Unity ML-Agentsのインストールから学習まで

物理エンジンの中で機械学習するのってめっちゃ楽しそうだし憧れがありました。 UnityのML-Agentsを使うとゲームをプレイさせたり歩き方を覚える強化学習が簡単に実行できます。 勢いで始めてUnityにも始めて触ったんですが、直ぐに学習することができました。 サンプルも種類がたくさんあって動かしてるだけでも楽しいです。

こんな感じで学習途中や変な収束の仕方したものを眺めてられます。

日本語の情報がちょっと少ないので環境構築のメモを残します。

2021-07-22追記 Unityのcom.unity.ml-agentsパッケージのインストール手順が間違ってたので修正。

Unity ML-Agentsで新しく学習環境を作る - suzu6ではサンプルにない学習環境を作って学習してます。

Unityの機械学習

UnityからML-Agentsという機械学習のツールが公開されています。 Unity 機械学習ではML-Agentsを使ってどんなことができるのかブログや作品がまとまってます。日本語はトップだけですが動画付きで自動翻訳だけでも十分イメージがつくかと思います。

ML-AgentsはGitHubで公開されています。 ml-agents github

ML-Agentsでは機械学習のベースにPyTorchを利用しています。 バージョン0.1ぐらいの時ではTensorflowを使っていたようで、調べたときに情報が錯綜してました。

環境構築の手順

最新のstableバージョンのRelease 12を利用します。 release_12_docsを参考にインストールしていきます。

出来上がる環境

  • Unity 2019.4
  • Python 3.6.4 (Anaconda 4.9.2)
  • ML-Agents Release 12
    • mlagents 0.23.0 (pip Package)
    • com.unity.ml-agents 1.7.2-preview (Unity Package)

ML-AgentsのReleaseはUnityとPythonのパッケージをまとめたバージョンとなっています。

手順のまとめ

  • Unityをインストール (2018.4 or later)
  • ML-Agents Toolkitのリポジトリをクローンまたはダウンロード
  • Pythonをインストール (3.6.1 or higher)
  • Pythonにmlagentsパッケージをインストールする
  • PyTorchをインストールする
  • Unityに com.unity.ml-agents パッケージをインストールする。

Windows 10で実施しましたがMacやLinuxでもほぼ同様の手順で大丈夫かと思います。 PythonはAnacondaを利用してインストールしました。

Unityをインストール

Unity StoreからUnity Hubをインストールする。

設定でアカウントの作成と新規ライセンスの認証をします。 個人の趣味の範囲で利用するためライセンスはPersonalを選択しました。ml-agentsもPersonalプランで利用可能です。

Unity HubのインストールメニューからUnityのLTSをインストールします。 2019.4.17f1 (LTS) を選択しました。

unity2019

ML-Agents Toolkitのリポジトリをクローンまたはダウンロード

UnityとPythonのパッケージとして利用するためローカルに持ってきます。 クローンでもダウンロードでもどちらでもよいです。

リポジトリをクローンする場合

> cd path/to/dir
> git clone --branch release_12 https://github.com/Unity-Technologies/ml-agents.git

zipでダウンロードする場合

Relese12から緑のボタンのCodeを開くとDownload ZIPがあるのでそこからダウンロードする。 ダウンロード出来たら好きなところに展開しておく。

zip

Pythonをインストール

Anacondaで環境を作りました。 始めはPython 3.9で進めようとしたがmlagentsに必要なパッケージのnumpyが3.9に対応してないため入れ直している。

Anacondaからダウンロードしてインストールする。 インストールして設定までの手順はPython Japanのガイドがわかりやすい。

インストール出来たら環境変数にAnacondaのPathを追加します。

%UserProfile%\Anaconda3\Scripts
%UserProfile%\Anaconda3

\Anaconda3\Anaconda3\Scripts のパスを追加します。 Anaconda3のパスは環境に合わせて変更して下さい。

AnacondaをインストールしたらPowershellを開いて Python 3.6を導入します。

powershell
(base) PS C:\Users\suzu6> conda create -n mlagents python=3.6.7 anaconda
(base) PS C:\Users\suzu6>  conda activate mlagents
# (mlagents)となればOK
(mlagents) PS C:\Users\suzu6>

