Amazon Web Services ブログ

Amazon SageMaker RL Notebook を使用した AWS DeepRacer のカスタム深層強化学習およびマルチトラックトレーニング

re:Invent 2018 で開始された AWS DeepRacer は、開発者が強化学習 (RL) を実践するのに役立ちます。  それ以来、世界中の AWS Summits で開催された 21 の AWS DeepRacer リーグイベントで、何千人もの人々が仮想的に AWS DeepRacer コンソールを通じてモデルを開発し、競い合いました。サミット以外にも、AWS Lofts でのいくつかのイベント、開発者のミートアップ、パートナーセッション、企業イベントなどがありました。

AWS DeepRacer で学び、実験する開発者の熱意は非常に高いものがあります。多くの人は、さらに探求し、ニューラルネットワークアーキテクチャやトレーニングプリセットを改良したり、複数のトラックで並行してトレーニングしたりする能力を高めたいと考えています。

AWS DeepRacer は、Amazon SageMakerAWS RoboMakerAmazon Kinesis Video StreamsAmazon CloudWatchAmazon S3 など、他のいくつかの AWS のサービスを利用しています。こうした各コンポーネントをよりきめ細かく制御してシミュレーション環境とモデリング環境を拡張するために、この記事にはこうした環境のプロビジョニングと管理に役立つノートブック環境が含まれており、AWS DeepRacer でのエクスペリエンスのあらゆる側面を改良できます。詳細については、この記事の GitHub リポジトリを参照してください。

この記事では、環境の設定方法を探り、AWS DeepRacer コードベースの主なコンポーネントを掘り下げ、ニューラルネットワークやトレーニングプリセットの変更、アクションスペースのカスタマイズ、複数のトラックでの並行トレーニングについて詳しく説明します。最後には、Amazon SageMaker を使用して AWS DeepRacer モデルトレーニングを変更する方法を理解できているはずです。

開発者は、AWS DeepRacer コンソールの背後にあるツールを利用することで、AWS DeepRacer トレーニングとモデルのあらゆる側面をカスタマイズおよび変更し、モデルを直接レースにダウンロードして、NeurIPS での AIDO 3 チャレンジに参加することができます。

AWS DeepRacer ノートブック環境を設定する

開始するには、AWS マネジメントコンソールにログインして、以下の手順を実行します。

  1. コンソールの [SageMaker] で、[Notebook instances] を選択します。
  2. [Create notebook instance] を選択します。
  3. ノートブックに名前を付けます。たとえば、DeepracerNotebook という名前を付けます。

AWS RoboMaker と Amazon SageMaker がトレーニングの面倒な作業を行うので、ノートブック自体にはそれほど多くの馬力は必要ありません。

  1. インスタンスタイプはデフォルトの ml.t2.medium のままにします。
  2. [Additional configuration] を選択します。
  3. [Volume size] では、少なくとも 25 GB に設定します。

このサイズは、トレーニング環境とシミュレーションアプリケーションを再構築するのに十分なスペースを提供します。

  1. [Create a new role] を選択します。
  2. [Any S3 bucket] を選択します。
  3. [Create role] を選択します。

Amazon SageMaker Notebooks を使用するのが初めてではない場合、ドロップダウンリストから有効なロールを選択します。

  1. 他のすべての設定はデフォルトのままにします。
  2. [Create notebook instance] を選択します。

次のスクリーンキャストは、ノートブック環境の設定方法を示しています。

ノートブックインスタンスの起動には数分かかります。準備ができたら、[Open Jupyter] を選択します。

ノートブックの読み込み

AWS DeepRacer サンプルノートブックを読み込むには、次の手順を実行します。

  1. [SageMaker Examples] を選択します。
  2. [Reinforcement Learning] を選択します。
  3. deepracer_rl.ipynb の隣の [Use] を選択します。
  4. [Create copy] を選択します。

このプロセスは、AWS DeepRacer ノートブックスタックを使用しているノートブックインスタンス (rl_deepracer_robomaker_coach_gazebo_YYYY-MM-DD ディレクトリの [Files] タブにあります) にコピーし、メインのノートブックファイルを新しいタブで開きます。

このプロセスのスクリーンキャストは次のとおりです。

AWS DeepRacer ノートブック環境

