這篇文章會(huì)教各位如何從無到有,準(zhǔn)備好在Unity使用ML-Agents。
ML-Agents (Machine Learning Agents) 是一個(gè)由 Unity 開發(fā)的開源套件,旨在幫助開發(fā)者在 Unity 引擎中訓(xùn)練和測試強(qiáng)化學(xué)習(xí)模型。它提供一個(gè)訓(xùn)練環(huán)境和一個(gè) API,讓你可以在 Unity 中訓(xùn)練AI代理,從而實(shí)現(xiàn)自主學(xué)習(xí)和決策。
如果好奇的話,可以先看文章最後面的影片,那是我之前用來測試ML-Agents訓(xùn)練的小遊戲,也是下一篇要做的內(nèi)容。
開始前我想先提醒,除非你知道自己在做什麼,或是你看到這篇文章的時(shí)候已經(jīng)過了發(fā)布時(shí)間很久,不然我會(huì)建議你盡量按照文章的教學(xué)走(步驟、各種軟體和套件的版本),否則容易出問題。
另外,請確認(rèn)你要安裝的硬碟有至少5GB左右的空間。
首先安裝Unity,這邊我安裝的是2021年LTS版,如果你安裝的是不同版本,待會(huì)在程式內(nèi)安裝ML-Agents的介面會(huì)有些許不同。
這邊請注意,根據(jù)官方文件,安裝的Unity版本要是2018.4或以上。
Unity下載頁面: (需登入並取得個(gè)人免費(fèi)License才能使用)
再來安裝Python,這邊如果已經(jīng)有安裝了,也建議看一下這段,確保你的版本符合要求。
這邊有趣的是,Unity官方要求Python版本至少要3.6以上,並建議使用3.6或3.7。另外,待會(huì)我們要安裝的PyTorch,只支援Python 3.7-3.9,也就是說,各位乖乖安裝Python 3.7吧。
Python 3.7.9下載頁面:
這邊有個(gè)小建議,在一開始的介面中,要勾選Add Python 3.7 to PATH這個(gè)選項(xiàng)。詳細(xì)理由後面有記得的話再講。
直接點(diǎn)Install Now,等待成功安裝畫面即可。
接著建立新的Unity專案,這邊強(qiáng)烈建議路徑上只有英文和數(shù)字,不要有中文或是其他的符號(hào),詳情後面會(huì)提到,這邊建立一個(gè)3D專案用來測試。
記得選取剛才安裝的Unity版本。
程式打開後,安裝ML-Agents套件,從Window點(diǎn)選Package Manager。
在Package Manager中,將左上角的Packages改為Unity Registry。
搜尋com.unity.ml-agents
點(diǎn)選右下角的Install,等待安裝完成。
接著在剛才的專案底下建立Python虛擬環(huán)境。
在檔案總管打開剛才建立的Unity專案位置。假如你忘了,可以在Unity Hub找到。在路徑中輸入cmd,這會(huì)直接將cmd導(dǎo)向現(xiàn)在的位置,或是不嫌麻煩的會(huì),可以在開啟cmd後,輸入cd “專案位置”,這邊就不多示範(fàn)了。
按下Enter後,可以看到cmd視窗,並且路徑已經(jīng)是專案的位置。
輸入py,可以看到現(xiàn)在使用的Python版本。
假如你的電腦上安裝了其他版本的Python,而且這時(shí)候顯示的版本不是你要的,先輸入exit()退出,並輸入where python,這時(shí)會(huì)出現(xiàn)所有的Python安裝路徑,複製你要的那個(gè),然後直接貼上並Enter,就可以看到現(xiàn)在執(zhí)行的是你選的Python版本了。
參考下圖:
exit()退出當(dāng)前環(huán)境,輸入指令建立Python虛擬環(huán)境,py -m venv venv,假如你是用上面說的第二種方法才找到正確的Python版本,你需要先exit()退出,並將整個(gè)路徑連同指令輸入,如下圖。
等待指令執(zhí)行完畢,回到等待輸入指令的狀態(tài),這時(shí)可以看到Unity的專案路徑下多了一個(gè)venv資料夾,裡面就是剛才建立的Python虛擬環(huán)境。
這時(shí)在cmd輸入venv\Scripts\activate,注意是反斜線。
成功的話,視窗就會(huì)跳到執(zhí)行虛擬環(huán)境的狀態(tài)了。
這邊先更新pip,py -m pip install --upgrade pip。
假如你在執(zhí)行的時(shí)候跳出一串錯(cuò)誤,錯(cuò)誤最後有提示關(guān)於字元編碼的問題,並且pip沒有被成功更新,那很有可能是你的檔案路徑上有中文或其他特殊文字,或是系統(tǒng)語言的問題。解法有兩種,假如是路徑問題,可以直接再開一個(gè)專案,並且這次要注意專案位置,或是要修改虛擬環(huán)境中的檔案,讓他以utf-8編碼開啟虛擬環(huán)境的設(shè)定檔。
檔案位在虛擬環(huán)境中的這個(gè)位置 \venv\Lib\site-packages\pip\_internal\utils\virtualenv.py,開啟後,修改第54行附近,open()加入 ,encoding="utf-8",完成後務(wù)必存檔且關(guān)閉檔案。接著再執(zhí)行一次應(yīng)該就沒問題了,參考下圖。
接著安裝PyTorch,
以下畫面出現(xiàn)後,靜待安裝完成。
安裝ML-Agents,pip3 install mlagents==0.29.0,等待安裝完成。
接著測試環(huán)境是否都成功安裝,輸入 mlagents-learn --help,有可能會(huì)出現(xiàn)ModuleNotFoundError,這時(shí)只要再自行安裝對應(yīng)的程式庫即可。
假如可以看到和下圖一樣一長串的內(nèi)容,基本上就沒問題了。
假如順利操作到這邊,那麼恭喜,你已經(jīng)可以開始使用ML-Agents了。
這邊先透過簡單的程式碼來測試我們安裝的ML-Agents。
首先,建立一個(gè)C#檔案。
開啟檔案,加入U(xiǎn)nity.MLAgents;
假如你到這邊發(fā)現(xiàn)打了Unity之後沒有自動(dòng)出現(xiàn)提示,將Visual Studio關(guān)閉,到Unity專案的Edit > Preferences,選擇你的External Script Editor,重新開啟檔案,輸入文字時(shí)應(yīng)該就可以看到提示了,這邊沒有提示的話會(huì)寫得比較辛苦,而且沒辦法及時(shí)除錯(cuò)。
將class改為繼承Agent,也就是ML-Agents,刪掉class裡面的預(yù)設(shè)程式碼。
加入以下程式碼??梢韵氤蛇@段程式碼會(huì)去接收ML-Agents的指令,再透過除錯(cuò)視窗輸出。這邊只是先進(jìn)行測試,這段程式碼本身並無意義。
回到Unity專案,在場景中加入空物件。
將剛才的程式碼加入這個(gè)物件底下。
將其中的Branch 0 Size改為5。
這邊要是有發(fā)現(xiàn),可以注意到Discrete就是程式碼中的actions.DiscreteActions,這邊修改的作用在於讓這個(gè)回傳值的第0個(gè)位置有5個(gè)選擇。詳細(xì)內(nèi)容會(huì)在之後的文章中討論,這邊可以先看過就好。
在Component > ML Agents中加入Decision Requester。
Decision Requester會(huì)像Agent發(fā)出傳送命令的請求,若是缺少這個(gè)物件,等於Agent和遊戲之間沒有溝通,也無法進(jìn)行訓(xùn)練。
準(zhǔn)備完成後,空物件的元件會(huì)像這樣
接著在虛擬環(huán)境中輸入mlagents-learn --force,順利的話會(huì)出現(xiàn)以下畫面,代表ML-Agents已經(jīng)準(zhǔn)備好執(zhí)行訓(xùn)練了。
這時(shí)若是出現(xiàn)錯(cuò)誤,可嘗試執(zhí)行pip install importlib-metadata==4.8,然後再一次執(zhí)行上述指令。
接著來到Unity專案,按下Play,可以看到ML-Agents開始執(zhí)行。
在Unity的除錯(cuò)視窗中,可以看到0到4的數(shù)字隨機(jī)出現(xiàn),這就是Agent的輸出,也就是在實(shí)際應(yīng)用中,Agent對遊戲的操作,這部分我在之後的文章再細(xì)講。這邊出現(xiàn)的警告可以先忽略。
要停止ML-Agents基本上有兩種方式,一個(gè)是再按一次Play,停止偵錯(cuò)並等待ML-Agents timed-out,或是停止偵錯(cuò)後,在虛擬環(huán)境按下Ctrl+C,兩種方法都可以。
我們可以試著將Continuous Actions改為1,並修改程式碼。
再次依照先前的步驟執(zhí)行ML-Agents (mlagents-learn --force)。
可以看到輸出由整數(shù)改為0到1的浮點(diǎn)數(shù)了。
Discrete的英文是離散,在這裡代表的就是像0123這種不連續(xù)的數(shù)值,而Continuous剛好相反,可以是由0到1之間的任一小數(shù)。ML-Agents就是透過這些數(shù)值來操作遊戲,例如0和1可以代表Agent決定角色是否跳躍,0-1則可以決定角色行走的速度及方向。
Agent在執(zhí)行的過程可以視為一個(gè)迴圈,在這個(gè)迴圈中會(huì)不斷重複 觀察 > 決定 > 動(dòng)作 > 接收回報(bào),藉由這些動(dòng)作,不斷嘗試獲得最大的回報(bào)。我們剛才的程式就是看Agent如何做出動(dòng)作,其他部分會(huì)在之後的文章提到,這邊先讓各位有點(diǎn)概念。
這篇教學(xué)到這邊告一段落,接下來會(huì)比較詳細(xì)講解ML-Agents,並實(shí)際帶各位訓(xùn)練你們的第一個(gè)ML-Agent,讓Agent學(xué)會(huì)玩一個(gè)小遊戲。應(yīng)該會(huì)做一個(gè)跟下面影片類似或一樣的東西出來。
謝謝各位看到這裡,有任何問題或建議都?xì)g迎在下方留言或私訊。
話說回來,從原本預(yù)計(jì)去年12月要發(fā)完整的ML-Agents教學(xué),到現(xiàn)在只發(fā)了安裝說明,這拖得實(shí)在有點(diǎn)久啊…
因?yàn)楝F(xiàn)在還是沒有什麼空閒,下一篇可能又要等上一段時(shí)間,如果有人希望能快點(diǎn)看到之後的內(nèi)容,也歡迎留個(gè)訊息或是給GP支持,說不定我會(huì)想辦法擠出時(shí)間來生出一點(diǎn)內(nèi)容w
這篇到這邊真的結(jié)束了,謝謝各位。