Google Cloud Vertex AI と Battlesnake: 実用的な強化学習を使って対戦相手を打ち負かそう
Google Cloud Japan Team
※この投稿は米国時間 2021 年 9 月 28 日に、Google Cloud blog に投稿されたものの抄訳です。
新しいスキルを学んでみませんか?本を読んだり、トレーニング コースを受講したり、何かを作ってみるのもいいですね。私たちは小さなカスタマー エンジニアのグループで、機械学習に関する正式な教育を受けたことはありません。今回、訓練されたエージェントが世界中の競争相手と戦うオンライン サバイバルゲーム「Battlesnake」に参加して、強化学習について学ぶことにしました。
このプロジェクトには、Google Cloud の機械学習プラットフォームである Vertex AI が使われました。私たちのプロセスと学びをここで共有することで、皆さんにも経験から学ぶことの大切さを感じてもらえればと思います。


新しい技術を評価し、新しいスキルを身につけるために、ゲームの組み立てを利用した別のアプローチを考えてみましょう。
さあ、アリーナの中へ
Battlesnake は、昔の携帯電話に入っていたスネークゲームとは違います。また、アップデートされた Google Snake のスピンオフでもありません(でも、このゲームの秘密の虹色のヘビはぜひ手に入れてくださいね)。それらとは大きく異なり、より役に立つゲームです。
一見、Battlesnake は、以下のようないくつかの基本ルールがあるだけの、ごくシンプルなゲームに思えます。
壁や他のヘビにぶつからないこと
ヘビのお腹をすかせないこと
ほかのヘビに食べられないこと
しかし、基本前提を突き詰めていくと、はるかに複雑なゲームだということがわかってきます。
自分で作った Battlesnake をコンペティションに送り出すには、いろいろな方法があります。チームの経験値に合わせて、Battlesnake が提供しているスターター プロジェクトに参加してみるのもいいでしょう。 あるいは、競争の大海原に漕ぎ出し、健康ベースのヒューリスティック モデルでヘビを強化する方法や、強化学習のアプローチで打って出るといった手もあります。
私たちは最初のコンペティションで、少し賭けに出てみることにしました。つまり、とりあえず何かを投入することを繰り返してデータを集め、ML モデルを調整し、最初のヘビのパフォーマンスの改善を試みたのです。最終的には(もちろん、道徳的かつ協力的にスポーツマンシップにのっとったやり方で)勝利を確信できる強化学習モデルを構築しました。 結果については後述しますが、ここでは私たちのアーキテクチャと開発がどのように進行したかを順番にご紹介します。
強化学習の概要
強化学習(しばしば RL と呼ばれます)は、AI モデルを構築する方法として長い歴史を持っています。チェス、囲碁、または Starcraft II といったようなゲームから、製造工程やサプライ チェーンの最適化といった業界により特化した問題まで、強化学習は最高クラスの AI の構築に使用され、多くの困難な課題への取り組みに役立っています。
RL に馴染みがない方向けに、簡単にご紹介します。
従来、機械学習モデルは、大量のラベル付きのデータの例をもとに予測を学習していました。RL では、エージェントは経験から学習します。
それぞれのイテレーションは、報酬関数に基づいてスコアリングされます。Battlesnake を例にとると、基本的な報酬のセットは、勝った場合は 1、負けた場合は -1 となります。
報酬はモデルに入力され、どのようなシナリオでどのような動きをすれば最も高い報酬を得られるかを「学習」します。人間が熱いストーブに触らないように学習するのと同じように、モデルはヘビが頭から壁に突っ込むと負の報酬を得ることを学習し、(ほとんどの場合)そうしないように記憶します。
複雑なシステムの場合、この報酬構造は、システム全体の現在の状態に基づいて報酬を形成するのに役立つ、何十もの異なる入力から構成されることがあります。
私たちのチームには、正式なトレーニングを受けた機械学習の専門家はいませんでしたが、同様のアプローチを試みた人から学んだコンセプトを、Google Cloud の Vertex AI プラットフォームを使って適用するのに十分な専門知識を持っていました。
ヘビを訓練する方法
RL モデルを構築するための重要な出発点の一つは、ゲームがプレイできる環境を整えることです。OpenAI's gym のツールキットは、デベロッパーが RL モデルの構築を始めるための簡単な方法を提供しています。シンプルなインターフェースと多くの例が用意されており、 モデルのトレーニングをすぐに始められます。これにより、以下のようなモデルの重要な部分に純粋に集中できます。


