概要

Unity ML-Agentsの強化学習はDockerイメージで実行できるので、じゃあGoogle Cloud Buildで実行できるよね?ということを確認してみました。

前提

GCPプロジェクトやgcloud コマンドが利用できる前提です。

Unity ML-Agentsの利用やDockerイメージ作成については下記をご参考ください。

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

Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.5.0対応)
https://cloudpack.media/43790

設定ファイルの用意

gcloud コマンドからビルド実行する前提の定義となります。
Unity ML-Agentsで強化学習するとmodelssummaries フォルダに学習結果や学習過程の情報が出力されます。
Dockerコンテナで実行しているとそれらのファイルが参照しにくいので、Cloud Storageへコピーするコマンドを定義しています。

パラメータの詳細については下記が参考になります。

REST Resource: projects.builds
https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds

cloudbuild.yaml

steps:
- name: 'gcr.io/$PROJECT_ID/unity_ml_agents:0.5.0a'
  args: ['trainer_config.yaml', '--env', '3DBall', '--train', '--run-id', '$BUILD_ID']
  id: 'mlagents-learn'
- name: 'gcr.io/cloud-builders/gsutil'
  entrypoint: 'bash'
  args: ['-c', 'while [ ! -f models/**/*.bytes ]; do if [ -d summaries ]; then gsutil cp -r summaries gs://任意のバケット名; fi; sleep 10s; done']
  waitFor: ['-']
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'if [ ! -f models/**/*.bytes ]; then mkdir -p models/error; touch models/error/error.bytes; fi']
  waitFor: ['mlagents-learn']
artifacts:
  objects:
    location: 'gs://任意のバケット名/models/$BUILD_ID/'
    paths: [
      'models/**/*'
    ]

それぞれ分けて説明します。

Unity ML-Agents実行

Unity ML-Agentsで強化学習を開始するステップです。
name でDockerイメージを指定しています。Dockerイメージ作成については、下記を参考ください。

Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.5.0対応)
https://cloudpack.media/43790

Unityアプリとハイパーパラメータファイルについては、gcloud コマンド実行時にsourceとして取得します。
id は後のステップのwaitFor で指定するために定義しています。

Dockerイメージで定義しているendpointmlagents-learn となるため、args にはパラメータを指定しています。
--run-id には$BUILD_ID を指定しており、$PROJECT_ID と同じようにビルド開始時に置換される変数となっています。

cloudbuild.yaml(mlagents-learn)

- name: 'gcr.io/$PROJECT_ID/unity_ml_agents:0.5.0a'
  args: ['trainer_config.yaml', '--env', '3DBall', '--train', '--run-id', '$BUILD_ID']
  id: 'mlagents-learn'

途中経過ファイルコピー

強化学習中に出力されるファイルを定期的にCloud Storageへコピーするステップです。
gsutil が利用できるイメージを指定しています。
waitFor- を指定するとで、前ステップ開始後すぐに並行して実行されます。
entrypointbash を指定して、args-c オプションを利用してコマンドを書いてます。

cloudbuild.yaml(gsutil)

steps:
- name: 'gcr.io/cloud-builders/gsutil'
  entrypoint: 'bash'
  args: ['-c', 'while [ ! -f models/**/*.bytes ]; do date; if [ -d summaries ]; then gsutil cp -r summaries gs://任意のバケット名; fi; sleep 10s; done']
  waitFor: ['-']

コマンドを整形してみます。
学習完了時にmodels/**/*.bytes ファイルが作成されるので、作成されるまで、summaries フォルダのファイルをCloud Storageへコピーするだけのコマンドになります。
ただ、このままだと、学習実行時にエラーなどで、models/**/*.bytes ファイルが作成されないと終了しないため、次のコマンドで対応しています。

while [ ! -f models/**/*.bytes ]; do
    if [ -d summaries ];
        then gsutil cp -r summaries gs://任意のバケット名;
    fi

終了処理

こちらもbashコマンドを利用しています。
waitFormlagents-learn とすることで、強化学習のステップが終わったら実行されるようにしています。

cloudbuild.yaml

- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'if [ ! -f models/**/*.bytes ]; then mkdir -p models/error; touch models/error/error.bytes; fi']
  waitFor: ['mlagents-learn']

コマンドを整形して見てみると、models/**/*.bytes が存在しなければ、ダミーファイルを作成する、というコマンドです。
これで、前ステップが強化学習でエラーが発生しても終了するようにしています。

if [ ! -f models/**/*.bytes ]; then
    mkdir -p models/error;
    touch models/error/error.bytes;
fi

結果ファイルのコピー

全ステップが完了後、paths で指定したファイルをCloud Storageへコピーする定義になります。
こちらはbash コマンドで定義してもよい感じです。

cloudbuild.yaml(artifacts)

artifacts:
  objects:
    location: 'gs://任意のバケット名/models/$BUILD_ID/'
    paths: [
      'models/**/*'
    ]

ビルド実行

用意した定義ファイルで、Cloud Buildでジョブ実行させてみます。
unityアプリ.zipはUnityアプリファイル・フォルダとハイパーパラメータファイルを含む圧縮ファイルを指定しています。
圧縮ファイルの場合、ビルド実行時にワークスペースへコピー・展開を勝手に行ってくれます。

> gcloud builds submit --config=cloudbuild.yaml gs://任意のバケット名/unityアプリ.zip

Cloud Functionsからもビルド実行可能ですので、Cloud Storageにzipファイルがコピーされたら、ビルド実行して、強化学習させることもこれで可能になります。

Google Cloud Functions(Python)からCloud Buildでビルド実行してみる
https://cloudpack.media/43716

Dockerを利用して動作させることができると、システム構成に選択の幅が広がって良いですね。メンテナンス性やコスト、想定されるスケールなどを考慮して、適切な選択ができそうです。

参考

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

Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.5.0対応)
https://cloudpack.media/43790

REST Resource: projects.builds
https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds

Google Cloud Functions(Python)からCloud Buildでビルド実行してみる
https://cloudpack.media/43716

元記事はこちら

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