社内勉強会：AWS DeepRacer基礎編（ログ取得）を開催した

# はじめに

社内でAWS DeepRacer人口が増えてきており、ちょっと乗り遅れてしまった人向けにAWS DeepRacer勉強会基礎編を社内で開催したのでその内容を公開します。

本記事では基礎編の**ログ取得**について解説しています。

その他の勉強会の内容については、以下の記事をご確認ください。

- [社内勉強会：AWS DeepRacer基礎編（モデル作成）を開催した](https://qiita.com/dnp-yonezawa/items/51a609b2c26ddc40d292)
- [社内勉強会：AWS DeepRacer基礎編（ハイパーパラメータ）を開催した](https://qiita.com/dnp-yonezawa/items/02f6d04f71a13868b32d)
- [社内勉強会：AWS DeepRacer応用編（ログの分析・可視化）を開催した](https://qiita.com/dnp-yonezawa/items/569c5871c74852230a9f)


# ログについて
## ログの取得方法の種類

ログの取得方法はいくつかあります。

- CloudWatchから一部のみ取得する：本記事記載
- CloudWatch APIを使用して全件取得する：[社内勉強会：AWS DeepRacer応用編（ログの分析・可視化）を開催した](https://qiita.com/dnp-yonezawa/items/569c5871c74852230a9f)記載

## ログの種類とアクセス方法

- Trainingログ：トレーニング中に出力されたログ

**Training** > Simulation Job > View logsをクリックします。

![log_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/f7e40a3a-ac1a-2c11-2b6d-ce521f1441d5.png)

- Evaluationログ：評価走行中に出力されたログ

**Evaluation** > Simulation Job > View logsをクリックします。

![log_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/53fce2a3-b527-9659-736d-c871e445ce43.png)

# ログの表示

AWS DeepRacerコンソール画面からTrainingまたはEvaluationのView logsをクリックするとCloudWatchのコンソール画面に遷移します。ログストリームからログをクリックすると該当するログが表示されます。

![log_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/88ec2d13-1ab2-33d9-bca5-6a506f9ad03d.png)

![log_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/f7a0a645-8d4a-fdb3-2cd8-a43f439f35b5.png)

※ Trainingログのキャプチャ

# ログの取得

CloudWatchのコンソール画面の左ペインから、[インサイト]をクリックします。

![log_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/a472562b-b5a1-b8e7-4c6e-5b80726236fb.png)


![log_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/aad8b405-a88e-b5c8-cada-8acbd3e7168e.png)

Logs Insightsのコンソール画面から、以下の項目を入力し、[クエリの実行]ボタンをクリックします。

- ①ロググループ名：/aws/robomaker/SimulationJobs
- ②期間：処理を実行した期間を指定します
　 例）2019-06-13(00:00:00)-2019-06-13(23:59:59)
- ③クエリ：
    - 以下のクエリを使用して、必要な行を取得するとともに、parseを使用して、各項目をCSV形式で取得できるようにします。
    - 1行目のシミュレーションIDを適宜書き換えてください。※ 例ではシミュレーションID：sim-abcd12345678

```
filter @logStream like /sim-abcd12345678/
| filter @message like /SIM_TRACE_LOG:/
| parse @message "SIM_TRACE_LOG:*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" as episodes,tsteps,x,y,yaw,steering_angle,throttle,action_taken,reward,done,on_track,current_progress,closest_waypoint_index,track_length
| sort @timestamp asc
```



# ログのダウンロード

[アクション] > [クエリ結果をダウンロード(CSV)]をクリックするとCSV形式でログをダウンロードすることができます。

![log_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/cccbb8f2-8d1f-d6db-9533-80a5134deea0.png)

![log_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/cdf72c01-fc0e-26d1-14e3-e0785a218cef.png)

ダウンロードしたCSVファイルのデータで、車両が通過した軌跡の視覚化や報酬の確認など、ログの分析をすることが可能です。

例）車両が通過した軌跡を視覚化

![log_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/a577ffeb-f966-2bfa-b93d-aadb0143678d.png)

# ログの出力

報酬関数内でprint文を書くことで、独自のログを出力することができます。

![log_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/59c5cbb7-5e02-ad4e-adb1-fdd089340a88.png)

```python
def reward_function(params):
    '''
    Example of penalize steering, which helps mitigate zig-zag behaviors
    '''
    
    # Read input parameters
    distance_from_center = params['distance_from_center']
    track_width = params['track_width']
    steering = abs(params['steering_angle']) # Only need the absolute steering angle
    
    waypoints = params['waypoints']

    # Calculate 3 markers that are at varying distances away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width

    # Give higher reward if the agent is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # likely crashed/ close to off track

    # Steering penality threshold, change the number based on your action space setting
    ABS_STEERING_THRESHOLD = 15

    # Penalize reward if the agent is steering too much
    if steering > ABS_STEERING_THRESHOLD:
        reward *= 0.8

    print("CUSTOM_LOG:wp={}".format(waypoints))
    
    return float(reward)

```

なお、Logs Insightsのコンソール画面から、ログを抽出する場合は以下のクエリを実行します。
※ waypointsは何行も表示される必要がないので、limit 1としています。

```
filter @logStream like /sim-abcd12345678/
| filter @message like /CUSTOM_LOG:/
| parse @message "CUSTOM_LOG:wp=*" as waypoints 
| sort @timestamp asc
| limit 1
```

# まとめ

本記事では、CloudWatchから一部のログを取得する方法を解説しました。

ログを分析して効率的に精度向上していけたらと思います。