2017年12月24日 星期日

[攻略]Unity - 3D小球機器學習專案架設

整理潤稿:Wei J,Kelvin Lo

本文將分享如何安裝Unity機器學習代理工具(Unity Machine Learning Agents),並透過官方範例3D小球,了解整個環境的安裝方法。

在本文中使用的案例是3D平衡小球(3D Balance Ball)的運行環境。該環境包含多個平板和小球。這些平板可以自己做縱向及橫向旋轉,來保持小球不掉離平板。每個平板都是一個代理,通過保持小球在平板上的時間得到獎勵;掉出平板,則會扣除獎勵。這個訓練過程的目的在於讓平板學習永遠不讓球落下。 

3D小球實際成果展示

-------------------------------------
整篇文章為參考以下文件列表所整合的一個攻略流程:
Windows 10安裝攻略 by Jason Weimann
Mac安裝攻略 by 
鲍健运
專案Github
整合Unity教學
Ptyhon與其他軟體安裝
--------------------------------------------------

開始:


如果你要架在Windows 10平台上:

本教學需要安裝的軟體清單如下:
Nvidia CUDA toolkit - CUDA 8.0.61
CUDNN檔案 - CUDA 8.0使用的v6.0版
安裝Anaconda會安裝以下套件:
- Python
- Jupyter
- TensorFlow
- Matplotlib
- numpy
- pillow
- docopt
Unity範例專案


設定Unity機器學習代理工具和TensorFlow環境(Windows 10)
本章節轉載由Jason Weimann所寫的文章,說明在Windows 10上如何設定Unity機器學習和TensorFlow環境。本章節完成後會繼續說明如何設定Unity官方的機器學習展示專案 - 3D Ball。

說明

  • 本章節針對Windows 10平台,Mac環境設定請跳過本章節。 
  • 請注意軟體所對應的版本,如果版本不同可能會導致安裝不成功。 
  • 下載和安裝軟體前請關閉Unity和Visual Studio,並確認你的Windows 10電腦採用NVIDIA顯卡,因為本文所使用的GPU加速工具包是NVIDIA的CUDA。 

安裝CUDA工具


首先需要下載CUDA 8.0.61。請到GUDA下載頁面,選擇下載CUDA Toolkit 8.0 GA2。 (會有很多新版本,但本案要下載這個版本)




下載完成後執行安裝,當出現下圖所示的選擇安裝介面。請選擇“Express”,一直下一步到完成CUDA工具的安裝。



安裝CUDA深度神經網路資料庫CUDNN


接下來需要下載CUDA深度神經網路庫(CUDA Deep Neural Network),簡稱CUDNN。它是專門針對深度神經網路框架設計的一套GPU計算加速方案。全世界的深度學習研究者和框架開發者都使用CUDNN來增強GPU計算效能。這讓他們能專注於訓練神經網路、開發軟體應用,不用在低級別的GPU性能調整上耗費時間。CUDNN支持當下流行的各種深度學習框架,包括Caffe2、MATLAB、Microsoft Cognitive Toolkit、TensorFlow和PyTorch等。

CUDNN下載頁面,選擇CUDA 8.0使用的v6.0版本下載。當下載CUDNN時,Nvidia 會要求你登入,可以註冊一個免費帳號登入。





下載完成後解壓縮會有三個目錄(bin、include和lib資料夾),確定CUDA工具安裝完成後,把這三個目錄複製到CUDA 8.0工具資料夾。 

一般來說安裝CUDA時的預設路徑是:
C:\Program Files\NVIDIA GPU Computing Toolkit\cuda\v8




複製bin、include和lib資料夾到\
NVIDIA GPU Computing Toolkit\cuda\v8目錄底下

設定環境變數和路徑


接下來需要幫Windows系統增加環境變數和路徑設定。


1.開啟檔案總管,在本機上按右鍵選內容
2.進入系統控制台後選進階系統設定
3.點選進階頁面底下的環境變數




4.點"新增"按鈕。 
加一個CUDA_HOME,數值設為: 
C:\Program Files\NVIDIA GPU Computing Toolkit\cuda\v8.0(路徑是你的CUDA安裝路徑)

選擇"確定"。




編輯路徑Path

先找到Path,反白後點"編輯",會開出系統路徑快捷表。



新增兩個系統路徑。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\CUPTI\libx64


最上面兩個是安裝CUDA時產生的不要去動它
新加的路徑會在最下面,注意不要打錯字了


