これはcloudpack あら便利カレンダー 2018の記事です。
概要
Unity ML-AgentsをDocker上で動作させてみました。
UnityやUnity ML-Agentsの環境構築などは下記をご参考ください。
Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://cloudpack.media/42142
MacでUnity ML-Agentsの環境を構築する
https://cloudpack.media/42164
手順
基本的には公式のドキュメントに沿えばよい感じです。
Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.md
Dockerのインストール
Dockerがインストールされていない場合、インストールします。
> brew cask install docker (略) > docker --version Docker version 18.06.0-ce, build 0ffa825 > open /Applications/Docker.app
Dockerを初回起動すると初期設定のためにパスワード入力が求められます。
UnityにLinuxビルドサポートコンポーネントを追加する
- Unity Hubアプリを起動する
- [Installs] > [On my machine]からUnityリスト右側にある[…]から[Add Component]を選択する
- [Add components your install]ダイアログの[Platforms]にある[Linux Build Support]にチェックを入れて[Done]ボタンをクリックする
学習用のappをビルドする
- Unityを起動して、[open]から以下のフォルダを開く
- ml-agents/unity-environment
- ml-agentsリポジトリを
git clone
していない場合は下記参照
Scenes(シーン)の設定
Unityの[Edit]メニューから[Project Settings] > [Player]を開く
- [Inspector]ビューで以下の設定を確認する。
- [Resolution and Presentation]の[Run In Background]がチェックされている
- [Display Resolution Dialog]がDisableになっている
- [Hierarchy]ビューから[Ball3DAcademy] > [Ball3DBrain]を開く
- [Inspector]ビューで[Brain Type]を[External]に変更する
- [Ctrl] + [s]キーでシーンを保存する
設定変更後、しっかりと保存しないとビルド時に設定が反映されなくてハマります。(1敗)
ビルド設定
- Unityの[File]メニューから[Build Settings]を選択する
- [Build Settings]ダイアログで[Platform]で[PC, Mac & Linux Standalone]が選択されていることを確認する
- [Target Platform]を[Linux]に変更する
- [Architecture]を[x86_64]に変更する
- [Build Settings]ダイアログで[Build]ボタンをクリックする
- ファイル保存ダイアログで以下を指定してビルドを開始する
- ml-agents\unity-volume\3DBall
すると、unity-volumeに以下フォルダ・ファイルが出力されます。
> ll unity-volume/ 3DBall.x86_64 3DBall_Data
Dockerコンテナを構築する
Dockerが起動していることを確認してから、ml-agentsリポジトリ直下でdockerコンテナを構築する。
すでにDockerfileが用意されているので、buildするだけ。楽々ですね。
> cd 任意のディレクトリ/ml-agents > docker build -t 3dball_ml_docker (略) Successfully built db0b82f60411 Successfully tagged 3dball_ml_docker:latest
Dockerコンテナの実行
Dockerコンテナが構築できたら実行してみます。
bash
# unity-ml-docker-3dball: コンテナ名(任意) # 3DBall: Unityでbuild時に付けた名前(拡張子なし) # 3dball_ml_docker: Dockerでbuild時に付けた名前 # docker_first_run: 機械学習結果を保存する際の名称(任意) > docker run --name unity-ml-docker-3dball \ --mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \ -p 5005:5005 \ 3dball_ml_docker:latest 3DBall \ --docker-target-name=unity-volume \ --train \ --run-id=docker_first_run
fishシェルで実行する場合は、"$(pwd)"
を"$PWD"
に置き換えます。
fish
> docker run --name unity-ml-docker-3dball \ --mount type=bind,source="$PWD"/unity-volume,target=/unity-volume \ -p 5005:5005 \ 3dball_ml_docker:latest 3DBall \ --docker-target-name=unity-volume \ --train \ --run-id=docker_first_run
実行すると、学習が始まります。学習は[ctrl]+[ c ]キーで終了させることができます。
> docker run (略) id=docker_first_run INFO:unityagents:{'--curriculum': 'None', '--docker-target-name': 'unity-volume', '--help': False, '--keep-checkpoints': '5', '--lesson': '0', '--load': False, '--no-graphics': False, '--run-id': 'docker_first_run', '--save-freq': '50000', '--seed': '-1', '--slow': False, '--train': True, '--worker-id': '0', '<env>': '3DBall'} INFO:unityagents: 'Ball3DAcademy' started successfully! Unity Academy name: Ball3DAcademy Number of Brains: 1 Number of External Brains : 1 Lesson number : 0 Reset Parameters : Unity brain name: Ball3DBrain Number of Visual Observations (per agent): 0 Vector Observation space type: continuous Vector Observation space size (per agent): 8 Number of stacked Vector Observation: 1 Vector Action space type: continuous Vector Action space size (per agent): 2 Vector Action descriptions: , INFO:unityagents:Hyperparameters for the PPO Trainer of brain Ball3DBrain: batch_size: 64 beta: 0.001 buffer_size: 12000 epsilon: 0.2 gamma: 0.995 hidden_units: 128 lambd: 0.99 learning_rate: 0.0003 max_steps: 5.0e4 normalize: True num_epoch: 3 num_layers: 2 time_horizon: 1000 sequence_length: 64 summary_freq: 1000 use_recurrent: False graph_scope: summary_path: /unity-volume/summaries/docker_first_run memory_size: 256 use_curiosity: False curiosity_strength: 0.01 curiosity_enc_size: 128 INFO:unityagents: Ball3DBrain: Step: 1000. Mean Reward: 1.128. Std of Reward: 0.598. # [ctrl] + [ c ]で終了させる ^CINFO:unityagents:Learning was interrupted. Please wait while the graph is generated. INFO:unityagents:Saved Model INFO:unityagents:List of nodes to export : INFO:unityagents: action INFO:unityagents: value_estimate INFO:unityagents: action_probs INFO:tensorflow:Restoring parameters from /unity-volume/models/docker_first_run/model-6084.cptk INFO:tensorflow:Froze 16 variables. ▄▄▄▓▓▓▓ ╓▓▓▓▓▓▓█▓▓▓▓▓ ,▄▄▄m▀▀▀' ,▓▓▓▀▓▓▄ ▓▓▓ ▓▓▌ ▄▓▓▓▀' ▄▓▓▀ ▓▓▓ ▄▄ ▄▄ ,▄▄ ▄▄▄▄ ,▄▄ ▄▓▓▌▄ ▄▄▄ ,▄▄ ▄▓▓▓▀ ▄▓▓▀ ▐▓▓▌ ▓▓▌ ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌ ╒▓▓▌ ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓ ▓▀ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▄ ▓▓▌ ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄ ▓▓ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▐▓▓ ^█▓▓▓ ▀▓▓▄ ▐▓▓▌ ▓▓▓▓▄▓▓▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▓▄ ▓▓▓▓` '▀▓▓▓▄ ^▓▓▓ ▓▓▓ └▀▀▀▀ ▀▀ ^▀▀ `▀▀ `▀▀ '▀▀ ▐▓▓▌ ▀▀▀▀▓▄▄▄ ▓▓▓▓▓▓, ▓▓▓▓▀ `▀█▓▓▓▓▓▓▓▓▓▌ ¬`▀▀▀█▓ --------------------------Now saving model------------------------- Converted 16 variables to const ops.
学習結果をUnityで確認
学習結果は下記に保存されるので、Unityプロジェクトのフォルダにコピーします。
- unity-volume/models/docker_first_run/3DBall_docker_first_run.bytes
> cp unity-volume/models/docker_first_run/3DBall_docker_first_run.bytes unity -environment/Assets/ML-Agents/Examples/3DBall/TFModels
- Unityの[Hierarchy]パネルから以下を選択する
- [3DBall] > [Ball3DAcademy] > [Ball3DBrain]
- Unityの[Inspector]パネルにある[Brain Type]を[internal]に変更する
- [Project]パネルで以下フォルダを選択する
- [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
- [Brain Type]下に[Graph Model]という項目が現れてるので、そこに[TFModels]フォルダ内の以下ファイルをドラッグ&ドロップする
- 3DBall_docker_first_run.bytes
- Unity上部にある再生(三角)ボタンをクリックする
これで、学習結果が組み込まれた状態でアプリが起動する(はず)です。
参考
Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.md
Docker for Macをインストールしてみた
https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68