
ML-Agentsのサンプルを動かすまで
-
2021年12月10日
こんにちは。
『ポケコロツイン』クライアントエンジニアのJです。
今回はML-Agentsのサンプルを動かしてみたので、その手順と詰まった点などを紹介していこうと思います。
ML-Agentsとは
まず初めに、ML-Agentsとは何か知らない方に向けて、軽く説明をしようと思います。
ML-AgentsはUnityが公開している機械学習のためのオープンソースプラグインです。Unityの環境で機械学習することで、学習結果や過程がすぐにビジュアル的に分かりやすい形で確認できます。
ML-AgentsはC#で完結しているプラグインではなく、実際に機械学習する部分はPythonで行っています。Python上で学習するためのライブラリはPyTorchを利用していて、最新の技術を利用するようUnityが日々更新しています。
https://unity.com/ja/products/machine-learning-agents
環境の準備
- Unityをインストール
- Pythonをインストール
- ML-Agentsのプロジェクトをクローン
- プロジェクトにML-Agentsのパッケージをインストール
- Pythonの仮想環境立ち上げ
- PyTorchを仮想環境にインストール
- mlagentsを仮想環境にインストール
1.Unityをインストール
UnityHubなどから2019.4以降をインストールしましょう
https://unity3d.com/jp/get-unity/download
2.Pythonをインストール
Pythonは3.6.1以降のバージョンをインストールしましょう。執筆時点ではPython 3.9など新しすぎるバージョンでは安定動作しない可能性があるそうです。
過去のバージョンはDownloadsのタブのAll releasesにあるので、そちらからダウンロードしましょう。
3.ML-Agentsのプロジェクトをクローン
こちらのページよりML-Agentsを手に入れることができます。
https://github.com/Unity-Technologies/ml-agents
README.mdにRelease Versionと対応するPythonのパッケージのバージョンなどが記載された対応表があるので、対応するバージョンをダウンロードもしくはgit cloneで入手しましょう。
4.ML-Agentsのプロジェクトを開く
次に先ほど手に入れたML-Agentsのプロジェクトを開きましょう。
Unity Hubを開き、右上のADDを押します。
するとファイルを選ぶウィンドウが開くので、先ほど手に入れたML-Agentsのファイルの中にある”Project”フォルダを選択し、開きましょう。
5.Pythonの仮想環境立ち上げ
$ cd [仮想環境作りたい場所]
$ python3 -m venv [仮想環境の名前]
フォルダを見てみると何やらいろいろファイルが生成されていますね。
これで仮想環境の準備ができたので、実際に仮想環境を動かしていきます。
//Windows※の場合
$ source [仮想環境の名前]/Scripts/activate
//Macの場合
$ source [仮想環境の名前]/bin/activate
すると
([仮想環境の名前])$
と表示されるようになります。
やめたいときは
([仮想環境の名前])$ deactivate
で終了できます。
※Windowsでターミナルに何を使っているかで仮想環境立ち上げのコマンドがちょっと変わってきます。
自分はGitBashを用いているのでMacと同じく頭にsourceを付ければいいですが、PowerShellとか使ってる人は. を付けることになったりするので要注意です。
6.PyTorch/mlagentsを仮想環境にインストール
Python側の学習ライブラリなどをさきほど立ち上げた仮想環境にインストールします。
//Windowsの場合
([仮想環境の名前])$ pip3 install torch~=[PyTorchのバージョン] -f https://download.pytorch.org/whl/torch_stable.html
([仮想環境の名前])$ python -m pip install mlagents==[mlagentsのバージョン]
//Macの場合
([仮想環境の名前])$ python -m pip install mlagents==[mlagentsのバージョン]
PyTorchのバージョンは以下を参考に安定版を入れるように適宜変更しましょう。
https://pytorch.org/get-started/locally
mlagentsのバージョンは2.でクローンしたバージョンに合わせて対応表に載っているバージョンを選びましょう。
例:UnityプロジェクトはRelease18、mlagentsは0.27.0
サンプルの再生
ここまでセットアップできたら実際にサンプルを再生してみます。
ところが、いざプロジェクトを開くとエラーが出てきます。
以下3点を行うとエラーは消えました。
- ProjectSettingsで、Player/Configuration/Api Compatibillity Levelを.Net4.Xに変更
- InputSystem1.1以上をインストール
- ProjectSettingsでPlayer/Configuration/Active Input HandlingをBothに変更
ML-Agentsのサイトに載ってないのでちょっと困りますね…
では気を取り直して再生していきます。見た目が分かりやすいので今回は3DBallを再生していきます。以下のSceneを再生しましょう。
Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity
再生するとこのように顔がついた青い箱の上にボールが落ちてバランスを取ろうとしている様子が見れるかと思います。
もしこの時青い箱がボールを落としてしまっている場合、予めサンプルとして用意されているモデルがアタッチされていないので、
Assets/ML-Agents/Examples/3DBall/Prefabs/3DBall
をダブルクリックし、Prefabを開きます。
3DBallの子オブジェクトであるAgentを選択し、InspectorよりBehaviourParametersスクリプトのModelの部分に
Assets/ML-Agents/Examples/3DBall/TFModels/3DBall
をアタッチしましょう。
これで青い箱がボールをうまく上に乗せることができるようになったかと思います。
サンプルの学習
先ほどすでに学習済みのサンプルモデルを使用しました。次はこのモデルを新たに生成していきます。
Assets/ML-Agents/Examples/3DBall/Prefabs/3DBall
を開き、子オブジェクトのAgentにアタッチされているBehaviourParametersスクリプトのModelの部分をNoneにします。
続いて仮想環境をActivateしてPython側のmlagentsを待機状態にします。
$ source [仮想環境の名前]/Scripts/activate
([仮想環境の名前])$ cd [ML-Agentsのプロジェクトのルートフォルダ]
([仮想環境の名前])$ mlagents-learn config/ppo/3DBall.yaml --run-id=[任意のユニークなID]
この画面が出てきたらUnityEditorで先ほどのシーンを再生します。するとすごい速さで学習が進んでいきます。
止めたいときはターミナルでCtrl+Cで中止できます。中止されるとカレントディレクトリの下にresultsというフォルダが作成されています。
以下のファイルが生成されたモデルなのでUnityにインポートします。
results/[任意のユニークなID]/3DBall.onnx
Unityにインポートしたら先ほどアタッチを外したPrefabにモデルをアタッチします。そして再生すると学習したモデルで3DBallたちがボールを落さないよう動作してくれます!
学習回数を増やせば増やすほど、動作が安定していきます。
まとめ
感想としてはUnityだけじゃなくPythonを用意しないと行けないのが少し手間でした。何事も最初は大変なものですね。
ぜひこれを参考にML-Agentsを触ってみてください!
おまけ
PyTorchとかTensorFlowとか機械学習するときに出てくる「テンソル」、皆さんどういうものか分かりますか?大学の授業で出てきたりしますよね。
実はスカラー量もベクトルも行列もテンソルです。
テンソルは数値の配列で、階数があります。この階数は次元ととらえるととても分かりやすいです。
では0階のテンソルとは何かですが、一般的には0次元は点ですよね。数値で点とするならばこうなります。
(1)
すなわちスカラー量です。
続いて1階のテンソルですが、1次元は線です。なので数値で線を作るならこうなります。
(1, 2, 3, 4)
すなわちベクトルです。
察しの良い方は続きも想像できると思いますが、2階は2次元なので面のようにこうなります。
じゃあ3階はどうなるんだと疑問が浮かぶと思いますが、想像通り立体になります。
4階は3階がさらに並べられてさらなる塊になります。
さて、テンソルについて理解が深まったところですが、どのように計算したりどう使ったりというのはすぐには出てこないと思います。そこでML-Agentsの登場です。テンソルを理解してなくてもML-Agentsさえ入れてしまえば中でよしなにテンソルを使って計算してくれています。逆にテンソルの計算方法とか利用方法が理解できればML-Agentsなんて使わなくても機械学習を自作できてしまうかもしれません。勉強のコストは高いかもしれませんが。
…これからもがんばれUnity!
ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、ぜひこちらの採用特設サイトをご覧ください。