安裝Anaconda


為了要安裝Python和Jpyther套件,為了避免繁瑣的安裝流程,建議採用Anaconda來安裝會比較容易。
到Anaconda的下載頁面,下載Python 3.6,選擇64位版本。下載完成後安裝Anaconda,按照系統下一步到完成安裝


安裝完成後你應該可以在快速選單找到Anaconda Prompt。開啟它。 



接下來所有的Command line指令都是在
Anaconda Prompt執行。

下一步,我們要創建使用Python 3.5.2的執行環境。在Anaconda Prompt中輸入指令來建立環境:

conda create -n tensorflow-gpu python=3.5.2


然後輸入指令啟動剛剛創建的環境:

activate tensorflow-gpu


最後用這個指令安裝TensorFlow:

pip install tensorflow-gpu


當安裝完成後,你就可以輸入指令啟動Python來測試剛剛的流程是否成功。指令為:

python


然後輸入指令測試:import tensorflow as tf


下載Unity的範例專案 


接下來要下載本次的3D小球專案,你需要從GitHub頁面下載專案,可以直接下載並解壓縮到任意位置。或是透過Github Desktop直接克隆一份道你電腦上。為了讓工作輕鬆建議不要太深的目錄,例如D:\ml\就好。

接下來從選單找到Anaconda Prompt。用右鍵點擊Anaconda Prompt,選擇更多->"以系統管理員身份執行"(Run as administrator)。




剛剛解壓縮後的Unity - 3D小球專案目錄下有一個python目錄。從這個Anaconda prompt視窗把目錄切換到剛下載好的ml-agents專案裡的python目錄位置。 

例如:我專案放在D:\ml\ml-agents\,那麼我們要把目錄切換到D:\ml\ml-agents\python。執行:

cd d:\ml\ml-agents\python


然後要安裝Html5lib庫,輸入指令:

conda install --force html5lib


然後輸入:

pip install .


注意:"pip install ." 最後有個點.


如果以上步驟一切正常,你就可以到下一章節
用TensorFlow和機器學習設定你的Unity專案了。
----------------------------
如果你要架在Mac OSX平台上:

  • macOS版本要求:OS X El Capitan(10.11)及以上。 
  • 建議下文中所使用的軟體版本都使用最新的版本。 

安裝Homebrew


對於許多使用macOS作為作業系統的開發者來說,一般習慣於使用命令列安裝所需應用,當然這樣也能顯得很geek。而Homebrew也是很常用的套裝軟體管理工具,能在Mac中方便的安裝軟體或者卸載軟體。

打開Terminal應用,輸入以下命令下載安裝最新的Homebrew。


/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝完Homebrew後,建議重啟Terminal。


透過Homebrew 安裝 Python 3


Python是機器學習常用的語言,TensorFlow就使用它作為主要開發語言。作為解釋語言,它不需要進行編譯,對於機器學習所需要的大量原型化和反覆運算處理有相當高的效率。而且Python開發生態成熟,有許多庫可供使用。通過pip(Python Package Index)工具,你可以安裝各種基於Python的庫。

輸入 
brew install python 3 安裝 Python 3。在安裝完Python 3之後,建議重啟Terminal。 


安裝專案所需Python庫和工具

以下說明兩種安裝路線:可以二選一

路線一:
安裝Jupyter Notebook

Jupyter Notebook是一個開源的Web應用程式,可以讓你建立和共用包含即時程式碼,方程式,視覺化和說明文本的文檔。 用途包括:資料清理與轉換,數值類比,統計建模,機器學習等等。

輸入 pip3 install jupyter 安裝Jupyter Notebook。


安裝NumPy

NumPy是Python語言的開源數學擴展庫。支援高級大量的維度數組與矩陣運算,此外也針對陣列運算提供大量的數學函式程式庫。由於NumPy剛剛宣佈不再支援Python 2,所以建議直接使用Python 3。

輸入 pip3 install numpy 安裝 NumPy。


安裝Pillow

Pillow是PIL(Python Imaging Library,Python圖像庫)的一個分支,提供了對於開發者許多比較友好和直觀的功能。

輸入 pip3 install pillow 安裝 Pillow。


安裝docopt

docopt是Python的命令列參數解析器,其基於多年來用於描述程式介面的説明資訊而設計的,因此可以給開發者清晰的輸出體驗。

