Amazon Web Services ブログ

AWS で大規模言語モデルにより生成された関数を使ってお客様がロボット学習を包括的に訓練する方法

このブログは、How to expansively train Robot Learning by Customers on AWS using functions generated by Large Language Models を翻訳したのものです。

ロボット工学業界では、強化学習 (RL) が、伝統的な経路計画アルゴリズムでは処理できない複雑な問題、特に複雑な操作を伴う問題に広く利用されています。RL における報酬関数は、目的を設定しエージェントの学習プロセスに指示を与える重要な要素です。効果的な報酬関数を作成することは難しいですが RL エージェントが適切に動作するためには不可欠です。

Eureka は、NVIDIA の研究者による大規模言語モデル (LLM) を使用して、報酬関数を手作業で設計するのではなく、洗練された報酬関数を生成する素晴らしいプロジェクトです。強化学習の業界では、報酬関数の作成は試行錯誤のプロセスのままです。ロボット工学者は報酬関数を自動的に生成および改良する方法を求めています。
このテーマの画期的な成果である Eureka は、難しい問題を解決するための一種の自動化を提供します。Eureka の研究論文によると、LLM によって生成された報酬関数は、全体で 50 % のパフォーマンス向上があり、タスクの 80 % 以上で人手による報酬関数設計を上回ります。

このブログ記事では、Nvidia の Eureka を Amazon Web Services (AWS) 上で実行し、Amazon Bedrock for LLMs を使用する方法を説明します。ロボット学習のプロセスをオンプレミスのトレーニングインスタンスから AWS に移行する際、エンジニアが対処する必要のある課題がいくつかあります。

  • シミュレーション/トレーニングプロセスを複数のノードに分散してスケーリングし、トレーニングプロセスを加速させ、コストを節約します。
  • クラウド上でロボットのシミュレーション/トレーニングプロセスを可視化し、エンジニアが参加できるようにすることで、タスク効率を向上させます。
  • Amazon Bedrock の LLM を使用して、報酬関数を生成します。

ソリューションの概要

このブログ記事では、ロボット業界の顧客が上記の課題を解決するために AWS が提案するソリューションの 1 つについて説明します。このソリューションでは、以下のツールを使用します。

  1. 自動運転データフレームワーク (Autonomous Driving Data Framework: ADDF) は、AWS の自動車チームが再利用可能でモジュール化された汎用コード資産を提供することを目的としたオープンソースプロジェクトです。ADDF はデータ処理、シグナル抽出、シーン検出、シミュレーション、データ可視化用のモジュールを提供しています。この記事では、このプロジェクトをロボット業界でどのように活用できるかを示します。
  2. Amazon Elastic Kubernetes Service (Amazon EKS) は、コンテナ のスケジューリング、アプリケーション可用性の管理、クラスターデータの保管を行う Kubernetes コントロールプレーンノードの可用性とスケーラビリティを AWS が管理する、マネージド型の Kubernetes サービスです。この記事では、EKS 上でロボットの学習とシミュレーションを行います。
  3. NICE DCV は、お客様にリモートデスクトップとアプリケーションストリーミングを安全に提供する高性能のリモートディスプレイプロトコルです。この記事では、EKS 上で行われるロボットシミュレーションと学習プロセスを DCV でストリーミングする方法を示します。

このソリューションは次のように設計されます:

Figure 1: High Level Design of the Solution

図 1: ソリューションの高レベル設計

この画像では、このデザインのアーキテクチャを示しています。まず、コードとトレーニングアーティファクトを Amazon S3 バケットにデプロイします。Amazon DataSync が、コードとアーティファクトを Amazon EKS クラスター内のポッドにマウントされる Amazon FSx と同期します。

Amazon EKS 側では、トレーニング/シミュレーションのためにイベント駆動型アーキテクチャを採用しています。シミュレーション/トレーニングのワークロードは、ワーカーポッドで実行されます。これらのワーカーポッドはステートレスです。タスクコントローラーポッドは、タスクに基づいてトレーニング/シミュレーションのワークロード定義を生成する責任があります。ワーカーにワークロードをスケジュールするために、Amazon Simple Queue Service (Amazon SQS) を使用しています。各タスクコントローラーは、1 つのトレーニングジョブのシミュレーションとトレーニングを制御します。

