ML-Agentsの学習を高速化する
前回の学習ではUnity Editor上で単体のエージェントで学習させていたが、学習を高速化するために
- 学習環境をビルドしてアプリ化して実行する
- 学習環境を複数同時起動する
- 1つの環境内に複数のエージェントを配置して学習する
という3つの方法が参考文献の2章の2-5で紹介されている。3の手法についてはPythonの操作的にも前回の記事と変わらないので今回は行わず、1、2のアプリ化&アプリ複数同時起動の2つの手法で学習の高速化をやってみたいと思う。
私は開発にWindows PCを使っているので、今回は学習環境をWindowsアプリとしてビルドしたが、MacやLinuxを使っている人もビルドを自分のOSに合わせて変えれば、同様の方法で学習はできるはず。
実行環境
Windows 10 64bit
Unity 2020.3.25f1
Anaconda 4.6.11 (Python 3.7.3)
ML-Agents Release 18
UnityにWindowsアプリのモジュールをインストールしてビルドする
学習環境はUnity 2020.3.25f1で作っているが、UnityにWindowsアプリにビルドするためのモジュールを入れてなかったので、まずはビルドするためにモジュールをインストールする。
…のだが、私は最初からインストールしていた。もしまだインストールしてない場合は、Unity Hubのインストールタブから使いたいバージョンのUnityを選択し、歯車マークをクリックして「モジュールを加える」で追加すればOK。LinuxやMacを使っている人は、自分の環境に対応したモジュールをインストールしてビルドすればOKだと思う。
インストールしたらUnityで前回のプロジェクトを開き、メニューのFile → Build Settingsを開く。
学習環境のシーンを開いていれば「Add Open Scenes」でビルド対象に学習環境を追加し、以下のようにWindows 10 64bitの設定にしてBuildをクリックする。あとはBuildしたアプリの作成先ディレクトリを選択してビルドすればOK。
作成された.exeファイルをダブルクリックすればアプリをWindowsアプリとして実行できるようになる。
アプリで学習を実行する
あとは前回と同様にpythonで学習を実行する。アプリで学習実行する場合は、mlagents-learnコマンドで先ほどの.exeファイルのパスを指定する。
私はAnaconda Promptでml-agentsディレクトリに移動した後に、以下のコマンドを実行した。MLballが今回ビルドしたアプリの名前で、–envで絶対パスでexeファイルを指定する。
# mlagents-learn ./config/sample/RollerBall.yaml --run-id=app1agent --env=MLball
なお、Windowsアプリの場合は.exeだけコピーして別のディレクトリに持って行ってもdllエラーが出るので、コピーする場合はビルドされたファイル一式まるごとコピーする必要がある。また、Anacondaで仮想環境を使っている場合は、実行前にactivateで環境を切り替えるのを忘れずに。
実行すると以下のように小さなwindowでゲームが実行されて学習が進んでいく。デフォルトでは画面の幅、長さは84pixelに指定されているとのことだが、–width、–heightオプションで指定することも可能。基本的には小さいほうが学習は早く進むはず。
また、今回は試していないが–no-graphicsのオプションをつけて実行すると画面表示が無しになり、さらに高速化されるとのこと。ただ、カメラやレンダリングテクスチャの画像を使う学習の場合はこのオプションは使えないので注意。
今回の学習環境ではエピソードごとに箱とボールがランダムな位置に配置されるため、学習ごとに学習速度はかなりバラつく。そのためアプリ化によりどの程度学習時間が短縮されるか確認するのは難しいが、目安として前回Unity Editorで実行してみた場合と、Windowsアプリで実行してみた場合で平均報酬(Mean Reward)が1.000になるまでの時間を比較すると
- Unity Editorで実行:446秒
- Windowsアプリで実行:294秒
となっており、かなり短くなっているように見える。
アプリを複数起動して学習を実行する
アプリだけでも実行が早くなったが、アプリを同時に複数起動して学習を実行するとさらに早くなるということなので、以下のように–num-envsオプションでアプリ数を8にして同時並行で復習してみた。
# mlagents-learn ./config/sample/RollerBall.yaml --run-id=app-8agent --env=C:/UnityProjects/MLball/App/MLball --num-envs=8
実行すると、以下のようにアプリが8個同時に立ち上がって学習が進む。
この場合だと、平均報酬が1.000になるまでの時間は85秒で、さらに学習時間が短くなった。Unity Editor上で学習するよりもかなり早くなるので、今後学習環境をつくって何度か学習をしないといけないときはアプリ化して、複数アプリを立ち上げて学習しようと思う。
次回は学習状況の統計情報をグラフィカルに確認することが出来るTensorBoardというツールを使って、学習の詳細を確認してみたいと思う。
参考文献
基本的には以下の本を読みつつ勉強していき、最終的には自分で何かしらゲームを作っていく予定。最低限ML-Agentsを使うための流れはブログで書いていこうと思っているが、詳細については説明しないので、深く理解するには本を買って勉強してみることをオススメする。
古くなった情報を補完するため、本と合わせて以下のML-Agents Release 18の公式ドキュメントを参照している。
https://github.com/Unity-Technologies/ml-agents/tree/release_18_docs/
日記まとめ
この日記は以下でまとめてます。