Unity ML-Agents 第三章:訓練範本

Source: Deep Learning on Medium

Go to the profile of CK Sun

上一章我們實現了載入官方訓練好的數據,這一章節我要來介紹如何自行訓練官方範本的模型,包含可視化訓練數據,調整訓練環境的參數等等。

基本上本章節分三加一種方式:

  1. 從編輯器直接執行PY訓練檔做訓練。
  2. 從建立好的環境執行文件接入PY訓練檔做訓練。
  3. 從ML-Agents Toolkit提供的Python API做測試。
  4. 從ML-Agents Toolkit提供的Python API做訓練(進階)。

Unity提供了一個很好的方式,請設計場景的人設計好資料接口,可以直接從已經打包好的執行檔直接接入模型來做訓練。而進階的部分是從Jupyter直接打自己的模型接API做訓練,這個牽扯到Unity調用的部分,留待後續章節講解。

基本上要開始之前我先假設讀者是重開命令列了,所以從頭講起,先開好上一章的場景,打開UnityHub直接點UnitySDK,等開好SDK之後,我們要先來做由學習模型控制的準備,首先選中3D小球的場景

接著點場景物件視窗的Ball3DAcademy,屬性視窗會出現相關選項

屬性視窗會中有一個選項,把Control打勾(如果沒有勾就是預設給丟進去的已經訓練好的參數控制)

然後打開命令列,CD到你的ml-agents目錄底下,輸入(Windows使用者前面的conda不用輸入)

conda activate ml-agents

使用編輯器進行模型訓練

這邊講解最基礎的方式做訓練,套用官方的模型。

講解一下整行指令

mlagents-learn <trainer-config-path> --run-id=<run-identifier> --train

<trainer-config-path>是指訓練參數的設定檔位址,要丟Path進去,官方預設的設定檔在

config/trainer_config.yaml

打開之後可以看到預設的模型是使用PPO演算法,HyperParameter也都在裡面,調整的方法留待後面講解,基本上要調整的設定都是放在這個檔案。

<run-identifier>是指這次訓練的名稱,自行指定,建議都加上日期跟序列,這樣比較好理解。

(選用) 如果加上–load就會載入預訓練好的<run-identifier>繼續訓練,沒有設的話就會是隨機初始係數。

(選用) 如果加上 — env=<PATH>可以設定使用執行檔進行訓練,沒有設的話預設是用編輯器來訓練。

後面的train是代表這次是學習訓練,如果沒有去設定會是凍結係數的狀態,只是用來看訓練結果用的。

接下來就訓練一次預設設定的訓練過程,打入

mlagents-learn "config/trainer_config.yaml" --run-id="train_3dball_01" --train

(選用)Windows用戶可能會出現no module named win32api. ,打以下指令就可以解決。

pip install pypiwin32

如果執行成功會提示使用的資源,然後要你按下編輯器裡的Play,這時候進到Unity編輯器裡按下撥放鍵(太久沒按會出現ERROR,重新執行即可)

這時候就會開始一輪新的訓練,在執行過程中,每跑完一個1000(summary_freq)值就會總結一次

直到到達max_steps停止,預設(config/trainer_config.yaml)是50000步,

從結果中可以看到平均獎勵從1.2到達98,當然,還沒到達最佳解,還在波動,所以我們之後可以微調(trainer_config.yaml)參數讓他更快收斂跟到達底部,在執行(另開同目錄的命令列)或是結束的時候可以輸入

tensorboard --logdir=summaries

這樣會開啟一個數據網址,是輸入summaries資料裡的訓練數據

直接在瀏覽器列打開,預設是6006,請看上面的狀態輸入。

localhost:6006

這樣就可以看到可視化數據,如果前面有訓練過的話會一起載入,就可以比較兩種參數的差別。

接下來載入訓練好的模型,進到編輯器裡,把ml-agents/models底下訓練好的模型資料夾(名稱就是上面指令的訓練名稱)拉到編輯器的目錄下,建議都拉到TFMODEL較容易管理。

接下來點Brains裡的3DballLearning,可以看到屬性視窗有個MODEL

把訓練好的模型資料夾底下3DballLearning的拉到MODEL之後,點一下MODEL裏頭的文件。確認是指向訓練完的文件。

接下來點場景物件裡的Ball3DAcademy,在屬性是窗內把Control取消勾選。