以下のファイルを変更して、AWS DeepRacer のトレーニングと評価を任意の方法でカスタマイズすることができます。

  • src/training_worker.py – このファイルは、事前にトレーニングされたモデルの読み込みまたは新しいニューラルネットワークの作成 (プリセットファイルを使用)、データストアの設定、Amazon SageMaker と AWS RoboMaker の間での通信用の Redis サーバーの起動のいずれかを処理します。
  • src/markov/rollout_worker.py – このファイルは Amazon SageMaker トレーニングインスタンスで実行され、S3 からモデルチェックポイントをダウンロードし (最初は training_worker.py によって作成され、rollout_worker.py の以前の実行によって更新されます)、トレーニングループを実行します。
  • src/markov/evaluation_worker.py – このファイルは、評価中にモデルを評価するために使用されます。S3 からモデルをダウンロードし、評価ループを実行します。
  • src/markov/sagemaker_graph_manager.py – このファイルは Amazon SageMaker トレーニングインスタンスで実行され、渡されたハイパーパラメーターの処理を含めて RL クラスをインスタンス化し、カメラ入力をグレースケールに変換するなどの入力フィルターを設定します。
  • src/markov/environments/deepracer_racetrack_env.py – このファイルは、Amazon SageMaker トレーニングインスタンスと AWS RoboMaker インスタンスの両方で 2 回読み込まれます。環境変数 NODE TYPE を使用して、実行中の環境を判別します。AWS RoboMaker インスタンスは Robotics Operating System (ROS) コードを実行します。このファイルは、AWS RoboMaker 環境とのやり取りのほとんどの作業を行います。たとえば、車が軌道を外れたときにリセットし、報酬関数パラメーターを収集し、報酬関数を実行し、CloudWatch にログを記録します。

また、次のディレクトリにファイルを追加して、さらにカスタマイズすることもできます。

  • src/markov/rewards – このディレクトリには、サンプルの報酬関数が保存されます。これらの報酬関数は S3 にコピーされ、ノートブックの Amazon SageMaker に渡されます。ノートブックは選択された報酬関数を S3 にコピーし、deepracer_racetrack_env.py がそれをフェッチして実行します。
  • src/markov/actions – このディレクトリには、ニューラルネットワークの最後の行の各ノードに対して実行されるアクションを定義する一連の JSON ファイルが含まれています。選択したもの (または新しく作成したもの) は、ニューラルネットワークの出力ノードの数と一致する必要があります。ノートブックは選択したものを S3 にコピーし、そこで rollout_worker.py スクリプトによってフェッチされます。
  • src/markov/presets – このディレクトリには、RL アルゴリズムを変更し、ニューラルネットワークのサイズや形状などの他のパラメーターを変更できるファイルが含まれています。ノートブックは選択したものを S3 にコピーし、そこで rollout_worker.py スクリプトによってフェッチされます。
  • Dockerfile – Amazon SageMaker トレーニングインスタンスにデプロイされるコンテナを構築するための指示が含まれています。コンテナは標準の Ubuntu ベースで構築され、src/markov ディレクトリがコンテナにコピーされます。また、AWS DeepRacer が使用する一連のパッケージがインストールされています。

RL のためのニューラルネットワークアーキテクチャのカスタマイズ

ニューラルネットワークアーキテクチャをカスタマイズして、エントリの追加、アルゴリズムの変更、ネットワークのサイズと形状の変更を行う方法などにご興味がおありでしょうか。

この記事を書いている時点では、AWS DeepRacer は、オープンソースパッケージ Intel RL Coach を使用して、最先端の RL アルゴリズムを実行しています。Intel RL Coach では、新しいプリセットファイルを作成することで、トレーニングバッチサイズ、探索方法、ニューラルネットワークアーキテクチャなどを含めて、これらに限らず RL アルゴリズムのハイパーパラメーターを編集できます。

GitHub リポジトリの例については、defaults.py および preset_attention_layer.py を参照してください。ノートブックの設定に固有のプリセットファイルに変更を加える場合、sagemaker_graph_manager.py を変更して、ハイパーパラメーターまたはアルゴリズム設定への適切な変更を反映し、新しいプリセットファイルに一致させる必要もあります。

presets/ ディレクトリに新しいファイルを配置したら、ノートブックファイルを変更し、「カスタムファイルを S3 バケットにコピーして Amazon SageMaker と AWS RoboMaker が取得できるようにする」セクションを編集して、新しいプリセットファイルを使用します。次のコードをご覧ください。

s3_location = "s3://%s/%s" % (s3_bucket, s3_prefix)
print(s3_location)

# 以前にアップロードしたファイルをクリーンアップ
!aws s3 rm --recursive {s3_location}

# 以下の環境およびプリセットファイルに変更を加え、これらのファイルをアップロード
!aws s3 cp src/markov/environments/deepracer_racetrack_env.py {s3_location}/environments/deepracer_racetrack_env.py

