物理エンジンの中で機械学習するのってめっちゃ楽しそうだし憧れがありました。 UnityのML-Agentsを使うとゲームをプレイさせたり歩き方を覚える強化学習が簡単に実行できます。 勢いで始めてUnityにも始めて触ったんですが、直ぐに学習することができました。 サンプルも種類がたくさんあって動かしてるだけでも楽しいです。
日本語の情報がちょっと少ないので環境構築のメモを残します。
2021-07-22追記 Unityのcom.unity.ml-agentsパッケージのインストール手順が間違ってたので修正。
Unity ML-Agentsで新しく学習環境を作る - suzu6ではサンプルにない学習環境を作って学習してます。
Unityの機械学習
UnityからML-Agentsという機械学習のツールが公開されています。 Unity 機械学習ではML-Agentsを使ってどんなことができるのかブログや作品がまとまってます。日本語はトップだけですが動画付きで自動翻訳だけでも十分イメージがつくかと思います。
ML-AgentsはGitHubで公開されています。 ml-agents github
ML-Agentsでは機械学習のベースにPyTorch
を利用しています。
バージョン0.1ぐらいの時ではTensorflow
を使っていたようで、調べたときに情報が錯綜してました。
環境構築の手順
最新のstableバージョンのRelease 12
を利用します。
release_12_docsを参考にインストールしていきます。
出来上がる環境
- Unity 2019.4
- Python 3.6.4 (Anaconda 4.9.2)
- ML-Agents Release 12
- mlagents 0.23.0 (pip Package)
- com.unity.ml-agents 1.7.2-preview (Unity Package)
ML-AgentsのReleaseはUnityとPythonのパッケージをまとめたバージョンとなっています。
手順のまとめ
- Unityをインストール (2018.4 or later)
ML-Agents Toolkit
のリポジトリをクローンまたはダウンロード- Pythonをインストール (3.6.1 or higher)
- Pythonに
mlagents
パッケージをインストールする - PyTorchをインストールする
- Unityに
com.unity.ml-agents
パッケージをインストールする。
Windows 10で実施しましたがMacやLinuxでもほぼ同様の手順で大丈夫かと思います。 PythonはAnacondaを利用してインストールしました。
Unityをインストール
Unity StoreからUnity Hubをインストールする。
設定でアカウントの作成と新規ライセンスの認証をします。 個人の趣味の範囲で利用するためライセンスはPersonalを選択しました。ml-agentsもPersonalプランで利用可能です。
Unity HubのインストールメニューからUnityのLTSをインストールします。 2019.4.17f1 (LTS) を選択しました。
ML-Agents Toolkit
のリポジトリをクローンまたはダウンロード
UnityとPythonのパッケージとして利用するためローカルに持ってきます。 クローンでもダウンロードでもどちらでもよいです。
リポジトリをクローンする場合
> cd path/to/dir
> git clone --branch release_12 https://github.com/Unity-Technologies/ml-agents.git
zipでダウンロードする場合
Relese12から緑のボタンのCode
を開くとDownload ZIP
があるのでそこからダウンロードする。
ダウンロード出来たら好きなところに展開しておく。
Pythonをインストール
Anacondaで環境を作りました。 始めはPython 3.9で進めようとしたがmlagentsに必要なパッケージのnumpyが3.9に対応してないため入れ直している。
Anacondaからダウンロードしてインストールする。 インストールして設定までの手順はPython Japanのガイドがわかりやすい。
インストール出来たら環境変数にAnacondaのPathを追加します。
%UserProfile%\Anaconda3\Scripts
%UserProfile%\Anaconda3
\Anaconda3
と \Anaconda3\Scripts
のパスを追加します。
Anaconda3
のパスは環境に合わせて変更して下さい。
AnacondaをインストールしたらPowershellを開いて Python 3.6を導入します。
(base) PS C:\Users\suzu6> conda create -n mlagents python=3.6.7 anaconda
(base) PS C:\Users\suzu6> conda activate mlagents
# (mlagents)となればOK
(mlagents) PS C:\Users\suzu6>
(base)
と表示がない場合は環境変数が通っていないかもしれません。
また、Windows限定でですがInstalling ML-Agents Toolkit for WindowsでもAnacondaのインストール方法が紹介されています(英語)。こちらではNvidia CUDA toolkitの導入も載っておりGPUを利用できます。
Pythonにmlagentsパッケージをインストールする
Installing ML-Agents Toolkit for Windows (Deprecated)を参考にしています。
# condaをactivate
(base) PS C:\Users\suzu6> conda activate mlagents
(mlagents) PS C:\Users\suzu6>
# (mlagents)となればOK
> pip install mlagents mlagents-envs
# tensorflowもインストールする
> pip install tensorflow==1.7.1
tensorflowのバージョンは適宜修正してください。
インストールしているモジュールに関しては以下のpypi.orgのリンクを参照してください。
GPUの設定は今回していない。
記録として以前紹介していた間違った方法を残します。
Install for Developmentの方法でインストールした。
ml-agents
のディレクトリの配下に /ml-agents
と/ml-agents-envs
のPythonのパッケージがあるのでこの2つをインストールします。
# condaをactivate
(base) PS C:\Users\suzu6> conda activate mlagents
(mlagents) PS C:\Users\suzu6>
# (mlagents)となればOK
# クローンしたパスへ移動する。
> cd C:/Downloads/ml-agents
# ダウンロードした場合のパスはこんな感じ。
> cd C:/Downloads/ml-agents-release_12_branch
# ローカルのパッケージを2つインストールする
> cd ml-agents-envs
> pip install -e .
> cd ..
> cd ml-agents
> pip install -e .
pip freeze
でインストールしたパッケージ一覧を確認できる。
(mlagents) > pip freeze
...
-e git+https://github.com/Unity-Technologies/ml-agents.git@2335fc7cb22f88f2e266cc128c7d66d8858dc73f#egg=mlagents&subdirectory=ml-agents
-e git+https://github.com/Unity-Technologies/ml-agents.git@2335fc7cb22f88f2e266cc128c7d66d8858dc73f#egg=mlagents_envs&subdirectory=ml-agents-envs
...
-e
でインストールはこんな風になるらしい。。。
このインストール方法だと、学習の実行時に以下のエラーが出る。
Traceback (most recent call last):
File "C:\Users\suzu6\anaconda3\envs\mlagents2\Scripts\mlagents-learn-script.py", line 33, in <module>
sys.exit(load_entry_point('mlagents', 'console_scripts', 'mlagents-learn')())
File "C:\Users\suzu6\anaconda3\envs\mlagents2\Scripts\mlagents-learn-script.py", line 22, in importlib_load_entry_point
for entry_point in distribution(dist_name).entry_points
AttributeError: 'PathDistribution' object has no attribute 'entry_points'
PyTorchをインストールする
機械学習ライブラリのPyTorchをインストールします。
(mlagents) > pip install torch==1.7.0 -f https://download.pytorch.org/whl/torch_stable.html
Unityに com.unity.ml-agents パッケージをインストールする
Unityにml-agentsのパッケージをインストールします。
- Unityを起動し、Unityのプロジェクトを「3D」で新規作成。
レイアウトを右上のLayoutから2by3に変更しました。
-
メニュー「Window → Package Manager」を開き、「+ → Add package from disk」を選択し、「com.unity.ml-agents/package.json」を選択します。
-
プロジェクトの.NET を有効化する。
Editメニューから、Project Settings > Playerを選択します。 以下を、利用したいプラットフォームごとに実施します。
Other Settingsを開きます Scripting Runtime VersionがExperimental、あるいは .NET 4.6 Equivalent、あるいは.NET 4.x Equivalentにします Restartするかのウィンドウが表示されたら、Restartします Unityが一度閉じて再起動するのを待ってください。これでエラーが出なくなります。
※ 公式ドキュメントではこの手順が抜けていたためusing ML-Agents
でnamespaceが解決できないエラーが出ました。
2021-07-22追記 4. AssetsにML-Agentsのパッケージを追加
クローンしていたものの .\ml-agents\Project\Assets\
にあるML-Agents
フォルダをプロジェクトのAssetsに置きます。
namespaseエラーが出ている場合はこちらを試してください。
こちらでもML-Agentsのパッケージを追加する方法を書いています。
以上でUnityのセットアップが終わります。
学習してみる
ML-Agentsのアセットを使ってサンプルを学習してみます。 Getting Started Guideを参考にバランスを学習する3DBallを学習してみます。
サンプルのシーンを先ほど作ったプロジェクトに追加します。
ml-agents\Project\Assets\ML-Agents
をAssetsに置きます。
まず、3DBallを実行してみます。
ProjectのタブでAssets\ML-Agents\Examples\3DBall\Scenes
から3DBallのシーンを選択します。プレイボタンで学習済みのモデルを使ったシミュレーションが実行できます。
Training ML-Agentsに学習についての詳細が載ってます。 学習で詰まったら一読してみてください。
トレーニングの実行
サンプルが動くことが確認できたので、学習してみます。
学習するモデルの設定がml-agents/config/ppo/3DBall.yaml
にあるのでこれを使います。
まず、PowershellでAnacondaの環境を開いて、mlagents-learn
を実行します。
# condaをactivate
(base) PS C:\Users\suzu6> conda activate mlagents
(mlagents) PS C:\Users\suzu6>
# (mlagents)となればOK
> cd path\to\ml-agents-release_12_branch
> mlagents-learn config/ppo/3DBall.yaml --run-id=test3DBallRun
C:\Users\suzumura\anaconda3\envs\mlagents\lib\site-packages\torch\cuda\__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at ..\c10\cuda\CUDAFunctions.cpp:100.)
return torch._C._cuda_getDeviceCount() > 0
▄▄▄▓▓▓▓
╓▓▓▓▓▓▓█▓▓▓▓▓
,▄▄▄m▀▀▀' ,▓▓▓▀▓▓▄ ▓▓▓ ▓▓▌
▄▓▓▓▀' ▄▓▓▀ ▓▓▓ ▄▄ ▄▄ ,▄▄ ▄▄▄▄ ,▄▄ ▄▓▓▌▄ ▄▄▄ ,▄▄
▄▓▓▓▀ ▄▓▓▀ ▐▓▓▌ ▓▓▌ ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌ ╒▓▓▌
▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓ ▓▀ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▄ ▓▓▌
▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄ ▓▓ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▐▓▓
^█▓▓▓ ▀▓▓▄ ▐▓▓▌ ▓▓▓▓▄▓▓▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▓▄ ▓▓▓▓`
'▀▓▓▓▄ ^▓▓▓ ▓▓▓ └▀▀▀▀ ▀▀ ^▀▀ `▀▀ `▀▀ '▀▀ ▐▓▓▌
▀▀▀▀▓▄▄▄ ▓▓▓▓▓▓, ▓▓▓▓▀
`▀█▓▓▓▓▓▓▓▓▓▌
¬`▀▀▀█▓
Version information:
ml-agents: 0.23.0,
ml-agents-envs: 0.23.0,
Communicator API: 1.3.0,
PyTorch: 1.7.0+cu110
2021-01-14 00:09:16 INFO [learn.py:275] run_seed set to 5620
C:\Users\suzumura\anaconda3\envs\mlagents\lib\site-packages\torch\cuda\__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at ..\c10\cuda\CUDAFunctions.cpp:100.)
return torch._C._cuda_getDeviceCount() > 0
2021-01-14 00:09:21 INFO [environment.py:205] Listening on port 5004. Start training by pressing the Play button in the Unity Editor.
--run-id
は学習を一意に決めるIDで、途中から学習したり学習効率を比較するのに使います。
mlagents-learn
を実行すると5004ポートを開けて待機状態になる。
Unityの3DBallのシーンでプレイボタンを押すと、学習を始めます。
学習中のログ。
3DBall.yaml
の設定値も出ています。
2021-01-14 00:09:43 INFO [environment.py:111] Connected to Unity environment with package version 1.7.2-preview and communication version 1.3.0
2021-01-14 00:09:43 INFO [environment.py:271] Connected new brain:
3DBall?team=0
2021-01-14 00:09:43 INFO [stats.py:147] Hyperparameters for behavior name 3DBall:
trainer_type: ppo
hyperparameters:
batch_size: 64
buffer_size: 12000
learning_rate: 0.0003
beta: 0.001
epsilon: 0.2
lambd: 0.99
num_epoch: 3
learning_rate_schedule: linear
network_settings:
normalize: True
hidden_units: 128
num_layers: 2
vis_encode_type: simple
memory: None
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
init_path: None
keep_checkpoints: 5
checkpoint_interval: 500000
max_steps: 500000
time_horizon: 1000
summary_freq: 12000
threaded: True
self_play: None
behavioral_cloning: None
framework: pytorch
2021-01-14 00:10:04 INFO [stats.py:139] 3DBall. Step: 12000. Time Elapsed: 47.133 s. Mean Reward: 1.136. Std of Reward: 0.670. Training.
2021-01-14 00:10:36 INFO [stats.py:139] 3DBall. Step: 24000. Time Elapsed: 79.293 s. Mean Reward: 1.281. Std of Reward: 0.783. Training.
2021-01-14 00:11:06 INFO [stats.py:139] 3DBall. Step: 36000. Time Elapsed: 109.718 s. Mean Reward: 1.806. Std of Reward: 1.116. Training.
2021-01-14 00:11:37 INFO [stats.py:139] 3DBall. Step: 48000. Time Elapsed: 140.264 s. Mean Reward: 2.763. Std of Reward: 2.053. Training.
2021-01-14 00:12:07 INFO [stats.py:139] 3DBall. Step: 60000. Time Elapsed: 170.701 s. Mean Reward: 4.412. Std of Reward: 3.909. Training.
2021-01-14 00:12:37 INFO [stats.py:139] 3DBall. Step: 72000. Time Elapsed: 200.760 s. Mean Reward: 8.648. Std of Reward: 8.444. Training.
2021-01-14 00:13:12 INFO [stats.py:139] 3DBall. Step: 84000. Time Elapsed: 235.244 s. Mean Reward: 20.314. Std of Reward: 16.167. Training.
Ctrl
+ C
で学習を止めモデルを保存できる。
学習を再開する
学習を再開したい場合は > mlagents-learn config/ppo/3DBall.yaml --run-id=test3DBallRun --resume
とすると前回のステップ数から再開します。
設定値や環境を変更したらステップ学習できるかもしれない。
学習曲線を表示する
tensorboard --logdir results
で学習曲線を表示することができます。
> conda activate mlagents
> cd {mlagents-learnを実行したパス}
> tensorboard --logdir results
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.4.0 at http://localhost:6006/ (Press CTRL+C to quit)
コマンドを実行してhttp://localhost:6006/を開くとグラフが確認できる。
Walkerを学習してみる
Walkerを学習したときのコマンドのメモ。
# anaconda
> conda create -n mlagents python=3.6.7 anaconda
> conda activate mlagents
> cd C:\git\unity\ml-agents-release_12_branch
> mlagents-learn config/ppo/WalkerStatic.yaml --run-id=runWalkerStatic
# play unity
# 学習を確認
> tensorboard --logdir results
# 学習を再開
> mlagents-learn config/ppo/WalkerStatic.yaml --run-id=runWalkerStatic --resume
# play unity
# 前の学習を破棄して新しく
> mlagents-learn config/ppo/WalkerStatic.yaml --initialize-from=runWalkerLegsStatic
おわりに
手順が結構多いのでエラーで進めなくなるかもしれません。 公式の手順の確認や質問サイトで解決してください。 また、twitter @suzu6_pyで聞いてもらえれば一緒に考えることはできます。
Unity ML-Agentsで新しく学習環境を作る - suzu6ではサンプルにない学習環境を作って学習してます。
参考
日本語で参考になったサイト
ML-Agentsについての書籍のレビュー