輸入 pip3 install docopt 安裝 docopt 。


安裝TensorFlow

TensorFlow是現今非常流行的使用資料流程圖進行數值計算的開源軟體庫。圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維陣列。這種靈活的架構可讓你使用一個 API 將計算工作部署到設備、伺服器或者移動設備中的一個或多個CPU或 GPU。TensorFlow 最初是由Google 機器智慧研究部門的 Google Brain 團隊中的研究人員和工程師開發的,用於進行機器學習和深度神經網路研究, 但它是一個非常基礎的系統,因此也可以應用於眾多其他領域。

輸入 pip3 install tensorflow 安裝 TensorFlow。

路線二:
Python庫快捷安裝

一步步通過pip3安裝這些庫可能有些麻煩,如果你已經安裝了Python 3,並且克隆了Github上完整的ml-agents專案。


你可以打開Terminal,把目錄改到ml-agents專案下python的目錄(目錄每個人都不同):

cd /Users/(你的名字)/UnityMachineLearningAgents/python 。

輸入“pip3 install .”,安裝以上所有的Python庫和工具(install後面有個.號不要漏掉)。


完成安裝

如果你按照以上2種方法順利操作的話Mac環境下Unity Machine Learning Agents所需功能基本安裝完畢。你就可以開始用TensorFlow和機器學習配置你的Unity專案了。

-----------------------------

上面的環境安排好了之後,接下來我們就可以到Unity裡面設定要學習的內容

確保你已經下載Unity在GitHub上的ml-agents專案。
確保使用Unity 2017.1 或以上版本


設定Unity環境


啟動Unity,開啟剛剛下載資料裡的unity-environment目錄(本展示專案)。

在啟動視窗中,選擇Open,並在彈出的檔流覽視窗中,選擇unity-environment,點擊Open。



注意:如彈出警告”Opening Project in Non-Matching Editor Installation”,請直接忽略。


打開專案後,在Project視窗,到資料夾Assets/ML-Agents/Examples/3DBall/,按兩下Scene檔的圖示開啟場景。




點擊功能列Edit -> Project Settings -> Player,選中Resolution and Presentation裡的Run in Background屬性。

將Resolution and Presentation中的Display Resolution Dialog屬性,選擇Disabled。




在左邊的場景hierarchy 視窗中,展開Ball3DAcademy遊戲物件,並選中它的子物件Brain3DBrain,在右邊的Inspector中查看屬性。

將物件的Type of Brain設定為External。
(註:設為External是為了在外部做訓練,未來把訓練資料放回專案後,設回Internal就可以在Unity裡面看到訓練後的行為)




點擊File -> Build Settings
選擇目標平台。(選項)勾選Development Build來記錄除錯資訊。點Build開始打包。
重要:存檔路徑請直接指定ml-agents底下的python目錄,給予的檔名也請記住,待會設定要填入一樣的檔名。





用強化學習訓練大腦

測試Python API

---Windows---
如果上面已經跑過Jupyter安裝流程,你可以:
開啟Anaconda Prompt
切換目錄到專案的python目錄

cd d:\ml\ml-agents\python

執行jupyter notebook

開啟瀏覽器localhost:8888就會看到jupyter notebook在python的位置被打開(目錄資料結構確保和下圖相同)






用PPO訓練模型


下一步我們訓練代理,讓它在平台上平衡小球的位置,我們會使用一個叫做近端策略優化(Proximal Policy Optimization),簡稱PPO的強化學習演算法。這個演算法經過實驗,證明是十分安全、高效且比其他強化學習演算法實用性更強的,所以我們選擇這個演算法來作為Unity機器學習代理的範例演算法。


如果想要瞭解更多關於近端策略優化演算法的資訊,請參閱OpenAI發佈的文章


現在請按照下面步驟操作:


  • 在Jupyter中打開PPO.ipynb
  • 修改env_name的值 = 剛剛打包的專案檔名稱
  • run_path目前設定為ppo,依需求可以改到別的目錄也可以不改
  • 按途中的前進按鈕,執行PPO.ipynb的程式,注意不要執行"Export the trained Tensorflow graph."這行文字後的程式。



(選項)針對本專案如果你想要快點訓練完成,可以多調整以下設定:
max_steps = 5000
buffer_size = 5000
batch_size = 512

觀察訓練過程


如果順利的話,你的機器人應該已經開始訓練了。要更仔細地觀察訓練過程,你可以使用Tensorboard。

