LoginSignup
1
0

More than 3 years have passed since last update.

[Project Bonsai/Moab]Bonsai育成記 (1)Moabバランス

Posted at

はじめに

ここではMicrosoftのProject BonsaiおよびProject Moabのチュートリアルを紹介します。
実際に手を動かす部分にフォーカスするので概念的な説明はDocsにお任せしてここではほぼ触れません。
チュートリアルもDocsも公式サイトには記事執筆時点で日本語がありませんがご了承ください。
なお、Elasticsearchのbonsai.ioは関係ありません。
盆栽も出てきません。

Bonsaiとは

Microsoftが提供するローコードプラットフォームです。Webブラウザ上で動作します。
強化学習を利用する産業機械をターゲットに提供されています。
計算リソースはAzureを利用します。

Moabとは

ボールのバランシング課題用シミュレータです。
実物はこんなのです。本稿ではこれをシミュレートします。
moab.gif
参考:https://www.freshconsulting.com/portfolio/moab/
3Dモデルはこちら。ハードウェアは記事執筆時点では市販されてはいないようです。

前提

  • Microsoftのアカウント取得済み →未取得の場合はこちら
  • Azureのサブスクリプションを導入済み →未取得の場合はこちら
  • Bonsaiは記事執筆時点でPreview版です。

事前準備 ワークスペースの作成

参考:Microsoft account setup for Bonsai
BonsaiのワークスペースをAzure上に作成します。
Azure Portalの「Create a resource」から「Bonsai」と検索して出てきた盆栽アイコンのリソースを選択して「Create」します。
image.png

次にリソース情報を入力していきます。リソースグループがない場合は新規作成します。
名前は任意で。ここでは「BonsaiWS-Tutorial-wus2」としました。
リージョンは今は選択肢が少ないです。West USかWest US2しか選べないと思います。とりあえずデフォルトの「West US 2」の選択のまま「Review + create」→次の画面も「create」を押します。
image.png

ワークスペース作成の手順は以上です。
作成されたワークスペースを確認しましょう。
Bonsaiはワークスペースとは別に、Azure管理下にあるリソースグループとその配下にStorageとLogAnalyticsが自動生成されます。Bonsaiの使用量に応じてこの部分が課金されますのでご注意ください。
image.png

チュートリアル1 バランスをとる

参考:Quickstart: Balance a ball with AI (Moab)
参考:MOAB TUTORIAL 1: TRAIN AI TO BALANCE A BALL
前置きが長くなりましたが、ようやく本題のチュートリアルです。早速Bonsaiのサイトに入ってみます。
https://preview.bons.ai/accounts/signin
image.png
Microsoftアカウントでログインし、先ほど作成したワークスペースを指定して「Get started」を押します。
ログインすると開始するアセットを選べます。ここでは「Moab」を選択して進めていきます。
image.png
AIモデルであるBrainの表示名を入力します。「Moab Tutorial 1」とします。
Brain表示名を入力したら「Create brain」で作成します。
image.png

BonsaiのWebUI

BonsaiのUIです。3領域に分かれています。
* ナビゲーションサイドパネル:作成されたBrainとシミュレータ(ここではMoab)が表示されます。
* Inkling コードエディター:独自言語Inklingのコードエディター。
* グラフパネル:コードエディターで定義されたState, Goal, Actionなどをグラフ表示します。
image.png

本来のステップで言えばシミュレート対象の機械があり、ここに適切なパラメータ設定と訓練カリキュラムを設定した上でカリキュラム通りの訓練を何万回と繰り返し、結果訓練されたモデルである「Brain」を最終的な出力とすることを目標とします。
チュートリアルではこの時点でシミュレータのMoab、訓練カリキュラムのInklingコード、Azure上の訓練用エンジンとリソースがすでに用意されている状態です。
image.png
参考:https://docs.microsoft.com/en-us/bonsai/product/

チュートリアルの目標

詳しいコードの中身やグラフの見方は後程簡単に説明しますが、押さえておきたいポイントが1つ。「Goal」です。
image.png
Goalはその名の通りシミュレーションに対する目標を設定します。現在は「ボールをプレートから落とさないこと」「ボールをプレートの中央に移動させること」の2点をGoalに設定しています。グラフパネルにはGoalで設定された2つが表示されていることが分かります。この後のBrainの訓練ではこのGoalがどの程度達成されているかが表示されます。

学習実行

