Edited at

Google Kubernetes EngineでUnity ML-Agentsを動かしてみる(V0.5.0対応)


概要

Unity ML-AgentsはDockerでも動作させることができるので、Google Kubernetes Engine(GKE)でも動作させることができるはず!と検証してみました。

Google Kubernetes Engineについては下記をご参考ください。

Google KUBERNETES ENGINE

https://cloud.google.com/kubernetes-engine/?hl=ja

Unity ML-Agentsについては下記をご参考ください。

MacでUnity ML-Agentsの環境を構築する(v0.5.0対応)

https://qiita.com/kai_kou/items/6478fa686ce1af5939d8

DockerでUnity ML-Agentsを動作させる(v0.5.0対応)

https://qiita.com/kai_kou/items/df3f3518a5a27b66f617


準備

下記記事を参考に進めました。

GKEを使ったバッチジョブ実行

http://otiai10.hatenablog.com/entry/2017/12/19/162430

Dockerのインストールは済んでいる前提です。

今回の手順で利用したのはMacでDockerバージョンは以下となります。

> docker --version

Docker version 18.06.1-ce, build e68fc7a

gcloud (Cloud SDK)のインストールがまだの場合、下記をご参考ください。

https://cloud.google.com/sdk/downloads?hl=ja

kubectl のインストールと初期化は下記をご参考ください。

https://cloud.google.com/kubernetes-engine/docs/quickstart

kubectl コマンドはDockerアプリでKubernetesが有効化するとコマンドが有効化されるようです。

GCPの設定については、上記記事の[gcloud のデフォルト設定を構成する]まで進めている前提です。


Unity ML-Agentsのダウンロード

Unity ML-Agentsのソースを取得します。

> mkdir 任意のディレクトリ

> cd 任意のディレクトリ
> git clone https://github.com/Unity-Technologies/ml-agents.git


Dockerイメージの用意

Unity ML-Agentsに含まれているDockerfileを利用してDockerイメージを作成します。

今回は、強化学習させるUnityアプリをイメージに含めてしまいます。

本来であれば、Unityアプリやハイパーパラメータファイルはコンテナ作成時にCloud Storageなどから取ってくるべきですが、検証のため割愛します。

Unityアプリのビルドについては下記記事をご参考ください。

DockerでUnity ML-Agentsを動作させる(v0.5.0対応)

https://qiita.com/kai_kou/items/df3f3518a5a27b66f617

> cd ml-agents

> ls ml-agents/
3DBall.x86_64 README.md requirements.txt tests
3DBall_Data mlagents setup.py trainer_config.yaml

3DBall.x86_643DBall_Data がLinuxビルドしたUnityアプリ、trainer_config.yaml がハイパーパラメータファイルとなります。

Unityアプリとハイパーパラメータファイルが準備できたら、イメージを作成します。

> docker build -t unity_ml_agents_on_gke .

イメージは、GKEで利用できるように、Google Container RegistryにPUSHします。

プライベートDocker RegistryをGoogle Container Registry で構築

https://qiita.com/zum/items/1904ccd280879ca481c5

PUSHするために、タグを指定します。

> docker tag unity_ml_agents_on_gke:latest gcr.io/[GCPのプロジェクトID]/unity_ml_agents_on_gke

タグが指定できたか確認しておきます。

> docker images

REPOSITORY TAG IMAGE ID CREATEDSIZE
gcr.io/[GCPのプロジェクトID]/unity_ml_agents_on_gke latest fd69fd69de11 8 days ago904MB

Google Container RegistryにPUSHします。

> gcloud docker -- push gcr.io/[GCPのプロジェクトID]/unity_ml_agents_on_gke

()
latest: digest: sha256:xxxxxx size: 3044

はい。

これで、GKEから利用できるDockerイメージの準備ができました。


コンテナクラスタを作成する

続いて、GKEでコンテナクラスタを作成します。

> gcloud container clusters create unity-ml-agents-on-gke

unity-ml-agents-on-gke はクラスタ名となりますので、任意の名称でOKです。

クラスタが作成できたら、ローカル環境から利用できるように、credentialsをfetchします。

> gcloud container clusters list

NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
unity-ml-agents-on-gke asia-northeast1-a 1.9.7-gke.6 xxx.xxx.xxx.xxx n1-standard-1 1.9.7-gke.6 3 RUNNING

xxx.xxx.xxx.xxx はIPアドレスになります。


Unity ML-Agentsで強化学習を実行する

Unity ML-Agentsで強化学習を実行するために作成したクラスタコンテナでジョブ実行します。

> touch job.yaml


job.yaml

apiVersion: batch/v1

kind: Job
metadata:
name: unity-ml-agents-on-gke-01
spec:
template:
spec:
containers:
- name: unity-ml-agents-on-gke
image: gcr.io/[GCPのプロジェクトID]/unity_ml_agents_on_gke:latest
command: ["mlagents-learn", "trainer_config.yaml", "--env", "3DBall", "--train"]
restartPolicy: OnFailure