Battlesnake コンペティションでは、1 週間かけてヘビを作り、訓練し、テストした後、アリーナに放り込んで仲間たちと勝者総取り式のトーナメントを行いました。従来の ML ループは構築に数週間から数か月かかることがありますが、Vertex AI のパワーとシンプルさで、数時間でエンドツーエンドの ML パイプラインを作ることができました。このベロシティのおかげで、トレーニング テストとモデルのチューニングに数日を費やせました。
今回の Vertex AI のトレーニングは、カスタム トレーニング ジョブから始まりました。Vertex AI では、独自のトレーニング コンテナ(今回は Pytorch を使用)を指定して、Vertex AI が管理するインフラストラクチャ上で任意のトレーニング タスクを実行できます。最初のテストは、Vertex AI 上でホストされた基本的な Jupyter ノートブックで始まりましたが、メインのソース リポジトリへの push で Cloud Build によって生成されたカスタム Docker コンテナにすぐに移行しました。複数のビルド済みイメージからコンテナ イメージを調達しようとしましたが、最終的には、相反する依存関係の処理に時間をかけすぎて進捗が遅くなったため、NVIDIA CUDA ドライバだけを含むクリーンなベースイメージに切り替えました。
トレーニングの規模が大きくなってきたので、Vertex AI のマネージド パイプライン サービスを使って、ノートブックを ML パイプラインに変換しました。このワークフローでは、内蔵されたハイパーパラメータ チューニング サービスを利用して、チームが最小限の監督をするだけで、モデルが可能な限り良い結果を出すように自動的にチューニングを行いました。各トレーニングは 2~4 時間行われた後、評価段階に入ります。評価の際には、過去のバージョンのモデルを選択してシミュレーション ゲームを行い、新たに学習したモデルが過去のバージョンよりも優れたパフォーマンスが可能かを確認しました。評価バトルの勝者はトップモデルに昇格し、次のイテレーションのトレーニングの新しいベースラインとなります。私たちのパイプラインは、要求に応じて追加のトレーニングを行うようにトリガーされていました。それはたいてい、新しいモデルをグローバル アリーナのヘビにロードして、行動を観察した後です。これを本番環境にデプロイしていれば、モデルのパフォーマンスが低下し始めた場合に、ゲームの勝率について取得したデータを利用して、追加のトレーニングをインテリジェントにトリガーすることができたでしょう。


デプロイ アーキテクチャ
Vertex AI のモデルをサービングするインフラストラクチャを利用して、トップモデルを本番環境にデプロイします。Battlesnake から送られてくるデータは、ヘビの現在の位置、食べ物、ボード上の危険物などのすべての JSON ドキュメントです。
サーバーからの応答は、500 ミリ秒で完了することが求められました。ゲームからのリクエストに応じて「タイムアウト」したヘビも、それまで進んでいた方向に進み続けます。限られた時間の中で、私たちは 2 つの方法でヘビをコントロールしました。Battlesnake からのリクエストは、まず Google App Engine にデプロイされたウェブサービスに届きます。App Engine サーバーは、300 ミリ秒のハード タイムアウトでリクエストをモデルサーバーに転送します。モデルが明らかに無効な手(ボード外の手など)を回答した場合に備えて、モデルからの回答は最後のフェイルセーフとして App Engine サーバーで検証されました。モデルサービスがタイムアウトした場合、App Engine サーバーは独自のロジックで合理的な動きをするようにフォールバックしました。


データ分析
Battlesnake の生態系の中で私たちのヘビは、パブリック アリーナとプライベートなトーナメントの両方で数千回もゲームを行いました。それぞれのゲームは数十から数百の手で構成されますが、結果は限られています。実験の一環として、Battlesnake プラットフォームから送信されたすべてのメッセージをキャプチャし、Pub/Sub 経由で BigQuery に送り、のちにパフォーマンスの統計分析に使用しました。前のセクションで述べたように、Pub/Sub から受け取ったデータは標準的な表形式ではなく、JSON オブジェクトの配列でした。分析を行うためには、それらのデータをまず標準のテーブル形式に変換する必要がありました。そこで、BigQuery の UNNEST 関数を用いて、レコードをテーブルにフラット化しました。バトルのメッセージに含まれるデータポイントは、ボードサイズを含むボード上のすべてのヘビの健康状態、長さ、食べ物の位置、頭と体の座標、ターンとレイテンシなどで構成されていました。ML モデルの探索的分析のために、どのヘビと最も多く戦ったのか、そしてそれぞれの戦いでどのようなパフォーマンスをしたのかといった質問の答えを探しました。いつも歯が立たない敵のヘビはいるか?よくエサがある場所は?これらの洞察を得た後、モデルのパラメータをさらに調整し、私たちのヘビにとって最適なものにできます。
結論
私たちのヘビは、パブリック アリーナでの公開競技では非常に良い成績を収めましたが、実際のトーナメント戦では苦戦が続きました。グループ ステージでは、決勝戦に進出した 2 匹のヘビと対戦しました。私たちのグループの最初のヘビは飢えた怪物で、がつがつ餌を食べ、私たちのヘビはあっという間に追い出されてしまいました。その結果、壁にぶつかって死んでしまい、トーナメントからも早々に退場することになりました。私たちは、Vertex AI の力によって、非常に短いトレーニング時間で、世界の舞台で相応の成果を出すことができました。
詳細
Battlesnake
Vertex AI - ML トレーニング、マネージド パイプライン、ハイパーパラメータ調整、モデル提供
https://cloud.google.com/vertex-ai/docs/pipelines
https://cloud.google.com/vertex-ai/docs/training/hyperparameter-tuning-overview
https://cloud.google.com/vertex-ai/docs/predictions/deploy-model-console
機械 学習
https://learndigital.withgoogle.com/digitalgarage/course/machine-learning-basics
https://ai.googleblog.com/2021/04/evolving-reinforcement-learning.html
- データ担当シニア カスタマー エンジニア Brad Egler
-インフラストラクチャ担当シニア カスタマー エンジニア Mike Vernabic
-アナリティクス担当カスタマー エンジニア Pratik Parjia
-インフラストラクチャ担当シニア カスタマー エンジニアMichael Kaehly