MacでUnity ML-Agentsの環境を構築する(v0.11.0対応)

Unityで機械学習を利用するML-Agentsというライブラリがv0.11.0(beta)にバージョンアップしていたので試してみました。(2019/11/05時点)

v0.9.1からしばらく動作確認をサボっていたらだいぶと変更点があって戸惑いました。

Release ML-Agents Beta 0.11.0 · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/releases/tag/0.11.0


Unity ML-Agentsについては下記が参考になります。

【Unity】Unityで機械学習する「ML-Agent」を色々と試して得た知見とか
http://tsubakit1.hateblo.jp/entry/2018/02/18/233000


Unityをまだインストールしていないという方は下記をご参考ください。

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033


## 手順

基本的には公式にある下記ドキュメントに沿えばよい感じです。

ml-agents/Installation.md at master · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Installation.md

ml-agents/Basic-Guide.md at master · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md#setting-up-ml-agents-within-unity


### Pythonをインストールする

現在、Python 3.6.1以上での動作がサポートされています。3.5以前のバージョンはサポートされていないのでご注意ください。(2019/11/05現在)

ml-agents/Installation.md at master · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Installation.md


>In order to use ML-Agents toolkit, you need Python 3.6.1 or higher. Download and install the latest version of Python if you do not already have it.

>We do not currently support Python 3.5 or lower.


v0.10.0でようやく3.7以上に対応してくれたみたいです。

Release ML-Agents Beta 0.10.0 · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/releases/tag/0.10.0

>ML-Agents is now compatible with Python v3.7 and newer versions of Tensorflow up to 1.14.



お手元にPythonの環境がない方は下記をご参照ください。

MacでanyenvをつかってPython環境構築(bash、fish対応) - Qiita
https://qiita.com/kai_kou/items/f54931991a781b96bb9c


### ML-Agentsリポジトリをダウンロード

適当なディレクトリにリポジトリをダウンロードします。

```console
> mkdir 適当なディレクトリ
> cd 適当なディレクトリ
> git clone https://github.com/Unity-Technologies/ml-agents.git
```

### 必要なライブラリをインストールする

ML-Agentsのパッケージをpipを利用してPyPIからインストールします。
ここではPythonの仮想環境を作ってインストールします。

