tanaka's Programming Memo

プログラミングについてのメモ。

Unity ML-AgentsをWindows10で使う 2018年11月版

f:id:am1tanaka:20181107163745g:plain

Unityで機械学習(Machine Learning)が使えるML-Agentsについて、1年前に導入の記事を書きました。あれから大幅に変更されて、動作環境やセットアップ手順が変わったので、2018年11版としてまとめ直します。

  • レーニング時に、待ちすぎると待機が終わる注意を追記(2018/11/9)
  • TFSharpのインポート時に、必要がなければAndroidiOSのチェックを外すとよいというコメントを追記(2018/11/8)

目次

Unity ML-Agents Toolkit (Beta)について

https://github.com/Unity-Technologies/ml-agents よりざっくりと。

Unity Machine Learning Agents Toolkit(ML-Agents)は、AIで動くエージェントをゲームやシミュレーションでトレーニングするための環境を提供します。エージェントは、強化学習(Reinforcement learing)、模倣学習(Imitation learning)、遺伝的アルゴリズム学習(Nueroevolution)、その他の機械学習を簡潔に使えるPython APIを通して学習させることができます。また、TensorFlowで構築された最新鋭のAIエージェントを2D、3D、VR/ARゲームなどでトレーニングして使う機能も提供します。これらのトレーニングされたエージェントは、NPMの振る舞いを制御することを含めて、ゲームの自動テストや、リリース前に異なったゲームのデザインを評価するなど様々な目的で利用できます。

機能

  • PythonからUnityの環境を操作
  • 10以上のUnity用のサンプル
  • 複数の環境設定や、トレーニングシナリオに対応
  • ディープラーニングを使ってメモリーを強化したエージェントのトレーニン
  • 分かりやすい学習シナリオのカリキュラム定義
  • 教師あり学習(supervised learning)のためのエージェントの振る舞いのブロードキャスティング
  • 模倣学習のための組み込みに対応
  • On Demand Decision Making(要求された時に意思決定をする)による自由度の高いエージェント制御
  • 環境内でのネットワークの視覚化
  • Dockerによる環境構築
  • ジム(gym)として学習環境をラッピングする機能

インストール手順

ml-agents/Installation.md at master · Unity-Technologies/ml-agents · GitHubを参考に、Windows10で環境を構築する手順です。簡単にするために、ドキュメント通りではない部分があります。

インストール手順概要

ML-Agentsの環境は以下の通り。

なお、このブログでは以下の環境で確認しました。

  • Windows10
  • Unity2018.2.10とUnity2017.3.0(推奨環境ではありませんが、3DBallは動きました)
  • Anaconda5.1 + Python3.6
  • TensorFlow1.7.1

Unity2017.4以降のインストール

Unity2017.4以降がインストールされていればOKです。Dockerを利用する場合は、Linuxビルドが必要ですが、今回は利用しないので、Linuxビルドは不要です。

ML-Agentsツールキットリポジトリーのダウンロード

gitが利用できる環境であれば、コマンドラインを開いて、リポジトリーをダウンロードしたいフォルダー(ドキュメント -> Unity Projectsフォルダーなど)に移動してから、以下を実行します。

git clone https://github.com/Unity-Technologies/ml-agents.git

Gitの利用が不安な場合は、こちらのページを開いて、以下を実行します。

  • Webページ右の緑色のClone or Downloadボタンをクリックします
  • Download ZIPを選択して、ZIPファイルをダウンロードします
  • ml-agents-master.zipのダウンロードが完了したら、プロジェクトを保存したいフォルダー(ドキュメント -> Unity Projectsフォルダーなど)に全て展開します

以上でml-agents-masterフォルダーに以下のファイルが展開されます。

UnitySDKフォルダー

ML-Agentsを利用したいプロジェクトに追加が必要なUnityアセットが入っています。このフォルダー内には、UnityでML-Agentsを使い慣れるのに便利な多くのサンプル環境も入っています。

ml-agentsフォルダー

AIをトレーニングしたり、UnityとPythonを連携させるためのPython APIなどのPythonパッケージが入っています。

gym-unityフォルダー

ブロック崩しピンボールなどのゲーム向けAIなどを強化学習で教育するためのツールキットであるOpen AI GymをUnityで使うためのインターフェースが入っています。

Pythonとmlagentsパッケージのインストール

以下をインストールしていきます。

注意!

  • 現在、Python3.5や3.7はサポートしていません

インストール手順

ml-agents/Installation-Windows.md at master · Unity-Technologies/ml-agents · GitHubを参考にインストールをします。

