今回はUnityのML-Agentのサンプルを動かしてどうやって機械学習をさせるかというのをやってみたいと思います。
前回UnityにML-Agentコンポーネントのインストールと機械学習を管理する為のAnacondaのインストール、その環境のインストールを行いました。
なので、せっかく作った環境で実際に機械学習をさせてみようというのが今回の記事でやることです。
UnityのML-Agentの設定やスクリプトはサンプルに含まれていて、configファイルもサンプルに添付されているので、あとはコンソール画面でコマンドを打って、Unityを実行させるやり方を覚えてみようという感じです。
サンプルのダウンロード
まずは最新リリースのML-Agentのツールキットをダウンロードします。
以下のサイトを開きます。
branchをrelease_8_branchに変更し、Codeを押したらDownload ZIPを選択します。
今回はわかりやすいようにデスクトップにZIPファイルを展開します。
すると以下のようなファイルが展開されます。
ProjectフォルダがUnityのプロジェクトになり、その中にサンプルがあります。
configフォルダの中にはプロジェクトのサンプルで使用するML-Agentのconfigファイルがあるのでコマンドプロンプトでこのconfigファイルを指定して機械学習を開始させるようにします。
Unityプロジェクトを開く
ML-Agentのツールキットをダウンロードしたので次にUnityのプロジェクトを開きます。
Unity Hubでリストに追加から、先ほど指定したProjectフォルダを指定しUnityのプロジェクトを開きます。
以下のようにデスクトップに展開したml_agents_release_8_branchフォルダの階層下のProjectフォルダを選択します。
Unity Hubにプロジェクトが追加されたらUnity2020.1.9f1バージョンにアップグレードしてプロジェクトを開きます。
Basicなサンプルの実行
Unityのプロジェクトを開いたらAssets/Ml-Agents/Examples/Basic/ScenesフォルダのBasicシーンを開きます。
BasicサンプルはBasicAgentゲームオブジェクトが小さいボール(報酬が小さい)と大きいボール(報酬が大きい)に移動していく過程でどちらに移動すると報酬が大きく得られるかを学習し、段々と大きいボールの方によっていくようなサンプルです。
Basicシーンを開いたらシーンに配置してあるBasicゲームオブジェクトの子要素のBasicAgentゲームオブジェクトを選択し、インスペクタのBehavior ParametersコンポーネントのModelに既にニューラルネットワークモデルであるBasic(既にトレーニングされたデータ)が設定してあるのでDeleteキーを押して何も設定しないようにします。
これは1からトレーニングしたモデルを作成したい為です(たぶん設定してあっても問題はなさそう)。
Anacondaのコンソールを開き以下のコマンドを打ち、configファイルがあるフォルダに移動します。
1 2 3 | cd C:\Users\ユーザー名\Desktop\ml-agents-release_8_branch\ml-agents-release_8_branch\config\ppo |
移動したらML-Agentをアクティブにします。
1 2 3 | conda activate mlagents |
アクティブにしたら学習を開始させるコマンドを打ちます。
1 2 3 | mlagents-learn ./Basic.yaml --run-id Basic_01 |
mlagents-learnで学習を開始し、その時に使用するconfigファイルはBasic.yamlなので現在のカレントディレクトリ(./)のBasic.yamlを指定します。
–run-idで学習したデータを保存するフォルダ名を設定出来ます。
既にデータがある場合はコマンドに–forceオプションで強制で上書き、–resumeオプションで再開が出来ます。
例えば先ほどのBasic_01を強制で上書きする場合は以下のような感じです。
1 2 3 | mlagents-learn ./Basic.yaml --run-id Basic_01 --force |
コマンドを実行すると以下のようにコンソールにUnityロゴが表示されます。
Unityエディターのプレイボタンを押すと学習が開始されるようになります。
Unityエディター上でBasicAgentゲームオブジェクトが高速で動き学習をしている様子が見られます。
また指定したステップ毎の平均報酬をコンソールで見ることが出来ます。
コンソールにステップ数が表示されない時はステップ間隔が長くてまだ表示されていないかコンソールがフリーズしている可能性があるのでコンソール内でEnterキーを押すと表示される場合があります。
Unityエディターのプレイボタンを押すか、最大ステップ数を超えたら学習を終了します。
TensorBoardを使ってグラフで確認する
コンソールに学習のデータが表示されますが、それだけ見ても分かり辛いのでTensorBoardを使ってデータをグラフで確認します。
グラフで確認するにはひとつでもステップを経過している必要があります。
学習中にAnacondaコンソールをもうひとつ開きます(学習後に同一コンソールで実行することも可能)。
開いたら以下のようにcdコマンドでconfigファイルがあったフォルダに移動します。
1 2 3 | cd C:\Users\ユーザー名\Desktop\ml-agents-release_8_branch\ml-agents-release_8_branch\config\ppo |
以下のようにコマンドを実行します。
1 2 3 | tensorboard --logdir results |
–logdirで学習データがあるフォルダを指定します。
学習結果があるのはC:\Users\ユーザー名\Desktop\ml-agents-release_8_branch\ml-agents-release_8_branch\config\ppoの中のresultsフォルダになります。
上の赤い四角の中のようにブラウザにlocalhost:6006を設定するとTensorBoardが開きます。
上の例では16分ほど経過した状態のもので、平均報酬がほとんど1(大きいボールに到達した時に得られる報酬)に収束しています。
TensorBoardを終了する時は実行したコンソール内でCtrl+Cキーを押すと終了出来ます。
Unityエディターの実行を停止するとコンソールでも学習の終了処理が進み、学習結果をconfigファイルがあるフォルダの階層下にresultsフォルダが作成され、その中に–run-idで指定した名前のフォルダが作られており、その中に拡張子が.nnであるファイルがありそれが学習データになります。
今回の場合は
C:\Users\ユーザー名\Desktop\ml-agents-release_8_branch\ml-agents-release_8_branch\config\ppo\results\Basic_01
フォルダの中にBasic_01.nnというファイルが出来ます。
このBasic_01.nnという学習モデルデータをUnityのAssetsフォルダ内にドラッグ&ドロップし、ML-Agentコンポーネントを設定したゲームオブジェクトのBehavior ParametersのModelに設定し使用することが出来ます。
Basicサンプルの場合はBasic階層下のBasicAgentというのがML-Agentを使用したゲームオブジェクトでBehavior Parametersコンポーネントを持つのでそのModelにこのBasic_01.nnモデルデータを設定し使う事が出来ます。
トレーニングした結果を確認する
Basic_01.nnをBasicAgentのBehavior ParametersのModelに設定し、Unityの実行ボタンを押してトレーニングした結果を確認してみましょう。
上のように大きい球の方に行くと得られる報酬が大きい為、大きい球の方に移動していきます。
終わりに
今回は既に学習が出来る状態のサンプルを使って学習を行いました。
configファイルであるBasic.yamlの中身やBasicサンプルで使っているML-Agentコンポーネント、それを使ってスクリプトを書きPythonとの連携を取るという中身に関しては全然見ていません。
次回はUnityでML-Agentを使うサンプルを作れたらと思います。