前回、ボールがキューブに向かって進んでいくという機械学習を行ったが今回はそのプロジェクトの機械学習にかかる時間を短縮する手法について学ぶ。
学習速度の改善
前回は機械学習をさせる際、Unityの実行ボタンを押したがこれはお手軽である反面、学習速度的には最も遅い。今回はそれを改善していこう。まずはアプリにするという方法がある。
アプリ化
Unityにて上部FileからBuildSettingsを選んで、現在のシーンを追加してBuildを押す
どこに保存するのかを聞かれるので、GitHubから最初にクローンしたml-agentsフォルダ内にappsというフォルダを作成し、その中にMyRollerApp1として保存する
Ml-agents->appsの中にMyRollerApp1として保存
学習の際このアプリを用いる。ターミナルから以下のコマンドを入力
(–env=の後ろにアプリのパスを記述する)
$ mlagents-learn ./config/rollerball_config.yaml --run-id=RollerBallApp1 --env=apps/MyRollerApp1
実行が始まった!この際、実行画面はとても小さいので注意
この画面の大きさはデフォルトでは84*84だが、–widthや–heightオプションを使って大きさを指定できる。また、–no-graphics オプションを指定することでさらに高速に行うことができる
実行の停止
50万ステップ完了するまで待っても良いが、ある程度Mean Rewardが1に収束してきたらCtrl + c で停止しよう。
50000ステップ完了するのにかかった時間が、Unityから実行したときには372秒だったのがアプリ化によって285秒になっている。かなり学習速度が改善したのがわかる。
複数起動
アプリ化したものを同時に実行することによってさらに短縮が見込まれる。以下のようにコマンドを打ってみよう。(–num-envs=4によって4つ同時に実行できる)
$ mlagents-learn ./config/rollerball_config.yaml --run-id=RollerBallApp2 --env=apps/MyRollerApp1 --num-envs=4
4つ同時に起動したことで学習速度が大幅に改善された!
シーンに複数配置
高速化の一つとしてシーンに複数配置するというのもある。やってみよう。
プレファブ化
まずはヒエラルキーにあるTrainingAreaをプロジェクトにドラッグしてプレファブ化
8回複製(Ctrl+D)してxz平面に15ずつオフセットさせながら並べる
先程と同じようにBuildしよう。今度はMyRollerApp9という名前にした。
実行
以下のコマンドで実行してみよう。
$ mlagents-learn ./config/rollerball_config.yaml --run-id=RollerBallApp3 --env=apps/MyRollerApp9
9つを同時実行しているので早い。記録更新だ。
それをさらに複数実行
では、それを4つ同時に走らせてみよう。コマンドは以下だ
$ mlagents-learn ./config/rollerball_config.yaml --run-id=RollerBallApp3 --env=apps/MyRollerApp9 --num-envs=4
さらに記録を更新することができた。
まとめ
アプリ化と同時学習によって学習に要する時間を372秒から最後は80秒と大幅に短縮することができた。ここらへんはマシンスペックにダイレクトに依存してくる部分なので自分の環境に何が適切なのかを色々試してみてもらいたい。
コメント