Search Unity

本日、Unity ML-Agents Toolkit の更新がリリースされ、単一のマシンで複数の Unity シミュレーションを実行することで迅速なトレーニングを行うことが可能となりました。このアップグレードによって、キャラクター挙動の作成における深層強化学習アルゴリズムのトレーニングを大幅にスピードアップすることが可能となります。

本記事では、JamCity とのパートナーシップによる、同社のバブルシューターゲーム『Snoopy Pop』 の高度なステージをエージェントにプレイさせるためにトレーニングを行う取り組みの概要をご紹介します。Unity ML-Agents Toolkit v0.8 のリリースにより、エージェントがひとつのステージをプレイできるようにするトレーニングを、単一のマシンで従来より 7.5 倍速く行えるようになりました。さらに、私達の取り組みはここでは終わりません ― トレーニングを複数のマシンにわたってスケールアウトすることによって複数のステージを同時にトレーニングする技術の開発も進めています。

Unity ML-Agents Toolkit初回リリース以来の私達の基本方針は、ゲームデベロッパーが深層強化学習(DRL)を活用してプレイアブルおよび非プレイアブルキャラクターの両方の挙動を開発できるようにすることでした。以前のブログ記事で、物理ベースのアニメーションを使用した プッポを制御する方策の学習に DRL がどのように使用できるかをご紹介しました。しかし実際のゲームは複雑で、DRL アルゴリズムは膨大な計算を伴うものであり、学習には大量のゲームプレイデータが必要です。DRL に関するほとんどの研究は、(ゲームプレイデータをより速く生成するために)大幅なスピードアップが可能なごく軽量なゲームを使用して行われますが、実際のゲームにおいては、通常の速度で(あるいはスピードアップの程度を制限して)実行しなければならないという制約がある場合がほとんどです。このため私達は、デベロッパーにとって最も身近な計算プラットフォームであるローカル開発マシンにおけるトレーニングの改良を集中的に行うことにしました。

DRL を使用したエマージェント挙動の作成には、方策(エージェントの観測からアクションへのマッピング)を具現化するニューラルネットワークのウェイトの学習が含まれます。学習は、1 つまたは複数のシミュレーションインスタンスで方策を実行し、その出力をもってエージェントの報酬を最大化する形でウェイトを更新することによって行われます。トレーニングは、方策の評価が行われるインスタンスの数が多いほど速く完了します。本日、マルチコアマシンで同時に複数の Unity インスタンスを実行することでトレーニングをより速く行う機能が公開されます。Unity は、実際のゲームにおけるエージェントのトレーニングにマルチコアマシンを利用する重要性を示すために、JamCity および 『Snoopy Pop』 のゲーム開発チームと提携しました。v0.8 で加えられた改良により、16 の Unity シミュレーションを使用してトレーニングのスピードを(簡単なステージで 5.5 倍、難易度の高いステージでは最大 7.5 倍)アップさせることが可能となります。一般的に、複数の Unity シミュレーションを使用する利点はステージやゲームが複雑になるほど大きくなります。

今回の Unity ML-Agents Toolkit の更新で加えられた改良によって、開発マシンのリソースをフル活用できるようになるだけでなく、Google Cloud Platform などのクラウドプロバイダーのマルチコアマシンを利用してトレーニングを大幅にスピードアップすることも可能になります。さらに私達は、『Snoopy Pop』の多数のステージを同時に解決できる単一の方策の学習を可能にすべく、トレーニングを複数のマシンにわたってスケールアウトするための内部的構造の構築も進めて来ました。下の動画では、トレーニングされた単一のエージェントが、徐々に難易度が上がる『Snoopy Pop』のステージをプレイスルーする様子をご覧いただけます。

 

 

トレーニングされた単一のエージェントが複数の『Snoopy Pop』のステージをプレイする

ML-Agents Toolkit +『Snoopy Pop』

『Snoopy Pop』は JamCity が開発したバブルシューターゲームです。『Snoopy Pop』では、プレイヤーはバブルをはじけさせて Woodstock というキャラクターと仲間の鳥の群れを解放して行きます。プレイヤーは特定の角度でバブルを撃ったり、撃つ前にバブルの色を切り替えたりできます。バブルが同じタイプのバブルにくっついて 3 つ以上の塊が形成されると、その塊が消え、バブルの中の鳥が解放されて、プレイヤーのスコアが上がります。全ての鳥が解放されるとステージクリアとなります。逆にカバンの中のバブルが全て無くなると負けとなります。私達の目標は、人間のプレイヤーがプレイするようにゲームをプレイできるエージェントをトレーニングし、出来るだけ高いステージをクリアさせることです。

Snoopy は Woodstock と仲間の鳥の群れが入ったバブルを全てクリアしなければなりません。

