UnityのML-Agentsのサンプルを動かしてみる

今回はUnityのML-Agentのサンプルを動かしてどうやって機械学習をさせるかというのをやってみたいと思います。

前回UnityにML-Agentコンポーネントのインストールと機械学習を管理する為のAnacondaのインストール、その環境のインストールを行いました。

UnityでML-Agentsを使った機械学習の環境作りをする
UnityでML-Agentsを使った機械学習をする為にML-AgentsコンポーネントのインストールとAnacondaのインストール等の環境作りをしていきます。

なので、せっかく作った環境で実際に機械学習をさせてみようというのが今回の記事でやることです。

UnityのML-Agentの設定やスクリプトはサンプルに含まれていて、configファイルもサンプルに添付されているので、あとはコンソール画面でコマンドを打って、Unityを実行させるやり方を覚えてみようという感じです。

スポンサーリンク

サンプルのダウンロード

まずは最新リリースのML-Agentのツールキットをダウンロードします。

以下のサイトを開きます。

Unity-Technologies/ml-agents
Unity Machine Learning Agents Toolkit. Contribute to Unity-Technologies/ml-agents development by creating an account on GitHub.

branchをrelease_8_branchに変更し、Codeを押したらDownload ZIPを選択します。

release_8_branchのML-Agentツールキットをダウンロードする

今回はわかりやすいようにデスクトップにZIPファイルを展開します。

ZIPファイルを全て展開する

すると以下のようなファイルが展開されます。

ML-Agentのツールキットのファイル

ProjectフォルダがUnityのプロジェクトになり、その中にサンプルがあります。

configフォルダの中にはプロジェクトのサンプルで使用するML-Agentのconfigファイルがあるのでコマンドプロンプトでこのconfigファイルを指定して機械学習を開始させるようにします。

Unityプロジェクトを開く

ML-Agentのツールキットをダウンロードしたので次にUnityのプロジェクトを開きます。

Unity Hubでリストに追加から、先ほど指定したProjectフォルダを指定しUnityのプロジェクトを開きます。

Unity Hubにプロジェクトを追加する

以下のようにデスクトップに展開したml_agents_release_8_branchフォルダの階層下のProjectフォルダを選択します。

ML-Agentツールキットのサンプルプロジェクトをリストに追加する

Unity Hubにプロジェクトが追加されたらUnity2020.1.9f1バージョンにアップグレードしてプロジェクトを開きます。

ML-AgentのサンプルプロジェクトをUnity2020.1.9f1で開く

Basicなサンプルの実行

Unityのプロジェクトを開いたらAssets/Ml-Agents/Examples/Basic/ScenesフォルダのBasicシーンを開きます。

BasicサンプルはBasicAgentゲームオブジェクトが小さいボール(報酬が小さい)と大きいボール(報酬が大きい)に移動していく過程でどちらに移動すると報酬が大きく得られるかを学習し、段々と大きいボールの方によっていくようなサンプルです。

Basicシーンを開いたらシーンに配置してあるBasicゲームオブジェクトの子要素のBasicAgentゲームオブジェクトを選択し、インスペクタのBehavior ParametersコンポーネントのModelに既にニューラルネットワークモデルであるBasic(既にトレーニングされたデータ)が設定してあるのでDeleteキーを押して何も設定しないようにします。

ML-AgentのサンプルのBasicに既に設定されているNNモデルを削除する

これは1からトレーニングしたモデルを作成したい為です(たぶん設定してあっても問題はなさそう)。

Anacondaのコンソールを開き以下のコマンドを打ち、configファイルがあるフォルダに移動します。

移動したらML-Agentをアクティブにします。

アクティブにしたら学習を開始させるコマンドを打ちます。

mlagents-learnで学習を開始し、その時に使用するconfigファイルはBasic.yamlなので現在のカレントディレクトリ(./)のBasic.yamlを指定します。

–run-idで学習したデータを保存するフォルダ名を設定出来ます。

既にデータがある場合はコマンドに–forceオプションで強制で上書き、–resumeオプションで再開が出来ます。

例えば先ほどのBasic_01を強制で上書きする場合は以下のような感じです。

コマンドを実行すると以下のようにコンソールにUnityロゴが表示されます。

AnacondaコンソールでML-Agentを開始する

Unityエディターのプレイボタンを押すと学習が開始されるようになります。

Unityエディター上でBasicAgentゲームオブジェクトが高速で動き学習をしている様子が見られます。

また指定したステップ毎の平均報酬をコンソールで見ることが出来ます。

コンソールにステップ数が表示されない時はステップ間隔が長くてまだ表示されていないかコンソールがフリーズしている可能性があるのでコンソール内でEnterキーを押すと表示される場合があります。

ML-Agentの学習で得られた平均報酬

Unityエディターのプレイボタンを押すか、最大ステップ数を超えたら学習を終了します。

TensorBoardを使ってグラフで確認する

コンソールに学習のデータが表示されますが、それだけ見ても分かり辛いのでTensorBoardを使ってデータをグラフで確認します。

グラフで確認するにはひとつでもステップを経過している必要があります。

学習中にAnacondaコンソールをもうひとつ開きます(学習後に同一コンソールで実行することも可能)。

開いたら以下のようにcdコマンドでconfigファイルがあったフォルダに移動します。

以下のようにコマンドを実行します。

–logdirで学習データがあるフォルダを指定します。

学習結果があるのはC:\Users\ユーザー名\Desktop\ml-agents-release_8_branch\ml-agents-release_8_branch\config\ppoの中のresultsフォルダになります。

TensorBoardを実行する

上の赤い四角の中のようにブラウザにlocalhost:6006を設定するとTensorBoardが開きます。

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を使うサンプルを作れたらと思います。

タイトルとURLをコピーしました