【ML-Agents Release 17 環境構築 2021.5 -Windows】【強化学習でAIを避難させる】 #2  -Unity ML-Agents

#0. はじめに
どうも、Yuulisです。2021年の4月下旬に[ML-AgentsのRelease 17](https://github.com/Unity-Technologies/ml-agents/tree/release_17_branch)が公開されたので、今回はそれを導入していきます。

[ML-Agentsの公式ドキュメント](https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Installation.md)も参考に。英語ですが。

前回の記事はこちら。

https://qiita.com/Yuulis/items/0d9ea77bc47a73275f87


なお、この解説の前提条件は、
・**Unity 2020.3**以上がインストールされていること
・Anacondaがインストールされており、環境変数にAnacondaのPathが追加されていること

とします。

#1. ML-Agents toolkitをダウンロード
[Release 17のbranch](https://github.com/Unity-Technologies/ml-agents/tree/release_17_branch)からzipファイルをダウンロード。branchじゃないとダメっぽい。
![スクリーンショット 2021-05-08 125539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/e8d8545e-c9e6-0f8e-9395-cb460890dcd4.png)
好きなところに展開しておきます。

#2. Anacondaで仮想環境を構築
Anacondaを起動し、Python3.7を導入。**必ず3.6か3.7を導入**してください。

```
(base) C:\Users\Yuulis>conda create -n ML-Agents2 python=3.7.9 anaconda
```
ここでの仮想環境名は、``ML-Agents2``としました。

``Solving environment: ``と出て読み込みがされていれば成功です。環境によっては、ここで結構時間がかかるかもしれません。

#3. mlagentsパッケージとPyTorchをインストール

まずは、ML-Agentsのパッケージをインストールします。
次のコマンドで先ほど作成した仮想環境をアクティブ化します。

```
(base) C:\Users\Yuulis>conda activate ML-Agents2
```

``(ML-Agents2)``と一番左に出ていればOKです。

続いて、先ほどダウンロードしたmlagentsのディレクトリに移動し、mlagentsのパッケージを2つインストール。

```
(mlagents2) C:\Users\Yuulis>cd (ml-agents-release_17_branchのPath)
(mlagents2) C:\Users\Yuulis>cd ml-agents-envs
(mlagents2) C:\Users\Yuulis>pip install -e .

(mlagents2) C:\Users\Yuulis>cd ..
(mlagents2) C:\Users\Yuulis>cd ml-agents
(mlagents2) C:\Users\Yuulis>pip install -e .
```

インストールが終わったら、``pip freeze``で確認しときましょう。

```
# Editable install with no version control (mlagents==0.26.0)
-e c:\users\Yuulis\ml-agents\ml-agents-release_17_branch\ml-agents
# Editable install with no version control (mlagents-envs==0.26.0)
-e c:\users\yuulis\ml-agents\ml-agents-release_17_branch\ml-agents-envs
torch==1.7.1+cu110
```

こうなればOK。

次に、以下のコマンドでPyTorchをインストール。インストール場所はブランチのディレクトリ上です。

```
(mlagents2) C:\Users\Yuulis>pip install torch==1.7.1 -f https://download.pytorch.org/whl/torch_stable.html
```


#4. Unityにmlagentsパッケージをインストール
今度は、Unityにmlagentsのパッケージを入れます。
Unityで新しいプロジェクトを作ります。今回はUnity 2020.3.6f1を使用。
![スクリーンショット 2021-05-29 212853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/2e4a237a-c4f5-1f4e-11ad-de6008f96db0.png)


プロジェクトが開いたら、上の「ウィンドウ」から「Package Maneger」を選択。
![スクリーンショット 2021-05-08 142353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/a23444bf-c140-2479-327a-a3d825597e5f.png)
左上の+ボタンから、「Add package from disk...」を選択。
![スクリーンショット 2021-05-08 142613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/e2b58990-f0a1-d493-173e-0011ea162883.png)
``com.unity.ml-agents/package.json``と、``com.unity.ml-agents.extensions/package.json``を選択して導入。
![スクリーンショット 2021-05-08 142757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/539261cc-19ce-2b8a-faed-8236518e18e4.png)![スクリーンショット 2021-05-08 143426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/d0c916f7-775f-128e-4f9d-da7bbf527411.png)
Package Manegerの操作は完了。

そして、「ファイル」から「ビルド設定」、「プレイヤー設定」を選択。
![スクリーンショット 2021-05-08 143940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/7c900eda-9759-fff9-66ea-dbf73a6cd00c.png)![スクリーンショット 2021-05-08 144001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/150ae9a9-eb89-4f9e-e861-d27422fb4055.png)
謎のインポートが出ますが、終わるまで待って、「API 互換性レベル」のところを、「.NET 4.x」に変更。
![スクリーンショット 2021-05-08 144250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/5fd40029-5968-f4cb-5445-e6c854bab7e3.png)

ここまでで、UnityでMl-Agentsが使えるようになりました。

#5. サンプルを学習させてみる
##5-1. 学習の準備
では、サンプルを学習させてみます。

Release 17のサンプルを動かすには、いくつか追加でパッケージをインストールしなければいけません。
Package Manegerを開き、Input System 1.1.0 -preview.3をインストール。
![スクリーンショット 2021-05-29 213054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/91f50409-abf8-105e-06e3-a108eb3603fb.png)
インストール完了後、こんな警告が出るので、いったん「YES」を選択。Unityが再起動します。
![スクリーンショット 2021-05-11 182958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/0ff31b7a-0e82-bce5-9428-8b92b57d58c0.png)
しかし、これだと旧バージョンのInput Systemが使えないので、「ビルド設定」から「プレイヤー設定」を開き、「使用中の入力処理」を「両方(both)」に変更。
![スクリーンショット 2021-05-11 183441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/d5afd275-413f-27b7-5af7-81b4b523abab.png)
また警告が出るので、「Apply」を選択。Unityが再起動します。

さらに、ローカルフォルダで``ML-Agents2_test\Packages\manifest.json``を開き、``"com.unity.nuget.newtonsoft-json": "2.0.0"``の一行を追加します。
![スクリーンショット 2021-05-11 184635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/df84072e-8c04-672c-5a93-c8f44dd928de.png)
今度は、ダウンロードしたブランチのファイルから、``.\Project\Assets\ML-Agents``のフォルダをUnityのAssetsフォルダにドラッグアンドドロップ。
好きなモデルのシーンを選択してください。今回は、3DBallを試してみます。
ここでエラーが出る場合は、Unity上で```PushBlockWithInput```というフォルダを削除してみてください。
![スクリーンショット 2021-05-11 184916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/ca25c299-0894-e49e-42f3-2b077ce88a23.png)
「Play」ボタンを押すとこんな感じ。かわいい。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/b6a927d7-e802-ed1e-28a2-46126d668fc0.gif)

##5-2. 学習させてみる
Anaconda3で次のコマンドを打ちます。

```
# 仮想環境の起動
(base) C:\Users\Yuulis>conda activate mlagents2

(mlagents2) C:\Users\Yuulis>cd (ml-agents-release_17_branchのPath)
```
そして、次のコマンドで学習を実行します。

```
(mlagents2) C:\Users\Yuulis\ML-Agents\ml-agents-release_17_branch>mlagents-learn .\config\ppo\3DBall.yaml --run-id=test3DBall
```
こんな感じのアスキーアートが出たらOK。

```


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


 Version information:
  ml-agents: 0.26.0,
  ml-agents-envs: 0.26.0,
  Communicator API: 1.5.0,
  PyTorch: 1.7.1+cu110
[INFO] Listening on port 5004. Start training by pressing the Play button in the Unity Editor.
```
UnityのPlayボタンを押して、学習をスタート。高速で学習が進みます。
実行中のログはこんな感じ。

```
[INFO] 3DBall. Step: 12000. Time Elapsed: 37.150 s. Mean Reward: 1.158. Std of Reward: 0.748. Training.
[INFO] 3DBall. Step: 24000. Time Elapsed: 67.693 s. Mean Reward: 1.321. Std of Reward: 0.811. Training.
[INFO] 3DBall. Step: 36000. Time Elapsed: 104.730 s. Mean Reward: 1.813. Std of Reward: 1.146. Training.
[INFO] 3DBall. Step: 48000. Time Elapsed: 159.660 s. Mean Reward: 2.754. Std of Reward: 1.822. Training.
[INFO] 3DBall. Step: 60000. Time Elapsed: 187.318 s. Mean Reward: 4.802. Std of Reward: 4.031. Training.
[INFO] 3DBall. Step: 72000. Time Elapsed: 212.711 s. Mean Reward: 10.345. Std of Reward: 9.217. Training.
[INFO] 3DBall. Step: 84000. Time Elapsed: 237.549 s. Mean Reward: 27.109. Std of Reward: 26.229. Training.
[INFO] 3DBall. Step: 96000. Time Elapsed: 259.744 s. Mean Reward: 68.819. Std of Reward: 29.598. Training.
[INFO] 3DBall. Step: 108000. Time Elapsed: 281.904 s. Mean Reward: 78.619. Std of Reward: 35.049. Training.
[INFO] 3DBall. Step: 120000. Time Elapsed: 303.880 s. Mean Reward: 88.169. Std of Reward: 26.931. Training.
[INFO] 3DBall. Step: 132000. Time Elapsed: 328.001 s. Mean Reward: 94.977. Std of Reward: 17.400. Training.
[INFO] 3DBall. Step: 144000. Time Elapsed: 353.802 s. Mean Reward: 98.850. Std of Reward: 3.814. Training.
[INFO] 3DBall. Step: 156000. Time Elapsed: 380.172 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 168000. Time Elapsed: 410.259 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 180000. Time Elapsed: 437.282 s. Mean Reward: 95.615. Std of Reward: 15.189. Training.
[INFO] 3DBall. Step: 192000. Time Elapsed: 462.558 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 204000. Time Elapsed: 502.204 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 216000. Time Elapsed: 542.187 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 228000. Time Elapsed: 580.243 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 240000. Time Elapsed: 613.892 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 252000. Time Elapsed: 639.569 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 264000. Time Elapsed: 664.050 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 276000. Time Elapsed: 699.197 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 288000. Time Elapsed: 734.714 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 300000. Time Elapsed: 761.823 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 312000. Time Elapsed: 789.209 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 324000. Time Elapsed: 820.857 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 336000. Time Elapsed: 848.906 s. Mean Reward: 93.792. Std of Reward: 20.591. Training.
[INFO] 3DBall. Step: 348000. Time Elapsed: 872.485 s. Mean Reward: 98.331. Std of Reward: 5.782. Training.
[INFO] 3DBall. Step: 360000. Time Elapsed: 898.045 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 372000. Time Elapsed: 939.385 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 384000. Time Elapsed: 986.738 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 396000. Time Elapsed: 1043.034 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 408000. Time Elapsed: 1080.173 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 420000. Time Elapsed: 1112.859 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 432000. Time Elapsed: 1132.707 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 444000. Time Elapsed: 1163.200 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 456000. Time Elapsed: 1198.443 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 468000. Time Elapsed: 1229.967 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 480000. Time Elapsed: 1259.384 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
[INFO] 3DBall. Step: 492000. Time Elapsed: 1287.441 s. Mean Reward: 100.000. Std of Reward: 0.000. Training.
```

3DBallでは50万stepで学習が終わります。
終わったら、ブランチのディレクトリの中に``.\resluts\test3DBallRun\3DBall.onnx``というファイルができていると思います。これをUnityのヒエラルキーウィンドウの以下のところにドラッグアンドドロップ。
![スクリーンショット 2021-05-29 214220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/1706bdde-0dde-8d4e-9d2d-0a342d637d88.png)
名前を``3DBall_test``に変えときました。

##5-3. 学習結果をグラフでチェック
学習後、次のコマンドで学習結果をグラフで見ることができます。

```
(ML-Agents2) C:\Users\Yuulis\ML-Agents\ml-agents-release_17_branch>tensorboard --logdir results
```

こんな感じにlocalhostのリンクが出るので、コピペしてアクセス。

```
TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.5.0 at http://localhost:6006/ (Press CTRL+C to quit)
```

私の環境ではこんなグラフになりました。
![スクリーンショット 2021-05-29 215646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1285757/f9f9b711-caaa-c32f-5e16-3a7b944c27db.png)

以上で環境構築は完了です。

#6. 終わりに
今回は、ML-Agents Release 17の環境構築をしてみました。環境構築はエラーとの戦いといっても過言ではありません。エラーが出たらコピペしてググるか、[Unity ML-Agentsの公式フォーラム](https://forum.unity.com/forums/ml-agents.453/)で質問してみるのも一つの手です。Unity公式の方が教えてくれるはずです。

最後までお読みいただきありがとうございました。