iTAC_Technical_Documents

アイタックソリューションズ株式会社

ブログ名

AWS DeepRacerでのログ分析(後半) -動かし方-

記事の概要

ログ分析を行うために、前回はログ分析ツールを動かすための準備を行いました。

今回はログ分析ツールを用いてどのような分析ができるか説明していきたいと思います。

ログ分析ツールの起動

今回は前回と同様、SageMakerでのログ分析をします。

まず、コンソールから「SageMaker」を検索し、左の「ノートブックインスタンス」を選択、アクションの「Open Jupyter」をクリックしてJupyter notebookを開きます。

Jupyter notebookを開いたら、「aws-deepracer-workshops」のフォルダの中の「log-analysis」のフォルダにある「DeepRacer Log Analysis.ipynb」を選択して、起動します。

f:id:iTD_GRP:20191127164925p:plain

すると、初回起動時は以下のように「kernel not found」と出てくると思いますが、出てきた場合、一番下の「conda_tensorflow_p36」を選択します。

f:id:iTD_GRP:20191127164943p:plain

ログのダウンロード

まず、ログをダウンロードします。

ログファイルのダウンロードは、まず「Download the desired log file giben the simulation ID」のプログラム部分の「MY_SIM_ID」の部分を自分のSimulation IDに変更します。

Simulation IDは、DeepRacerで、モデル一覧からモデルを選択した際に、「Training」の「Resource」の「Simulation job」にある、「sim-」から始まるコードです。

f:id:iTD_GRP:20191127164957g:plain

コースの選択

コースの選択は、「Load waypoints for the track you want to run analysis on」のプログラムのwaypoints = get_track_waypoints("reinvent_base")reinvent_baseを学習のフェイズでシミュレーションしたコース名に変更します。

コースは「/aws-deepracer-workshops/log-analysis/tracks/」の中にコースのwaypointsのデータが.npyファイルとして入っており、.npyを取り除いた名前をget_track_waypointsの引数として指定します。

npyファイルの作成

npyファイルで格納されているコース以外でシミュレーションした場合、npyファイルを自作する必要があります。

特にVirtual Racesの場合、毎月コースが変更されるので、コースファイルが追加されない場合があります。

npyファイルとは、NumPy配列形式で格納されたデータファイルで、コースのnpyファイルでは中心線の座標であるCenterlineの座標、コースの外側の座標であるOuterline、コースの内側の座標であるInnerlineをNumPyの配列として格納しています。

まず、Centerlineは取得されるwaypoints、そしてOuterlineInnerlineCenterlineの座標やコースの横幅等から計算すれば取得できます。

これらのデータを取得するには、報酬関数内でprint文で出力します。

すると、ログから取得することができるので、コンソールから「CloudWatch」にいき、「インサイト」から取得できます。

また、自作する以外にも、DeepRacerのコミュニティやGithubでほかの参加者が作成した.npyファイルを検索するなどすれば得ることもできます。

Load the training log

ダウンロードしたログをロードします。

fnameの値をlogs/deepracer-(Simulation ID).logのように指定します。

ログ分析

ログ分析の準備はできたため、ログ分析をします。

Plot rewards per Iteration

Plot rewards per Iteration部分のプログラムを実行すると、上から「イテレーションごとの平均」、「標準偏差」、「エピソードごとの合計報酬」をプロットしたグラフを出力します。

f:id:iTD_GRP:20191127165026p:plain

Analyze the reward distribution for your reward function

設定した報酬関数により、報酬がどのような分布になっているかを出力します。

例えば以下の場合、中心線から外側に向かって報酬が分布しているため、レーシングカーは中心線から外側に対して走るように報酬が設定されてしまっていることがわかります。

f:id:iTD_GRP:20191127165037p:plain

また、これに加えて分析ツールでは以下のように、より詳細にレーシングカーの軌跡を出力するプログラムもあります。

  • Plot a particular iteration:指定したイテレーションの報酬関数の分布を示す。イテレーションの指定はiteration_idの変数に指定する。
  • Path taken for top reward iterations:各イテレーションにおける合計報酬の上位N個のレーシングカーの軌跡を出力(Nはplot_top_laps関数の第二引数で指定)の軌跡を出力
  • Path taken in a particular episode:指定したエピソードでの軌跡。(エピソードはplot_episode_runの第二引数で指定)
  • Path taken in a particular Iteration:指定したイテレーションでの全エピソードのパス(iteration_idで指定)

Action breakdown per iteration and histogram for action distribution for each of the turns -reinvent track

コース内の各部分でどのようなアクション(ステアリング、減速等)を行っているかを出力します。

注意として、このコードはre:Inventのトラックのみしか対応していません。もしほかのトラックでも行いたい場合は、コードの以下の部分をコースに対応するように変更すれば対応することができます。

