Unity ML-Agents を動作させるための環境構築を行います。
Unity ML-Agents 実践ゲームプログラミング v2.2対応版 | 株式会社ボーンデジタル
上記の書籍の 2 章をもとに作業していますが、個人の環境に合わせているためかなり異なっています。
環境
- Win 11 Home
- Python 3.9.18
- ML-Agents Release 20
- CUDA Toolkit 11.8
- PyTorch 2.0.0
Python のパッケージ管理は 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"
上記の 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 shell
は Windows では使えないらしいです。
ということで、素直に 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 形式で保存でき、かつそれを使った推論まで実行することができました 🎉🎉