はじめに
前編では、モデル作成の各ステップと報酬関数の設計、そしてコードのバリデーションで詰まった話をまとめました。後編では、実際に訓練を開始してから、評価、そしてレースへの提出までを振り返ります。
新規の個人AWSアカウントということもあって、ここでも1つ予想外の壁にぶつかりました。
訓練開始 → いきなり失敗
報酬関数のバリデーションを通過し、「Train your model」を押して訓練を開始しました。ところが、しばらくして画面を確認すると次のような状態になっていました。
Reward graphにもSimulation video streamにも一切データがなく、ステータスは「Failed」。DeepRacer on AWSはAmazon SageMakerを裏側で使って、モデルの訓練やエージェントと環境の相互作用のシミュレーションを行います。 つまり、コード自体は正しくても、その裏側のSageMakerのジョブが起動できていない可能性がありました。
「Download logs」を押してもNo log files foundと表示され、ログが一切存在しない状態でした。これは非常に手前の段階(インスタンス起動前)で失敗していることを示すサインです。
原因:新規アカウントのSageMaker利用制限
しばらくして、以下のようなメールが届きました。
内容は「東京リージョンでSageMakerを利用するために追加の検証が必要だったが、その検証が完了した」という趣旨のものでした。
新規のAWSアカウントでは、GPU系・計算リソース系のサービス(SageMakerなど)を初めて使う際、不正利用防止のための自動検証プロセスが走ることがあります。この検証が完了するまでは、インスタンスそのものが起動できず、ログすら生成されないまま即座に失敗する、という状況でした。
個人の新規AWSアカウントでDeepRacer on AWSを試す場合、この検証待ちのタイムラグがあることは事前に知っておいた方がよさそうです。 検証が完了した通知を受け取った後、同じ設定のまま再度訓練を実行しました。
再挑戦 → 訓練完了
今度は無事にグラフが表示され、ステータスも「Completed」になりました。
- 赤線/紫線は報酬(Average reward)、緑線/薄紫線は完走率(Average completion)です。
- Iteration 13付近でピークを迎え、そこが「Best model」として自動的に記録されています。
- その後、Iteration 14〜16では性能がやや下降しています。強化学習ではこうした一時的な性能低下は珍しくなく、探索(exploration)の影響や過学習気味の挙動が原因と考えられます。DeepRacer on AWSは自動的にBest modelを保持してくれるので、最終イテレーションの性能低下を過度に心配する必要はありません。
評価(Evaluation)
続いて、実際にモデルがどれだけ走れるかをEvaluationタブで確認しました。
| Trial | Time | 完走率 | Resets |
|---|---|---|---|
| 1 | 00:13.241 | 100% | 0 |
| 2 | 00:14.243 | 100% | 1 |
| 3 | 00:15.968 | 100% | 2 |
3回すべて100%完走していて、初回の報酬関数としては十分な結果でした。ただ、トライアルが進むごとにリセット回数(コースアウトして復帰した回数)が増えている点は気になりました。これはモデルが毎回同じ挙動をしているわけではないことを示していて、以前別の話題で触れた「同じ報酬関数でも学習・推論の結果にばらつきが出る」現象が、評価フェーズでも垂れ込んでいる一例だと思います。
レースへの提出 — ここも昔との大きな違い
評価が終わったので、レースに提出しようとして「Submit to a virtual race」を押したところ、ここでもう1つ「昔との違い」に気づきました。
学生時代のDeepRacer StudentやDeepRacer Leagueでは、AWSが用意した公式のバーチャルサーキットにモデルを提出するだけでした。世界中の参加者と同じ土俵に自動的に載る仕組みです。
ところがDeepRacer on AWS(セルフホスト版)では、レースを主催してくれるAWS側の存在がないため、レースという「入れ物」自体を自分で作成する必要があることが分かりました。「Choose a race」のドロップダウンには、事前に作成したレースしか出てきません。
レースの作成
Race hubから新規レースを作成しました。
主な選択肢は以下の通りです。
- Race mode:Community race(モデルは提出されるたびに非同期で評価され、結果は評価完了とともにリーダーボードに表示される)、または Live race(スケジュールされたライブイベント中に順番に評価され、ファシリテーターがキューを管理する)。
- Race type:Time trial(タイムを競うシンプルな形式。レースタイプは左から右に複雑さが増し、初めてレースをする方には収束が速いTime trialsが推奨されている)、または Object avoidance(障害物を回避しながら最速ラップを目指す形式)。
今回は自分1人のデモ用途なので、シンプルなCommunity race・Time trialを選択しました。
Ranking method(Best lap time か Total time)、Maximum laps、Off-track penaltyなども細かく設定できるようになっていました。今回はTotal time・5ラップ・ペナルティ1秒という設定で作成しました。
内容を確認し、Submitでレースを作成しました。
モデルをレースにエントリー
作成したレースに、実際にモデルをエントリーします。
訓練済みモデル(re-deepracer)を選択して「Enter race」を押すと、提出が完了しました。
Community raceの仕組み上、モデルは提出後すぐには結果が出ず、裏側でSageMakerによる評価シミュレーションが走ります。しばらく待つ必要がありました。
リーダーボードでの結果
少し時間を置いて確認すると、無事に結果が反映されていました。
- Time: 01:06.031(5ラップ合計)
- Off-track: 4回
単純計算で1ラップあたり平均13.2秒程度となり、これは以前のEvaluation結果(13〜16秒台)とほぼ一致する数字でした。一方でOff-trackが4回発生している点は、5ラップ連続で走らせたことで、単発評価では見えにくかった「たまにコースアウトする」傾向が積み重なって表面化した結果だと考えています。報酬関数の速度インセンティブ部分(カーブの入り口・出口付近でも加速を許してしまっている可能性)を見直せば、改善の余地がありそうです。
まとめ(後編)
- 新規AWSアカウントでは、SageMakerの初回利用時に自動検証プロセスが走り、それが完了するまで訓練ジョブが起動できないという、コードとは無関係な壁がありました。ログが「No log files found」となる場合は、まずこれを疑うとよさそうです。
- 訓練・評価自体は、昔の記憶とほぼ同じ感覚で進められました。グラフの見方や「Best model」の概念も変わっていません。
- レース参加の仕組みが「AWS主催の共有サーキットに乗る」形式から「自分でレースを作成し、自分の環境内で運営する」形式に変わっていたのは、前回記事で触れた「セルフホスト化」の流れを象徴する変化だと感じました。
結果として、初回の報酬関数でも100%完走・約13秒/ラップというところまで持っていけました。懐かしさから始めた取り組みでしたが、今のDeepRacerがどう変わったのかを体感できる、良い機会になりました。
次回は、Snowflakeと今回のRacelogを使用し、データの可視化と改善を行っていきたいと考えております。