在Anaconda Prompt視窗切換目錄到專案的python目錄


cd d:\ml\ml-agents\python

輸入:

tensorboard --logdir=summaries



然後在瀏覽器中打開localhost:6006





從Tensorboard上,你會看到以下多個統計圖:


  • 累計獎勵(Cumulative Reward):所有代理各自的平均累計獎勵。在成功的訓練過程中,這個變數應該會增大。
  • 數值損失(Value Loss) :數值函式更新時的平均損失。這關係到模型是否能預測每個狀態下的數值。在成功的訓練過程中,這個變數會減小。
  • 策略損失(Policy Loss) :策略函式更新時的平均損失。這關係到策略(決定行為的過程)的變化大小。在成功的訓練過程中,這個變數的大小會減小。
  • 事件長度(Episode Length) :設定環境下,所有代理中每個事件的平均長度。
  • 數值估計(Value Estimates) :代理所存取的所有狀態下的平均數值估計。在成功的訓練過程中,這個變數數值會增大。
  • 策略信息量(Policy Entropy):這個變數告訴你模型的決定隨機度有多大。在成功的訓練過程中,這個變數會緩慢減小。如果它減小得太快,beta hyperparameter應該會增大。



將訓練好的模型載入Unity環境


經過一段時間訓練後,當訓練過程顯示的平均獎勵大於等於75時,你可以回到PPO檔案繼續往下執行Export the trained Tensorflow graph這一區,匯出保存資料。

資料會存在python/models/ppo(檔案裡面run_path所指的目錄)
會看到一個同名.bytes




停止執行PPO就能停止訓練。現在你就已經有訓練好的TensorFlow模型。你必須將保存的模型轉換為Unity可使用的格式,透過以下步驟載入到Unity專案中。

把訓練好的bytes檔案複製到:
Assets/ML-Agents\Examples\3Dball\TFModels




設定對TensorFlowSharp的支援


因為對TensorFlowSharp的支持目前還處於實驗階段,預設情況下它是被禁用的。要打開它,你必須按照下列步驟。
請注意Internal Brain模式只在完成以下步驟後才能使用。


  • 確保使用的是Unity 2017.1以上版本。
  • 從這裡下載TensorFlowSharp套件,並匯入Unity中。
  • 功能表選擇Edit -> Project Settings -> Player。找到Other Settings,在Scripting Runtime Version屬性中選擇Experimental (.NET 4.6 Equivalent),在Scripting Defined Symbols屬性中,加入ENABLE_TENSORFLOW。(請注意:多個平台代表每個平台都要設定)
  • 重開Unity


務必重開之後回來確認Symbols還在


  • 重新開啟3DBall場景
  • 從場景的hierarchy視窗選擇Ball3DBrain物件
  • 如下圖將Type of Brain改為Internal
  • 如下圖將Graph Model指定剛剛匯入的.bytes檔



  • 將Graph Placeholder的size值設為1
  • 增加名為epsilon的placeholder,設定類型為floating point,範圍從0到0。


注意:上面這兩個設定應該在專案裡已經設好了。
設定這兩個步驟是有必要的,因為3DBall是個持續的控制環境,而TensorFlow模型會用噪音參數來決定行動。但那樣的情況下控制過程是離散的,所以不需要epsilon變數)

最後按Play按鈕,查看訓練後的結果在Unity Editor裡呈現。


流程非常繁瑣但現在你應該可以看到被訓練好的模型已經能自行控制平衡小球的行為。

Jason Weimann的兩段教學影片對本專案非常有幫助,建議遇到問題的開發者可以參考這兩段影片

Unity3D Machine Learning Setup for ML-Agents on Windows 10 with Tensorflow

5 則留言:

  1. 新下載的unity ml-agents-master\python內找不到ppo.ipynb

    回覆刪除
  2. 找不到ppo.ipynb +1
    是否有更新甚麼細節?

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 更新後已改用python資料夾中的learn.py,
      將場景輸出到python資料夾中(輸出檔檔名可能會因為選取的是python資料夾而命名為python,須改掉)
      在Anaconda prompt中切換至python資料夾,
      輸入python learn.py ballBuild --train
      其中ballBuild是你輸出檔的檔名,請自行更改。
      可參考https://blog.csdn.net/q568360447/article/details/78206968

      刪除
  4. 新的unity ml-agents-master內找不到python資料夾

    回覆刪除

著作人