タスクコントローラーは、選択された LLM からさまざまな報酬関数をサンプリングするサービスを提供する Amazon Bedrock とも通信します。一方、ユーザーは DCV モジュールを介してシミュレーションを視覚化および操作できます。ADDF では、インフラストラクチャを簡単に設定できます。ADDF は、Amazon EKS、DCV コンポーネント、この特別なプロジェクト向けの他の AWS リソースなど、必要なモジュールをデプロイします。

ローカル開発環境での前提条件は以下の通りです:

  • Python 3.8 以上のバージョン
  • git CLI
  • AWS 認証情報
  • AWS CLI
  • aws-cdk CLI バージョン 2.20.0 以上
  • kubectl CLI バージョン 1.29 以上
  • Amazon EKS クラスターのセットアップ

この項では、インフラストラクチャのセットアップに焦点を当てます。以前別のプロジェクトで ADDF を使用したことがある場合は、該当する手順を飛ばしてください。

ステップ 1: ADDF リポジトリをローカルディレクトリに clone します。現在、複数のリリースがあります。この記事執筆時の最新バージョンは release/3.5.0 を使用することをおすすめします。

git clone --origin upstream --branch release/3.5.0 https://github.com/awslabs/autonomous-driving-data-framework.git

ステップ 2: Python の仮想環境を作成し、依存関係をインストールする

cd autonomous-driving-data-framework 
 python3 -m venv .venv && source .venv/bin/activate 
 pip3 install -r requirements.txt 

今度は、アカウントに対する有効な AWS 認証情報があることを確認してください。アカウントの bootstrapping に必要になります。以下のコマンドで <REGION><ACCOUNT_ID><ROLE_NAME>を置き換えてください:

export AWS_DEFAULT_REGION =
 cdk bootstrap aws:///

Step 3: Deploy Amazon EKS Cluster and DCV modules.このステップでは、セットアップに必要なモジュールをデプロイします。以下のものがデプロイされます:

  • Amazon FSx for Lustre: これは Amazon EKS 上の Pod にマウントされます。また、S3 バケットから Amazon FSx へのデータ同期を設定します。これとデータ同期をデプロイするには、次のモジュール定義が必要です。Amazon FSx の定義は manifests/robotic-training-on-eks/storage.yaml に定義されています。
    • eureka モジュールにも、K8S リソースとして Amazon FSx ストレージクラスがデプロイされます。依存関係のあるモジュールでは、Amazon FSx が作成されます。また、追加の Amazon FSx K8S リソースをデプロイし、Amazon FSx を Pod にマウントできるようにします。
  • Amazon ECR: これはロボット学習/シミュレーション画像を格納するために使用されます。
  • Amazon S3 バケット: このバケットはデータストアとして使用されます。学習データ、学習出力、コードをこのバケットに保存します。
  • Amazon EKS: これは、学習/シミュレーション Pod をスケジューリングするためのフレームワークとなります。この例では、少なくとも 2 つの g5.2xlarge インスタンスをデプロイします。
  • NICE DCV イメージと Kubernetes (K8S) リソース: DCV に関連する 3 つのモジュールがあります。1 つは DCV サーバーイメージを格納する ECR を作成し、もう 1 つは DCV イメージを作成し、最後のモジュールは K8S リソース (DaemonSet、ClusterRole、ClusterBinding など) を作成します。これらのモジュールはそのままの状態で構いません。設定の更新は必要ありません。dcv-eks モジュールの README を確認してください。DCV サーバー用のシークレットを設定する必要があります。

次のコマンドを実行して、ADDF モジュール全てをデプロイできます:

seedfarmer apply manifests/robotic-training-on-eks/deployment.yaml

次のような出力が正常にデプロイされた場合に表示されます:

Figure 2: ADDF Modules to be deployed

図 2: デプロイされる ADDF モジュール

ステップ 4: Kubectl とクレデンシャルをセットアップ。 ステップ 3 で Amazon EKS クラスターをデプロイしました。この ブログ記事の範囲では、kubectl コマンドを使用して Amazon EKS でアプリケーションを実行する必要があります。このリンクに従い、バージョン 2.29 の kubectl クライアントをインストールしてください。

