DeepRacerの走行ログをTableauで分析してみた #AWSDeepRacer #AWSDeepRacerJP

せーのでございます。
クラメソでは今一部の社員でDeepRacerがブームです。

DeepRacerって何?という方はこちらをご覧ください。

【DeepRacer】ワークショップに参加してきたので初心者なりに色々いじってみる #AWSSummit #AWSDeepRacer #AWSDeepRacerJP

さて、現在DeepRacerのバーチャルリーグでは「Empire City Circuit」というコースで日々闘いが繰り広げられておりますが、このコース、なかなかの曲者です。一番厳しいポイントとは「トレーニングコースと本番コースの形状が若干違う」ということです。

そのため、最終コーナーに入る手前で車がトレーニング同様内側に入ってきてしまい、コースアウトする、というパターンが続出し、トレーニングで完走率が100%のモデルでも本番では一周も回れない、ということが多いのです。

そこで本番のどこの部分で失敗し、どこの部分がうまくいってるのか分析するために、「SIM_TRACE_LOG」というレースの状況を記録したログを使って、自分の走りを確認します。このログはCloudWatch Logsの1フィールドにCSV形式で吐かれているのでまずはCloudWatch Insightを使ってこれらをパースします。細かい方法はこちらをご覧ください。

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

さて、DeepRacerには公式のログ分析ツールがあります。

aws-deepracer-workshops/DeepRacer Log Analysis.ipynb at master · aws-samples/aws-deepracer-workshops · GitHub

こちらを使って分析するのもいいと思います。
ですが私はより自分の手元でぐりぐりするのが好きなのでTableauを使って分析してみたいと思います。

やってみた

では実際にやってみましょう。今回は本番のログを使います。

SIM_TRACE_LOGをダウンロードする

本番走行が終わると右下に「Evaluation log」というリンクが表示されるのでクリックします。

CloudWatch Logsの画面が表示されるので「インサイト」をクリックします。

Insightsの画面が表示されます。

ロググループを「/aws/deepracer/leaderboard/SimulationJobs」に合わせ、ログをパースするフィルタを書きます。

fields @message
| 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,current_progress,closest_waypoint_index,track_length,time
| sort by time

書いたら「クエリの実行」をクリックします。

パース結果が下に現れます。パースできていれば「アクション」より「クエリ結果をダウンロード(CSV)」をクリックしてダウンロードします。

「logs-insights-results.csv」というファイルがダウンロードされていれば成功です。

Tableauの設定をする

次にTableauの設定をします。新規にTableauを開いたら「データに接続」をクリックして「テキストファイル」から先程落としたCSVファイルを選択します。

ログが表示されたら新しいワークシートに移動します。

「X」を列に「Y」を行にそれぞれドラッグし、形式をディメンションに変更すると散布図としてXとYの値がプロットされます。

分析

これでとりあえず見えるのですが、分析しやすくするために少し工夫します。まず「Speed」を不連続に変更し、色のマークにドラッグします。右のペインに色が表示されますので、▼より「色の編集」をクリックして、色を見やすく再配置します。私の場合はステアリングの角度とともに緑 => 黄色 => 赤に変化するようにしました。

出来上がったのがこちらです。カーブは緑、直線は赤くなっているのがわかります。

次にコースアウトしたステップの形を変えます。ディメンションにある「all_wheel_on_track」をマークの「形状」にドラッグし、falseを☓、trueを○に変更します。

そうすると、コースアウトしたところがXで表示されてわかりやすくなります。

私の場合はコーナーを内側に入りすぎる傾向があるようですね。

他の値で確認したいものを「ラベル」や「詳細」に入れます。
「ラベル」は画面上に常時表示され、「詳細」はマウスオーバーした時に見えるようになります。

これはwaypointをラベルに入れ、その他を詳細に入れたものです。

次に軌跡が重なって見えにくいのでトライごとに見られるようにフィルタをかけていきます。「epishodes」を不連続にし、「フィルター」にドラッグします。その後「フィルターを表示」をクリックして右ペインにフィルタを表示させます。

フィルタにチェックを入れたものだけが表示されます。これは完走できた5周目の軌跡です。

完走できなかった2周目と比較しています。第2コーナーの走りにブレがあるのが気になります。

ラベルをwaypointからcurrent_progressに変え、右ペインの「all_wheels_on_track」のfalseをクリックし、すべてのエピソードでコースアウトした部分だけをハイライトしてみます。

課題としては「第2コーナーを綺麗に曲がれること」「70%前後のストレートをまっすぐ走れること」になりそうです。

と、このようにTableauを使うと課題点が色々わかるようになります。

ちなみに作った設定をそのまま新しく取得したログデータでも試したいときは、データソースに新しいログデータを入れ

「データ」から「データソースの置換」をクリックし

新しいデータソースに入れ替えればOKです。

分析していてひとつ謎が残っています。

これはStepごとのrewardの値をグラフにしています。色分けはaction_taken、つまり車がどのような行動を取ったか、を表しています。

これをみているとどのアクションを取った場合でもまんべんなく1.0の報酬が取れていることになります。が、設計している報酬関数上、まっすぐ走った時以外はなにかしら報酬は減額されるようになっているはずなのです。

また報酬のパターンが1.0、0.5、0.1、0.01の4つしかないのも気になります。もっと色々あるはずなんですが。。。
この現象は本番コースとevaluationのログにのみ現れ、trainingのログでは思ったような報酬になっています。この謎がわかる方がいれば、是非ご連絡くださいませ。

まとめ

ということでDeepRacerのログをTableauで分析してみました。
Empire City Circuitもレベルがどんどん上っていて、現在は12秒を切らないとトップ10に入るのも難しくなっています。精進を重ねていきたいと思います。