[Project Bonsai] Bonsaiのシミュレータを触ってみる【番外編】


はじめに

Project Bonsaiについて調べてみましたの3回目の番外編です。
過去の内容はこちら。
1回目は「Bonsaiを触ってみる」
2回目は「Bonsaiをいじってみる」
3回目は「Bonsaiのシミュレータを触ってみる」
4回目は[「Bonsaiをローカル環境で使ってみるる」
ローカルシミュレータの実行速度が遅すぎるので、実用に耐えられるようBonsaiのシミュレータに登録してみたいと思います。

Bonsaiって何?

Microsoftが提供している自律システム向け機械教示サービスです。(現在はPublic Preview)
産業制御システムに焦点を当てた汎用ディープ強化学習プラットフォームのようです

学習時間を速くする

ローカルシミュレータが遅すぎる件について

ローカルシミュレータでもなんとかなるかなと思い、1日以上動かしてみたりしましたが、何ともなりませんでした。
通信トラブルで止まったり等もあり、散々です。

現在、学習させている内容は、1エピソードを50回にしているので、1回学習カリキュラムの実行回数は最大50回
Bonsaiは、70万エピソードを実行するか、これ以上学習が不要な状態になるまで実施しますので、
70万(学習回数) × 50回(エピソード) = 3500万回
の処理回数(最大)が必要となります。

私の環境の場合、ローカルシミュレータの実行速度は1秒当たり約6回
単純に、3500万 ÷ (6/s × 3600) = 約1620時間(約2か月・・?)

ローカルでやっては絶対ダメなやつでした。

シミュレータをコンテナ化する

シミュレータをコンテナ化することで、複数のインスタンスを実行させ、高速に学習させることができます。
「BonsaiをBonsaiのシミュレータを触ってみる」では、VisualStudio上から実行しましたが、こちらをDockerのコンテナ化します。

シミュレータのパッケージを出力する

まずは、VisualStudioからシミュレータのパッケージを出力します。

プロジェクトを右クリックし、メニューから「発行」を選択します。

「発行」ボタンをクリックして、パッケージを出力します。

まずはローカルで動作確認をする

Bonsaiに登録する前に、ローカル環境下で問題なく動作するか確認してみます。

Dockerのイメージを作成する

「Microsoft.Bonsai.Api.Samples.Cartpole」フォルダから以下のコマンドを実行します。

docker build -t csharp-cartpole .

正常に終了すると、Dockerのイメージが作成されます。

シミュレータのパッケージ出力ができてない場合は、エラーになりますので注意ください。

Dockerをイメージを実行する

コンテナが実際に動作するか実行して確認します。

以下のコマンドを実行し、起動させます。

docker run --rm -it -e SIM_WORKSPACE="SIM_WORKSPACE" -e SIM_ACCESS_KEY="SIM_ACCESS_KEY" -e SIM_API_HOST="https://api.bons.ai"   csharp-cartpole

SIM_WORKSPACEには、Bonsaiのworkspace IDを設定します。
SIM_ACCESS_KEY には、BonsaiのAccessKeyを設定します。

起動すると、デバッグ時と同じように、Bonsaiとの接続待ちのログが出力されます。

デバッグ機能で動作を検証する

Dockerで動いているシミュレータが、Bonsai上と接続できているか確認します。
「Simulators」に、「CartPole-CSharp Unmanaged」が追加されていれば接続は問題ありません。

次に、シミュレータがうまく動作するかBonsaiのデバッガ確認します。
※確認方法は、「Bonsaiのシミュレータを触ってみる」をご確認ください。

シミュレータをBonsaiで使うために準備する

動くことを確認したら、次はAzureでシミュレータを動かします

ちなみに、Bonsaiによって管理されるシミュレータを実行すると、課金されます。
必ずローカルでテストしてから実施してください。

シミュレータをBonsaiに追加する

まずは、以下のコマンドを実行し、Azure Container Registry(以下ACR)インスタンスにログインします。

az acr login --name ACR_NAME

Docerfileからイメージをビルドします。
※ローカルで実行した場所と同じ場所で実行してください。

az acr build             \
  --image IMAGE_NAME:TAG \
  --registry ACR_NAME    \
  --file Dockerfile .

ビルド完了後、以下のコマンドを実行することで、リストが表示され正常にアップロードされているか確認できます。

az acr repository list --name ACR_NAME --output table

Bonsaiにシミュレータをパッケージとして登録する

次に、Bonsainiシミュレータを追加します。
「Simulators」右にある、「+Add Sim」をクリックします。

クリックすると、シミュレータの追加画面が表示されるので、一覧から「Other」を選択します。

ACRにアップロードしたシミュレータを指定します。
image pathは、ビルド時に指定したIMAGE_NAMEを指定します。
今回はdisplay nameも同じにしています。

最後に、シミュレータの環境を設定しますが、Cores及び、メモリは、既存値の使用(1コア、1Gメモリ)が推奨されているようです。
※Max instanceは、コストと速度からベストな数を選んでください。

すべて入力が終わったら、「Create simulator」をクリックすることで、シミュレータが追加されます。
 

「csharp-cartpol(Unmanagedがついていない)」がSimulatorsが登録されます。
また、ローカルシミュレータの時にはなかった、Packageも表示されています。

教育カリキュラムの呼び出し先に指定する

シミュレータのPackage名を設定することで、直接シミュレータを指定することができます。(チュートリアルと同じ)

source simulator(Action: SimAction):SimState{  
  package "csharp-cartpole"       
}

まとめ

今回はローカルのシミュレータを、Bonsaiに登録するまでを試してみました。
正直、シミュレータをデバッグする状況でない限り、ローカルで動かすのは得策ではないことを身をもって実感しました。
ちなみにBonsai上で動かすと、インスタンス数が1でも、ローカルの10倍以上速かったです。

Bonsai登録後は、課金されるのに躊躇していましたが、使わないと作業が終わらないことがわかりました、、
ただ、使うたびに課金されますので、しっかりデバッグしてから実施ください。