metadata.name はジョブ名になります。重複しているとエラーになるので、複数回実行する場合には名前を変更します。

containers.name にはクラスタ名を指定します。

ジョブ実行してみます。

> kubectl create -f job.yaml

job.batch "unity-ml-agents-on-gke-01" created

登録できたら、ジョブ情報を見てみます。

> kubectl describe jobs/unity-ml-agents-on-gke-01

Name: unity-ml-agents-on-gke-01
Namespace: default
Selector: controller-uid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Labels: controller-uid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
job-name=unity-ml-agents-on-gke-01
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Fri, 21 Sep 2018 14:57:02 +0900
Pods Statuses: 1 Running / 0 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
job-name=unity-ml-agents-on-gke-01
Containers:
unity-ml-agents-on-gke:
Image: gcr.io/[GCPのプロジェクトID]/unity_ml_agents_on_gke:latest
Port: <none>
Host Port: <none>
Command:
mlagents-learn
trainer_config.yaml
--env
3DBall
--train
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 6s job-controller Created pod: unity-ml-agents-on-gke-01-c9fvg

> kubectl logs jobs/unity-ml-agents-on-gke-04

INFO:mlagents.trainers:{'--curriculum': 'None',
'--docker-target-name': 'None',
'--env': '3DBall',
'--help': False,
'--keep-checkpoints': '5',
'--lesson': '0',
'--load': False,
'--no-graphics': False,
'--num-runs': '1',
'--run-id': 'ppo',
'--save-freq': '50000',
'--seed': '-1',
'--slow': False,
'--train': True,
'--worker-id': '0',
'<trainer-config-path>': 'trainer_config.yaml'}

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

Found path: /ml-agents/3DBall.x86_64
Mono path[0] = '/ml-agents/3DBall_Data/Managed'
Mono config path = '/ml-agents/3DBall_Data/MonoBleedingEdge/etc'
Preloaded 'libgrpc_csharp_ext.x64.so'
Preloaded 'liblibtensorflow.so'
Preloaded 'libtensorflow_framework.so'
PlayerPrefs - Creating folder: /root/.config/unity3d/Unity Technologies
PlayerPrefs - Creating folder: /root/.config/unity3d/Unity Technologies/Unity Environment
Logging to /root/.config/unity3d/Unity Technologies/Unity Environment/Player.log
INFO:mlagents.envs:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
Number of Brains: 1
Number of External Brains : 1
Reset Parameters :

Unity brain name: Ball3DBrain
Number of Visual Observations (per agent): 0
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: ,
2018-09-21 05:57:10.516154: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
INFO:mlagents.envs: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: ./summaries/ppo-0
memory_size: 256
use_curiosity: False
curiosity_strength: 0.01
curiosity_enc_size: 128
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 1000. Mean Reward: 1.201. Std of Reward: 0.662. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 2000. Mean Reward: 1.406. Std of Reward: 0.790. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 3000. Mean Reward: 1.618. Std of Reward: 1.028. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 4000. Mean Reward: 2.217. Std of Reward: 1.516. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 5000. Mean Reward: 3.195. Std of Reward: 2.365. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 6000. Mean Reward: 4.861. Std of Reward: 3.957. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 7000. Mean Reward: 8.058. Std of Reward: 7.471. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 8000. Mean Reward: 12.446. Std of Reward: 11.199. Training.
INFO:mlagents.trainers: ppo-0: Ball3DBrain: Step: 9000. Mean Reward: 17.426. Std of Reward: 18.031. Training.
()

はい。無事にML-Agentsで強化学習がされました。

このままだと、UnityアプリやハイパーパラメータファイルをDockerイメージに含めてしまっているので、使い勝手が悪いため、ジョブ実行時にCloud Storageから取得したり、学習結果ファイルをCloud Storageなどへ対比させるスクリプトを書く必要がありますが、思っていたより簡単に実行することができました。


参考

Google KUBERNETES ENGINE

https://cloud.google.com/kubernetes-engine/?hl=ja

Unity ML-Agentsについては下記をご参考ください。

MacでUnity ML-Agentsの環境を構築する(v0.5.0対応)

https://qiita.com/kai_kou/items/6478fa686ce1af5939d8

DockerでUnity ML-Agentsを動作させる(v0.5.0対応)

https://qiita.com/kai_kou/items/df3f3518a5a27b66f617

GKEを使ったバッチジョブ実行

http://otiai10.hatenablog.com/entry/2017/12/19/162430

Kubernetes Engineのクイックスタート

https://cloud.google.com/kubernetes-engine/docs/quickstart

Unity ML-Agents関連の記事まとめ

https://qiita.com/kai_kou/items/bffe1837ae1caccee179