これはcloudpack あら便利カレンダー 2018の記事です。

概要

Unity ML-AgentsをDocker上で動作させてみました。

UnityやUnity ML-Agentsの環境構築などは下記をご参考ください。

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://cloudpack.media/42142

MacでUnity ML-Agentsの環境を構築する
https://cloudpack.media/42164

手順

基本的には公式のドキュメントに沿えばよい感じです。

Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.md

Dockerのインストール

Dockerがインストールされていない場合、インストールします。

> brew cask install docker
(略)

> docker --version
Docker version 18.06.0-ce, build 0ffa825

> open /Applications/Docker.app

Dockerを初回起動すると初期設定のためにパスワード入力が求められます。

UnityにLinuxビルドサポートコンポーネントを追加する

  • Unity Hubアプリを起動する
  • [Installs] > [On my machine]からUnityリスト右側にある[…]から[Add Component]を選択する
  • [Add components your install]ダイアログの[Platforms]にある[Linux Build Support]にチェックを入れて[Done]ボタンをクリックする

学習用のappをビルドする

  • Unityを起動して、[open]から以下のフォルダを開く

Scenes(シーン)の設定

Unityの[Edit]メニューから[Project Settings] > [Player]を開く

  • [Inspector]ビューで以下の設定を確認する。
    • [Resolution and Presentation]の[Run In Background]がチェックされている
    • [Display Resolution Dialog]がDisableになっている

  • [Hierarchy]ビューから[Ball3DAcademy] > [Ball3DBrain]を開く
    • [Inspector]ビューで[Brain Type]を[External]に変更する

  • [Ctrl] + [s]キーでシーンを保存する

設定変更後、しっかりと保存しないとビルド時に設定が反映されなくてハマります。(1敗)

ビルド設定

  • Unityの[File]メニューから[Build Settings]を選択する
  • [Build Settings]ダイアログで[Platform]で[PC, Mac & Linux Standalone]が選択されていることを確認する
  • [Target Platform]を[Linux]に変更する
  • [Architecture]を[x86_64]に変更する
  • [Build Settings]ダイアログで[Build]ボタンをクリックする
  • ファイル保存ダイアログで以下を指定してビルドを開始する
    • ml-agents\unity-volume\3DBall

すると、unity-volumeに以下フォルダ・ファイルが出力されます。

> ll unity-volume/
3DBall.x86_64
3DBall_Data

Dockerコンテナを構築する

Dockerが起動していることを確認してから、ml-agentsリポジトリ直下でdockerコンテナを構築する。
すでにDockerfileが用意されているので、buildするだけ。楽々ですね。

> cd 任意のディレクトリ/ml-agents
> docker build -t 3dball_ml_docker
(略)
Successfully built db0b82f60411
Successfully tagged 3dball_ml_docker:latest

Dockerコンテナの実行

Dockerコンテナが構築できたら実行してみます。

bash

# unity-ml-docker-3dball: コンテナ名(任意)
# 3DBall: Unityでbuild時に付けた名前(拡張子なし)
# 3dball_ml_docker: Dockerでbuild時に付けた名前
# docker_first_run: 機械学習結果を保存する際の名称(任意)

> docker run --name unity-ml-docker-3dball \
           --mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \
           -p 5005:5005 \
           3dball_ml_docker:latest 3DBall \
           --docker-target-name=unity-volume \
           --train \
           --run-id=docker_first_run

fishシェルで実行する場合は、"$(pwd)""$PWD"に置き換えます。

fish

> docker run --name unity-ml-docker-3dball \
           --mount type=bind,source="$PWD"/unity-volume,target=/unity-volume \
           -p 5005:5005 \
           3dball_ml_docker:latest 3DBall \
           --docker-target-name=unity-volume \
           --train \
           --run-id=docker_first_run

実行すると、学習が始まります。学習は[ctrl]+[ c ]キーで終了させることができます。

> docker run (略)
id=docker_first_run
INFO:unityagents:{'--curriculum': 'None',
 '--docker-target-name': 'unity-volume',
 '--help': False,
 '--keep-checkpoints': '5',
 '--lesson': '0',
 '--load': False,
 '--no-graphics': False,
 '--run-id': 'docker_first_run',
 '--save-freq': '50000',
 '--seed': '-1',
 '--slow': False,
 '--train': True,
 '--worker-id': '0',
 '<env>': '3DBall'}
INFO:unityagents:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
        Number of Brains: 1
        Number of External Brains : 1
        Lesson number : 0
        Reset Parameters :

Unity brain name: Ball3DBrain
        Number of Visual Observations (per agent): 0
        Vector Observation space type: continuous
        Vector Observation space size (per agent): 8
        Number of stacked Vector Observation: 1
        Vector Action space type: continuous
        Vector Action space size (per agent): 2
        Vector Action descriptions: ,
INFO:unityagents:Hyperparameters for the PPO Trainer of brain Ball3DBrain:
        batch_size:     64
        beta:   0.001
        buffer_size:    12000
        epsilon:        0.2
        gamma:  0.995
        hidden_units:   128
        lambd:  0.99
        learning_rate:  0.0003
        max_steps:      5.0e4
        normalize:      True
        num_epoch:      3
        num_layers:     2
        time_horizon:   1000
        sequence_length:        64
        summary_freq:   1000
        use_recurrent:  False
        graph_scope:
        summary_path:   /unity-volume/summaries/docker_first_run
        memory_size:    256
        use_curiosity:  False
        curiosity_strength:     0.01
        curiosity_enc_size:     128
INFO:unityagents: Ball3DBrain: Step: 1000. Mean Reward: 1.128. Std of Reward: 0.598.

# [ctrl] + [ c ]で終了させる

^CINFO:unityagents:Learning was interrupted. Please wait while the graph is generated.
INFO:unityagents:Saved Model
INFO:unityagents:List of nodes to export :
INFO:unityagents:       action
INFO:unityagents:       value_estimate
INFO:unityagents:       action_probs
INFO:tensorflow:Restoring parameters from /unity-volume/models/docker_first_run/model-6084.cptk
INFO:tensorflow:Froze 16 variables.


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


--------------------------Now saving model-------------------------
Converted 16 variables to const ops.

学習結果をUnityで確認

学習結果は下記に保存されるので、Unityプロジェクトのフォルダにコピーします。

  • unity-volume/models/docker_first_run/3DBall_docker_first_run.bytes
> cp unity-volume/models/docker_first_run/3DBall_docker_first_run.bytes unity
-environment/Assets/ML-Agents/Examples/3DBall/TFModels
  • Unityの[Hierarchy]パネルから以下を選択する
    • [3DBall] > [Ball3DAcademy] > [Ball3DBrain]
  • Unityの[Inspector]パネルにある[Brain Type]を[internal]に変更する
  • [Project]パネルで以下フォルダを選択する
    • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
  • [Brain Type]下に[Graph Model]という項目が現れてるので、そこに[TFModels]フォルダ内の以下ファイルをドラッグ&ドロップする
    • 3DBall_docker_first_run.bytes
  • Unity上部にある再生(三角)ボタンをクリックする

これで、学習結果が組み込まれた状態でアプリが起動する(はず)です。

参考

Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.md

Docker for Macをインストールしてみた
https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68

元記事はこちら

MacでUnity ML-AgentsをDockerで動作させる