Unity+ML-Agentsで強化学習環境の構築
Unity+ML-Agentsで強化学習
Unityで強化学習をやりたくなったので、セットアップしてみました。
公式のマニュアルは以下です。
ただ、凄い丁寧というわけではないので、Unity全然知らない自分は、結構悩んで色々なサイトのやり方を試行錯誤したり、バージョン違いに苦しみながらセットアップしました。メモとして残しておきます。
環境は、Intel Mac/Apple Silicon Mac/Linux/Windows(WSL2)を想定しています。Linux(Ubuntu)はまだ試していませんが、同じ要領でセットアップできると思います。
実際に、学習まで実施するには、以下の5ステップが必要です。
- Python環境セットアップ
- ML-Agentsセットアップ
- Unityインストール
- UnityでML-Agentsを使う
- mlagents-learnで学習テスト
順に説明していきます。
Python環境セットアップ
pyenvかMiniForgeで環境を構築します。
pyenvは以下記事参照ください。
MiniForgeに関しては以下記事参照にセットアップしてください。
ML-AgentsはバックエンドとしてPyTorchを使います(以前はTensorFlowでしたが、途中でPyTorchに変更になりました)。PyTorchもインストールしておきましょう。Intel Mac/Linuxはpipで簡単に入りますが、Apple Silicon(M1) Macの場合は、以下記事のPyTorchのインストールの箇所を参考にセットアップしましょう。
ML-Agentsセットアップ
ターミナル(WindowsはWSL2上)で、以下コマンドを実行してセットアップします。
$ mkdir mla_test && cd mla_test
$ git clone --depth 1 --branch release_18 https://github.com/Unity-Technologies/ml-agents.git
$ cd ml-agents
$ git checkout -b release_18
$ pip install -e ./ml-agents-envs
$ pip install -e ./ml-agents
Unityインストール
たくさんネットに情報ありますが、以下が参考になりました。
MacのHomebrewでインストールする場合は、以下コマンドとなります。
$ brew install unity
Linuxの場合は、以下を参考にしました。
UnityのサイトからUnityHub.AppImage
をダウンロードして、適当な場所~/Unity
に移動して、実行権限を与えから実行しましょう。実行権限を与えないといけないのがポイントです。GUIを使わずコマンドで実施する場合は以下です。
$ chmod 755 UnityHub.AppImage
$ ./UnityHub.AppImage
VS Codeエディタが好きなので「External Script Editor」の設定はVS Codeエディタにしてみました。VS Codeエディタ自体に関しては、以下記事参照ください。
VS CodeエディタのUnityでの使い方に関しては、以下記事が参考になりそうです。
UnityでML-Agentsを使う
Unity Hubを開き、「リストに追加」をクリックし mla_test/ml-agents/Project
を選択します。ML-Agents関係のAssetsが読み込まれて起動します。
UnityのAssetsでAssets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity
をダブルクリックで開くと、以下のように表示されます。
学習済みのモデルが設定されているので、実行すると以下のようにボールが落ちないようにバランスを取っているのが見られます。
mlagents-learnで学習テスト
次は自分で学習させてみましょう。学習にはmlagents-learn
というソフトを使うのが簡単なので試してみます。
ml-agents
フォルダで、以下コマンドを実行します。
$ mlagents-learn config/ppo/3DBall.yaml --run-id=test3DBallRun
実行するたびにrun-id
は変えてください。続きから実施する場合は--resume
オプションをつけましょう。
GPU関係のエラーが出る場合は、CUDAのセットアップするか--torch-device
オプションでcpuを指定しましょう。
$ mlagents-learn config/ppo/3DBall.yaml --run-id=test3DBallRun --torch-device cpu
Unityを再生しろというメッセージが表示されるので、Unityの再生ボタンをクリックすればOKです。
以下のように凄い勢いで学習が始まります。
ログ確認
学習を実行するとresults
ディレクトリ以下に指定したrun-id
でディレクトリが作成され、その下にログが格納されます。ログを確認したい場合は、以下のようにtensorboardで確認します。
$ tensorboard --logdir results/<run-id>
エラー対応
実行した際、環境によってはエラーが出るかもしれません。
Symbol not found:
が表示された場合は、以下コマンド実行しましょう。
$ conda install grpcio
参考: Symbol not found: _deflate from grpc 1.12.0 #15510
OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
とエラーが表示された場合は、mlagents-learn
のコードを修正します。
まず、ファイルの場所を調べます。
$ which mlagents-learn
私の環境では、/Users/karaage/miniforge3/envs/python38/bin/mlagents-learn
だったので、エディタで修正します。具体的には、以下2行を追加すればOKでした。
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
参考: OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized.
まとめ
UnityとML-Agentsで強化学習のサンプルを動かすところまでやってみました。Unity、ハマると大変そうだと思ってなかなか手を出せずにいたのですが、いよいよ少し試してみようかなと思っています。
しかし、Unity少し触っているのですがバージョン違いなどによる問題がディープラーニング並みに大変な予感…
参考リンク
関連記事
Discussion