!aws s3 cp src/markov/rewards/default.py {s3_location}/rewards/reward_function.py

!aws s3 cp src/markov/actions/model_metadata_10_state.json {s3_location}/model_metadata.json

#!aws s3 cp src/markov/presets/default.py {s3_location}/presets/preset.py
!aws s3 cp src/markov/presets/preset_attention_layer.py {s3_location}/presets/preset.py

変更された最後の行は、default.py の代わりに preset_attention_layer.py を S3 バケットにコピーします。Amazon SageMaker および AWS RoboMaker は、トレーニングを開始する前の初期化期間中に、変更されたファイルを S3 バケットからコピーします。

アクションスペースとノイズインジェクションのカスタマイズ

アクションスペースは、ニューラルネットワークの出力層と、対応する出力ノードを選択する際の車の動作を定義します。ニューラルネットワークの出力は、アクションの数に等しいサイズの配列です。この配列には、特定のアクションを実行する確率が含まれます。この記事では、最も確率が高い出力ノードのインデックスを使用しています。

標準 JSON で記述されたマッピングを介して、最大確率出力ノードのインデックスに対応するアクション、速度、およびステアリング角度を取得できます。AWS RoboMaker シミュレーションアプリケーションは、JSON ファイルを使用して、トレーニング中の速度とステアリング角度、および評価段階を決定します。次のサンプルコードは、同じ速度でステアリング角度だけが異なる 5 つのノードを定義しています。

{
    "action_space": [
        {
            "steering_angle": -30,
            "speed": 0.8,
            "index": 0
        },
        {
            "steering_angle": -15,
            "speed": 0.8,
            "index": 1
        },
        {
            "steering_angle": 0,
            "speed": 0.8,
            "index": 2
        },
        {
            "steering_angle": 15,
            "speed": 0.8,
            "index": 3
        },
        {
            "steering_angle": 30,
            "speed": 0.8,
            "index": 4
        }
    ]
}

ステアリング角度と速度の単位は、それぞれ度とメートル/秒です。Deepracer_env.py は JSON ファイルを読み込んで、指定された出力ノードに対して特定のアクションを実行します。また、このファイルは、同じ理由で物理的な車に読み込むためにエクスポートされたモデルにもバンドルされています。つまり、シミュレーションから実世界へと、ニューラルネットワークの出力ノードを対応するステアリング角度と速度にマッピングします。

アクションスペース内の順列が多いほど、ニューラルネットワークの出力層にあるノードが多くなります。ノードが多くなると、トレーニング中の数学的操作のための行列がより大きくなることを意味します。 したがって、トレーニングには時間がかかります。

次の Python コードは、カスタムアクションスペースを生成するのに役立ちます。

#!/usr/bin/env python

import json

min_speed = 4
max_speed = 8
speed_resolution = 2

min_steering_angle = -30
max_steering_angle = 30
steering_angle_resolution = 15

output = {"action_space":[]}
index = 0
speed = min_speed
while speed <= max_speed:
    steering_angle = min_steering_angle
    while steering_angle <= max_steering_angle:
        output["action_space"].append( {"index":index,
                                         "steering_angle":steering_angle,
                                         "speed":speed}
                                     )
        steering_angle += steering_angle_resolution
        index += 1
    speed += speed_resolution

print json.dumps(output,indent=4)

シミュレーションから実世界への変換の改善

ロボット工学の研究は、エントロピーとノイズをシミュレーションに導入すると、モデルがより適切な特徴を識別し、実世界の条件により適切に反応し、シミュレーションから実世界への変換が改善することを示しています。新しいアルゴリズムとネットワークを開発する際は、このことに留意してください。

たとえば、AWS DeepRacer には、製造中の機械部品の摩擦と偏差の変化を考慮して、ステアリング角度と速度のランダムノイズがすでに含まれています。これは src/markov/environments/deepracer_racetrack_env.py にある以下のコードで確認できます。

   def step(self, action):
        self.steering_angle = float(self.json_actions[action]['steering_angle']) * math.pi / 180.0
        self.speed = float(self.json_actions[action]['speed']) + 
    
        ## ノイズ ##    
        # ステアリング角度と速度の両方にランダムなノイズを追加
        self.steering_angle += 0.01 * np.random.normal(0, 1.0, 1)
        self.speed += 0.1 * np.random.normal(0, 1.0, 1)