さて、コメントは日本語に直してみましたが、この時点でコード自体は何も修正はしていないです。
Moabを動かせるのでとりあえず動かしてみます。「Train」ボタンを押してみます。
image.png
Trainボタンを押すと中央のパネルのタブがTrainタブへ切り替わります。このパネル上でMoabのシミュレーションを見ることができます。
Moabの場合はTrainタブで見れるセクションは大きく3つです。

  1. トレーニングパフォーマンスプロット:訓練回数に対する目標達成度のグラフ。各Goalの達成度とその平均値がプロットされます。
    image.png

  2. シミュレータノード:グラフパネルに達成度が表示されます。シミュレーターにはインスタンス数と訓練速度が表示されます。
    image.png

  3. Moabデバイスの視覚化:リアルタイムにデバイスモデルのシミュレーションが見れます。
    moab_train1.gif
    最初はボール落としてばかりですが、徐々に上手になっていくはずです!

ソースコード

訓練完了までは時間がかかるのでその間コードを眺めてみようと思います。
ソースコードはInklingという独自言語で記述されています。グラフパネルのいずれかのノードをクリックすると対応するコードにジャンプすることもできます。
image.png

前述の通りgoalでは学習における目標を設定します。goalを設定することにより、Bonsaiのエンジンが強化学習における報酬と早期終了条件を自動的に決定できるようにします。

# トレーニングの目的は、2つのサブゴールを持つゴールとして表されます。
# - ボールをプレートから落下させないこと
# - ボールをプレートの中央に移動させること
goal (State: ObservableState) {
    avoid `Fall Off Plate`: Math.Hypot(State.ball_x, State.ball_y) in Goal.RangeAbove(RadiusOfPlate * 0.8)
    drive `Center Of Plate`: [State.ball_x, State.ball_y] in Goal.Sphere([0, 0], CloseEnough)
}

goalの引数には State: ObservableState が指定されています。これはSimulatorから出力された「状態」が渡されます。グラフパネルを見ると4つポチがありますが、これはそれぞれObservableState内で定義されている変数を表しています。

# Stateは反復処理のたびにsimulatorから渡されます
type ObservableState {
    # ボールの X,Y 位置
    ball_x: number<-MaxDistancePerStep - RadiusOfPlate .. RadiusOfPlate + MaxDistancePerStep>,
    ball_y: number<-MaxDistancePerStep - RadiusOfPlate .. RadiusOfPlate + MaxDistancePerStep>,

    # ボールの X,Y 速度
    ball_vel_x: number<-MaxVelocity .. MaxVelocity>,
    ball_vel_y: number<-MaxVelocity .. MaxVelocity>,
}

座標系とPitch/Rollの概念は下図の通りです。
image.png
参考:https://microsoft.github.io/moab/tutorials/1-balance/index.html#step-1-define-the-problem

goalの評価結果、シミュレーションを継続する場合次の反復が開始されます。その際simulatorへ渡される情報として定義されるのがActionです。Brainの演算結果、プレートをどういう方向に動かせばいいのかはプレートの傾きであるpitchとrollで表現されます。

# シミュレータのポリシーによって出力として提供され、シミュレータへの入力として送信されます
type SimAction {
    # -1から1の範囲は、ハードウェアでサポートされているプレートの回転範囲全体を表す値です。
    input_pitch: number<-1 .. 1>, # rotate about x-axis
    input_roll: number<-1 .. 1>, # rotate about y-axis
}

Moabデバイスの3本のアームはこのActionで受け取った値によってプレートを操作します。
なおコメントにあるポリシーとは(たぶんですが)提供されているMoabシミュレータで定義されているインターフェースを指します。ナビゲーションサイドパネルのSimulator部分にある「Moab」をクリックしてみます。
image.png
ここではシミュレータが提供しているインターフェースとその詳細を見ることができます。
グラフパネルの「Moab」をクリックしても同じページに飛びます。

学習終了

これらのAction→Simlator→State→Goalの手順を繰り返すことにより学習をしていきます。
50万回の試行を繰り返すか、有意な改善が見られなくなったら自動的に訓練は終了します。
訓練時間はまちまちですが、今回は34分でした。
image.png

最終的にはこんな感じになりました。上手!
moab_trainfinished.gif

現在は物理デバイスが手元にないのでやりませんでしたが、作成されたAIモデルのBrainをExportして物理デバイスへデプロイすることも可能だそうです。

次のステップ

次のチュートリアルもできたら書いていきたいと思います。

チュートリアル2 ドメインランダム化
MOAB TUTORIAL 2: ROBUST BALANCING VIA DOMAIN RANDOMIZATION

チュートリアル3 障害物を避ける
MOAB TUTORIAL 3: BALANCE WITH A FIXED OBSTACLE

サンプル(OpenAI Gym)
bonsai-gym sample

まとめ

MicrosoftのProject Bonsaiをチュートリアル通りなぞってみました。コードは一切修正せずに簡単に試すことができます。3Dモデルがあれば、よく見る物理演算&強化学習とか結構簡単にできるのでは、と思いました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0