- 記事の概要
- ログ分析ツールの起動
- ログ分析
- Plot rewards per Iteration
- Analyze the reward distribution for your reward function
- Action breakdown per iteration and histogram for action distribution for each of the turns -reinvent track
- Simulation Image Analysis - Probability distribution on decision (actions)
- Model CSV Analysis
- Evaluation Run Analysis
- Grid World Analysis
- What is the model looking at?
- まとめ
記事の概要
ログ分析を行うために、前回はログ分析ツールを動かすための準備を行いました。
今回はログ分析ツールを用いてどのような分析ができるか説明していきたいと思います。
ログ分析ツールの起動
今回は前回と同様、SageMakerでのログ分析をします。
まず、コンソールから「SageMaker」を検索し、左の「ノートブックインスタンス」を選択、アクションの「Open Jupyter」をクリックしてJupyter notebookを開きます。
Jupyter notebookを開いたら、「aws-deepracer-workshops」のフォルダの中の「log-analysis」のフォルダにある「DeepRacer Log Analysis.ipynb」を選択して、起動します。
すると、初回起動時は以下のように「kernel not found」と出てくると思いますが、出てきた場合、一番下の「conda_tensorflow_p36」を選択します。
ログのダウンロード
まず、ログをダウンロードします。
ログファイルのダウンロードは、まず「Download the desired log file giben the simulation ID」のプログラム部分の「MY_SIM_ID」の部分を自分のSimulation IDに変更します。
Simulation IDは、DeepRacerで、モデル一覧からモデルを選択した際に、「Training」の「Resource」の「Simulation job」にある、「sim-」から始まるコードです。
コースの選択
コースの選択は、「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、そしてOuterline
やInnerline
はCenterline
の座標やコースの横幅等から計算すれば取得できます。
これらのデータを取得するには、報酬関数内でprint文で出力します。
すると、ログから取得することができるので、コンソールから「CloudWatch」にいき、「インサイト」から取得できます。
また、自作する以外にも、DeepRacerのコミュニティやGithubでほかの参加者が作成した.npyファイルを検索するなどすれば得ることもできます。
Load the training log
ダウンロードしたログをロードします。
fname
の値をlogs/deepracer-(Simulation ID).log
のように指定します。
ログ分析
ログ分析の準備はできたため、ログ分析をします。
Plot rewards per Iteration
Plot rewards per Iteration部分のプログラムを実行すると、上から「イテレーションごとの平均」、「標準偏差」、「エピソードごとの合計報酬」をプロットしたグラフを出力します。
Analyze the reward distribution for your reward function
設定した報酬関数により、報酬がどのような分布になっているかを出力します。
例えば以下の場合、中心線から外側に向かって報酬が分布しているため、レーシングカーは中心線から外側に対して走るように報酬が設定されてしまっていることがわかります。
また、これに加えて分析ツールでは以下のように、より詳細にレーシングカーの軌跡を出力するプログラムもあります。
- 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_bucket
とs3_prefix
の部分にペーストしてください。
そしてこの部分のコードを実行するとダウンロードできるはずです。
ヒストグラムの出力
ここでは、レーシングカーから見えている景色の画像データを、指定したイテレーションのモデルに入力したとき、その結果出力された報酬がどれくらい確信をもってその報酬の値を決定しているかを、横軸を確信度としたヒストグラムとして出力しています。
イテレーションの指定は、iteration
という変数名の配列があるのですが、その配列にイテレーションのIDを格納すれば指定ができます。
確信度は0~1で出力されるため、最頻値(ヒストグラムの度数が最大のときの確信度)が1に近ければ近いほど、モデルは確信をもってその結果を出力しているということになります。
この分析も、入力で用いられる画像は、simulation_episode
というフォルダにある画像が入力されます。
そして、このフォルダ内の画像はre:Inventのコースの画像であるため、それ以外のコースでは対応していないですが、他のコースでも分析の参考にはなりうると思います。
Model CSV Analysis
モデルのCSVファイルをダウンロードして、プロットするためのプログラムです。
これを実行するためにはモデルのCSVをダウンロードしてくる必要があります。
モデルのCSVのダウンロード方法は、まず、DeepRacerの自分のモデルの画面を選択し、右上の「Download model」を選択する。
すると、モデルが様々な形式のファイルをまとめた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ファイルを用いると、割引率に関するデータやエントロピー、損失に関するデータなど様々なデータをプロットすることができますが、本プログラム上では学習で得られた各イテレーションごとの報酬と、エピソードの長さを出力しています。
Evaluation Run Analysis
この部分では、評価時のログを出力するプログラムになります。
これを実行するには、プログラム内の変数eval_sim
にモデルのEvaluationのSimulation IDを指定、eval_fnameにも「logs/deepracer-(Simulation ID).log」と指定します。
Grid World Analysis
この部分では、評価時に、各エピソードで、どのようなコース取りでどのようなスピードで走っているかを以下のような画像で出力してくれます。
What is the model looking at?
この部分では、レーシングカーによって取得された画像をモデルに入力した結果、どこの部分をみて報酬を決定しているかということをGrad-CAMという手法を用いて、ヒートマップで出力しています。
これも入力で使われている画像も、simulation_episode
内のフォルダの画像なため、ほかのコースでは対応していませんが、カーブではどこを見て報酬を決定しているか、直線ではどこを見て報酬を決定しているかなどはわかるため、これも参考にはなると思います。
まとめ
前回のログ分析ツール仕様の準備に引き続き、今回はログ分析ツールでどのようなことができるか紹介しました。
このようなツールを用いなくても、AWSのCloudWatchからログをダウンロードして、データをプロットしてくれるツールやソフトウェアなどを使えばどこで外れているかなどの分析はできますが、今回紹介した方法が一番詳しく分析できる方法かと思います。