(base)と表示がない場合は環境変数が通っていないかもしれません。

また、Windows限定でですがInstalling ML-Agents Toolkit for WindowsでもAnacondaのインストール方法が紹介されています(英語)。こちらではNvidia CUDA toolkitの導入も載っておりGPUを利用できます。

Pythonにmlagentsパッケージをインストールする

Installing ML-Agents Toolkit for Windows (Deprecated)を参考にしています。

# condaをactivate
(base) PS C:\Users\suzu6>  conda activate mlagents
(mlagents) PS C:\Users\suzu6>
# (mlagents)となればOK

> pip install mlagents mlagents-envs

# tensorflowもインストールする
> pip install tensorflow==1.7.1

tensorflowのバージョンは適宜修正してください。

インストールしているモジュールに関しては以下のpypi.orgのリンクを参照してください。

GPUの設定は今回していない。

記録として以前紹介していた間違った方法を残します。

間違って開発用でインストールしていた方法とそのエラー(クリックで開く)

Install for Developmentの方法でインストールした。

ml-agentsのディレクトリの配下に /ml-agents/ml-agents-envsのPythonのパッケージがあるのでこの2つをインストールします。

# condaをactivate
(base) PS C:\Users\suzu6>  conda activate mlagents
(mlagents) PS C:\Users\suzu6>
# (mlagents)となればOK

# クローンしたパスへ移動する。
> cd C:/Downloads/ml-agents
# ダウンロードした場合のパスはこんな感じ。
> cd C:/Downloads/ml-agents-release_12_branch

# ローカルのパッケージを2つインストールする
> cd ml-agents-envs
> pip install -e .
> cd ..
> cd ml-agents
> pip install -e .

pip freezeでインストールしたパッケージ一覧を確認できる。

(mlagents) > pip freeze
...
-e git+https://github.com/Unity-Technologies/ml-agents.git@2335fc7cb22f88f2e266cc128c7d66d8858dc73f#egg=mlagents&subdirectory=ml-agents
-e git+https://github.com/Unity-Technologies/ml-agents.git@2335fc7cb22f88f2e266cc128c7d66d8858dc73f#egg=mlagents_envs&subdirectory=ml-agents-envs
...

-eでインストールはこんな風になるらしい。。。

このインストール方法だと、学習の実行時に以下のエラーが出る。

Traceback (most recent call last):

  File "C:\Users\suzu6\anaconda3\envs\mlagents2\Scripts\mlagents-learn-script.py", line 33, in <module>

    sys.exit(load_entry_point('mlagents', 'console_scripts', 'mlagents-learn')())

  File "C:\Users\suzu6\anaconda3\envs\mlagents2\Scripts\mlagents-learn-script.py", line 22, in importlib_load_entry_point

    for entry_point in distribution(dist_name).entry_points

AttributeError: 'PathDistribution' object has no attribute 'entry_points'

PyTorchをインストールする

機械学習ライブラリのPyTorchをインストールします。

(mlagents) > pip install torch==1.7.0 -f https://download.pytorch.org/whl/torch_stable.html

Unityに com.unity.ml-agents パッケージをインストールする

Unityにml-agentsのパッケージをインストールします。

  1. Unityを起動し、Unityのプロジェクトを「3D」で新規作成。

newproject

レイアウトを右上のLayoutから2by3に変更しました。

  1. メニュー「Window → Package Manager」を開き、「+ → Add package from disk」を選択し、「com.unity.ml-agents/package.json」を選択します。

package

  1. プロジェクトの.NET を有効化する。

Editメニューから、Project Settings > Playerを選択します。 以下を、利用したいプラットフォームごとに実施します。

Other Settingsを開きます Scripting Runtime VersionがExperimental、あるいは .NET 4.6 Equivalent、あるいは.NET 4.x Equivalentにします Restartするかのウィンドウが表示されたら、Restartします Unityが一度閉じて再起動するのを待ってください。これでエラーが出なくなります。

参考 : UnityのML-Agentsで、新しい学習環境を作成する

net

※ 公式ドキュメントではこの手順が抜けていたためusing ML-Agentsでnamespaceが解決できないエラーが出ました。

2021-07-22追記 4. AssetsにML-Agentsのパッケージを追加