action_names = ['LEFT', 'RIGHT', 'STRAIGHT', 'SLIGHT LEFT', 'SLIGHT RIGHT', 'SLOW']
 vert_lines = [10,25,32,33,40,45,50,53,61,67]
 track_segments = [(15, 100, 'hairpin'),
 (32, 100, 'right'),
 (42, 100, 'left'),
 (51, 100, 'left'),
 (63, 100, 'left')]

 segment_x = np.array([15, 32, 42, 51, 63])
 segment_y = np.array([0, 0, 0, 0, 0])

 segment_xerr = np.array([[5, 1, 2, 1, 2], [10, 1, 3, 2, 4]])
 segment_yerr = np.array([[0, 0, 0, 0, 0], [150, 150, 150, 150, 150]])

Simulation Image Analysis - Probability distribution on decision (actions)

このプログラムでは、報酬関数から報酬の値を決定するときに、どれくらいの確信度を持って報酬を出力しているかをヒストグラムとして表示しています。

イテレーションのダウンロード

上記プログラムを実行する前に、各イテレーションごとのモデルをダウンロードする必要があります。

まず、このプログラムの最初の方で以下のコードがあります。

!grep "S3 bucket" $fname
!grep "S3 prefix" $fname

この出力結果をコピーし、Download all the checkpoints (provided as an example). にある変数、s3_buckets3_prefixの部分にペーストしてください。

そしてこの部分のコードを実行するとダウンロードできるはずです。

ヒストグラムの出力

ここでは、レーシングカーから見えている景色の画像データを、指定したイテレーションのモデルに入力したとき、その結果出力された報酬がどれくらい確信をもってその報酬の値を決定しているかを、横軸を確信度としたヒストグラムとして出力しています。

イテレーションの指定は、iterationという変数名の配列があるのですが、その配列にイテレーションのIDを格納すれば指定ができます。

確信度は0~1で出力されるため、最頻値(ヒストグラムの度数が最大のときの確信度)が1に近ければ近いほど、モデルは確信をもってその結果を出力しているということになります。

f:id:iTD_GRP:20191127165102p:plain

この分析も、入力で用いられる画像は、simulation_episodeというフォルダにある画像が入力されます。

そして、このフォルダ内の画像はre:Inventのコースの画像であるため、それ以外のコースでは対応していないですが、他のコースでも分析の参考にはなりうると思います。

Model CSV Analysis

モデルのCSVファイルをダウンロードして、プロットするためのプログラムです。

これを実行するためにはモデルのCSVをダウンロードしてくる必要があります。

モデルのCSVのダウンロード方法は、まず、DeepRacerの自分のモデルの画面を選択し、右上の「Download model」を選択する。

f:id:iTD_GRP:20191127165115p:plain

すると、モデルが様々な形式のファイルをまとめたzipファイルがダウンロードされます。

そのzipファイル内のCSVファイル全てをintermediate_checkpointというファイル内に入れて、以下のようにプログラム上のfnameに名前指定すれば実行可能です。

fname = 'intermediate_checkpoint/worker_0.simple_rl_graph.main_level.main_level.agent_0.csv'
 df_csv = pd.read_csv(fname)

このCSVファイルを用いると、割引率に関するデータやエントロピー、損失に関するデータなど様々なデータをプロットすることができますが、本プログラム上では学習で得られた各イテレーションごとの報酬と、エピソードの長さを出力しています。

f:id:iTD_GRP:20191127165128p:plain

Evaluation Run Analysis

この部分では、評価時のログを出力するプログラムになります。

これを実行するには、プログラム内の変数eval_simにモデルのEvaluationのSimulation IDを指定、eval_fnameにも「logs/deepracer-(Simulation ID).log」と指定します。

Grid World Analysis

この部分では、評価時に、各エピソードで、どのようなコース取りでどのようなスピードで走っているかを以下のような画像で出力してくれます。

f:id:iTD_GRP:20191127165143p:plain

What is the model looking at?

この部分では、レーシングカーによって取得された画像をモデルに入力した結果、どこの部分をみて報酬を決定しているかということをGrad-CAMという手法を用いて、ヒートマップで出力しています。

f:id:iTD_GRP:20191127165152p:plain

これも入力で使われている画像も、simulation_episode内のフォルダの画像なため、ほかのコースでは対応していませんが、カーブではどこを見て報酬を決定しているか、直線ではどこを見て報酬を決定しているかなどはわかるため、これも参考にはなると思います。

まとめ

前回のログ分析ツール仕様の準備に引き続き、今回はログ分析ツールでどのようなことができるか紹介しました。

このようなツールを用いなくても、AWSのCloudWatchからログをダウンロードして、データをプロットしてくれるツールやソフトウェアなどを使えばどこで外れているかなどの分析はできますが、今回紹介した方法が一番詳しく分析できる方法かと思います。


次の記事へ

前の記事へ 目次へ戻る