AWS DeepRacer ノートブックを使用して SageMaker モデルをトレーニングし評価する - AWS DeepRacer

AWS DeepRacer ノートブックを使用して SageMaker モデルをトレーニングし評価する

AWS DeepRacer コンソールは、AWS DeepRacer モデルをトレーニングし評価するための統合されたエクスペリエンスを提供します。AWS DeepRacer が SageMaker および AWS RoboMaker をシーンの裏で使用するため、統合されています。統合には、詳細な強化学習タスクが含まれており、初心者がトレーニングをより簡単に利用できるようになります。

経験を積んだ SageMaker ユーザーである場合、または SageMaker と AWS RoboMaker を使用して AWS DeepRacer モデルをトレーニングおよび評価する方法を学習することを決定している場合は、手動で SageMaker ノートブックを作成できます。次に、強化学習サンプルのノートブックインスタンスを複製し、それをテンプレートとして使用して、AWS DeepRacer モデルの学習と評価を行う事前定義タスクを実行できます。

トレーニングの後、物理的環境での試運転のためにトレーニング済みのモデルアーティファクトを AWS DeepRacer 車両にコピーできます。

チュートリアルでは、これらのタスクを順を追って説明するためのステップバイステップの説明を示します。

SageMaker ノートブックを作成する

SageMaker で直接 AWS DeepRacer モデルをトレーニングするには、次のステップを実行し、SageMaker ノートブックインスタンスを作成します。

