まえがき
この記事は下記サイトを参考にUnityで強化学習を行った際に吐かれたエラーをまとめたもので個人的な覚え書きです。
参考サイト
環境
windows11
Unity20203.30f
ml-agents-release_19
目次
1.起こった問題その1:mlagents-learnが実行できない
2.起こった問題その2:yamlが読まれない
3.起こった問題その3:Unityの実行を押しても動作しない
起こった問題その1 mlagents-learnが実行できない
参考サイトの手順7-(2)で
mlagents-learn ./config/RollerBall.yaml --run-id=RollerBall-ppo-1
を実行したところ
「mlagents-learn : 用語 'mlagents-learn' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
」
というエラーが吐かれました。
つまりmlagents-learnなんてコマンドないよって話ですね。
解決策
参考サイトの通りにwindows storeのpythonを使用していましたがUnity ML-Agents実践ゲームプログラミングではAnacondaを使用していたのでAnacondaでやったところうまく作動しました。
注意点
windows storeのpythonはpowershellでコマンドを実行しますが、anacondaのcondaコマンドはAnaconda Powershell Prompt (anaconda3)でないと作動しないので注意してください。(1敗)
起こった問題その2 yamlが読まれない
アナコンダで仮想環境を作り下記のコマンドを実行してみました。
mlagents-learn ./config/RollerBall.yaml --run-id=RollerBall-ppo-1
すると「mlagents.trainers.exception.TrainerConfigError: There was an error decoding Config file from ./config/RollerBall.yaml. Make sure your file is save using UTF-8
」と吐かれました。
簡単に訳すと「RollerBall.yaml読めないんだけどちゃんとUTF-8で書いてる?」ってことです。もちろんUTF-8で書いてますし、コードは参考サイトをコピペしたものなのでどっか書き間違えがあって読めないとかではないです。ですが読めないといわれてます。なんでや
エラー文で検索をかけてみると同じ悩みを抱えている方がいました。
この方はML-Agentsのバージョンを上げると解決したようですが、2022/6/11の時点で最新のrelease_19を使っているので同じ方法は取れませんでした。
解決策
config\ppoファイル内にはサンプルのシーン用の強化学習設定ファイルが転がっています。
path
ml-agents-release_19\config\ppo
こちらのファイルにある3DBall.yamlを指定してmlagents-learnコマンドを実行したところうまく動作しました。こちらの設定ファイルはちゃんと読んでくれるようです。(当たり前ですが)
なので3DBall.yamlをコピーしRollerBall2.yamlと名前を変え、中身の数値を参考サイトのRollerBall.yamlに置き換えを行いました。するとうまく動作し、Unityのロゴが出てきました。
起こった問題その3 Unityの実行を押しても動作しない
うまくmlagents-learnが作動し、Unityのロゴが出てきたためUnityの実行ボタンを押したところ
「mlagents.trainers.exception.TrainerConfigError: The behavior name Roll_Ball has not been specified in the trainer configuration. Please add an entry in the configuration file for Roll_Ball, or set default_settings.
」と吐かれました。
つまりRoll_Ballなんてないぞってことですね。Roll_Ballってどっから出てきた?
解決策
エラー文で検索をかけたところ同じ同じ悩みを抱えている方がいました。
この方の自己解決によると、yamlの2行目をBrainの名前と一致させたらできるようになるとのことです。つまりUnityでRollerAgentにコンポーネントしたBehavior Parametersの名前がyamlと一致してないのが原因のようでした。自身のプロジェクトをのぞいてみるとBehavior NameがRoll_Ballになってました。
あとがき
以上が自分が吐かれたエラーのまとめです。誰かの助けとなれば幸いです。