どうも、モリカトロン株式会社でプログラマおじさんを営んでいる岡島です。
先日正式リリースされた Unreal Engine 4.26.0 に UE4ML という機械学習関係っぽい名前のプラグインが追加されたという情報を見つけたので、早速試してみました。
UE4ML はブログ執筆現在、公開されたばかりの実験的機能です。
README.md には、まだこの仕組みを使ってトレーニングした例がない(見せられるものという意味だと思いますが…)と書かれている点をご留意ください。
UE4ML とは?
リリースノートには
New: Made the UE4ML plugin public. Engine/Plugins/AI/UE4ML/README.md contains the basic documentation.
とだけ書かれているだけでよくわかりません。 しかしUE4.26をダウンロードして該当のパスに行っても README.md は存在しません……
そこで Unreal Engine 4のソースコードにアクセスできるようにし、GithubリポジトリにあるREADME.mdを読んでみたところ、自作のUE4のゲームをOpenAI Gymと同じように扱えるようにするプラグイン + Pythonモジュールのセット という理解で良さそうです。
Unreal Engine 4のソースコードにアクセスするには、Epic GamesアカウントとGithubアカウントを連携させる必要があります。
参考: Unreal EngineアカウントとGithubアカウントのリンクのしかたは - Epicアカウントのサポート
ここでいうPythonはUnreal Engine 4に内蔵されているPython実行環境ではなく、外部のPython実行環境。
外部のPythonとUnreal Engine 4のUE4MLプラグインがRPC(Remote Procedure Call)でやり取りすることで、Pythonからユーザー入力を行ったり、ゲーム内の情報をPythonが取得することが出来るようになります。
Unreal Engine 4 に内蔵されている Python を使わない理由は、Python 3.x 系(3.7.xがオススメだそうです)を前提としているからと、マルチエージェント学習を想定しているからではないかと思われます。
弊社でUnreal Engine4のゲームの強化学習環境を自前で用意した時にも同じ理由で外部のPythonとやり取りするようにしていました。
対応プラットホームは現状Windowsのみ
現在UE4MLは開発中の実験的機能ということもあり、Windows(64bit)でしかテストをしていないそうです。この記事でも Windows10(64bit) を使ってサンプルの動作確認をしています。
README には rpclib さえ用意すれば他のプラットホームでも動作するだろうと書かれていますが、誰も動作を確認していない状態のようですので、Windows以外で試すのは時期尚早と思われます。
( 実際に弊社松原がmacOSで試してみたところ、なんとかPythonから高速に動くActionRPGを立ち上げることが出来たものの、PythonとUE4の通信が確立できなかったそうです。残念…)
サンプルを動かしてみる
とりあえず今回はUE4MLのREADME.mdに従って、用意されているサンプルを動かしてみましょう。
Unreal Engine 4側の作業
基本的にプラグインを導入するだけです。
Python からの指示でゲームを操作する処理、ゲーム内の特徴量(≒データ)をPythonに送るための処理はUnreal Engine 4側には(基本的には?)不要みたいです。
- ActionRPGサンプルをマーケットプレイスから入手してプロジェクトを作成する
https://www.unrealengine.com/marketplace/ja/product/action-rpg - プロジェクトを開き、[編集]->[プラグイン] を選択して、AI のカテゴリにある UE4 support for ML を有効にする
- 現時点では BETA版なので警告メッセージが出ます
- [ファイル]->[プロジェクトをパッケージ化]->[Windows(64-bit)] でActionRPGサンプルプロジェクトの単体実行バイナリを生成します。
- これはREADME.mdに書かれていない手順ですが、デフォルトの
C:\Program Files\Epic Games\
ディレクトリ以下にエンジンをインストールしている場合に重要なポイントです。 - ファイルパスにスペースが含まれないような場所(例えば C:\)に出力しましょう。
- これはREADME.mdに書かれていない手順ですが、デフォルトの
Python 側の作業
Python 側ではUE4MLを pip install
すれば環境構築は完了で、 あとは用意されたスクリプトを実行するだけです。
UE4.26.0 のパッケージに同梱されている UE4ML は、実行したいプロジェクトのファイルパスにスペースが混じっているとうまく動作しないので注意と対策が必要です。
公式の手順
- UE4ML モジュールをインストールする。
cd C:\Program Files\Epic Games\UE_4.26\Engine\Plugins\AI\UE4ML\Source\python
pip install -e .
- UE4 の Binaries ディレクトリを指す環境変数 UE-DevBinaries を用意する
- examples の custom_params.py を実行する
cd examples
python custom_params.py
しかし、これだと手元では以下のようなエラーが出て動きませんでした。
INFO: ue4ml: Launching UE4 instance with commandline: "C:\Program Files\Epic Games\UE_4.26\Engine\Binaries\Win64\UE4Editor-Win64-Debug.exe" ActionRPG ActionRPG_P -windowed -usefixedtimestep -game -unattended -nullrhi -debug -resx=800 -resy=600 -fps=20 -4mlport=15151 ERROR: ue4ml: Failed to launch the executable. Please verify the executable's path
どうやら、Python から UE4 を起動する処理がスペースを含むファイルパスを扱えないようになっていて、UE4 をデフォルトのインストール先にインストールしているとどうにもならないみたいです。
実行エラーを回避して動作させる
ということで、custom_params.py を少々弄りましょう。
コードを読んでみると ue4ml\runner.py に set_executable というユーティリティ関数が用意されていて、それを使うことで環境変数の値より優先してそちらのバイナリを起動するようになるようです。
- ue4ml.runner から set_executable をインポートします。
from ue4ml.runner import UE4Params, set_debug, set_executable
- env インスタンスを生成する前に set_executable 関数で、事前にパッケージ化したActionRPGのバイナリを指定します。(ファイルパスに注意!)
set_executable('C:\WindowsNoEditor\ActionRPG.exe')
- custom_params.py を実行する
python custom_params.py
今度はウィンドウサイズが800x600で通常より高速に動作するActionRPGサンプルが立ち上がり、プレイヤーがランダム行動するのを確認できます。
最後に
今回はサンプルプロジェクトを動かしてみただけでしたが、ゲーム側の改造をせずに機械学習が始められる機能であることが分かりました。 利用するためのドキュメントも充実しておらず、現時点で機械学習を始めようというのは時期尚早な気がしますがUE4 x 機械学習に興味がある人はサンプルを動かしてみたり、Python側のコードを読んでみると良いかと思います。
おまけ
UE4ML は --norendering=1
を指定することでレンダリングを無効にすることが出来るようですが、これはゲームを起動する際に NullRHI オプションを有効にするという実装でした。
UE4MLでは未検証ですが、おそらくスケルタルメッシュの変形などがされないと思いますので、キャラクタのモーションに関係するイベントや当たり判定などが想定通り行われずレンダリングを有効にしている場合と動作が異なるかもしれません。
詳しくはこちらの記事にまとめてありますので、レンダリングを無効にしてみたい方は合わせてお読みください。 tech.morikatron.ai