ML-Agents Toolkit を使用して、エージェントは、ゲームの状況を表す観測を受け取り、それに応じてアクションを実行することで方策を遂行します。DRL を使用して『Snoopy Pop』をクリアするには、まずこれらの観測、アクション、および方策が最大化を試みる報酬機能を定義する必要があります。エージェントは、ゲームボードおよびそこに含まれるバブルの、簡易化された低解像度(84 x 84)バージョンを観測として受け取ります。その上でエージェントは、21 つの異なる角度でバブルを撃つ、あるいは撃つ前にバブルを取り換える選択を行うことができます。バブルが撃たれて他のバブルと衝突する(あるいは衝突しない)と、エージェントは、スコアを上げて鳥を解放して勝利したことに対する報酬を得ます。また、バブルが撃たれた時(ステージを迅速に解決するようエージェントに促すため)および負けた時には、負の報酬も与えられます。

『Snoopy Pop』用に定義された観測、アクション、および報酬

大きなアクション空間における視覚的観測情報の使用は『Snoopy Pop』のステージの解決を困難にします。単純なステージでも、エージェントが効果的な方策を学習するためには 8 万を超えるアクションを実行する必要があります。より難易度の高いステージになると 50 万以上のアクションが必要になるかもしれません。

またこのゲームは、バブル同士の跳ね返りや衝突を物理を使用してシミュレートしているので、ゲームのダイナミクスを大幅に変えずに時間スケールを変更するのは困難です。5 倍速の時間スケールでさえ、1 秒間に 2 つほどのアクションしか収集できません。つまり、単純なステージのクリアに 11 時間以上、難易度の高いステージのクリアには数日間掛かることとなります。このため、複数の Unity シミュレーションを同時に起動してデータ収集プロセスをスケールアウトし、マシンのリソースを最大活用することが不可欠です。

『Snoopy Pop』の複数のインスタンスを同時に実行する

『Snoopy Pop』において、単一のインスタンスをどこまでスピードアップさせられるかには限度がありますが、マルチコアプロセッサーを使用すれば、複数のインスタンスを単一のマシンで実行できます。このゲームでは 1 回 1 回のプレイスルーが独立しているので、トレーニングデータの収集を自明に並行処理化することが可能です。

 

 

 

各シミュレーションが 1 つの共通トレーニングバッファ内にデータをフィードし、後にトレーナーがそれを使用してその方策を更新することで、ゲームがより良くプレイできるようになります。この新しい枠組みによって、時間スケールをはじめ一切のゲームパラメーターを変更することなしに、遥かに多くのデータを収集することが可能になります(ゲームパラメーターが変更されるとゲームプレイの仕組みに影響が及ぼされる可能性があります)。これは、ML-Agents Toolkit のユーザーの皆様により高いパフォーマンスのトレーニング体験をお届けするに当たって必要な第一歩であると私達は考えています。

パフォーマンスの結果

複数の Unity シミュレーションを同時起動することの有用性をお見せするために、『Snoopy Pop』の 2 種類のステージ(ステージ 2 および 25)のトレーニング時間をご紹介します。具体的には、用いる Unity シミュレーションの数を変えてそれぞれのトレーニング時間を記録しました。同時実行されるひとつひとつの環境に調整のための小さなオーバーヘッドが伴うので、スケーリングするに従って戻り値が減少することが予測されます。また、単純なステージやゲームの場合は、Unity シミュレーションをより多く追加してもパフォーマンスが向上するとは限りません。何故かと言うと、追加的なシミュレーションから生成されたゲームプレイデータは、既存のゲームプレイデータと密接に相関したものとなるため、トレーニングアルゴリズムに貢献しないからです。つまり、減少率が(モデルのトレーニングが行われる)ステージやゲームの難易度に依存する状況においては、追加する Unity シミュレーションの数を増やすと戻り値が減少することが予測されます。

下の最初のグラフは、v0.8 リリースで、並列環境の数を 1 個~ 16 個用いた場合に『Snoopy Pop』のステージ 2 の解決に掛かるトレーニング時間を示しています。トレーニングのプロセスのランダム性が実行から実行までの時間を大幅に変える可能性があるので、3 回の実行における平均時間を使用しました。1 つの環境から 2 つの環境にスケーリングした所でパフォーマンスが大幅に向上し、その後は一定の比率でほぼ直線的なスケーリングとなっており、環境を 1 つだけ用いた場合に対し、16 個用いた場合に 5.5 倍の改善が見られました。

