Unity ML-Agents の環境構築

Unity ML-Agents を動作させるための環境構築を行います。

Unity ML-Agents 実践ゲームプログラミング v2.2対応版 | 株式会社ボーンデジタル

上記の書籍の 2 章をもとに作業していますが、個人の環境に合わせているためかなり異なっています。

環境

Python のパッケージ管理は Rye を使っています。

Installation - Rye

プロジェクト作成

3.9 系にしてプロジェクトを構成します。

rye init hello_unity_ml
cd hello_unity_ml
rye pin 3.9
rye sync

PyTorch の追加

Previous PyTorch Versions | PyTorch

今回は v2.0.0 を使います。特にこれに意図はありませんが、とりあえず2 系にしたかったぐらいです。(この記事公開時点だとマイナーバージョンがもう少しあがっています)

Conda ではないので、pip であれば以下になることがわかります。

# CUDA 11.8
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118

rye はデフォルトでは PyPI しか対象にしないのですが、バージョンの後に + を付ける場合は、PyPI に無いようなので以下を pyproject.toml に追加します。

[[tool.rye.sources]]
name = "torch"
url = "https://download.pytorch.org/whl/cu118"
type = "index"

Dependency Sources - Rye

上記の project source として追加している形になります。

では改めて、それぞれを追加していきます。

rye add "torch==2.0.0+cu118"
rye add "torchvision==0.15.1+cu118"
rye add "torchaudio==2.0.1"

ml-agents の追加

ml-agents は rye のプロジェクトディレクトリの隣にある状態です。

+ hello_unity_ml/
+ ml-agents-release_20/
  + ml-agents/
  + ml-agents-envs/

こちらも rye add していきます。ローカルなので path で追加します。

rye add mlagents --path ..\ml-agents-release_20\ml-agents
rye add mlagents-envs --path ..\ml-agents-release_20\ml-agents-envs

ここまでで pyproject.toml の dependencies は以下のようになっています。

dependencies = [
    "torch==2.0.0+cu118",
    "torchvision==0.15.1+cu118",
    "torchaudio==2.0.1",
    "mlagents @ file:///D:/UnityProjects/hello_unity_ml/../ml-agents-release_20/ml-agents",
    "mlagents-envs @ file:///D:/UnityProjects/hello_unity_ml/../ml-agents-release_20/ml-agents-envs",
]
rye sync