ML-AgentsはWindows10のみでテストされています。他のWindowsやBootcampやParallelsのような仮想マシンでも動く可能性はありますが、動作テストはされていません。

Step 1: Anacondaを使ってPythonをインストール する

Windows用のAnacondaをダウンロードしてインストールします。Anacondaは、Pythonの科学計算向けパッケージです。Python自体を含み、複数の独立したPython環境の構築ができます。

ML-Agentsでは、少し古いAnaconda5.1を利用します。Anacondaのサイトからだと、古いバージョンのダウンロードリンクが動いていないようなので、64-bitならこちら32-bitならこちらからダウンロードしてください(ビット数が分からない場合は、とりあえず64ビットのものを使ってみてください)。

オプションはそのままで構わないので、インストールを進めます。

  • VSCodeは不要なので、以下はSkipします

f:id:am1tanaka:20181106162826p:plain

  • 完了したら、特に何も開く必要はないので、チェックを外してFinishをクリックします

f:id:am1tanaka:20181106162911p:plain

インストールが完了したら、仕上げのためにAnaconda Navigationを起動して設定をします。

  • 検索バーに(検索バーが表示されていなければスタートボタンをクリックしてから)anaと入力すると、Anaconda Navigationが検索で表示されるのでクリックします

f:id:am1tanaka:20181106163055p:plain

  • 設定が完了したらアプリが起動するので、OK, and don't show ageinをクリックします

f:id:am1tanaka:20181106163619p:plain

  • 以上が完了したら、アプリを閉じます

f:id:am1tanaka:20181106163626p:plain

コマンドラインからAnacondaを使えるようにするために、環境設定を実行します。

  • 検索バーに環境と入力するなどして、環境変数を編集を開きます

f:id:am1tanaka:20181106165350p:plain

  • Path欄をダブルクリックします

f:id:am1tanaka:20181106165504p:plain

  • 新規ボタンをクリックして、以下の2つのパスを追加して、OKをクリックします
%UserProfile%\Anaconda3\Scripts
%UserProfile%\Anaconda3

以上で、コマンドラインからAnaconda用のコマンドであるcondaが呼び出せるようになりました。

Step 2: 新規にCondaの環境(Conda environment)を設定する

ML-Agentsツールキット用のCondaの環境を作成します。Condaの環境を利用することで、ML-Agentsの動作に必要なパッケージをインストールする影響を限定して、システム全体や他のPython環境に影響を与えるのを防ぎます。Conda環境は、ML-Agentsを実行したい時に必要に応じて有効にすることができます。

Anaconda Promptを使って環境設定をします。

  • 検索バーにanaと入力して、リストアップされるAnaconda Promptをクリックして起動します

f:id:am1tanaka:20181106172435p:plain

  • 以下のコマンドを実行して、Python3.6の環境を、ml-agentsという名前で新規に作成します
conda create -n ml-agents python=3.6

f:id:am1tanaka:20181106172653p:plain

  • yを入力して[Enter]キーを押して、設定を完了させます

f:id:am1tanaka:20181106172839p:plain

Anaconda環境の有効化

ML-Agentsでこの環境を利用する場合は、Anaconda Promptから以下のコマンドを実行します。

activate ml-agents

これで、作成したml-agents環境が有効になり、以下のようにプロンプトが変更されます。

f:id:am1tanaka:20181106173153p:plain

TensorFlow1.7.1のインストール

機械学習ライブラリであるTensorFlowを、作成したConda環境にインストールします。先に開いたAnaconda Promptで、ml-agentsを有効にしたら、以下を実行します。

pip install tensorflow==1.7.1

f:id:am1tanaka:20181106173407p:plain

注意!! ML-Agentsは、TensorFlowの最新版はサポートしません。必ず、指定のバージョン(1.7.1)をインストールしてください。

Step 3: 必要なPythonパッケージのインストール

先にダウンロードしていた、ML-AgentsのGitリポジトリーフォルダーに移動して、インストールコマンドを実行します。Step 2に続けて、Anaconda Promptで作業します。

  • cdコマンドで、先ほどダウンロードして展開したML-Agentsのフォルダー内のml-agentsフォルダーを開きます
    • 展開したのがユーザーのドキュメントフォルダー内のUnity Projectsフォルダーだった場合は、以下のようになります。違うフォルダーに展開した場合は、そのフォルダー内のml-agentsフォルダーを開いて下さい
cd %USERPROFILE%\Documents\UnityProjects\ml-agents-master\ml-agents
pip install .