SageMaker ノートブックインスタンスを作成して AWS DeepRacer モデルをトレーニングおよび評価するには

  1. SageMaker コンソール (https://console.aws.amazon.com/sagemaker) にサインインします。サポート対象のリージョンをいずれか選択します。

  2. ナビゲーションペインで、[ノートブックインスタンス]、[Create notebook instance (ノートブックインスタンスの作成)] の順に選択します。

  3. [Create notebook instance (ノートブックインスタンスの作成)] ページで、以下の操作を行います。

    1. 名前を入力します。たとえば、[Notebook instance name (ノートブックインスタンス名)] は「my-deepracer-model」。

    2. [IAM ロール] ドロップダウンメニューに既存の IAM ロールが表示されない場合は、[新しいロールの作成] を選択し、カスタムの IAM ロール ARN を入力する既存のロールを使用して、次の手順を実行します。

    3. 他のすべてのオプションについてはデフォルト設定のままにしておき、[Create notebook instance (ノートブックインスタンスの作成)] を選択します。

    詳細については、「SageMaker ノートブックインスタンスを作成する」を参照してください。

  4. ノートブックインスタンスの [ステータス] が [Pending] から [InService] に変わるまで待ちます。次に、[Open Jupyter (Jupyter を開く)] を選択します。

  5. Jupyter ページ (新規に作成されたノートブックのホームページ) で、次を実行します。

    1. [SageMaker Examples (SageMaker サンプル)] タブを選択します。

    2. サンプルコレクションから [Reinforcement Learning (強化学習)] サンプルグループを展開します。

    3. この演習では、[deepracer_rl.ipynb] 項目の横にある [使用] を選択します。

    4. [Create a copy in your home directory (ホームディレクトリにコピーを作成)] ダイアログボックスで、[Create copy (コピーを作成)] を選択します。

    この時点で、ノートブックインスタンスが実行され、モデルのトレーニングを開始できます。

    選択したインスタンスタイプに応じて、実行中のインスタンスに対して課金されます。使用する準備ができていないときに実行中のインスタンスに対して課金されないようにするには、インスタンスをシャットダウンします。

SageMaker ノートブックインスタンスを開始する

AWS DeepRacer モデルのトレーニングに SageMaker ノートブックインスタンスを使用するには、まず、必要なジョブのインスタンスを適切に初期化します。この開始には、以下が含まれています。

  • 必須のライブラリをインポートする。

  • トレーニング環境をセットアップする。

  • SageMaker および AWS RoboMaker にアクセス許可を付与する。

  • トレーニングおよび評価ジョブをホストするための Docker コンテナをプロビジョニングします。

  • SageMaker および AWS RoboMaker が相互に連動するように VPC を設定する。

ノートブックインスタンスを初期化する詳細なステップについては、以下を実行します。

SageMaker ノートブックインスタンスを開始するには

  1. トレーニングに必要なライブラリをインポートするには、ノートブックインスタンスの最初のコードブロックを選択します。たとえば、[インポート] 見出しの下のいずれかを選択します。次に、このコードブロックを実行するには、ノートブックのメニューバーから [実行] を選択します。Shift-Enter key コマンドのショートカットを使用してコードブロックの実行を開始できます。

    
                        イメージ: ノートブックにライブラリをインポートします。

    コード実行が開始される前は、コードブロックのステータスは In [ ] と表示されます。実行が進行中の場合、ステータスは In [*] になります。コードの実行が完了すると、ステータスは In [n] になります。ここで n は呼び出しの順序に対応します。インポートコードセルが、最初の n=1 であるためです。最初の実行後に再度コマンドを実行すると、ステータスは In [2] になります。

    非同期実行の場合、コードセルはすぐに戻って完了ステータスを示します。同期実行の場合、ステータスが In [*] から In [n] に変わったときに現在のコードセルの実行が完了するまで、後続の呼び出しはブロックされます。

  2. 基本パラメータを初期化するには、[Initializing basic parameters] コードブロックをそのまま実行します。

    サンプルノートブックインスタンスは、デフォルトでジョブ期間を 1 時間に設定します。トレーニングを高速化または延長するには、コードセルを実行する前に job_duration_in_seconds 値を増減します。

  3. トレーニング出力ストレージを設定するには、[Setup S3 bucket (S3 バケットの設定)] の下にあるコードブロックを選択し、ノートブックインスタンスメニューから [実行] を選択するか、Shift+Enter キーを押します。

    
                        イメージ: ノートブックの S3 バケットを設定します。

    実行が完了したら、Amazon S3 コンソールでこのバケットを検証できます。

    s3_output_path 変数の値を表示するには、上のコードのセルに print(s3_output_path) を追加し、コードを再実行します。

  4. このノートブックインスタンスに対して、SageMaker による出力用に S3 ストレージにアクセスするための適切なアクセス許可を設定するには、[Create an IAM role (IAM ロールを作成する)] のコードセルを実行します。

    このコードブロックが実行されると、次の IAM ポリシーを含む新しい IAM ロールが作成されます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::*" ] } ] }

    作成された IAM ロールには、信頼されたエンティティとして SageMaker があります。

  5. このノートブックインスタンスに対して、トレーニング環境のシミュレーション用に AWS RoboMaker を呼び出すためのアクセス許可を設定するには、[Permission setup for invoking AWS RoboMaker from this notebook (このノートブックから AWS RoboMaker を呼び出すためのアクセス許可を設定する)] のコードセルを実行し、その後の指示に従って、前に作成した IAM ロールのものとは別の信頼されたエンティティとして、robomaker.amazonaws.com を追加します。

  6. SageMaker に対して、S3 ストレージにアクセスするためのアクセス許可を設定するには、[Permission setup for SageMaker to S3 bucket (S3 バケットに対する SageMaker のアクセス許可を設定する)] のコードセルを実行し、その後の指示に従って、前に作成した IAM ロールに [AmazonS3FullAccess] ポリシーをアタッチします。

  7. トレーニングジョブと評価ジョブの実行用に docker コンテナをプロビジョニングするには、[Build and push docker image (docker イメージを構築してプッシュする)] のコードセルを実行します。

    Docker イメージの構築とプッシュは、完了するまでに時間がかかります。

  8. SageMaker と AWS RoboMaker で VPC モードを有効にして、ネットワークを介して相互に通信できるようにするには、[Configure VPC (VPC を設定する)] のコードセルを実行します。デフォルトでは、ノートブックインスタンスはデフォルトの VPC、セキュリティグループ、サブネットを使用して VPC モードを設定します。VPC を他のトラフィックに対してオープンにしない場合は、必ず指定したセキュリティグループの [インバウンドルール] と [アウトバウンドルール] を設定し、それ自体からの受信トラフィックのみを許可するようにします。

    
                        イメージ: ノートブックで自身への VPC トラフィックを制限する。
  9. SageMaker トレーニングジョブが S3 リソースにアクセスできるようにするには、[Create Route Table (ルートテーブルを作成する)] のコードセルを実行して VPC S3 エンドポイントを作成します。

これで、トレーニングの初期化は完了しました。トレーニング環境のセットアップに進むことができます。

トレーニング環境のセットアップ

AWS DeepRacer モデルのトレーニング用に環境をセットアップするには、トレーニングに使用するレーストラック、報酬関数、関連するアクションスペース、ハイパーパラメータを選択する必要があります。

これらにはノートブックによってデフォルト設定が使用されます。デフォルト設定を表示するには、関連する部分のコメントを解除してから、[Configure the preset for RL algorithm (RL アルゴリズムのプリセットを設定する)] のコードセルを実行します。たとえば、報酬関数のコードリストを表示するには、以下のようにコードセルを実行します。

デフォルト設定を使用することにした場合は、それらのファイルを S3 バケットにコピーします。それらのファイルを変更するには、以下の手順に従って、デフォルトの報酬関数以外のものについてファイル名とディレクトリを変更します。

default.py ファイルの報酬関数を変更するには:

  1. ノートブックインスタンスページの上部にある [ファイル] メニューを選択してから、[Open... (開く)] を選択します。

  2. src/markov/rewards フォルダに移動し、default.py を選択してそのファイルを開きます。

  3. 必要に応じてファイルを編集します。ファイルの編集が完了したら、[ファイル]、[Save (保存)] の順に選択して、更新を保存します。

環境ファイルは SageMaker と AWS RoboMaker (ノードとも呼ばれる) の両方によって共有されています。SageMaker によって使用されている場合、node_typeSAGEMAKER_TRAINING_WORKER です。AWS RoboMaker によって使用されている場合、node_typeSIMULATION_WORKER です。

AWS DeepRacer モデルをトレーニングする

モデルを SageMaker および AWS RoboMaker の合計でトレーニングし、ノートブックの src ディレクトリの training_worker.py ファイルにあるコードを実行します。training_worker.py ファイルはトレーニングジョブのエントリポイントとして指定されます。

トレーニングプロセスでは、AWS RoboMaker を使用して環境での運転エクスペリエンスをエミュレートします。ディープニューラルネットワークをトレーニングするための入力として SageMaker に一定の間隔でエクスペリエンスを中継し、ネットワークの重みを S3 の場所に更新します。

トレーニングの進行中に、Amazon CloudWatch Logs にログ記録された、または AWS RoboMaker ターミナルに表示されたトレーニングメトリクスを指定できます。

AWS DeepRacer モデルをトレーニングするには

  1. [Copy custom files to S3 bucket so that sagemaker & robomaker can pick it up (カスタムファイルを S3 バケットにコピーして sagemaker と robomaker が選択できるようにする)] のコードセルを実行して、環境ファイルを S3 にコピーします。

    
                        イメージ: DeepRacer トレーニングジョブ環境ファイルを S3 にコピーする。
  2. SageMaker ジョブを開始して AWS DeepRacer モデルをトレーニングするには、以下の操作を行います。

    1. CloudWatch Logs または AWS RoboMaker コンソールウィンドウで監視するトレーニングメトリクスを定義するには、[Train the RL model using the Python SDK Script mode (Python SDK スクリプトモデルを使用して RL モデルをトレーニングする)] の最初のコードセルを実行します。

      
                                イメージ: トレーニング中に記録されるメトリクスを設定する。

      指定したメトリックを表示して、トレーニングをモニタリングしたり、CloudWatch Logs または AWS RoboMaker ターミナルで選択した報酬関数の有効性を確認したりできます。

    2. モデルの SageMaker トレーニングジョブを開始するには、[Train the RL model using the Python SDK Script mode] の 2 番目のコードセルを実行します。

      
                                イメージ: SM でトレーニングジョブを作成する。

      この SageMaker トレーニングジョブでは、TensorFlow フレームワークを使用して、指定された EC2 コンピュートインスタンスタイプで実行されます。出力にはジョブの名前が一覧表示されます。SageMaker でこのトレーニングのジョブのステータスを追跡できます。

      
                                イメージ: トレーニング中に記録されるメトリクスを設定する。
  3. AWS RoboMaker で環境シミュレーションジョブを作成するには、[Start the RoboMaker job (RoboMaker ジョブを開始する)] と [Create Simulation Application (シミュレーションアプリケーションを作成する)] のコードセルを実行します。

  4. AWS RoboMaker でシミュレーションを開始し、シミュレーションデータを共有するには、[Launch the Simulation job on RoboMaker (RoboMaker でシミュレーションジョブを起動する)] のコードセルを実行します。

    
                        イメージ: SageMaker ノートブックでシミュレーションジョブを起動する
  5. AWS RoboMaker でシミュレーションを表示するには、[Visualizing the simulations in RoboMaker (RoboMaker でシミュレーションを可視化する)] のコードセルを実行し、出力から [Simulation 1] リンクを選択します。

    
                        イメージ: AWS RoboMaker でシミュレーションを表示する

    または、直接 AWS RoboMaker コンソールに移動し、シミュレーションジョブを開きます。

    シミュレーションジョブが初期化されると、AWS RoboMaker コンソールで、以下の可視化ユーティリティが利用できます。

    • Gazebo: 選択したトラックで自動走行車をシミュレートするための 3D 世界のエミュレーション。

    • rqt: ROS GUI 開発のための Qt ベースのフレームワークとプラグイン。

    • ivis: 車両の正面カメラで捉えた視野を表示するための ROS ビジュアライザー。

    • ターミナル: シミュレーションジョブホスト上でコマンドラインアクセスを提供するためのターミナルアプリケーション。

    1. 3D シミュレーションで車両の学習を表示するには、[Gazebo] をダブルクリックするかタップします。

      
                                イメージ: シミュレーションジョブ Gazebo

      スタート地点から始まってオフトラックまたはフィニッシュラインに到達するまでの試行を繰り返して、模擬車両がトラックに沿って移動するのを表示します。最初は、車両は一時的に軌道に乗ることができます。時間が経つにつれて、より長い時間トラックにとどまることを学びます。

    2. [rqt] ユーティリティにアクセスするには、[rqt] をダブルクリックまたはタップしてプラグインを選択します。

      
                                イメージ: ROS Qt

      プラグインの詳細については、AWS RoboMaker プラグインを参照してください。

    3. 車両の正面の視野を表示するには、[rvis] をダブルクリックまたはタップします。ビジュアライゼーションを作成するには、[追加] を選択します。その後 [By topic (トピック別)] タブを選択し、下にスクロールして [/camera/zed/rgb/image_rec_color/Image] を選択して、[OK] を選択します。

      
                                イメージ: ROS Visualizer
    4. ターミナルを使用するには、[ターミナル] をダブルクリックまたはタップしてシミュレーションジョブホストでターミナルウィンドウを開き、適切なシェルコマンドを入力します。

      
                                イメージ: シミュレーションジョブホストターミナル

      シミュレーションジョブホストターミナルが開いた状態で、Linux シェルコマンドを呼び出して ログを表示 (more または tail) するか他のオペレーションを実行します。

      シミュレーションログの最後の 10 ステップの報酬を表示するには、ターミナルで次のシェルコマンドを入力します。

      tail /tmp/simulation-logs/stdout_and_stderr
  6. トレーニングのパフォーマンスを可視化するには、[Plot metrics for training job (トレーニングジョブのメトリクスをプロットする)] の 2 つのコードセルを実行します。すべてが正常に実行されると、[Training reward (報酬のトレーニング)] と [Episode # (エピソード番号)] のプロットが以下に類似した形で表示されます。

    
                        イメージ: トレーニングメトリクスのプロット

    この特定の例では、トレーニング報酬は横ばいになるように見えます。それが正しいかどうかを検証するには、おそらくさらに多くのデータが必要になります。トレーニングジョブが実行されている場合、[Plot metrics for training job (トレーニングジョブのメトリクスをプロット)] のコードセルを再度実行し、プロットにより多くの最新データを含めることができます。結果が変わらない場合、大きな変動の開始は報酬関数における特定の欠乏を示すことができます。したがって、報酬関数の定義を更新することができます。いずれにせよ、より多くのトレーニングでより多くのデータを集める必要があります。

    トレーニングが指定された期間を経過した後、トレーニングしたモデルアーティファクトはトレーニングジョブの S3 バケット (例: s3://<bucket>/<sagemaker-training-job-name>/output/model.tar.gz) で見つけることができます。モデルアーティファクトファイルをダウンロードし、USB ドライブにコピーして、AWS DeepRacer 車両のコンピューティングモジュールにファイルを転送します。

    • トレーニングが完了し、AWS RoboMaker および SageMaker のリソースを必要としない場合は、[Clean Up (クリーンアップ)] の下の 2 つのコードセルを実行します。

    • これまでにトレーニングされたモデルを評価するには、[Evaluation (評価)] にあるコードセルを実行します。

      正常に実行されると、タスクのシミュレーションジョブが AWS RoboMaker に作成されます。コードセルの下の出力にあるジョブ名を書き留めます。AWS RoboMaker コンソールでシミュレーションジョブを開くために必要になる場合があります。このシミュレーションジョブは、トレーニング用のシミュレーションジョブと似ています。AWS RoboMaker コンソールで進行中の評価を表示するのと同じユーティリティを提供します。具体的には、[Gazebo] で評価のトライアルを監視できます。

    • モデルの評価が終わりシミュレーションアプリケーションを終了する場合は、[Clean Up Simulation Application Resource (シミュレーションアプリケーションリソースのクリーンアップ)] のコードセルを実行します。