DeepRacerのモデルの学習状況をCloudWatch Logs Insightsで確認する

どうも、大阪DI部の大澤です。

先日DeepRacerが正式に公開され、DeepRacer Virtual Circuitも開始されました。 DeepRacerはサンプルの報酬関数があり、行動の種類の設定も簡単にできるため、自動運転用モデルをお手軽に学習させることができます。
今回はより効率よく学習を進めるために、CloudWatch Logs Insightsを使ってモデルの学習状況を把握する方法について紹介します。

概要

  1. CloudWatch Logs Insightsを開く
  2. ロググループに/aws/robomaker/SimulationJobsを選択する
  3. 期間を選択する
  4. 取りたいデータに応じたクエリを入力する
  5. クエリを実行する

クエリ

ステップログ

方向や速度、報酬値といった各ステップでの状態の値を確認することができます。

filter @message like /^SIM_TRACE_LOG/
| parse @message "SIM_TRACE_LOG:*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" as episodes,steps,x,y,heading,steering,speed,action_taken,reward,done, all_wheels_on_track, progress,closest_waypoint_index,track_length,time
| sort by time desc
| limit 100

各値については報酬関数の入力に準じたものが多くあります。報酬関数の入力については以下のドキュメントをご覧ください。

※ただし、角度系のデータには注意が必要です。報酬関数の引数ではですが、ログの値ではラジアンになっています。

ステップごとの報酬

各ステップで報酬はどれくらい得ているかを確認できます。

filter @message like /^SIM_TRACE_LOG/
| parse @message "SIM_TRACE_LOG:*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" as episodes,steps,x,y,heading,steering,speed,action_taken,reward,done, all_wheels_on_track, progress,closest_waypoint_index,track_length,time
| stats avg(reward) by bin(15m)

エピソードごとの進み具合

progressは車のコースの進み具合に応じて0~100までの数値を取ります。各エピソードで車がコースアウトもしくは完走時にどこまで到達できたかを確認できます。

filter @message like /^SIM_TRACE_LOG/
| parse @message "SIM_TRACE_LOG:*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" as episodes,steps,x,y,heading,steering,speed,action_taken,reward,done, all_wheels_on_track, progress,closest_waypoint_index,track_length,time
| filter done = "True"
| stats avg(progress) by bin(15m)

完走率

各エピソードで車がコースを完走できたかどうかを集計することで対象時間範囲での完走率を確認できます。

filter @message like /^SIM_TRACE_LOG/
| parse @message "SIM_TRACE_LOG:*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" as episodes,steps,x,y,heading,steering,speed,action_taken,reward,done, all_wheels_on_track, progress,closest_waypoint_index,track_length,time
| filter done = "True"
| fields progress = 100 as is_goal
| stats avg(is_goal) by bin(15m)

各エピソードのタイム

各エピソードで車がコースアウトもしくは完走するまでのおおよその時間を確認できます。

filter @message like /^SIM_TRACE_LOG/
| parse @message "SIM_TRACE_LOG:*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" as episodes,steps,x,y,heading,steering,speed,action_taken,reward,done, all_wheels_on_track, progress,closest_waypoint_index,track_length,time
| stats max(time) - min(time) as episodes_time, max(progress) as max_progress, max(time) as goal_time by @logStream, episodes
| sort by max_progress desc, goal_time desc

注意点

  • 各エピソードの開始時間はログの中にないため、実際のラップタイムに比べて1ステップ分ほど短いものとなります
  • 詳しい原因はわかりませんが正しいタイムが表示されない場合があります。早すぎるタイムが表示されるなど集計結果が怪しい場合は、実際にログを確認することをお勧めします。
    • 例えば、ログから実際に計算してみると13秒くらいなのに、Insightsで集計すると10秒切るような時間が表示される感じです

特定のジョブに絞り込む

以下のクエリを集計クエリの頭に追加して、学習で用いるRoboMakerでのシミュレーションジョブの名前でlogStreamを絞り込むことで、特定のジョブの結果のみに絞り込めます。

filter @logStream like /^sim-robomakerjobname/ | 

さいごに

CloudWatch Logs Insightsを使ったDeepRacerの学習状況を見る方法について紹介しました。 クエリの記述をいじることで今回紹介した内容以外のデータもみることができます。目的に応じて色々試してみることをお勧めします。

参考