[Project Bonsai] Bonsaiをローカル環境で使ってみる

# はじめに
Project Bonsaiについて調べてみましたの4回目です。
過去の内容はこちら。
1回目は[「Bonsaiを触ってみる」](https://qiita.com/masaya3/items/5cca56a773386bb80262)
2回目は[「Bonsaiをいじってみる」](https://qiita.com/masaya3/items/5cca56a773386bb80262)
3回目は[「BonsaiをBonsaiのシミュレータを触ってみる」](https://qiita.com/masaya3/items/05b1d578d1921f8ae20f)

今回は、学習されたBonsaiをローカル環境で使ってみたいと思います。

# [Bonsai](https://azure.microsoft.com/ja-jp/services/project-bonsai/)って何？
Microsoftが提供している自律システム向け機械教示サービスです。（現在はPublic Preview）
産業制御システムに焦点を当てた汎用ディープ強化学習プラットフォームのようです

# Bonsaiを使ってみる 

学習結果は、[Dockerのコンテナとしてパッケージ化](https://docs.microsoft.com/ja-jp/bonsai/guides/export-brain?tabs=docker-ps)して使用することができます。

使用するにあたり、以下のソフトが必要となります。
インストール方法や操作方法は、ここでは説明いたしませんので、個別でお調べください。

* [Azure Cli](https://docs.microsoft.com/ja-jp/cli/azure/)
* [Docker](https://www.docker.com/)


## 学習されたBonsaiを出力する

まずは、学習済みの情報を表示させ、「Train」ページから「Export Brain」をクリックします。
![Export](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/1afa1d1d-009b-1017-559f-c46fbbc35422.png)

出力するコンテナの形式を指定します。
※例えばRaspberryPi3で動作させたい場合は、arm64(v8)などを指定します。
利用する環境の出力形式が決定したら「Export」ボタンをクリックします。
完了には少し時間がかかります。
![Exportウィザード画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/0583ddc2-43eb-3b53-2f26-bd3b9978e423.png)

## コンテナをダウンロード＆実行

Exportが完了すると、左のメニューの「Simulators」の下に、Expoeted Brainsの項目が追加されます。
![メニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/046f9868-58b4-e896-7998-471150391524.png)
追加された項目の右にある「...」を選択し、メニューから「View deployment instructions」をクリックします。
![コマンド表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/2c7c6078-49f5-5f8d-9384-a2fbeb104c19.png)
ログインから、取得、起動までのコマンドが表示されますので、コピーしてローカル環境で実行します。

コマンドは以下の通りです。

```shell

# Azure Container Registryにログイン
az acr login

# イメージのダウンロード
docker pull \
WORKSPACE_NAME.azurecr.io/WORKSPACE_ID/BRAIN_NAME:VERSION-OS_TYPE-ARCHITECTURE

# 起動
docker run              \
  --detach              \
  --publish 5000:5000   \
  --name CONTAINER_NAME \
WORKSPACE_NAME.azurecr.io/WORKSPACE_ID/BRAIN_NAME:VERSION-OS_TYPE-ARCHITECTURE
```
`WORKSPACE_NAME`: Bonsaiのワークスペースに付けた名前。
`WORKSPACE_ID`: Azure によって割り当てられたBonsaiのWokespace ID。
`CONTAINER_NAME`: ローカルのDocker コンテナー名前。

コピー内容を実行すると、ACRへのログイン、ダウンロード、実行が実行されます。
![実行](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/1a7fddb9-7f55-c63b-5375-41d1e67a842e.png)


## 起動の確認
起動コマンドまで実行出来たら、Bonsaiが起動されているか確認するため、以下のコマンドを実行します。

```
docker logs -f CONTAINER_NAME
```
Bonsaiが正常に実行されている場合は、Bosanaiのログが表示されます。
![Bonsaiログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/7f9271dd-d151-da77-5812-332533eb9e49.png)


## 動作の確認
起動させたローカルのBonsaiに対して、RESTにて学習の結果を取得することができます。

以下のURLに対して、学習カリキュラムで指定した`SimState`のJSON情報をPOSTすることで、内容に対する`SimAction`が返却されます。

```
http://localhost:5000/v1/prediction
```

ためしに以下に情報を送信してみます。

```json
{
  "cart_position":0,
  "cart_velocity":0,
  "pole_angle":0,
  "pole_angular_velocity":0
}
```


![POST成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/ec479306-a081-e3e8-c3ac-eda6af82b988.png)
しっかり、`SimState`に対する`SimAction`(command)が返却されています。

ちなみに、pole_angleのパラメータを削除して、実行した場合は、以下のようなエラーとなります。
![POST失敗](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/c612f9c2-49d6-8c92-39e3-295a539e58ed.png)

#### 余談
APIのマニュアルは、http://localhost:5000/v1/doc/index.html で参照することができます。
![マニュアル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/053b19b8-861a-7ce9-747e-66dd7c18ada0.png)

# まとめ
今回は、学習後にBonsaiをどうやって使用していくのか？を中心に調べてみました。
お手軽にできるのはいい感じです。
ただ、学習させたCartpoleを現実環境でテストできる環境がないのが残念なところです。

ここまででBonsaiについて一通り触ることができたので、次（いつになるかわからないけど）は、全部独自で用意してみたいと思います。