クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

Unity ML-Agentsのコードデバッグについて

すぐに忘れるのでわすれないうちに

こんにちわ、こんばんわ。かえるのクーの助手の弟子の「井戸中 」(いとなか )です。

とうとう連休も最終日です。みなさまの連休は如何でしたでしょうか?

ほぼ半分は、Unity ML-Agents関連のYoutubeやブログ、説明を見ておりました。英語のサイトやヒアリング等、頭に詰め込みすぎたのか、3時間毎に猛烈な睡魔に襲われ、たいへんよく眠りました。おかげで連休のはじめの頃より聞き取れるようなった「気」がします。さらに、アニメ三昧でした。今シーズンののお勧めはなんといっても

聖女の魔力は万能です」です。

ほかには、トウカイテイオーちゃんもメジロマックイーンちゃんも、もちろんスペシャルウィークちゃんもかわいいです。瑠璃のまわりではゲームのほうの「ウマ娘」がおおはやりです。何故かゴールドシップ様(ゴルシちゃん)に人気が集まっております。

さて、連休はUnityをがんばるつもりでしたが、ML-Agents一辺倒になってしまいました。

ML-Agentsのコードデバッグは「mlagents-learn」のタイムアウトと中断後の続行に注意すれば、それほど難しくはありませんでした。

とはいえ、すぐに忘れるので記録しておきます。今回はWindowsでやったのでWindowsでの情報です。

mlagents-learn編

やったことはあまりありませんが、ポイントは何点かあります。

起動は学習の直前にすること

-- 時間が空いてしまうとタイムアウトしてそのIDはエラー状態になってしまいます。

失敗したIDは上書きしてしまったほうがよい。

> mlagents-learn ./config/SpaceBall.yaml --run-id=SpaceBall-ppo-100 --force

 --(あとからの確認に邪魔なため)次の実行で 同じIDで --force を指定すれば上書きできます。(操作ミスやタイミングなどで学習開始の失敗はかなりあります。)ただし、次の実験でIDを間違えないように注意が必要です。(同じコマンドで起動してしまうと前回の情報が消えます)

・Unity側デバッガの関係で停止させたが、続行したい場合は --resume を使用する

> mlagents-learn ./config/SpaceBall.yaml --run-id=SpaceBall-ppo-100 --resume

-- これはかなり重宝です。デバッガを使用したり、学習途中にプログラムを変更・調整して続行してみるような場合はありがたいです。

・学習のパラメータや報酬の与え方を調整したい場合はTensorBordでの確認がとっても便利です。

>tensorboard --logdir=summaries --port=6006

...
TensorBoard 2.5.0 at http://localhost:6006/ (Press CTRL+C to quit)

いろいろ確認できます。

f:id:np2LKoo:20210505181445p:plain

f:id:np2LKoo:20210505181523p:plain

f:id:np2LKoo:20210505181555p:plain

-- はじめは使ってませんでしたが、途中から使用して重宝でした。

・学習の最大ステップ数などを変えたい場合は yamlファイルを調整します

最初は max_steps: 5.0e5 にしていましたが、 ゆっくり学習するパラメータのためかこれくらいではまだ学習が不十分なためmax_steps: 5.0e6にしてみました。(終わらなくなったので サンプルでは とりあえず4.0e5(400,000Stepにしています)

Unity C#編

操作は通常のデバックと変わりませんが、基本的に遠隔デバッグであることに注意が必要です。特に学習中はmlagents-learnと通信しているので、Unity側を1~2分止めただけでmlagents-learnがTimeout終了してしまいます。

基本手順

(1)AgentのプログラムコードをVisualStudioで起動する

(2)ブレークポイントを設定する

(3)メニューのデバッグからUnityデバッガのアタッチを選択し、起動しているUnityを選択する。

(4)Unity側にC# Debugger Attached ウインドウが表示されるので、[Enable debugging for this session]を選択する。([...all projects]の方でもよい)

(5)Unity のPlay▶ボタンを押す

(6)このとき学習中で、mlagents-learn が停止してしまっていた場合は、mlagents-learnを --resume モードで起動する。--resume でエラーになる場合はやむなく --force 指定で最初から学習を実行する。

(7) mlagents-learn でStart training by pressing the Play button in the Unity Editor.の票y時がでたら改めてUnity のPlay▶ボタンを押す

(このとき▶ボタンを複数回おさないと再開しないケースがあった)

(8)起動するとC#のブレークポイントで停止するので、いろいろ確認する。確認しているとmlagents-learn はそのうち TimeOutするが、デバッガで確認中(メソッド内)は気にしない

※TimeOut値の設定がないか調べましたが、ドキュメントやWebに情報がみあたりませんでした。

・強制的に停止したり、異常の場合ポートが使用中になってしまう場合がある

-- プロセスを見て完全に停止させるか、ポートの自動解放を待つか(OSの制限ですぐに再使用できない場合あり)、最悪の場合PCの再起動となります。

 

連休楽しかったです

連休中は寝てばかりでしたが、ML-Agentsで遊べたので「よし」としておきます。

特に報酬の与え方が異なれば、まったく違うタイプの挙動をみせるのが、たいへん興味深かったです。

それではみなさま、ごきげんよう。

 

(おまけ)

とりあえずどんな感じなのか学習中の画像を貼っておきます。(まったく未編集で音声なしです。ごめんなさい。)

学習のレベルがあがる様子がたいへん興味深いです。最後のほうではかなりいい感じになっているものの、初期段階での用心深さがとれていないので、まだ「伸びしろ」はある感じです。

タイムアウトか衝突できたのか、画面からわかりにくいのが反省点です。やっぱりその点が残念なところみたいで、衝突したときと失敗(タイムアウト)したときのエフェクトを調べてみます。