モジュールがデプロイ済みであれば、すべてのリソースが Amazon CloudFormation のスタックとして存在します。AWS コンソールから Amazon CloudFormation サービスに移動し、addf-robotic-training-on-eks-core-eks という名前のスタックを探して選択し、出力を参照すると、次の図のように clusterConfigCommand が表示されます。

Figure 3: Amazon EKS Cloud Formation Stack OutputFigure 3: Amazon EKS Cloud Formation Stack Output

次に、clusterConfigCommand の値をターミナルにコピーして実行してください。資格情報は適切に更新されます。次のコマンドを実行して K8s クライアントを検証できます:

kubectl get svc

出力は次のようになります。

NAME          TYPE         CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE 

 kubernetes    ClusterIP    172.20.0.1            443/TCP    177m

ステップ 5: GPU オペレータをインストールする。 ステップ 3 で GPU 対応ノードを持つ Amazon EKS クラスターを設定したはずです。ADDF EKS モジュールは、GPU ドライバーが事前にインストールされたインスタンスを起動します。ただし、GPU リソースを必要とする K8s ワークフローをスケジュールするには、クラスターに GPU オペレータプラグイン をインストールする必要があります。GPU オペレータは、K8S 内のすべての NVIDIA GPU リソースを自動的に処理します。この手順で、GPU 関連のワークロードに NVIDIA GPU オペレータをインストールします。ステップ 5.1 と 5.3 はオプションです。これらの追加機能を利用したい場合は、このリンクの下にある必要なファイルがあります。

(オプション) DCGM メトリクス パブリッシャーをインストールします。これは GPU の利用状況など GPU 関連のメトリクスを公開するための、GPU オペレーターのオプションのステップです。

kubectl create namespace gpu-operator 
 curl https://raw.githubusercontent.com/NVIDIA/dcgm-exporter/main/etc/dcp-metrics-included.csv > dcgm-metrics.csv 
 kubectl create configmap metrics-config -n gpu-operator --from-file = dcgm-metrics.csv 

ステップ 5.2 (必須) GPU オペレータをインストールします。 ステップ 5.1 をスキップした場合、次のコマンドでは DCGM 関連のフラグ (次のコマンドの太字部分) を設定する必要はありません。

# run command in bash 
 bash -c "helm install --wait --generate-name \ 
    -n gpu-operator \ 
    nvidia/gpu-operator \ 
    --set driver.enabled = false \ 
    --set toolkit.version = v1.14.4-ubi8 \ 
    --set dcgmExporter.config.name = metrics-config \ 
    --set dcgmExporter.env[0].name = DCGM_EXPORTER_COLLECTORS \ 
    --set dcgmExporter.env[0].value =/etc/dcgm-exporter/dcgm-metrics.csv"
# Validate installation by checking out whether all the pods in namespace gpu-operator are Running or Completed 
 kubectl get pods -o wide -n gpu-operator 

GPU ドライバのインストールは ADDF EKS モジュールによってデプロイされた K8S ノードグループの AMI に既にインストール済みのため、GPU オペレータでは無効化されていることに注意してください。

今のところ、稼働可能な Amazon EKS クラスターが準備できています。

ロボット訓練とシミュレーション Isaac Gym デモンストレーション

シミュレーション環境のセットアップ

ADDF リポジトリのさまざまなモジュールと GPU Operator のデプロイが成功したら、シミュレーション/トレーニングのワークロードのデプロイを開始できます。

このブログ記事では、Eureka コントローラーポッドとトレーニングポッドをデプロイします。すべてのアプリケーションポッドは kubectl を使って手動でデプロイされます。各トレーニングタスクに対して、1 つのコントローラーポッドがあります。このブログの範囲では、shadow-hand タスクを実演します。異なるユースケースでテストしたい場合は、別のコントローラーポッドをデプロイできます。トレーニングポッドは K8s のデプロイメントとしてスピンアップします。トレーニングポッドの数は、各ノードで使用可能な GPU 数などのリソース制限によって制限されます。

上記のセクションに記載した方法でモジュールをデプロイすると、eureka モジュールが必要なすべての出力を保存します。具体的には、次の 3 つの項目が出力されます。