また『Snoopy Pop』のステージにおいては、並列環境を用いたトレーニングの効果がより顕著に表れることも確認できます。これは、単純なステージの場合と比べ、難易度の高いステージでは複数のシミュレーションから生成された経験がより独立している(また、それ故にトレーニングのプロセスに貢献する)ためです。このグラフは『Snoopy Pop』のステージ 25 の v0.8 リリースでのパフォーマンスを比較したものです。1 つの環境を使用した場合に比べて、16 個の環境を使用した場合に 7.5 倍の改善 が見られることにご注目ください。

今回リリースされた ML-Agents Toolkit v0.8 は、ひとつのマシン上での複数の Unity シミュレーションの実行に対応します。既存の環境をお持ちの場合、ML-Agents Toolkit の最新版に更新してゲームをビルドし直すだけで済みます。アップグレード後は、mlagents-learn の新しいオプションが利用可能になります。このツールを使用して、実行したい並列環境の数を指定できます。詳細はドキュメンテーション(英語)をご覧ください。

その他の更新事項

今回の ML-Agents Toolkit の更新には、複数の Unity シミュレーションを起動する機能の他にもいくつかの新機能が含まれます。

カスタムのプロトコルバッファメッセージ

研究者の多くが、デフォルトで搭載されている以上の、Python と Unity の間で構造化データをやりとりできる機能を必要としています。本リリースでは、全てのデベロッパーがカスタムのプロトコルバッファーメッセージを作成してそれを観測やアクションとして使用したり、パラメーターのリセットに使用できるようにするための API を作成しました。

レンダーテクスチャーの観測

カメラの Visual Observation(視覚的観測情報)の他に、レンダーテクスチャーを使用できる機能も含めました。これにより、カメラ(2D スプライト、ウェブカメラ、その他のカスタム実装など)を使用する以外の方法で、Visual Observation 用にテクスチャーをレンダーすることが可能になります。

2D レイキャスティング

多くのユーザーの皆様から、2D ゲームにおけるレイキャスティングの使用に関するお問い合わせをいただきました。本リリースでは、RayPerception をリファクタリングして 2D レイキャスティング(RayPerception2D)のサポートを追加しました。

複数の Python パッケージ

mlagents Python パッケージを 2 つの別々のパッケージ(mlagents.trainers と mlagents.envs)に分割しました。これによりユーザーは TensorFlow などのバージョン依存を分離できるようになり、研究者は既存の Python 設定を崩すことなく Unity 環境を使用できるようになります。

ご協力くださった皆様に感謝申し上げます。

Unity ML-Agents Toolkit は、コミュニティの皆様の多大な貢献に支えられたオープンソースのプロジェクトです。このリリースに組み込まれた改良を実現してくださった外部の方々(@pyjamads【レンダーテクスチャー】、@Tkggwatson【最適化の改良】、@malmaud【カスタムのプロトコルバッファ機能】、@LeSphax【動画レコーダー】、@Supercurious / @rafvasq / @markovuksanovic / @borisneal / @dmalpica【各種改良】)に深く御礼申し上げます。ありがとうございました。

次のステップ

Unity ML-Agents Toolkit の今回のリリースによって、エージェントのトレーニングをひとつのマシンでより速く行えるようになります。私達は引き続きこの分野への取り組みに尽力し、将来的には、より良い形で単一のマシンのリソースを最大活用できる更新をリリースします。

この、機械学習とゲーム開発が交差するエキサイティングなフィールドで仕事をしてみたい方は、現在いくつかの職種で採用中ですので、是非ご応募ください!

本リリースに含まれる機能をお使いになった皆様からのご報告をお待ちしております。Unity ML-Agents Toolkit に関するフィードバックは、以下のアンケートにご記入ください。また、メールでもお気軽にご連絡ください。問題やご質問は ML-Agents GitHub の Issues のページへお寄せください。

コメント受付を終了しました。

  1. What’s the actual command to run multiple instances?
    –num-envs=16
    Seems to be the right command but it isn’t working for me.

    1. Hi @willie, yes you are correct. The –num-envs=16 argument should work, except that 16 might be too large if you are not using a really powerful machine. The documentation is here https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md.

      If you are having trouble running this command, please post an issue on https://github.com/Unity-Technologies/ml-agents/issues, and we will get back to you soon.

    2. Yes –num-envs=16 should be the correct argument. If it doesn’t work for you, please post an issue on https://github.com/Unity-Technologies/ml-agents/issues.

  2. What up with this JamCity logo ADS next to Unity logo?

  3. When documentation will be updated?

    1. You can find the updated doc regarding this new feature here: https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md

  4. How about memory usage when running 16 parallel games?

    1. It depends on how much your Unity executable will consume. In our case we are using a machine with 64GB memory.

    2. It depends on how much memory your Unity executable will take up. In our Snoopy Pop case, we were using a 64GB machine, and more than half of the memory was used.