Microsoft Azure DSVMでUnity ML-Agentsを使用した強化学習
Unity ML-Agentsでは、PCで開発したUnityアプリのゲームオブジェクトに脳(学習済みモデル)を持たせて動かすことができますが、頭の良い脳を育てるには多くの時間がかかります。育て方には様々な方法がありますが、複数の異なる脳を育てることもできますし、同じ脳を複数のオブジェクト同士を競い合わせて育てることもできます。 今回は時間のかかる強化学習の学習をUnityでアプリ開発しているPCではなく、コンピュートリソース豊富なAzureのDSVMを使用して実施する方法を紹介します。Microsoft Azure DSVMとは
Data Science Virtual Machine(DSVM)は、機械学習の各種ツールがプレインストールされている便利な仮想マシンです。 今回使うLinuxのDSVMは、UbuntuとAnacondaをベースに、The Microsoft Cognitive Toolkit, TensorFlow, MXNet, Caffe, Caffe2, Chainer, NVIDIA DIGITS, Deep Water, Keras, Theano, Torch, PyTorch などのDeep Learningツールが初めからインストールされています。また、NシリーズのようなNVIDIA GPUが搭載された仮想マシンを素早く利用するために、NVIDIAドライバ、CUDA、cuDNNも初めからインストールされています。 https://azure.microsoft.com/ja-jp/services/virtual-machines/data-science-virtual-machines/Unity ML-Agentsとは
Unity Machine Learning Agents Toolkit(ML-Agents)は、ゲームオブジェクトに強化学習を適用できるオープンソースのUnityプラグインです。外部のTensorflow環境を使用して学習を行うことが可能であり、生成された学習モデルをゲームオブジェクトを使って推論動作させることもできます。 https://github.com/Unity-Technologies/ml-agentsML-Agentsを動かすDSVMの準備
Microsoft AzureのポータルでDSVMの仮想マシンを作成した後、DSVMでML-Agentsの動作環境を構築します。Microsoft Azureのポータルは以下よりアクセスします。 https://portal.azure.comDSVM仮想マシンの作成
Microsoft Azureのポータルの「リソースの作成」より、"Data Science Virtual Machine"で検索して出てくる「Data Science Virtual Machine for Linux(Ubuntu)」を選択します。

ML-Agentsのインストール
githubのML-AgentsのリポジトリをDSVMの仮想マシンにクローンします。また、ML-Agentsで利用するPythonのパッケージをインストールします。(以下はDSVMにログインして実行)UnityアプリのビルドとDSVMへのコピー
今回はUnityアプリにML-Agentsのサンプルを例として使用します。このサンプルをPCでLinux向けアプリとしてビルドした後、前章で作成したDSVMの仮想マシンにコピーします。プロジェクトの作成とTensorFlowSharpの設定
Unityのプロジェクトを作成してください。次にEdit > Project Settings > Playerから、PlayerSettingsのInspectorの、Display Resolution DialogをDisableに、Script Runtime Versionを.NET 4.xに、Script Define SymbolsをENABLE_TENSORFLOWとして設定します。

プロジェクトでは強化学習にTensorflowを使用するため、C#からTensorFlowを使うためのTensorFlowSharpプラグインをインポートします。以下のURLにリンクされている「TensorFlowSharp plugin」をクリックしてプラグインをダウンロードします。
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Basic-Guide.md
次に、ダウンロードしたファイルを、Assets > Import Package よりインポートします。

サンプルアプリのビルド
サンプルアプリはML-Agentsのリポジトリに含まれていますのでML-Agentsをクローンします。(gitがインストールされていない場合は、https://github.com/Unity-Technologies/ml-agents よりZipファイルをダウンロードしてください。)(以下はPCで実行)ml-agents\unity-environment\Assets\ML-Agents フォルダ配下にサンプルのシーンがありますので、このML-AgentsフォルダをUnityのアセットに追加します。追加したアセット内の「3D Ball」シーンを開きます。Hierarchyより、Ball3DAcademy(Academy)のBall3DBrain(Brain)を選択し、InspectorのBrain TypeをExternalに設定します。これによりTensorflowを利用して学習を行うことが可能になります。

次に、ビルドです。AzureのDSVMはLinuxで動作するため、Linux向けのビルド設定をします。File > Build Settingsより、Target PlatformをLinuxにして、Headless Modeにチェックを入れます。Headless Modeのチェックは、DSVMにSSHを使用したターミナルだけで接続するためです。

ビルドにより作成された実行ファイルは以下のような構成です。(以下はPCで実行)
これをSCPでDSVMにコピーします。(以下はPCで実行)
DSVMで学習を行う
DSVMにコピーしたUnityアプリをchmodコマンドで実行できるように変更します。(以下はDSVMで実行)学習にはlearn.pyを使用します。オプションとしてコピーしたUnityアプリと学習モードを指定します。(以下はDSVMで実行)
学習には時間がかかりますが、学習中の状況はTensorbordで表示することが可能です。(以下はDSVMの別ターミナルなどで実行)
PCからTensorBoardへのアクセスには、SSHのポートフォワード機能を使用します。SSHのポートフォワード接続が確立された後に、PCのブラウザよりTensorBoardに接続して学習状況を確認します。(以下はPCで実行)
PCのブラウザでローカルの6006にアクセスすることにより学習状況を確認することができます。 http://localhost:6006/

学習済みモデルの取得と動作確認
DSVMで学習された学習済みモデルは、Unityアプリで使うことができます。まず、学習済みモデルをPCにコピーします。(以下はPCで実行)Hierarchyより、Ball3DAcademy(Academy)のBall3DBrain(Brain)を選択し、InspectorのBrain TypeをInternalに設定し、Graph ModelにDSVMよりコピーした学習済みモデルを設定します。アプリケーションを実行することにより学習済みモデルを反映したゲームオブジェクトの動きを見ることができます。