1. IamRoleArn: これはユーザーがクラウド上でシミュレーション/学習を実行するために作成された役割です。以下の権限が含まれています:

a. Amazon FSx の読み取り/書き込み

b. Amazon S3 バケットの読み取り/書き込み

c. Amazon SQS の読み書き

d. Amazon Bedrock の権限。

e. Amazon EKS クラスターのサービスアカウントがこのロールを引き受けるための信頼関係

2. ApplicationImageUri: このモジュールでは、基本ライブラリを含む ECR イメージを公開します。この実演では、このブログ記事内のすべての使用に対して 1 つの単一のイメージを再利用します。

3. SqsUrl: このモジュールは、Amazon SQS メッセージキューも作成します。コントローラーがエンキューし、ワーカーはシミュレーション/トレーニングの目的でデキューします。

ステップ 1: アーティファクトを S3 にアップロードする。このステップでは、前に作成した S3 バケットに次のファイルをアップロードします。Amazon Datasync を利用しているので、ファイルをアップロードした後、データは自動的に Amazon S3 から Amazon FSx に同期されます。Amazon FSx をポッドにマウントすれば、すべてのポッドが共通の外部ドライブを共有できます。

  • Eureka: これは元の Eureka から フォークされたライブラリ です。複数のノードにシミュレーションをデプロイしてスケーラビリティを持たせることを目的としています。
  • IssacGym: この リンク から IssacGym Preview 4 にアクセスしてください。IssacGym をダウンロードするリンクが表示されます。次のコマンドで <LINK_TO_DOWNLOAD_ISSACGYM> をダウンロード用の正しいリンクに置き換えてください。
  • Fbx Fix Patch: これは FBX モジュールのエラーを修正するホットパッチです。Adobe は公式に Fbx Python をサポートしていないため、Fbx を実行するにはこのパッチを当てる必要があります。
  • BUCKET は ADDF モジュールで作成したデータバケットです。
mkdir robotic_data && cd robotic_data 

# Get Eureka for distributed simulation 
 git clone https://github.com/sauronalexander/Eureka.git 

# Get IssacGym 
 wget 
 tar -xvf IssacGym_Preview_4_Package.tar.gz 
 rm IssacGym_Preview_4_Package.tar.gz 

# Get Fbx fix patch 
 git clone https://github.com/Shiiho11/FBX-Python-SDK-for-Python3.x.git 
 mv FBX-Python-SDK-for-Python3.x/2020.0.1_3.8.3_x64/FbxCommon.py ./
 mv FBX-Python-SDK-for-Python3.x/2020.0.1_3.8.3_x64 ./fbx 
 rm -rf FBX-Python-SDK-for-Python3.x 

