はじめに
Pythonによる環境操作編では、ML-AgentsのPython APIを使用して、前回までで作成した環境を操作していきます。その1の記事では、Unity環境を含むアプリケーションのビルドと環境の起動を行います。
環境のビルド
UnityのBuild Settings画面のScenes in Buildに現在作成中の環境を表すシーン、JumpEnvironmentをいれてください。次に、PlatformをWindows, Mac, LinuxからDedicated Serverに変更してください。(Dedicated Serverが選択できない場合、Unity Hubから対応するモジュールをインストールしてください)
Dedicated Server Buildを行うと、レンダリング画像を用いた学習ができなくなり、また学習の途中経過をUnityの画面を通じて確認することもできなくなりますが、その分オーバヘッドが小さくなります。
Buildを行い、その出力フォルダへ移動します。
注意:ヒューリスティックモードの解除
ここまでこの記事に沿って環境を作成してきた人は、Behavior Parameters
のBehavior Type
がHeuristic
になっています。このままではUnityとPythonが通信できませんので、Default
に戻しておきましょう
成果物の確認
MLAgentsLowLevelAPI.exeが生成されていることが確認できます。これがPythonと通信してくれる環境そのものを表すexeです。
そして、この出力フォルダがPythonプロジェクトのルートディレクトリになります。この配下にPythonスクリプトを配置して開発を進めていきます。
learn.pyの配置
ここからはPythonを利用した通常のAI開発になります。まず、ルートディレクトリにlearn.pyという空のPythonスクリプトを作成します。ここに学習用コードを書いていきます。それでは、mlagents-envsの最初のコードを以下のように記述します。
from mlagents_envs.environment import UnityEnvironment
# 起動したいexeファイルの名前を指定する
env = UnityEnvironment(file_name="MLAgentsLowLevelAPI", seed=1, side_channels=[])
# 環境と通信できることを確認する。具体的な意味は後述する
env.reset()
詳しくは後述しますが、mlagents_envs.environment
は環境操作用のクラスがまとめられてるモジュールです。また、UnityEnvironment
クラスはUnityで作成した強化学習環境を読み込むためのクラスです。
なお、mlagents-envsパッケージの全コードはこのサイトで見ることができます。
スクリプトの実行
先ほど作成したスクリプトを動かすため、Anaconda Promptを起動して以下の操作を行います。
(base) $ conda activate ml-agents
(ml-agents) $ cd Unityのビルドフォルダ兼Pythonプロジェクトのルートフォルダのパス
(ml-agents) $ python learn.py
メモリ状態などを表す大量のログとともに、コマンドが正常終了すれば成功です。
番外編:ウィンドウ付きビルド
ここまででDedicated Server Buildを用いた環境との通信を行いましたが、ウィンドウが出ないことから正しく動いているのか不安になる人もいるかもしれません。そこで、通常のWindows, Mac, Linux用のビルドを使っても正常に環境が起動できることを確認しておきましょう。まずは、Build SettingsからPlatformを切り替えます。
次に、Player SetingsからPlayer > Resolution and Presentation > Run In Background*とすすみ、チェックを付けます。
これで準備が完了するので、ビルドしましょう。ビルドしたフォルダにlearn.pyを持っていき、Dedicated Server Buildのときと同じようにpythonコマンドを実行します。
$ python learn.py
Unityのウィンドウが一瞬出現して、learn.pyが終了すると同時にウィンドウも閉じることが確認出来たら成功です。
おわりに
いよいよPython側の実装に入りました。ここから先のコードの書き心地については、ほとんど完全にUnityというゲームエンジンの要素は抽象化されていて、Pythonによる開発といった感じになります。これは、積み重ねられたPythonの資産を利用できるということであり、非常に便利です。