クローンしていたものの .\ml-agents\Project\Assets\にあるML-AgentsフォルダをプロジェクトのAssetsに置きます。 assets

namespaseエラーが出ている場合はこちらを試してください。

こちらでもML-Agentsのパッケージを追加する方法を書いています。

以上でUnityのセットアップが終わります。

学習してみる

ML-Agentsのアセットを使ってサンプルを学習してみます。 Getting Started Guideを参考にバランスを学習する3DBallを学習してみます。

サンプルのシーンを先ほど作ったプロジェクトに追加します。 ml-agents\Project\Assets\ML-AgentsをAssetsに置きます。

asset

まず、3DBallを実行してみます。 ProjectのタブでAssets\ML-Agents\Examples\3DBall\Scenesから3DBallのシーンを選択します。プレイボタンで学習済みのモデルを使ったシミュレーションが実行できます。

3dball

Training ML-Agentsに学習についての詳細が載ってます。 学習で詰まったら一読してみてください。

トレーニングの実行

サンプルが動くことが確認できたので、学習してみます。

学習するモデルの設定がml-agents/config/ppo/3DBall.yamlにあるのでこれを使います。 まず、PowershellでAnacondaの環境を開いて、mlagents-learnを実行します。

# condaをactivate
(base) PS C:\Users\suzu6>  conda activate mlagents
(mlagents) PS C:\Users\suzu6>
# (mlagents)となればOK