# Upload files to s3 
 aws s3 sync ./* s3:// --recursive 

これからは、ローカルの Python スクリプトを編集し、コードを S3 と同期できます。コード成果物はすぐにすべての Pod から参照可能になります。もう 1 つの手法は、コードをイメージにビルドインすることです。この記事の単純化のため、コード変更の度にイメージのリビルドは行いません。

ステップ 2: Python Anaconda 環境をセットアップします。 このステップでは、必要な Python ライブラリをインストールします。IssacGym などの依存関係パッケージのインストールには、Nvidia ドライバが準備されている必要があります。このステップでは、環境をセットアップするために、各ノードに 1 つの Pod をデプロイします。各 Pod では、ホストノード内のディレクトリを使用するローカルマウントを確立します。この Pod は、Nvidia GPU ドライバをチェックアウトし、Anaconda 環境を共有ディレクトリにあらかじめインストールします。このセットアップが完了すると、ワーカー Pod とコントローラー Pod は、シミュレーション/トレーニングのワークロードを実行するために、この Anaconda 環境を再利用します。これにより、環境のセットアップ時間が大幅に節約されます。

anaconda_setup.yaml 内の画像 URI とロール ARN を、前のステップで作成した適切な画像 URI と IAM ロール (以下の太字の部分を参照) に置き換えてください。

apiVersion: v1 
 kind: ServiceAccount 
 metadata:
  name: aws-s3-access 
  annotations:
    eks.amazonaws.com/role-arn: 
 automountServiceAccountToken: true 
---
 apiVersion: apps/v1 
 kind: DaemonSet 
 metadata:
  name: anaconda-daemonset 
  labels:
    app: anaconda-setup 
 spec:
  selector:
    matchLabels:
      app: anaconda-setup 
  template:
    metadata:
      labels:
        app: anaconda-setup 
    spec:
      terminationGracePeriodSeconds: 30 # Set the termination grace period 
      serviceAccountName: aws-s3-access 
      automountServiceAccountToken: true 
      containers:
      - name: anaconda-setup-container 
        image: 
        resources:
          limits:
            nvidia.com/gpu: 1 # requesting 3 GPU, 1 shared gpu is 3GB in g5 
…

# Wait for around 10 minutes until the setup is complete. You can verify the setup to be completed by check if the conda setup pods are ready 
 watch -n 5 kubectl get pods 

# When it is ready, you can delete the pods 
 kubectl delete -f anaconda_setup.yaml 

ステップ 3: LLM アクセスを設定するこの プロジェクトでは、LLM を使って報酬関数を生成できることを示します。私たちの実装では、Anthropic の Claude 3 (Amazon Bedrock 上) と OpenAI の ChatGPT の 2 つの LLM ファミリをサポートします。

ステップ 3.1: Claude 3 へのアクセスを設定する

  1. AWS コンソール (リージョン us-east-1 または us-west-2) で Amazon Bedrock に移動してください。Amazon Bedrock LLM には一部の特定のリージョンでのみアクセスできます。
  2. 左側のパネルで「Model Access」を選択します。
  3. 使用するモデルをチェックしてください。Claude 3 モデル (Claude 3 Haiku、Claude 3 Sonnet、Claude 3 Opus、および Claude 3.5 Sonnet) のみがサポートされています。
  4. 「Save」をクリックすると、Python で Claude 3 モデルを操作できるようになります。

ステップ 3.2: ChatGPT アクセスの設定

  1. OpenAPI API キーを取得する
  2. この API キーを管理し、コントローラーポッドを Amazon EKS クラスターにデプロイする際、環境変数として使用できます。

デモンストレーション – シミュレーション/トレーニングの実行
次に、eureka.yaml に記載されている Eureka アプリケーションをデプロイできます。
必要に応じて、以下を置き換えてください。

  • イメージ URI: 前のセクションで展開したモジュールでは、Amazon ECR の 1 つに Ubuntu イメージを公開します。イメージ URI は eureka モジュールの出力名 <ApplicationImageUri> になります。
  • EUREKA_TRAINING_QUEUE_URL: ADDF モジュールで作成した <SqsUrl>に置き換えてください。
  • OPENAI_API_KEY: ステップ 3.2 で取得したキーに置き換えてください。Claude 3 を使用する場合はこのステップを省略できます。
  • AWS_REGION: デプロイする予定のリージョン<REGION>に置き換えてください。
  • EUREKA_ENV: 学習に使用するタスク名です。
  • EUREKA_SAMPLE: LLM から生成される報酬関数のサンプル数です。各反復で並列に評価されます。
  • EUREKA_MAX_ITERATIONS: LLM から生成された報酬が評価される最大反復回数です。
  • EUREKA_NUM_VAL: 最終評価ラウンド数 (20000 回の反復) で、並列に実行できる数です。

上記の設定を変更した後は、次のコマンドを使用してポッドをデプロイできます。この例では、shadow-handタスクを実行します。コントローラーのポッドは shadow-hand という名前です。

kubectl apply -f eureka.yaml 

# You can check the progress using 
 kubectl logs shadow-hand --follow 

ノート: タスクごとに 1 つの controller pod をデプロイできます (これは EUREKA_ENV で定義されます)。一方で、controller では複数のタスクを並列でデプロイできます。

ロボットシミュレーション/トレーニングの視覚化を DCV で行うデモンストレーション

Figure 3: Application Streaming Architecture in EKSFigure 3: Application Streaming Architecture in EKS

このセクションでは、DCV サーバーを使用してシミュレーションとトレーニングをストリーミングする方法を説明します。DCV をストリーミングするための全体的なアーキテクチャは以下のようになります。

DCV コンポーネントは、Amazon EKS クラスターへの DaemonSet としてデプロイされます。つまり、ノードごとに 1 つの DCV Pod が存在します。アプリケーション Pod、あるいは私たちのユースケースではワーカー Pod は全て、DCV Pod との間でディレクトリを共有します。DCV Pod はそのディレクトリに X11 ディスプレイソケットを作成し、ワーカー Pod はそのソケットを通じて DCV Pod 内の DCV サーバにアプリケーションをレンダリングできます。ワーカー Pod 内で実行される IssacGym は X11 ソケット上にレンダリングされます。次に、DCV サーバはユーザ接続を受け入れ、リモートデスクトップ上に IssacGym を表示します。パブリックの Amazon サブネットでは、NodePort サービスを使用できます。このブログ記事の範囲では、プライベートサブネットを使用します。次の接続方法は、プライベートサブネットとパブリックサブネットの両方で使用できます。

K8S ポートフォワーディングを使用して接続します。次のコマンドを使用できます:

# First, determine which worker pod you want to connect to by running:
 kubectl get pods 

# Next, run the following command to forward the traffic 
 kubectl port-forward $(kubectl get pods -n dcv --field-selector spec.nodeName =$(kubectl get pod  -o = jsonpath ='{.spec.nodeName }') -o jsonpath ='{ range .items[ * ] }{.metadata.name }{"\n"}{ end }') -n dcv 9999:8443 

上記のコマンドは、指定されたワーカー Pod が実行されているノードを見つけます。次に、そのノードで実行されている DCV Pod の名前を見つけます。そして、DCV サーバーがリッスンしているポート 8443 を、ローカルホストのポート 9999 にフォワードします。

ブラウザから https://localhost:9999 にアクセスできます。DCV サーバーからユーザー名とクレデンシャルの入力を求めるプロンプトが表示されます。

Figure 4: DCV Login Page in Web BrowserFigure 4: DCV Login Page in Web Browser

DCV モジュールのセットアップで設定したユーザー名/パスワードを入力してください。次に、DCV サーバーに接続できるはずです。シミュレーションが画面に表示されるはずです。

Figure 5: Training shadow-hand in multiple podsFigure 5: Training shadow-hand in multiple pods

クリーンアップ

アプリケーションの Pod を削除するには、次のコマンドを実行できます:
kubectl delete -f eureka.yaml

このデプロイデモのモジュールを破棄するには、次のコマンドを実行できます。

seedfarmer destroy manifests/robotic-training-on-eks/deployment.yaml

まとめ

このブログ投稿では、Amazon EKS、Amazon FSx for Lustre、Amazon ECR、そして NICE DCV などの Amazon サービスを使用して、Nvidia の Eureka と Isaac Gym を使ってスケーラブルなロボット研修パイプラインを構築する方法を説明しました。また、ADDF を使ってインフラストラクチャを構成し、GPU オペレーターをインストール、IAM ロールを作成、コントローラーとワーカーの Pod をデプロイする方法も示しました。
さらに、AWS Bedrock の Claude 3 のような LLM を強化学習タスクの報酬関数生成に統合する方法も示しました。最後に、NICE DCV リモートデスクトップを使ってロボットのシミュレーションを視覚化するストリーミングする方法をご紹介しました。このソリューションは、ロボット開発チームが AWS 上で最新の AI モデルを使った報酬モデリングを活用し、より効果的に協業しながら研修を加速できるように設計されています。
オープンソースの ADDF プロジェクトは、このようなロボットの学習パイプラインをすばやくプロトタイピングできるようインフラストラクチャをコードとして再利用できるよう設計されています。

今後の課題として、このフレームワークで学習したポリシーを実際のロボットに移行することを検討しています。このフレームワークを活用すれば、実世界で高度な操作作業を行うためにロボットを訓練することも可能だと考えています。

AWS の自動車向け製品サービスについて詳しくは AWS for automotive ページをご覧ください。または、お問い合わせください。

参照

AWS の自動運転データフレームワーク (ADDF) を使用してカスタマイズされたワークフローを開発・デプロイ

このブログはシニアソリューションアーキテクトの渡邊翼が翻訳を担当しました。