ステアリングと速度のノイズに加えて、照明、トラックの素材、トラックの状態、バッテリーの充電レベルの変動などを考慮することもできます。これらは、環境コードまたは AWS RoboMaker ワールド設定ファイルで変更できます。

並列マルチトラックトレーニング

単一のトレーニングジョブを複数のシミュレーション環境でトレーニングすることにより、モデルをより速くトレーニングすることができます。たとえば、あるシミュレーション環境ではコンクリート素材の道路を使用し、別のシミュレーション環境ではカーペットを使用します。並列 AWS RoboMaker 環境がバッチを生成すると、トレーニングインスタンスはすべてのシミュレーションからの情報を使用してモデルをトレーニングします。この戦略により、モデルが単一のマップの一部ではなく道路の特徴を識別できるようにしたり、さまざまなテクスチャや照明条件の下で動作したりすることができます。

AWS RoboMaker は、オープンソースの 3D ロボット工学シミュレーターである Gazebo を使用しています。ワールドファイルは Gazebo 環境を定義し、モデル定義と collada ファイルを使用して環境を構築します。標準の AWS DeepRacer シミュレーションアプリケーションには、reinvent_basereinvent_carpetreinvent_concretereinvent_woodAWS_trackBowtie_trackOval_trackStraight_track などの複数のワールドファイルが含まれています。新しいトラックは、仮想リーグの一部として定期的にリリースされます。AWS RoboMaker シミュレーションジョブの WORLD_NAME 環境変数によってそれらを識別できます。

さまざまなワールド設定で並列シミュレーションアプリケーションを実行するには、ノートブックの「AWS RoboMaker でシミュレーションジョブを起動する」セクションを変更します。次のコードをご覧ください。

import datetime #衝突を避けるためにマイクロ秒の精度が必要 

envriron_vars = {
    "KINESIS_VIDEO_STREAM_NAME": "SilverstoneStream",
    "SAGEMAKER_SHARED_S3_BUCKET": s3_bucket,
    "SAGEMAKER_SHARED_S3_PREFIX": s3_prefix,
    "TRAINING_JOB_ARN": job_name,
    "APP_REGION": aws_region,
    "METRIC_NAME": "TrainingRewardScore",
    "METRIC_NAMESPACE": "AWSDeepRacer",
    "REWARD_FILE_S3_KEY": "%s/rewards/reward_function.py" % s3_prefix,
    "MODEL_METADATA_FILE_S3_KEY": "%s/model_metadata.json" % s3_prefix,
    "METRICS_S3_BUCKET": s3_bucket,
    "METRICS_S3_OBJECT_KEY": s3_bucket + "/training_metrics.json",
    "TARGET_REWARD_SCORE": "None",
    "NUMBER_OF_EPISODES": "0",
    "ROBOMAKER_SIMULATION_JOB_ACCOUNT_ID": account_id
}

vpcConfig = {"subnets": deepracer_subnets,
             "securityGroups": deepracer_security_groups,
             "assignPublicIp": True}

worldsToRun = ["reinvent_base","reinvent_carpet","reinvent_concrete","reinvent_wood"]

responses = []
for world_name in worldsToRun:
    envriron_vars["WORLD_NAME"]=world_name
    simulation_application = {"application":simulation_app_arn,
                              "launchConfig": {"packageName": "deepracer_simulation_environment",
                                               "launchFile": "distributed_training.launch",
                                               "environmentVariables": envriron_vars}
                              }
    client_request_token = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f") 
    response =  robomaker.create_simulation_job(iamRole=sagemaker_role,
                                            clientRequestToken=client_request_token,
                                            maxJobDurationInSeconds=job_duration_in_seconds,
                                            failureBehavior="Continue",
                                            simulationApplications=[simulation_application],
                                            vpcConfig=vpcConfig
                                            )
    responses.append(response)

print("Created the following jobs:")
job_arns = [response["arn"] for response in responses]
for response in responses:
    print("Job ARN", response["arn"]) 

変更されたリストは新しい worldsToRun リストでループし、simulation_application 辞書の定義はループ内にあります (envriron_vars 辞書は毎回新しい WORLD_NAME で更新する必要があるため)。さらに、変更された clientRequestToken は、datetime モジュールでマイクロ秒を使用します。これは、同じ秒内に 2 つのジョブが送信された場合に古いメソッドがエラーになる可能性があるためです。

カスタム評価

