したかみ ぶろぐ

Unity成分多め

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

始めに

本屋でテキトーに本を見てた時にML-Agentsの新しいバージョンの本があり、秒で買ってしまいました。


実は前のバージョンの本も購入していましたが、出版から1年くらい経っていたのでML-Agentsのバージョンがかなり異なり本を読み進めることが困難となっていました。

今回は同じような失敗をしないよう早速、本の始めに出てくるサンプルを試してみました。

また、今回の内容はネット上でも拝見することが出来ます。

note.com



実行環境

基本的にすべて元から自分のPCに入っていたのでそれを元に実行してみました。 

OS : windows10

Unity : 2018.4.14f

Python : 3.7.9

Anaconda : 4.8.3

ML-Agents : Release 3



Python側での準備

ここの内容は普段使っていない機能が多いのでまとめます。


Anacondaを使ってPythonの仮想環境を作成

Anacondaのコマンドで仮想環境を作成します。conda create -n "仮想環境の名前" python=x.xで仮想環境が作成できます。

$ conda create -n ml-agents python=3.7


また、作成した仮想環境に切り替える際はconda activate "仮想環境の名前"で行います。

$ conda activate ml-agetns

成功した場合はコマンドプロンプト(ターミナル)の先頭に仮想環境の名前が付きます。

これらのコマンドについてはこちらのサイトが参考になりました。

[Python]Anacondaで仮想環境を作る - Qiita



Pythonパッケージのインストール

次にML-Agentsに必要となるパッケージをインストールします。

先ほど作成した仮想環境内で以下のコマンドを使用して"ml-agents-env"と"ml-agents"をインストールします。

pip install -e ./ml-agents-envs
pip install -e ./ml-agents



Unityシーンの作成

f:id:vxd-naoshi-19961205-maro:20200906212909g:plain

今回作るシーンは玉を転がして目標地点まで行くものとなります。

こちらは先ほどのリンク通り行うとこのようなシーンが作成されます。

note.com



学習の流れ

訓練設定ファイルの作成

訓練設定ファイルの作成します。拡張子は.yamlです。

まだ訓練設定ファイルについての解説を読んでいないのでどんなことが書かれているか把握していません。

以下、サイトからの引用です。 (Unity ML-Agents Release 3 のチュートリアル (2)|npaka|note

behaviors:
  RollerBall:
    trainer_type: ppo
    hyperparameters:
      batch_size: 10
      buffer_size: 100
      learning_rate: 0.0003
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    checkpoint_interval: 500000
    max_steps: 500000
    time_horizon: 64
    summary_freq: 1000
    threaded: true

作成した.yamlファイルはML-Agents Release3のフォルダ内の./config/sample/に保存します。ここでは"RollerBall.yaml"と保存します。



mlagents-learnの実行

ではここから学習を開始していきます。

学習を開始するコマンドはmlagents-learn "ファイルパス" --run-id="ID名"です。

今回は次のようにコマンドを入力します。

mlagents-learn ./config/sample/Rollerball.yaml --run-id=firstRun

成功した場合はテキストの最後の部分にStart training by pressing the Play button in the Unity Editorと出力されるはずです。



mlagents-learnの実行が上手くいかなかった場合

ここで私は上手く実行できなかったのでその時の対処法を記します。

そもそもStart training by pressing the Play button in the Unity Editorが出力されなかった場合はファイルパスが間違っているか、既存のID名があるか、訓練ファイルのパラメータ名が間違っていないか、インデントがずれていないか確認してください。


次に準備は成功するが学習を始めきれない場合についてです。本では以下のサイトのvc_redist.s64.exeをダウンロード、インストールしてくださいと記載されていました。

support.microsoft.com

私の場合はその通りにしても上手く動作しなかったので、もう一つの方法としてコマンドpip install tensorflow==2.0を行いました。こちらの内容は以下のサイトに記載されています。

インストールをした後は上手く学習を進めることが出来ました。

github.com


どちらが学習を進める要因だったかはわかりませんが、どちらかをやってみてそれでも上手くいかなかった場合は両方やるといいかもしれません。



Unityで学習を始める

mlagents-learnが成功したら、あとはUnityの再生ボタンを押すと学習が始まります。

学習が進んでいないときはボールがランダムに動き、すぐにステージから落ちてしまいます。

f:id:vxd-naoshi-19961205-maro:20200906224705g:plain



これが少しずつ目的地に向かうようになり、最終的には一直線に向かうようなります。

f:id:vxd-naoshi-19961205-maro:20200906224920g:plain



また、学習の最中のコマンドプロンプトは途中結果を出力します。Mean Rewardが平均報酬、Std of Reward標準偏差を表します。

Mean Rewardが1、Std of Rewardが0になったら学習を終了します。

f:id:vxd-naoshi-19961205-maro:20200906224421p:plain



推論の実行

先ほどの学習の結果を使って、推論を行います。

学習の結果ファイルはml-agetnsファイルの./results/firstRun/RollerBall.nnに保存されており、このRollerBall.nnをUnityのAssetsにコピーします。

あとはBehavior ParametersコンポーネントのModelパラメータにRollerBall.nnをつけて実行すれば推論を実行できます。

f:id:vxd-naoshi-19961205-maro:20200906225946g:plain



感想

サンプルを触った感じとても面白かったです。また、無事実行できたことで勉強するモチベーションを作ることが出来ました。

また本を読み始めたばかりなので全くわかりませんが、これから少しずつ読み進めていこうと思います。また、余力があれば何かしらのサンプルを作ってブログにまとめたいです。



参考

note.com

note.com