接下來點選撥放就可以看到訓練成果了。

另外有個更快的方法,就是直接用預載入模型的方式去LOAD,記得把trainer_config.yaml的learning_rate改成0,這樣就不會學習,然後拿掉–train,在 — run-id後面加上預載入的模型,加上 — slow的話就會以比較真實的時間去跑。

mlagents-learn "config/trainer_config.yaml" --load  --run-id="train_3dball_02" --slow

這指令原本用來載入預訓練的模型,這是一種活用的方法。

這邊預祝大家訓練愉快~~~~~~~ ,另外覺得這些流程有幫助到你的話多給我幾個掌聲~可以連拍到50下唷~有問題可以在下面留言,我盡可能幫忙解答。

(選用)打包成執行檔訓練

接下來教大家怎麼打包,打包之前先打開File> Build Setting

點選左下角的Player Setting

接下來勾選Run in Background,確定Display Resolution Dialog選擇Disabled

然後確認小視窗裡面的場景是不是空的,如果不是要確定只有選中要訓練的場景,然後按Build,會問你要存在哪,我們就設定在目錄底下的env(請自己創一個),然後取名3Dball,然後按確定會開始建立。

建立完成後會出現3Dball.app,接下來只要開始測試

因為放在目錄底下的env/3Dball.app,所以把這段加上去,就會發現開始訓練了。

mlagents-learn "config/trainer_config.yaml" --run-id="train_3dball_04" --env="env/3Dball.app" --train

(選用)也許有人問說為什麼視窗這麼小,因為這是訓練視窗,盡量不耗費資源為前提,如果想要更高解析度來觀察的話可以在Build之前設定,在場景目錄內選Ball3DAcademy,屬性是窗內有一個Training Configuration,裡面有個長寬設定,設定成自己想要的質就好,然後下面有Time Scale,是指訓練加速的程度,FrameRate是FPS。

(選用)使用Python API檢查及測試訓練環境

這邊從官方提供的Notebook範本來做講解,windows用戶先看我這篇文章!!

接續上一個命令列指令,輸入下面指令打開jupyternotebook

jupyter notebook

接下來畫面會出現一行網址,複製下來貼到瀏覽器網址中打開:

然後從網頁中找到notebook資料夾下的getting-started.ipynb,打開他

接下來會看到這個畫面

(選用)基本上這就是PythonAPI接入Unity引擎的介紹,從

from mlagents.envs import UnityEnvironment

可以知道,這個是整個API最重要的地方,在environment.py中定義了UnityEnvironment 這個類別是用來控制整個Unity的環境,連接與溝通的主要方法。在brain.py中定義了BrainInfo是整個Agent的所有數據來源。而BrainParameters就是在Agent中保存的數據類型。

一開始我們先從編輯器裡處理,所以看到Start the environment底下有個

env = UnityEnvironment(file_name=env_name)

要修正成

env = UnityEnvironment(file_name=None)

(選用)相反的,如果想要直接看打包好的環境的話,就是透過編輯器build完的執行文件,在第一個Set environment parameters下定義

env_name = "../envs/3DBall"

把後面的字串改成執行文件的Path即可。

接下來我們要開始執行一次訓練過程,點到第一個Tab,然後點上面的Run(shift+Enter),一格一格執行。

接下來到開啟環境這個如果是用編輯器訓練會提是你按下編輯器裡的播放按鈕,進到編輯器點播放(太久沒按會出現無回應的錯誤,再重新點那個單元再Run就可以了)

編輯器點完撥放會出現抓取到BrainInfo的訊息,目前可以知道我們用一組大腦訓練,如果想要比較不同模型參數訓練可以設定兩個大腦,一組訓練一半,可以觀察。

基本上Examine the observation and state spaces,這個單元格會重置整個環境,是用

env_info = env.reset(train_mode=train_mode)[default_brain]

可以發現重置完之後會告訴您觀察到的狀態,下面的單元格是開始一輪新的模擬環境測試,一樣點Run,可以發現小球開始做動。

以上是用Jupyter Notebook來檢查環境,當然想要直接在上面跑模型的人也是可以從這個接口接入模型,並透過API傳送Action給Agents,不過這個進階的部分留到後面的章節再解釋。覺得這些流程有幫助到你的話多給我幾個掌聲~可以連拍到50下唷~有問題可以在下面留言,我盡可能幫忙解答。