目次
1. Unreal Engine上で強化学習を行いたい理由
2. 各種手法の比較
2-1. 内部実行系の手法
以下の4つの方法について紹介します。
・Python Editor Script Plugin
・UneralEnginePython
・Python Foundation Packages
・Neural Network Inference
2-2. 外部通信系の手法
以下の4つの方法について紹介します。
・Mind maker
・UE4ML
・ML Adapter
・Learning Agent
※記事中のUEはUnreal Engineの略です。
1. Unreal Engine上で強化学習を行いたい理由
強化学習は、機械学習の一分野であり、エージェントが環境と相互作用しながら、試行錯誤を通じて最適な行動を学習する手法です。ゲームエンジンと強化学習は相性が良く,例えばUnityではすでにその手法が確立されていますが,Unreal Engine上での強化学習についてはいまだに情報が少ないのが現状です。
Unreal Engine上で強化学習を行う利点については以下のようなものが考えられます。
-
リアルな環境のシミュレーション
Unreal Engineは、強力なグラフィックス機能や物理エンジンを備えており、リアルな環境のシミュレーションを行うことができます。そのために強化学習エージェントが現実世界の振る舞いを学ぶための理想的なプラットフォームとなりえます。例えば、自動運転車の制御やロボットの動作制御など、実際の物理環境での学習を必要とするタスクにおいて、Unreal Engineは非常に有用だと思われます。 -
統合された開発環境:
Unreal Engineは、ゲーム開発において強力な開発環境を提供しています。強化学習の研究や開発においては、実験環境のセットアップやデータの収集などが課題となりますが,Unreal Engineを使用することで、シミュレーションの設定や結果の視覚化、デバッグなどを容易に行うことができるようになると思われます。
2. 各種手法の比較
まず大まかにまとめるとUnreal Engine上で強化学習を行うには以下の2つの方法があります。
- UE内で学習を実行する
- 外部のプログラムと通信して学習を行う
UE内で学習を実行する場合,Unreal Engineのビルトインのスクリプト言語であるBlueprintやC++,もしくはPythonを使用して強化学習アルゴリズムを実装し,学習プロセスを制御する事になります。この方法では,エージェントの学習とゲームの実行が同時に行われるため,リアルタイムで学習の進捗を観察することができます。
一方で,外部のプログラムを利用する場合はUnreal Engineと外部の強化学習フレームワークやライブラリを組み合わせます。Unreal Engine内で環境のシミュレーションを行いながら,学習のためのデータや状態を外部プログラムに送信し,外部の強化学習アルゴリズムによって学習を実行します。この方法では,より高度な強化学習アルゴリズムやリソースを利用することができますが,Unreal Engineと外部プログラムの間でデータの送受信や同期を行う必要があります。
以下では今回調査した方法を,上記の2手法に分類し紹介します。
2-1. 内部実行系の手法
Python Editor Script Plugin
Python Editor Script PluginはUE5から標準で搭載されているプラグインです。このプラグインを導入することでPythonをゲーム内ターミナル,テキストファイル,BluePrintから実行することができるようになり,またライブラリも導入することができます。
一方でこのプラグインの致命的な欠点として,エディター上でしか使用できず,ランタイム中(ゲーム実行中)は動作させられなかったので強化学習用途では使うことができません。
参考:
Python Setup For Unreal Engine 5 Tutorial:Pythonの実行(テキスト,ファイル)
Run Python In Blueprints Utilities:BluePrintからの実行
Python Install Modules With PIP:ライブラリの導入
UneralEnginePython
UnrealEnginePythonは有志が開発したUE4用のプラグインです。このプラグインを導入することでPythonをゲーム内ターミナル,テキストファイル,BluePrintから実行することができるようになり,またライブラリも導入することができます。また,こちらのプラグインではランタイム中もPythonを実行することができます。
一方で現在は開発が停止しており,UE5では動かせないというのが難点です。
細かい実装
このスレッドなどによるとUE4.27でも動かせるようですが,自分は上手くいかなかったので今回は例としてUE4.23での実装を紹介します。
まずはEpic Games Launcherを起動して,ライブラリ
へ移動します。
Engineバージョン
の横の+マークを押すと以下の画像のようになるので,プルダウンメニューから4.23.1
を選択し,インストールします。
また,このバージョンのUEはVisualStudio2017にしか対応していないので,PCに入っていない人はインストールしてください。
UE4.23.1のインストールが終わったら起動します。
このような画面が出てくるので,新規プロジェクト
>C++
と選択し,適当にプロジェクトを作成します。
こちらからUnrealEnginePython_20190508_4_22_python36_embedded_win64.zip
をダウンロードしてください。
解凍したフォルダ(UnrealEnginePython
)を先ほど作成したプロジェクトのフォルダのPlugins
下に配置します。
パスは恐らくこのようになります。
\Unreal Projects\[プロジェクト名]\Plugins\UnrealEnginePython
次にこちらからソースコードをダウンロードしてきてください。
ダウンロードした圧縮ファイルを解凍し,中の\UnrealEnginePython-master\Source\UnrealEnginePython\UnrealEnginePython.Build.cs
を適当なテキストエディタで開きます。
11行目の
private string pythonHome = "";
に適当なpython.exe
までのパスを入れてください(パスにpython.exeは含めません)。
保存したら,今編集したファイルを含むSource
フォルダをコピーし,
\Unreal Projects\[プロジェクト名]\Plugins\UnrealEnginePython\
下に貼り付けます。
そのままプロジェクトフォルダ下にある[プロジェクト名].uproject
を右クリックし,Generate Visual Studio project files
を選択します。
次に[プロジェクト名].sln
をVisual Studio2017で開き,ローカルWindowsデバッガー
をクリックします。そのままビルドが上手くいけば,プロジェクトにUnrealEnginePythonプラグインが導入できているはずです。
プラグインの使い方や,Pythonライブラリの導入は下の記事を参考にしてください。
参考:
UE4でPythonを使ってみる
Python Foundation Packages
Python Foundation PackagensはUE5の実験段階のプラグインです。NumpyやPytorchが公式サポートされるとのことですが,現状非常にドキュメントが少ないため詳細は不明です。
Neural Network Inference
今回の記事の趣旨からは外れますが,単にUnreal Engine上で学習済みモデルを動かすだけならNeural Network Inference(NNI)プラグインを使うのが良さそうです。Pytorchなどで学習を行ったモデルをONNX形式で出力すれば,このプラグインを用いてUE5上で実行することができます。似たような有志のプラグインにSimplePytorchというものもありますが,こちらはUE4用なのでUE5では動きません。
参考:
OnnxRuntime-UnrealEngine:Microsoftが出しているNNIのサンプルコード。
Neural Network Inferenceプラグインについて
2-2. 外部通信系の手法
Mind maker
Mind makerは有志が開発した強化学習用のプラグインであり,UE4とUE5の両方で動作します。強化学習アルゴリズムとしてA2C,DQN,PPO,SAC,TD3,DDPGの6つが用意されており,その中から好きなものを選び学習を行うことができます。また,有料ながらも倒立振り子のサンプルプログラムが用意されているので,取り敢えず何かを動かしてみたいという人にはおすすめです。仕組みとしてはUE上で取得したObservationsとRewardの値を外部の実行ファイル(.EXE)へ送信し,そこからActionを受け取るという様になっています。
あえて難点を挙げるとすれば、プラグインの完成度が高いため、独自の強化学習アルゴリズムを使用したい場合などの拡張性はあまりありません。
細かい実装
参考:
Creating a Custom Deep Reinforcement Learning Environment:公式ドキュメント
UE4ML
UE4MLはその名前の通りUE4上で機械学習を行えるようにするプラグインです。自作のUE4のゲームをOpenAI Gymと同じように扱えるようにするプラグインと,Pythonモジュールのセットになっており,外部のPythonからユーザー入力を行ったり、ゲーム内の情報を外部Pythonが取得出来るようになっています。
ただUnrealEnginePython等と同様にUE5では使えないのが難点です。
細かい実装
マーケットプレイスからEpic Gamesが出しているAction RPGサンプルを入手し,UE4.27でプロジェクトを作成します。
https://www.unrealengine.com/marketplace/ja/product/action-rpg-01
プロジェクトを開き,編集
>プラグイン
からUE4 support for ML
のプラグインを有効化します。
再起動を促されるので再起動します。
ファイル
>プロジェクトをパッケージ化
>Windows(64-bit)
からサンプルプロジェクトをパッケージ化します。このときファイルの出力先のパスにスペースが含まれないようにしてください。
次にPythonにUE4MLのモジュールをインストールします。
コマンドプロンプトを開いて以下のコマンドを実行します。
cd C:\"Program Files"\Epic Games\UE_4.27\Engine\Plugins\AI\UE4ML\Source\python
pip install -e .
C:\Program Files\Epic Games\UE_4.27\Engine\Plugins\AI\UE4ML\Source\python\examples\custom_params.py
を修正します。
# 6行目にset_executableを追加
from ue4ml.runner import UE4Params, set_debug, set_executable #
import argparse
# 49行目(envインスタンスを作る前)に以下の行を追加
set_executable(r'D:\Documents\UEpackage\WindowsNoEditor\ActionRPG.exe')
env = env_cls(ue4params=params, server_port=args.port)
set_executableで設定する値は先ほどパッケージ化したサンプルプロジェクトの実行ファイル(.exe)までのパスです。r
を忘れるとエラーが出ます。
C:\Program Files\Epic Games\UE_4.27\Engine\Plugins\AI\UE4ML\Source\python\ue4ml\core.py
を修正します。
# 15行目に追加
import numpy as np
# 153行目を変更
return gym.spaces.unflatten(self.observation_space, np.array(raw_obs))
コマンドプロンプトを開いて以下のコマンドを実行します。
cd C:\"Program Files"\Epic Games\UE_4.27\Engine\Plugins\AI\UE4ML\Source\python\examples
python custom_params.py
キャラクターがそれらしく動いているのを確認できました。
ML Adapter
ML Adapterは前述のUE4MLに似た仕組みを持つ,UE5向けの実験段階プラグインです。こちらのスレッドにはいくつか実装例もあるので問題なく利用できると思われます。
しかし,同スレッドに
it is increasingly likely ML Adapter will be sunset later this year in favor of a new plugin we are intending to release.(MLアダプターは今年後半には廃止され、新しいプラグインがリリースされる予定です。)
とあるため,将来性は乏しいかもしれません。
参考:
MLAdapter github:Github
Python example:サンプルコード
Learning Agent
Learning AgentはUE5向けの未リリースプラグインであり,ML Adapterの後継プラグインという扱いのようです。将来的には外部のPythonで実行されているPytorchと連携可能なC++(Brueprint)ライブラリが実装されるそうです。
ただ,現状(UE5.2)では完全には機能が実装されていない上に,ドキュメントが少ないので正式リリースを待った方が良さそうです。
細かい実装
現在のバージョン(UE5.2)で利用するにはソースからUnreal Engienをビルドする必要があります。
- こちらの記事に従いUnreal EngienのGitHubリポジトリにアクセスできるようにしてください。
- Epic GamesのGitHubからue5-mainブランチをダウンロードします(かなり時間がかかります)。
- ダウンロードしたフォルダ内にある
UnrealEngine/Setup.bat
を実行します(かなり時間がかかります)。 -
UnrealEngine/GenerateProjectFiles.bat
を実行します。 - 生成された
UnrealEngine/UE5.sln
をVisual Studio 2022で開いてビルド
>ソリューションのビルド
を実行します(かなり時間がかかります)。
自分の場合ここでエラーが出てしまいましたが,うまくいけば編集
>プラグイン
からLearning Agent
のプラグインを有効化できるようになっているはずです。Learning Agentのクラスの使い方については,下の参考の記事を見てみてください。
参考:
Learning Agents Introduction:Learning Agentに関するスレッド
Early Explorations of Learning Agents in Unreal Engine:導入と簡単な紹介についての記事
Killers and Explorers: Training RL Agents in Unreal Engine:実装例の記事
3. 結局何を使えばいいのか
Unreal Engineで強化学習を行う方法はいくつもあり,一体どれを利用すれば良いのか分かりずらい状況となっています。そこで,今回調べたことを簡単にまとめると以下のようになります。
- 学習済みモデルを動かしたい人→NNI
- 手っ取り早く強化学習を行いたい人→Mind maker
- UE5でなくても良い人→UneralEnginePython, UE4ML
- 今すぐ強化学習を行いたいわけではない人→Learning Agent
また今回紹介した物以外にも,MachineLearningRemote-Unrealや,TensorFlow-Unrealなど,有志が開発したプラグインがいくつかあるので試してみても良いかもしれません。
(この記事は研究室インターンで取り組みました:https://kojima-r.github.io/kojima/)