仮想環境？なにそれ？な方は下記をご参照(再掲
https://qiita.com/kai_kou/items/f54931991a781b96bb9c

```console
> python --version

Python 3.7.4


> python -m venv venv
> . venv/bin/activate

# fishな方はこちら
> . venv/bin/activate.fish

> pip install mlagents
```

はい。


### Unityアプリからサンプルプロジェクトを開く

Unity Hubでアプリを立ち上げます。Unity Hubがインストールされていない場合は下記をご参考ください。

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033

ML-Agentsを利用するにはUnityのバージョン`2017.4` 以上が必要となります。今回は`2019.2.10f1` を利用しました。

アプリが立ち上がったら「開く」ボタンから`任意のディレクトリ/ml-agents/UnitySDK` フォルダを選択します。

<img width="980" alt="2019_11_05_16_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/49a79c7f-3711-368a-cf59-002dc19cf1b7.png">
<img width="799" alt="2019_11_05_17_00のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/34d76461-37ea-47ab-e50a-2f9031594bfa.png">
<img width="980" alt="2019_11_05_17_01のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/07870a97-0ba9-ab3c-9376-a4bf8fa8fa12.png">

Unityエディタのバージョンによっては、アップグレードするかの確認ダイアログが立ち上がります。

<img width="980" alt="2019_11_05_17_02のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/7dc88f5f-2c0a-e4b7-366c-f3d61e472a46.png">



「確認」ボタンをクリックして進めます。アップグレード処理に少し時間がかかります。

<img width="1679" alt="スクリーンショット 2018-09-13 10.50.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/3b9869f9-6c07-86e9-94aa-4f85bc1d9a10.png">



### Scenes(シーン)が開くか確認する

サンプルが動作するか、Unityでプロジェクトを読み込み、動作させてみます。

- Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
- 開いたら、[3DBall]ファイルがあるので、ダブルクリックして開く

<img width="1617" alt="スクリーンショット 2019-11-06 10.13.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/4a5e0f91-4308-73ad-75ac-d719965f6792.png">
なんかでてきたー(感動



Unityの上にある再生ボタンをクリックします。

<img width="1619" alt="スクリーンショット 2019-11-06 10.14.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/9f40a39d-4044-2320-0141-7895ba5db39a.png">
なんかうごいたー(感動
そして、かわいくなってるwww


読み込んだサンプルが動作することを確認できました。
現時点ではボールがボックス？からすぐに落ちてしまいます。これを機械学習で、落とさないようにさせるわけです。


### Scenes(シーン)の設定

ML-Agentsで学習させるための設定です。

- Unityアプリの[Edit]メニューから[Project Settings]を開く
<img width="373" alt="スクリーンショット 2019-08-19 14.23.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/c326d6cd-9ead-6e8f-3dee-b07212079a4f.png">

- [Inspector]パネルで以下の設定を確認する
    - [Resolution and Presentation]の[Run In Background]がチェックされている
    - [Display Resolution Dialog]がDisableになっている
<img width="631" alt="スクリーンショット_2019_08_19_14_25のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/36514763-700d-47d5-d0a1-05a24329989c.png">



### 学習させる

学習に必要な設定ができましたので、Unityアプリ上で学習させてみます。


#### コマンドの実行

コンソールに戻り、学習開始のコマンドを実行します。オプションは結構数がありますが、最低限を指定します。

```console
> cd 適当なディレクトリ
> mlagents-learn ml-agents/config/trainer_config.yaml --train

WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
  * https://github.com/tensorflow/io (for I/O related ops)
If you depend on functionality not listed there, please file an issue.



                        ▄▄▄▓▓▓▓
                   ╓▓▓▓▓▓▓█▓▓▓▓▓
              ,▄▄▄m▀▀▀'  ,▓▓▓▀▓▓▄                           ▓▓▓  ▓▓▌
            ▄▓▓▓▀'      ▄▓▓▀  ▓▓▓      ▄▄     ▄▄ ,▄▄ ▄▄▄▄   ,▄▄ ▄▓▓▌▄ ▄▄▄    ,▄▄
          ▄▓▓▓▀        ▄▓▓▀   ▐▓▓▌     ▓▓▌   ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌  ╒▓▓▌
        ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓      ▓▀      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌   ▐▓▓▄ ▓▓▌
        ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄     ▓▓      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌    ▐▓▓▐▓▓
          ^█▓▓▓        ▀▓▓▄   ▐▓▓▌     ▓▓▓▓▄▓▓▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▓▄    ▓▓▓▓`
            '▀▓▓▓▄      ^▓▓▓  ▓▓▓       └▀▀▀▀ ▀▀ ^▀▀    `▀▀ `▀▀   '▀▀    ▐▓▓▌
               ▀▀▀▀▓▄▄▄   ▓▓▓▓▓▓,                                      ▓▓▓▓▀
                   `▀█▓▓▓▓▓▓▓▓▓▌
                        ¬`▀▀▀█▓


INFO:mlagents.trainers:CommandLineOptions(debug=False, num_runs=1, seed=-1, env_path=None, run_id='ppo', load_model=False, train_model=True, save_freq=50000, keep_checkpoints=5, base_port=5005, num_envs=1, curriculum_folder=None, lesson=0, slow=False, no_graphics=False, multi_gpu=False, trainer_config_path='ml-agents/config/trainer_config.yaml', sampler_file_path=None, docker_target_name=None, env_args=None, cpu=False)
INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor.
```


`INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor.`　と出力されたら、Unityアプリの上部にある[▶]ボタンをクリックします。初期設定だと50,000ステップ実行するので少々時間がかかります。

<img width="963" alt="スクリーンショット 2019-11-06 10.51.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/2ff0122b-947b-41d3-ed0e-ce9612964a77.png">


```console
(略)
INFO:mlagents.trainers: ppo: 3DBall: Step: 2000. Time Elapsed: 22.201 s Mean Reward: 1.167. Std of Reward: 0.766. Training.
(略)
INFO:mlagents.trainers: ppo: 3DBall: Step: 10000. Time Elapsed: 113.151 s Mean Reward: 30.106. Std of Reward: 27.092. Training.
(略)
INFO:mlagents.trainers: ppo: 3DBall: Step: 49000. Time Elapsed: 542.744 s Mean Reward: 100.000. Std of Reward: 0.000. Training.
(略)
IGNORED: Cast unknown layer
IGNORED: StopGradient unknown layer
GLOBALS: 'is_continuous_control', 'version_number', 'memory_size', 'action_output_shape'
IN: 'vector_observation': [-1, 1, 1, 8] => 'sub_3'
IN: 'epsilon': [-1, 1, 1, 2] => 'mul_1'
OUT: 'action', 'action_probs'
DONE: wrote ./models/ppo-0/3DBall.nn file.
INFO:mlagents.trainers:Exported ./models/ppo-0/3DBall.nn file
```

Python 3.7.4で動作させているからか、TensorFlow 2.0だからなのか、`WARNING` が結構出力されますが、動作はしているので置いておきます。



### 学習結果をアプリに組み込む


学習が完了すると学習結果が`models` 配下に`*.nn` ファイルとして保存されます。
それをUnityアプリに組み込むことで学習結果をUnityアプリに反映できます。

```console
> tree models/
models/
└── ppo-0
    ├── 3DBall
    │   ├── checkpoint
    │   ├── frozen_graph_def.pb
    │   ├── model-50000.cptk.data-00000-of-00001
    │   ├── model-50000.cptk.index
    │   ├── model-50000.cptk.meta
    │   ├── model-50001.cptk.data-00000-of-00001
    │   ├── model-50001.cptk.index
    │   ├── model-50001.cptk.meta
    │   └── raw_graph_def.pb
    └── 3DBall.nn

2 directories, 10 files
```

#### Unityアプリの設定

Playerの設定を行います。

- Unityアプリの[Edit]メニューから[Project Settings]を選択する
- [Inspector]ビューの[Other Settings]欄で以下を確認・設定する
  - Scripting Backendが`Mono` になっている
  - Api Conpatibility Levelが`.NET 4.x` になっている
<img width="701" alt="スクリーンショット 2019-11-06 11.23.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/93714941-cfdd-da99-6bf5-960d08cc40b4.png">




#### 学習結果ファイルの取り込み

ターミナルかFinderで学習結果を以下フォルダにコピーします。

- 学習結果ファイル: `models/ppo-0/3DBall.nn`
- 保存先: `UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/`

※すでに保存先に`3DBall.nn` ファイルが存在していますので、リネームします。

```console
> cp models/ppo-0/3DBall.nn ml-agents/UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall_new.nn
```

- Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
- 開いたら、[3DBall]ファイルがあるので、ダブルクリックして開く
- [Hierarchy]パネルから[Agent]を選択する
- Unityアプリの[Project]パネルで以下フォルダを選択する
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
- Unityアプリの[Inspector]パネルにある[Model]という項目に[TFModels]フォルダ内の`3DBall_new.nn`ファイルをドラッグ＆ドロップする
<img width="1618" alt="2019_11_06_11_28のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/cb780e62-f13c-b7a1-258f-aa21fdc626b7.png">

- Unity上部にある[▶]ボタンをクリックする

これで、学習結果が組み込まれた状態でアプリが起動します。
50,000ステップ学習すると動きが穏やかでもはやプロです。~~なんのプロかはわかりませんが^^~~
<img width="1619" alt="スクリーンショット 2019-11-06 10.14.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/30cb05e3-e797-7fd0-8afe-db56649499fa.png">

サンプルは他にもあるので、いろいろとお試しあれ。
ML-Agentsはv0.5.0くらいから触っていますがだいぶと利用方法がかんたんになってきていますが、v0.11.0ではさらに設定箇所が減っていて良い感じになっています。



## 参考

【Unity】Unityで機械学習する「ML-Agent」を色々と試して得た知見とか
http://tsubakit1.hateblo.jp/entry/2018/02/18/233000

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033

ml-agents/Installation.md at master · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Installation.md

ml-agents/Basic-Guide.md at master · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md#setting-up-ml-agents-within-unity

Release ML-Agents Beta 0.10.0 · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/releases/tag/0.10.0

MacでanyenvをつかってPython環境構築(bash、fish対応) - Qiita
https://qiita.com/kai_kou/items/f54931991a781b96bb9c

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033