Step 4のGPUレーニングは使わなくてもよいのでとりあえず飛ばします

以上でインストール完了です。

最初の手引き

以下の内容に沿って、インストールした教育済みモデルの例をUnityで動作させる手順と、どのようにモデルをトレーニングするかの手順を示します。

github.com

UnityでML-Agentsツールキットを準備する

まずは、ML-Agentsツールキットを利用するための設定をして、TensorFlowSharpプラグインを組み込みます。

  • 2017.4以降のUnityを起動します
  • Openをクリックして、ダウンロードして展開したml-agents-masterフォルダー内のUnitySDKフォルダーを開きます

f:id:am1tanaka:20181107145656p:plain

  • バージョン違い確認のダイアログが表示されたら、Continueをクリックして、読み込みを進めます

この段階ではまだエラーが発生します。設定を続けます。

  • プロジェクトが起動したら、Editメニューから、Project Settings > Playerを選択します
  • 以下を、利用したいプラットフォームごとに実施します
    • Other Settingsを開きます
    • Scripting Runtime VersionExperimental、あるいは.NET 4.6 Equivalent、あるいは.NET 4.x Equivalentにします

f:id:am1tanaka:20181107150052p:plain

  • Scripting Defined Symbols欄に、ENABLE_TENSORFLOWを入力して、[Enter]キーを押します

f:id:am1tanaka:20181107150241p:plain

  • FileメニューからSave Projectを選択します

TensorFlowSharpプラグインのインストール

こちらからTensorFlowSharpプラグインをダウンロードします。

ダウンロードが完了したら、ダウンロードしたファイルをダブルクリックするか、UnityのProjectタブにドラッグ&ドロップして、プロジェクトにインポートします。AndroidiOSでの利用の予定がない場合は、インポートするパッケージからチェックを外しておくとよいです(ご指摘下さったHayatoさん、ありがとうございます!)

インポートが成功したら、Assets > ML-Agents > Plugins > Computerフォルダー内に、TensorFlow関連のファイルが確認できます。

f:id:am1tanaka:20181107152720p:plain

以上で、エラーがなくなります。

レーニング済みのモデルを動作確認

3DBallを実行してみましょう。

  • ProejctタブでAssets/ML-Agents/Examples/3DBallフォルダーを開いて、3DBallシーンをダブルクリックして開きます

f:id:am1tanaka:20181107152947p:plain

  • Hierarchyタブで、Ball3DAcademyゲームオブジェクトの子供のBall3DBrainオブジェクトを選択します

f:id:am1tanaka:20181107153107p:plain

f:id:am1tanaka:20181107153220p:plain

  • Projectタブで、Assets/ML-Agents/Examples/3DBall/TFModelsフォルダーを開きます

f:id:am1tanaka:20181107153355p:plain

  • 3DBallモデルをドラッグして、InspectorタブのGraph Model欄にドロップします

f:id:am1tanaka:20181107153526p:plain

以上で設定完了です。Playすると、板の上でボールのバランスをとる様子が確認できます。

f:id:am1tanaka:20181107153610p:plain

強化学習(Reinforcement Learning)のトレーニン

Brainを外部(External)に設定

学習はUnityとPythonを連携させて行うので、Brainを外部にあるPythonとつなげるためにExternalにします。

  • Hierarchyタブで、Ball3DAcademyオブジェクトの子供のBall3DBrainオブジェクトを選択します
  • InspectorタブのBrain Type欄をExternalに変更します

f:id:am1tanaka:20181107155442p:plain

学習の開始

学習は、Anaconda Promptから行います。Anaconda Promptが閉じている状態から開く手順を示します。

  • 検索ボックスにanaと入力して、Anaconda Promptが表示されたらクリックして開きます

f:id:am1tanaka:20181106172435p:plain

  • 以下を実行して、ML-Agents環境に切り替えます
activate ml-agents
  • cdコマンドで、ml-agents-masterフォルダーに切り替えます
  • 以下を入力して、トレーニングの開始を準備します
mlagents-learn config/trainer_config.yaml --run-id=firstRun --train

ツールが起動すると、以下のような画面が表示されて待機状態になります。

f:id:am1tanaka:20181107160032p:plain

  • UnityでPlayします

f:id:am1tanaka:20181107160314p:plain

Unityでボールのバランスを取るトレーニングがはじまります。最初は下手ですが、徐々に上手になっていくのが確認できます。Anaconda Promptの方では、学習の様子が表示されます。

f:id:am1tanaka:20181107160714p:plain

