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

Unityで機械学習を利用するML-Agentsというライブラリがありますが、2019/08/02にv0.9.0(beta)がリリースされていたので試してみました。

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

確認しているうちにv0.9.1(beta)がリリースされました(汗

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

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での動作がサポートされています。3.5、3.7はサポートされていないのでご注意ください。(2019/08/09現在)

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.
>Download and install Python 3.6 if you do not already have it.


>We do not currently support Python 3.7 or Python 3.5.

お手元に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
> pyenv local 3.6.6
> python --version

Python 3.6.6


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

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

> pip install mlagents
```

はい。

v0.8.0からはPyPIからインストールするようになったみたいです。

mlagents · PyPI
https://pypi.org/project/mlagents/

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

>Splitting ML-Agents package into mlagents.trainers and mlagents.envs.


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

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

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

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

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

<img width="1001" alt="Unity_Hub.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/2bcdf91e-649e-6a71-3061-f7cfb8e89374.png">


Unityエディタのバージョンによっては、アップグレードするかの確認ダイアログが立ち上がります。
<img width="999" alt="スクリーンショット 2019-08-09 16.37.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/7f419ae8-4090-2f57-abc5-2ffa72eae602.png">

「Upgrade」ボタンをクリックして進めます。

アップグレード処理に少し時間がかかります。

<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="557" alt="Scenes選択" src="https://qiita-image-store.s3.amazonaws.com/0/48549/d77344b9-ba61-94ca-a515-88fd5ff6e199.png">

なんかでてきたー(感動
<img width="1679" alt="3DBall Scenes" src="https://qiita-image-store.s3.amazonaws.com/0/48549/a0f7d411-81a0-87c8-7171-27ff5e76c8be.png">

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

なんかうごいたー(感動
<img width="911" alt="3DBall Scenes Play" src="https://qiita-image-store.s3.amazonaws.com/0/48549/23f60e82-f51d-b691-f6a2-a224b0a5358c.png">

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


### 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">


### Prefabs(プレハブ)の設定

- Unityアプリの下にある[Project]タブから以下のフォルダまで開く
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Prefabs]
- Prefabsフォルダ内の[Game]をダブルクリックする
- Unityアプリの左側にある[Hierarchy]パネルから[Game] > [Pratform]を選択する
  <img width="911" alt="Unity" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/d3998e14-862f-741a-8780-c7526129dc4b.png">
- Unityアプリの右側にある[Inspector]パネルのBall 3D Agent(Script)にあるBrainが[3DBallLearning(LearningBrain)]であることを確認する
- [3DBallLearning(LearningBrain)]ではない場合、
    - [Project]タブから以下のフォルダまで開き、
        - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Brains]
    - [3DBallLearning]を[Inspector]パネルのBrainにドラッグ&ドロップして指定する
<img width="1347" alt="Unity" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/380b3277-b685-1335-86a9-d8f83854ff55.png">
- [Ctrl] + [s]キーでシーンを保存する
    - ※設定変更後、しっかりと保存しないと、ビルド時に設定が反映されなくてハマります。

#### Brainsの設定

- Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
- Unityアプリの左側にある[Hierarchy]パネルから[Ball3DAcademy]を選択する
- Unityアプリの右側にある[Inspector]パネルの[Broadcast Hub] > [Brains]に「3DBallLearning (LearningBrain)」が指定されていることを確認する
- 「3DBallLearning (LearningBrain)」横にある[Control]にチェックを入れる
<img width="1348" alt="Unity" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/3804c2c7-c7ba-1903-d19b-05230fe2a370.png">


### 学習させる

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


#### コマンドの実行

コンソールに戻り、学習開始のコマンドを実行します。`--run-id=firstRun` の`firstRun` は任意に決めてもらってOKです。

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

(略)
 '<trainer-config-path>': '../config/trainer_config.yaml'}
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="797" alt="スクリーンショット 2018-12-20 18.41.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/91227fb8-858c-ca5c-3fa6-5d6da5bdda7a.png">

```console
INFO:mlagents.envs:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
(略)
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
INFO:mlagents.envs:Hyperparameters for the PPOTrainer of brain 3DBallLearning:
        trainer:        ppo
(略)
INFO:mlagents.trainers: firstRun-0: 3DBallLearning: Step: 1000. Time Elapsed: 43.596 s Mean Reward: 1.150. Std of Reward: 0.680. Training.
(略)
INFO:mlagents.trainers: firstRun-0: 3DBallLearning: Step: 49000. Time Elapsed: 921.048 s Mean Reward: 100.000. Std of Reward: 0.000. Training.
INFO:mlagents.envs:Saved Model
INFO:mlagents.trainers: firstRun-0: 3DBallLearning: Step: 50000. Time Elapsed: 939.028 s Mean Reward: 100.000. Std of Reward: 0.000. Training.
(略)
INFO:tensorflow:Restoring parameters from ./models/firstRun-0/3DBallLearning/model-50001.cptk
INFO:tensorflow:Froze 14 variables.
Converted 14 variables to const ops.
Converting ./models/firstRun-0/3DBallLearning/frozen_graph_def.pb to ./models/firstRun-0/3DBallLearning.nn
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/firstRun-0/3DBallLearning.nn file.
INFO:mlagents.trainers:Exported ./models/firstRun-0/3DBallLearning.nn file
```


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


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


#### Unityアプリの設定

Playerの設定を行います。

- Unityアプリの[Edit]メニューから[Project Settings]を選択する
- [Inspector]ビューの[Other Settings]欄で以下を確認・設定する
    - [Scripting Runtime Version]を[.Net 4.x Equivalent]にする
<img width="632" alt="Unity" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/f5f4d17d-4d94-a8ad-7c98-8e8a8a78b62d.png">



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

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

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

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

```console
> cp models/firstRun-0/3DBallLearnig.nn ../UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels
```

- Unityアプリの[Project]パネルで以下ファイルを選択する
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Brains] > [3DBallLearning]
- Unityアプリの[Project]パネルで以下フォルダを選択する
    - [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
- Unityアプリの[Inspector]パネルにある[Model]という項目に[TFModels]フォルダ内の`3DBallLearning.nn`ファイルをドラッグ＆ドロップする
<img width="1351" alt="Unity" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/38137bb9-549d-e2bc-43a6-6f7c9709d713.png">
- Unityアプリの[Hierarchy]パネルから以下を選択する
    - [3DBall] > [Ball3DAcademy]
- Unityアプリの[Inspector]パネルにある[Broadcast Hub] > [Brains] > [3DBallLearning(LearningBrain)]横の[Control]のチェックを外す
<img width="1350" alt="Unity" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/515b7c71-0b56-98d8-466c-33be00bbeca1.png">
- Unity上部にある[▶]ボタンをクリックする

これで、学習結果が組み込まれた状態でアプリが起動します。
50,000ステップ学習すると動きが穏やかでもはやプロです。~~なんのプロかはわかりませんが^^~~

<img width="1677" alt="スクリーンショット 2018-09-13 12.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/5ac93f64-7289-bfc2-fe7c-41f8a8da796d.png">


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


## 参考

MacでUnity ML-Agentsの環境を構築する(v0.6.0対応) - Qiita
https://qiita.com/kai_kou/items/2a6545d1f9d83178d0c0

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

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

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

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

Using an Environment Executable
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Executable.md

Unityの公式サンプルml-agentsでAIを試す
http://am1tanaka.hatenablog.com/entry/2017/11/08/230525

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