標準の AWS DeepRacer コンソール評価では、3 つのエピソードが実行されます。車がコースを外れると、そのエピソードは終了し、完了した割合とそこまでの時間が記録されます。サンプルノートブックが envriron_vars 辞書の NUMBER_OF_TRIALS 割り当てで示すように、エピソードの数を渡すことができます。ただし、この動作は evaluation_worker.py ファイルで変更できます。4 分間でできるだけ多く実行するには、以下のコード (37〜39 行目) を変更します。

    while curr_num_trials < number_of_trials:
        graph_manager.evaluate(EnvironmentSteps(1))
        curr_num_trials += 1

以下は、更新されたコードです。

    import time
    starttime = time.time()
    while time.time()-starttime < 240:  #240 seconds = 4 minutes
        graph_manager.evaluate(EnvironmentSteps(1))
        curr_num_trials += 1

これにより、AWS Summit 物理トラックルールに従って、車は 4 分間走行できます。

これをさらに進めて、エピソードが終了する前に最大 3 回まで車をトラックに戻すことができる AWS Summit 物理レースリセットルールをシミュレートするには、deepracer_racetrack_env.pyinfer_reward_state() 関数を変更します。次のコード (行 396 および 397) を参照してください。

             done = True
             reward = CRASHED

以下は、更新されたコードです。

            reward = CRASHED
            try:
              self.resets +=1
            except:
              self.resets = 1 #likely this is the first reset and the variable hadn't been defined before
            if self.resets > 3:
              done = True
            else:
              done = False
              #ここで、すべてをトラックにリセット
              self.steering_angle = 0
              self.speed = 0
              self.action_taken = 0
              self.send_action(0, 0)
              for joint in EFFORT_JOINTS:
                  self.clear_forces_client(joint)
              current_ndist -= model_point.distance(self.prev_point)/2  #Try to get close to where the car went off
              prev_index, next_index = self.find_prev_next_waypoints(current_ndist)
              self.reset_car_client(current_ndist, next_index)
              #イメージキューをクリアして、車をトラックに戻す前の古い状態でトレーニングしないようにする
              _ = self.image_queue.get(block=True, timeout=None)
              self.set_next_state()

まとめ

AWS DeepRacer は、強化学習を始めるための楽しい方法です。自律モデルを構築するには、Python で適切な報酬関数を記述するだけです。コードと環境を掘り下げて AWS DeepRacer を拡張したい開発者向けに、この記事ではそのためのノートブック環境も提供しています。

この記事では、ノートブック環境の使用を開始する方法、トレーニングのアルゴリズムをカスタマイズする方法、アクションスペースを変更する方法、複数のトラックでトレーニングする方法、カスタム評価方法を実行する方法を示しました。思いついたことを、ぜひ共有してください!

以後の記事では、AWS RoboMaker シミュレーションアプリケーションを変更して、カスタムトラックでトレーニングと評価を行います。この記事では、トラックのシェーピングに関するヒントとコツを提供し、トラックを生成するためのコードを共有し、AWS DeepRacer 用にパッケージ化する方法について説明します。


著者について

Neal McFee は、AWS のパートナーソリューションアーキテクトです。彼はロボティクス、コンピュータービジョン、自律システムにまたがるソリューションに熱意を持っています。余暇には、彼はドローンを飛ばし、AWS のお客様と協力して、DeepRacer イベントを通じた強化学習の可能性を実現しています。

 

 

 

Don Barber は、シニアソリューションアーキテクトです。20 年以上にわたって、金融、製薬、政府などの規制された業界でお客様がテクノロジーを利用してビジネス上の問題を解決するのを支援しています。彼は、マリエッタ大学でコンピューターサイエンスの学士号を、メリーランド大学で MBA を取得しています。仕事を離れると、家族時間を過ごしたり、アマチュア無線や電子機器の修理などの趣味を楽しんでいます。

 

 

Sunil Mallya は、AWS Deep Learning チームのシニアソリューションアーキテクトです。彼は、お客様が機械学習と深層学習ソリューションを構築し、ビジネスを発展させるのを支援しています。余暇には、料理、セーリング、RC 自動運転車の作成を楽しんでいます。

 

 

Sahika Genc は、Amazon 人工知能 (AI) のシニアアプライドサイエンティストです。彼女の研究対象は、スマートオートメーション、ロボット工学、予測制御と最適化、強化学習 (RL) であり、国際自動制御連盟の産業委員会で活躍しています。彼女は、AWS DeepRacer や SageMaker RL などの消費者製品を含む、スケーラブルな自動運転および自動化システムに関するサイエンスチームを率いています。以前は、General Electric (GE) グローバルリサーチセンターの人工知能および学習研究所の上級リサーチサイエンティストでした。