実行が始まらない場合

実行が始まらない場合は、開始するフォルダーを間違えている可能性があります。ML-Agentsのリポジトリーを展開したml-agents-masterフォルダーにいることを確認してください。

また、Anaconda Promptでmlagents-learn config/trainer_config.yaml --run-id=firstRun --trainコマンドを実行したあと、UnityでPlayしないまま1分程度放置すると待機が終わってUnity側でエラーが発生します。Anaconda Promptを実行してUnityでPlayするようメッセージが表示されたら、速やかにUnityの方もPlayしてください(2018/11/9追記)

レーニングを終了する

レーニングは、5万ステップに達したら自動的に終了するような設定になっています。

f:id:am1tanaka:20181107161155p:plain

AIでは過学習といって、学習させすぎるとかえって精度が落ちる場合があります。学習の途中でも十分な成果が出ていると感じたら、[Ctrl]+[C]キーを押して停止することができます。

レーニングしたモデルは、models/<run-identifire>/editor_<academy_name>_<run-identifier>.bytesというファイルに保存されます。

f:id:am1tanaka:20181107161607p:plain

<academy_name>は、現在のUnityシーンでのAcademyゲームオブジェクト名です。このファイルに、最後のチェックポイントの状態のモデルが記録されています。以下の手順で、学習させたモデルをプロジェクト内部に組み込むことができます。

  • 保存された上記の.bytesファイルを、UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/フォルダーにコピーします
  • Unityに切り替えて、3DBallシーンが開いていることを確認します
  • Hierarchyタブから、Ball3DBrainオブジェクトを選択します

f:id:am1tanaka:20181107162002p:plain

  • Inspectorタブで、Brain TypeInternalに切り替えて、読み込んだ学習ファイルをGraph Model欄にドラッグ&ドロップします

f:id:am1tanaka:20181107162242p:plain

以上で設定完了です。UnityでPlayすると、先ほど学習したモデルでの実行を試せます。

本当に学習したモデルなのか?

学習を完全にやると、最初の時と同じなので自分で学習させたのか良く分かりません。そこで、不完全な学習状態のデータを作って、それを設定してみましょう。以下は概略なので、分からない部分があったら、これまでの説明に戻ってください。

  • Brain TypeExternalに切り替えます
  • Anaconda Promptで上カーソルキーを押すと、学習させる時に入力したコマンドを呼び出せるので、[Enter]キーを押します
  • 学習の待機状態になったら、Unityに切り替えてPlayします
  • Anaconda Promptで経過を見て、Stepが5000になったら、[Ctrl]+[C]キーを押して、学習を停止します

f:id:am1tanaka:20181107162651p:plain

  • Unityに切り替えて、Projectタブで先ほど読み込んだ学習ファイルeditor_Ball3DAcademy_firstRun-0.bytesを削除します
  • 学習させなおしたeditor_Ball3DAcademy_firstRun-0.bytesを、ProjectタブのUnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/にドラッグ&ドロップし直します
  • Brain TypeInternalに切り替えます
  • Inspectorタブで、Brain TypeInternalに切り替えて、読み込んだ学習ファイルをGraph Model欄にドラッグ&ドロップします

以上で、今度は全然バランスが取れない状態が確認できます。これで、自分が学習させたファイルだったことが確認できるでしょう。

f:id:am1tanaka:20181107163745g:plain

このあと

このブログでは、以下のドキュメントのInstallation & Set-upの内容を紹介しました。

ml-agents/docs at master · Unity-Technologies/ml-agents · GitHub

新規のUnityプロジェクトにML-Agentsの環境を作って、学習、再生する記事であるml-agents/Learning-Environment-Create-New.md at master · Unity-Technologies/ml-agents · GitHubについて以下にまとめました。続きに是非どうぞ。

am1tanaka.hatenablog.com

あるいは以下のような場合はそれぞれのものを読み進めるとよいでしょう。

www.youtube.com

最後に

1年が経過して、インストール手順も学習方法もシンプルになりました。Jupyter Notebookを使わずにコマンドラインで学習できるようになったのはいいですね。Jupyterも引き続き使えるので、必要になったら使えます。

このブログの内容で、Examplesの中のプロジェクトを一通り試すことはできると思います。サンプルプロジェクトのBrain Typeは、最初はプレイヤーが自分で操作するPlayerモードになっているので、それをInternalに変更すれば学習済みのAIの動きを見ることができます。

自分でモデルを作って学習させる方法は分からないので、引き続きドキュメントを読んでまとめていきます。

参考URL