これで一旦完了です。(が、実際にはこれでは不十分でした 😓

プロジェクトの動作確認

書籍の 2-2, 2-3 で Unity 側の準備はされているものとします。

そして 2-4 で実際に学習を行います。

mlagents-learn の実行

これは Python の仮想環境での実行となっているのですが、mlagents-learn は ml-agents の方にあるので、rye のプロジェクトの外にあります。

なので、 rye shell して仮想環境を持ったままディレクトリを移動しようとしますが、、、

Windows 11 environment seems to be getting misconfigured · Issue #349 · astral-sh/rye · GitHub

rye shellWindows では使えないらしいです。

ということで、素直に venv を activate します。(ここで、いつも使っている nushell ではうまくいかず、Powershell コンソールを起動する必要がありました 🤣)

.\.venv\Scripts\activate
# hello_unity_ml から隣の ml-agents のディレクトリを移動
cd ..\ml-agents-release_20\
mlagents-learn .\config\samples\RollerBall.yaml --run-id=RollerBall-1

さっそく protobuf のエラーが出ました。3.20.x にしろと出ていたのでバージョンを下げます。

rye add "protobuf==3.20"
rye sync

すると無事実行できたようです 🍻

            ┐  ╖
        ╓╖╬│╡  ││╬╖╖
    ╓╖╬│││││┘  ╬│││││╬╖
 ╖╬│││││╬╜        ╙╬│││││╖╖                               ╗╗╗
 ╬╬╬╬╖││╦╖        ╖╬││╗╣╣╣╬      ╟╣╣╬    ╟╣╣╣             ╜╜╜  ╟╣╣
 ╬╬╬╬╬╬╬╬╖│╬╖╖╓╬╪│╓╣╣╣╣╣╣╣╬      ╟╣╣╬    ╟╣╣╣ ╒╣╣╖╗╣╣╣╗   ╣╣╣ ╣╣╣╣╣╣ ╟╣╣╖   ╣╣╣
 ╬╬╬╬┐  ╙╬╬╬╬│╓╣╣╣╝╜  ╫╣╣╣╬      ╟╣╣╬    ╟╣╣╣ ╟╣╣╣╙ ╙╣╣╣  ╣╣╣ ╙╟╣╣╜╙  ╫╣╣  ╟╣╣
 ╬╬╬╬┐     ╙╬╬╣╣      ╫╣╣╣╬      ╟╣╣╬    ╟╣╣╣ ╟╣╣╬   ╣╣╣  ╣╣╣  ╟╣╣     ╣╣╣┌╣╣╜
 ╬╬╬╜       ╬╬╣╣      ╙╝╣╣╬      ╙╣╣╣╗╖╓╗╣╣╣╜ ╟╣╣╬   ╣╣╣  ╣╣╣  ╟╣╣╦╓    ╣╣╣╣╣
 ╙   ╓╦╖    ╬╬╣╣   ╓╗╗╖            ╙╝╣╣╣╣╝╜   ╘╝╝╜   ╝╝╝  ╝╝╝   ╙╣╣╣    ╟╣╣╣
   ╩╬╬╬╬╬╬╦╦╬╬╣╣╗╣╣╣╣╣╣╣╝                                             ╫╣╣╣╣
      ╙╬╬╬╬╬╬╬╣╣╣╣╣╣╝╜
          ╙╬╬╬╣╣╣╜
             ╙

 Version information:
  ml-agents: 0.30.0,
  ml-agents-envs: 0.30.0,
  Communicator API: 1.5.0,
  PyTorch: 2.0.0+cu118
[INFO] Listening on port 5004. Start training by pressing the Play button in the Unity Editor.

実行してみる

書籍の指示通り、Unity Editor からプレイしてみます。うまく学習をしているように見え、 Mean Reward が 1.0 に到達したので停止すると、、

[INFO] RollerBall. Step: 161000. Time Elapsed: 2047.522 s. Mean Reward: 1.000. Std of Reward: 0.000. Training.
[INFO] Learning was interrupted. Please wait while the graph is generated.
============= Diagnostic Run torch.onnx.export version 2.0.0+cu118 =============
verbose: False, log level: Level.ERROR
======================= 0 NONE 0 NOTE 0 WARNING 0 ERROR ========================

Traceback (most recent call last):
  File "D:\UnityProjects\hello_unity_ml\.venv\lib\site-packages\torch\onnx\_internal\onnx_proto_utils.py", line 219, in _add_onnxscript_fn
    import onnx
ModuleNotFoundError: No module named 'onnx'

上記のエラーが発生しました。 onnx が無い。これは何でしょうか。

GitHub - onnx/onnx: Open standard for machine learning interoperability

これっぽい。

rye add onnx
rye sync

この後、numpy やらのバージョンのミスマッチがいくつか出た結果、protobuf のバージョン固定も外すことでシンプルに解決できました。よって、dependencies は以下のような感じです。

dependencies = [
    "torch==2.0.0+cu118",
    "torchvision==0.15.1+cu118",
    "torchaudio==2.0.1",
    "mlagents @ file:///D:/UnityProjects/hello_unity_ml/../ml-agents-release_20/ml-agents",
    "mlagents-envs @ file:///D:/UnityProjects/hello_unity_ml/../ml-agents-release_20/ml-agents-envs",
    "protobuf",
    "onnx",
]

これでうまく学習結果を onnx 形式で保存でき、かつそれを使った推論まで実行することができました 🎉🎉