> cd path\to\ml-agents-release_12_branch
> mlagents-learn config/ppo/3DBall.yaml --run-id=test3DBallRun
C:\Users\suzumura\anaconda3\envs\mlagents\lib\site-packages\torch\cuda\__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  ..\c10\cuda\CUDAFunctions.cpp:100.)
  return torch._C._cuda_getDeviceCount() > 0


                        ▄▄▄▓▓▓▓
                   ╓▓▓▓▓▓▓█▓▓▓▓▓
              ,▄▄▄m▀▀▀'  ,▓▓▓▀▓▓▄                           ▓▓▓  ▓▓▌
            ▄▓▓▓▀'      ▄▓▓▀  ▓▓▓      ▄▄     ▄▄ ,▄▄ ▄▄▄▄   ,▄▄ ▄▓▓▌▄ ▄▄▄    ,▄▄
          ▄▓▓▓▀        ▄▓▓▀   ▐▓▓▌     ▓▓▌   ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌  ╒▓▓▌
        ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓      ▓▀      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌   ▐▓▓▄ ▓▓▌
        ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄     ▓▓      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌    ▐▓▓▐▓▓
          ^█▓▓▓        ▀▓▓▄   ▐▓▓▌     ▓▓▓▓▄▓▓▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▓▄    ▓▓▓▓`
            '▀▓▓▓▄      ^▓▓▓  ▓▓▓       └▀▀▀▀ ▀▀ ^▀▀    `▀▀ `▀▀   '▀▀    ▐▓▓▌
               ▀▀▀▀▓▄▄▄   ▓▓▓▓▓▓,                                      ▓▓▓▓▀
                   `▀█▓▓▓▓▓▓▓▓▓▌
                        ¬`▀▀▀█▓


 Version information:
  ml-agents: 0.23.0,
  ml-agents-envs: 0.23.0,
  Communicator API: 1.3.0,
  PyTorch: 1.7.0+cu110
2021-01-14 00:09:16 INFO [learn.py:275] run_seed set to 5620
C:\Users\suzumura\anaconda3\envs\mlagents\lib\site-packages\torch\cuda\__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  ..\c10\cuda\CUDAFunctions.cpp:100.)
  return torch._C._cuda_getDeviceCount() > 0
2021-01-14 00:09:21 INFO [environment.py:205] Listening on port 5004. Start training by pressing the Play button in the Unity Editor.

--run-idは学習を一意に決めるIDで、途中から学習したり学習効率を比較するのに使います。

mlagents-learnを実行すると5004ポートを開けて待機状態になる。 Unityの3DBallのシーンでプレイボタンを押すと、学習を始めます。

学習中のログ。 3DBall.yamlの設定値も出ています。

2021-01-14 00:09:43 INFO [environment.py:111] Connected to Unity environment with package version 1.7.2-preview and communication version 1.3.0
2021-01-14 00:09:43 INFO [environment.py:271] Connected new brain:
3DBall?team=0
2021-01-14 00:09:43 INFO [stats.py:147] Hyperparameters for behavior name 3DBall:
        trainer_type:   ppo
        hyperparameters:
          batch_size:   64
          buffer_size:  12000
          learning_rate:        0.0003
          beta: 0.001
          epsilon:      0.2
          lambd:        0.99
          num_epoch:    3
          learning_rate_schedule:       linear
        network_settings:
          normalize:    True
          hidden_units: 128
          num_layers:   2
          vis_encode_type:      simple
          memory:       None
        reward_signals:
          extrinsic:
            gamma:      0.99
            strength:   1.0
        init_path:      None
        keep_checkpoints:       5
        checkpoint_interval:    500000
        max_steps:      500000
        time_horizon:   1000
        summary_freq:   12000
        threaded:       True
        self_play:      None
        behavioral_cloning:     None
        framework:      pytorch
2021-01-14 00:10:04 INFO [stats.py:139] 3DBall. Step: 12000. Time Elapsed: 47.133 s. Mean Reward: 1.136. Std of Reward: 0.670. Training.
2021-01-14 00:10:36 INFO [stats.py:139] 3DBall. Step: 24000. Time Elapsed: 79.293 s. Mean Reward: 1.281. Std of Reward: 0.783. Training.
2021-01-14 00:11:06 INFO [stats.py:139] 3DBall. Step: 36000. Time Elapsed: 109.718 s. Mean Reward: 1.806. Std of Reward: 1.116. Training.
2021-01-14 00:11:37 INFO [stats.py:139] 3DBall. Step: 48000. Time Elapsed: 140.264 s. Mean Reward: 2.763. Std of Reward: 2.053. Training.
2021-01-14 00:12:07 INFO [stats.py:139] 3DBall. Step: 60000. Time Elapsed: 170.701 s. Mean Reward: 4.412. Std of Reward: 3.909. Training.
2021-01-14 00:12:37 INFO [stats.py:139] 3DBall. Step: 72000. Time Elapsed: 200.760 s. Mean Reward: 8.648. Std of Reward: 8.444. Training.
2021-01-14 00:13:12 INFO [stats.py:139] 3DBall. Step: 84000. Time Elapsed: 235.244 s. Mean Reward: 20.314. Std of Reward: 16.167. Training.

Ctrl + Cで学習を止めモデルを保存できる。

学習を再開する

学習を再開したい場合は > mlagents-learn config/ppo/3DBall.yaml --run-id=test3DBallRun --resumeとすると前回のステップ数から再開します。

設定値や環境を変更したらステップ学習できるかもしれない。

学習曲線を表示する

tensorboard --logdir resultsで学習曲線を表示することができます。

> conda activate mlagents
> cd {mlagents-learnを実行したパス}

> tensorboard --logdir results
TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.4.0 at http://localhost:6006/ (Press CTRL+C to quit)

コマンドを実行してhttp://localhost:6006/を開くとグラフが確認できる。

tensor

Walkerを学習してみる

Walkerを学習したときのコマンドのメモ。

# anaconda
> conda create -n mlagents python=3.6.7 anaconda
> conda activate mlagents

> cd C:\git\unity\ml-agents-release_12_branch
> mlagents-learn config/ppo/WalkerStatic.yaml --run-id=runWalkerStatic
# play unity

# 学習を確認
> tensorboard --logdir results

# 学習を再開
> mlagents-learn config/ppo/WalkerStatic.yaml --run-id=runWalkerStatic --resume
# play unity

# 前の学習を破棄して新しく
> mlagents-learn config/ppo/WalkerStatic.yaml --initialize-from=runWalkerLegsStatic

おわりに

手順が結構多いのでエラーで進めなくなるかもしれません。 公式の手順の確認や質問サイトで解決してください。 また、twitter @suzu6_pyで聞いてもらえれば一緒に考えることはできます。

Unity ML-Agentsで新しく学習環境を作る - suzu6ではサンプルにない学習環境を作って学習してます。

参考

日本語で参考になったサイト

ML-Agentsについての書籍のレビュー

 関連記事

 新着 or 更新記事