[Isaac Lab] AWS EC2 g5.xlarge + Amazon DCV で Isaac Sim を GUI 起動し、SO-ARM101 を手動で動かしてみました

[Isaac Lab] AWS EC2 g5.xlarge + Amazon DCV で Isaac Sim を GUI 起動し、SO-ARM101 を手動で動かしてみました

# Isaac Sim を AWS EC2 の g5.xlarge で安く運用する構成を試してみました NVIDIA Isaac Sim / Isaac Lab をクラウドで学習するコストを抑えるため、公式サポート外の g5.xlarge インスタンスを活用し、t3.medium との切り替え運用で月額費用を大幅削減した環境構築方法を紹介します。
2026.05.24

1 はじめに

製造ビジネステクノロジー部の平内(SIN)です。

ロボット制御や強化学習の勉強のためのシミュレータ環境として NVIDIA Isaac Sim / Isaac Lab がありますが、これを快適に動かすには RT Core を搭載した GPU が必要です。

そして、AWS EC2 にクラウド GPU 環境を立てるアプローチが、ここ Developers IO で、既に紹介されています。

https://dev.classmethod.jp/articles/ec2-isaac-sim-session-manager/

NVIDIA / AWS 公式サポートの構成(Marketplace AMI「NVIDIA Isaac Sim Development Workstation」+ g6e インスタンス + SSM ポートフォワーディング)で、SSH キー不要・インバウンドポート全閉という美しい構成でブラウザから Amazon DCV に接続するアプローチが示されています。

「Isaac Sim をすぐ触ってみたい」「公式サポート構成で安定運用したい」というのであれば、この記事が最短ルートで素直で優れた選択になると思います。

私もこの記事に倣って、作業を進めていたのですが、「Isaac Sim を一度体験してみる」ではなく「継続的に Isaac Sim / Isaac Lab を学習したい」となると、AWS 利用費がどうしても気になってきます。

そこで、本記事では、基本的に先の記事をなぞりながら、少し工夫してみた点について紹介させてください。

2 本記事で工夫した点

本記事の工夫点は、以下です。

  1. g5.xlarge 利用 — 公式サポート外ですが、driver / kit / docker run の組み合わせを詰めて動作確認できました
  2. t3 ↔ g5 切替運用 — 普段は t3.medium 、GPU 必要時のみ g5.xlarge に切り替える運用形態にしました
  3. EBS 35 GiB 最小スタート — 停止時の EBS 利用費を抑えるため、最小限のサイズにしました(オンライン拡張可能)
  4. NGC コンテナベース(AMI 非依存) — 派生イメージで xdg-utils 同梱や Isaac Lab pre-install などを後から積むことも視野に入れました
  5. CDK で IaC 化teardown.sh で完全削除、ISAAC_VERSION 変数で NGCのバージョンを指定することで、Isaac Sim のバージョン追従可能になっています
  6. シェルスクリプト — 再現性を確保し、改善を積み重ねられるように、操作シェルをいくつか準備しました

Marketplace AMI(g6e / g7e のみ対応)は、使用せず、NGC コンテナをUbuntuに立てる構成となっています。

工夫の結果、利用費は、概ね以下となりました。

状態 インスタンス 利用費(時) 利用費(日)
起動中 (GPUあり) g5.xlarge 約 232 円 約 5,568 円
起動中 (GPUなし) t3.medium 約 9 円 約 216 円
停止中(EBS 35 GiB のみ) 約 17 円
完全削除 (teardown.sh) 0 円

単価は 2026/05/15 時点のものです。
Amazon EC2 オンデマンド料金

なお、g5.xlarge を 1 ヶ月起動しっぱなしにすると約 17 万円となってしまいます。使用していない時の停止忘れには、十分に注意が必要です。

個人的には、下記のしくみで止め忘れをサポートする環境を構築しています。

[Amazon EC2] LINE で「まだ使ってる?」と聞いてくる EC2 停止忘れ防止の仕組みを作ってみました

3 前提環境

項目
クライアント Mac(Apple Silicon)
AWS リージョン ap-northeast-1
インスタンス(普段の作業) t3.medium(2 vCPU / 4 GiB)
インスタンス(GUI 起動時) g5.xlarge(NVIDIA A10G 24GB)
OS Ubuntu 22.04 LTS
EBS gp3 35 GiB(オンライン拡張可)
GUI 方式 Amazon DCV(ブラウザ)
接続方式 SSM Session Manager + ポートフォワーディング
構築方法 AWS CDK (TypeScript) + AWS CLI + shell scripts
ベース NVIDIA NGC isaac-sim:5.1.0 + MuammerBay/isaac_so_arm101

4 環境構築

最初に t3.medium で安く環境を整え、必要なときだけ g5.xlarge に切り替える運用です。

(1) AWS 側の事前確認

最初に、対象アカウント・リージョンで g5.xlarge が起動可能かを確認します。

G/VT vCPU クォータ確認

g5.xlargeRunning On-Demand G and VT instances という vCPU ベースのクォータに紐付きます。g5.xlarge = 4 vCPU 必要。

$ aws service-quotas get-service-quota \
  --service-code ec2 \
  --quota-code L-DB2E81BA \
  --region ap-northeast-1 \
  --query 'Quota.{Quota:QuotaName, Value:Value}' \
  --output table

---------------------------------------------------
|                 GetServiceQuota                 |
+----------------------------------------+--------+
|                  Quota                 | Value  |
+----------------------------------------+--------+
|  Running On-Demand G and VT instances  |  768.0 |
+----------------------------------------+--------+

Value4 以上なら OK。私のアカウントでは 768 vCPU だったのでそのまま進めました。不足なら Service Quotas コンソールから引き上げ申請します。

提供 AZ 確認

GPU インスタンスは AZ 限定で提供されます。ap-northeast-1g5.xlarge の提供 AZ を確認します。

$ aws ec2 describe-instance-type-offerings \
  --location-type availability-zone \
  --filters Name=instance-type,Values=g5.xlarge \
  --region ap-northeast-1 \
  --query 'InstanceTypeOfferings[].Location' \
  --output table
-------------------------------
|DescribeInstanceTypeOfferings|
+-----------------------------+
|  ap-northeast-1a            |
|  ap-northeast-1c            |
+-----------------------------+

確認時点では ap-northeast-1aap-northeast-1c で提供されていました。CDK の VPC は ap-northeast-1a 固定となっています。

NGC API Key 準備

Isaac Sim の Docker イメージを nvcr.io から pull するため、NVIDIA NGC の API Key が必要です。

  1. NGC にアクセスしてアカウント作成(無料、既存の NVIDIA Developer アカウントでも可)
  2. 右上のアバター → Account SettingsKeys & SecretsAPI KeysGenerate API Key
  3. Services で NGC Catalog にチェックを入れて生成
  4. 表示された Key を一度だけ控える(再表示不可)

001

AWS Session Manager Plugin のインストール

先の記事で紹介されていたとおり、AWS Systems Manager Session Manager 経由で接続するため、ローカル PC に AWS CLI v2 に加えて Session Manager Plugin が必要です。インストール方法は OS ごとに異なるので、公式ドキュメントを参照してください。

Session Manager プラグインをインストールする

# Homebrew で入れる場合
$ brew install --cask session-manager-plugin

# 動作確認
$ session-manager-plugin --version
1.2.814.0 # 2026.05 時点

(2) リポジトリ取得 + CDK デプロイ

$ git clone https://github.com/furuya02/aws-ec2-isaaclab-soarm101-gui.git
$ cd aws-ec2-isaaclab-soarm101-gui
$ cd cdk
$ pnpm install
$ pnpm exec cdk bootstrap # 初回のみ
$ pnpm exec cdk deploy

GitHub: cdk/lib/aws-ec2-isaaclab-soarm101-gui-stack.ts

CDK スタックには以下が含まれます。

  • VPC(ap-northeast-1a 単一 AZ、Public Subnet、NAT なし)
  • Security Group(インバウンド全閉、アウトバウンドのみ)
  • IAM Role(AmazonSSMManagedInstanceCore + S3 Read for DCV License / NVIDIA driver)
  • EC2 Instance(初期 t3.medium / EBS gp3 35 GiB

Outputs には以下が表示されます。いずれも Public IP に依存しないため、stop/start のたびに値が変わることはありません。

  • InstanceId — stop/start で不変
  • SsmStartCommand — SSM Session Manager の対話シェル起動コマンド
  • DcvPortForwardCommandlocalhost:8443EC2:8443 のポートフォワーディングコマンド

002

この時点では、t3.mediumのインスタンスが上がります。

003

(3) 接続確認(SSM Session Manager)

GitHub: scripts/connect.sh

$ ./scripts/connect.sh

scripts/connect.sh は Name タグで running なインスタンスの InstanceId を引いて、SSM Session Manager の対話シェルを開くヘルパーです。

SSM Session Manager では、デフォルトで、ssm-user というユーザーで /home/ssm-user にログインします。

本記事は ubuntu ユーザーのホーム に作業ファイルを置く前提で、connect.sh の中で sudo su - ubuntu を実行する形にしてあります(--document-name AWS-StartInteractiveCommand --parameters command="sudo su - ubuntu")。

$ ./connect.sh
Opening SSM session to i-09767e6e4d0500cbf (as ubuntu)...

Starting session with SessionId: AssumeRole-Session-4qln4eakc9cgj7nx64y565dd4e
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

$ uname -a
Linux ip-10-0-0-4 6.8.0-1053-aws #56~22.04.1-Ubuntu SMP Tue Apr 21 06:13:23 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
$ whoami
ubuntu
$ pwd
/home/ubuntu
$ nvidia-smi
Command 'nvidia-smi' not found, but can be installed with:

この時点では、GPUが利用できる環境ではないため、nvidia-smiは利用できません。

(4) EC2 上にリポジトリを配置

setup-docker.sh などのセットアップスクリプトは EC2 上で実行するため、EC2 にも同じリポジトリを clone し、~/scripts から参照できるようにします。

$ cd ~
$ git clone https://github.com/furuya02/aws-ec2-isaaclab-soarm101-gui.git
$ ln -s ~/aws-ec2-isaaclab-soarm101-gui/scripts ~/scripts
$ ls ~/scripts/
connect.sh           launch-isaac.sh  setup-docker.sh  switch-to-g5.sh  teardown.sh
dcv-port-forward.sh  setup-dcv.sh     setup-isaac.sh   switch-to-t3.sh

以降の ~/scripts/... はこのシンボリックリンク経由で実行します。

(5) Docker + NVIDIA Container Toolkit インストール

t3.medium 上で Docker CE と NVIDIA Container Toolkit を入れます。GPU 不要な作業なので、g5 に切り替える前に t3 で済ませることでコストを抑えます。

GitHub: scripts/setup-docker.sh

$ ~/scripts/setup-docker.sh

setup-docker.shでは、以下を実行しています。

1. Docker CE のインストール

  • Docker 公式の GPG キーと apt リポジトリ(download.docker.com)を追加
  • docker-ce / docker-ce-cli / containerd.io / docker-buildx-plugin / docker-compose-plugin を一括インストール
  • ubuntu ユーザーを docker グループに追加(以降は sudo なしで docker コマンドを叩ける)

2. NVIDIA Container Toolkit のインストール

  • NVIDIA 公式の GPG キーと apt リポジトリ(nvidia.github.io/libnvidia-container)を追加
  • nvidia-container-toolkit パッケージを導入
  • sudo nvidia-ctk runtime configure --runtime=docker で Docker daemon に nvidia ランタイムを登録(/etc/docker/daemon.json を書き換え)
  • sudo systemctl restart docker で反映

Toolkitは t3.medium に GPU が無くても apt 経由のインストールは普通に進みます。

setup-docker.sh (抜粋)

#!/bin/bash
set -euo pipefail

# --- Docker CE ---

# 1. Docker 公式 GPG キーと apt リポジトリを追加
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) \
       signed-by=/etc/apt/keyrings/docker.gpg] \
       https://download.docker.com/linux/ubuntu \
       $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 2. Docker 関連パッケージを一括インストール
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
                       docker-buildx-plugin docker-compose-plugin

# 3. ubuntu ユーザーを docker グループに追加(sudo なしで docker 実行可)
sudo usermod -aG docker ubuntu

# --- NVIDIA Container Toolkit ---

# 4. NVIDIA 公式 GPG キーと apt リポジトリを追加
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 5. nvidia-container-toolkit を入れて Docker daemon に nvidia runtime を登録
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker   # /etc/docker/daemon.json を書き換え
sudo systemctl restart docker
NFO[0000] Config file does not exist; using empty config
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted.

==> Docker + NVIDIA Container Toolkit installed.
==> Log out and back in (or run 'newgrp docker') so the docker group takes effect.
$

完了後、docker グループの反映のため一度 exit で SSM セッションを抜けて再接続(./scripts/connect.sh)すれば、sudo なしで docker ps できます。また、nvidia-container-toolkitのインストールが完了していることも確認できます。

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ nvidia-ctk --version
NVIDIA Container Toolkit CLI version 1.19.0
commit: ec7b4e2fa2caecad6d89be4a26029b831fe7503a

5 Amazon DCV セットアップ

(1) g5.xlarge への切替

ここからは、GPUインスタンスによる課金に注意が必要です。(g5.xlarge は約 232 円/h かかります)

GitHub: scripts/switch-to-g5.sh

ローカルPCで、switch-to-g5.shを実行します。

$ ./scripts/switch-to-g5.sh

スクリプトは「stop → modify-instance-attribute → start → wait」を一括実行します。EBS は共有で引き継がれるため、ここまでの作業は引き継がれます。

注意:g5 系はキャパシティ不足で起動失敗(InsufficientInstanceCapacity)することがあります。その場合は時間を置いて再試行するか、g6.xlarge 等の別タイプにフォールバックします。

005

(2) NVIDIA Datacenter Driver + Amazon DCV インストール

g5 に再接続(./scripts/connect.sh)してからsetup-dcv.shを実行します。

GitHub: scripts/setup-dcv.sh

 ~/scripts/setup-dcv.sh

スクリプトは、以下を実行します。

  1. ubuntu-desktop-minimal インストール
  2. Wayland 無効化(DCV は Xorg ベース)
  3. gcc-12 を導入して default に切替(kernel 6.8 の DKMS ビルドに必須)
  4. CUDA Datacenter driver 570(nvidia-driver-570)を apt で導入
  5. xorg.conf を手書きで作成(AllowEmptyInitialConfiguration "True" 含む)
  6. Amazon DCV Server 2025.0 をインストール
  7. dcv.conf で自動 console session を有効化
  8. dcvserver を enable + start
  9. ubuntu ユーザーのパスワードを設定(DCV ログイン用)

setup-dcv.sh (抜粋)

# kernel 6.8 の DKMS ビルドには gcc-12 が必須(gcc-11 では失敗)。--set で明示切替する
sudo apt-get install -y build-essential gcc-12 "linux-headers-$(uname -r)"
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
sudo update-alternatives --set gcc /usr/bin/gcc-12

# GRID ではなく CUDA Datacenter driver 570 を apt で導入(GRID は Isaac Sim でクラッシュ → 後述「10-(1)」)
wget -q https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update && sudo apt-get install -y nvidia-driver-570

# DCV の自動 console session を ubuntu 所有で作成
sudo tee /etc/dcv/dcv.conf > /dev/null <<'EOF'
[session-management]
create-session = true
[session-management/automatic-console-session]
owner = "ubuntu"
[display]
target-fps = 30
EOF

sudo systemctl enable --now dcvserver
sudo passwd ubuntu   # DCV ブラウザログインで使うパスワードを設定

sudo passwd ubuntu で設定するパスワードが、後でブラウザから DCV ログインする際に使われます。

==> Set the ubuntu user password for DCV login:
New password:
Retype new password:
passwd: password updated successfully

============================================================
 DCV setup complete.
 Reboot is required to load NVIDIA driver 570:
   sudo reboot

 After reboot, open in your browser:
   https://<PublicIp>:8443
   Username: ubuntu
   Password: (the one you just set)
============================================================

完了後、ドライバ反映のため reboot します:

 sudo reboot

1〜2 分待ってから ./scripts/connect.sh で再接続し、nvidia-smi で A10G + driver 570 + Xorg + DCV agent が GPU を使っていることを確認します。

006

(3) ブラウザから DCV 接続(SSM ポートフォワーディング)

DCV のポート 8443 は Security Group で閉じてあるため、SSM Session Manager の AWS-StartPortForwardingSession で localhost:8443EC2:8443 のトンネルを張ってからブラウザ接続します。

GitHub: scripts/dcv-port-forward.sh

ローカル PC で、別ターミナルから、トンネルを張ります。(Ctrl+C で切断)

$ ./scripts/dcv-port-forward.sh
==> Forwarding localhost:8443 -> i-09767e6e4d0500cbf:8443
    Open in a browser:  https://localhost:8443
    (Ctrl+C to stop)

Starting session with SessionId: AssumeRole-Session-3yfdooddj9baagflchg6cxhdje
Port 8443 opened for sessionId AssumeRole-Session-3yfdooddj9baagflchg6cxhdje.
Waiting for connections...

続いてブラウザで、https://localhost:8443を開きます。

自己署名証明書のため警告が出ます。Chrome なら「詳細設定」→「localhost にアクセスする(安全ではありません)」で進みます。

  • Username: ubuntu
  • Password: 先ほど sudo passwd ubuntu で設定したもの

007

Ubuntu の GNOME デスクトップがブラウザに表示されれば成功です。

008
009

6 Isaac Sim GUI で SO-ARM101 を触ってみる

(1) NGC ログイン + Isaac Sim コンテナ取得

GitHub: scripts/setup-isaac.sh

SSM セッション内(./scripts/connect.sh で接続中)の EC2 上で:

~/scripts/setup-isaac.sh

スクリプトは以下を行います。

  1. NGC API Key を対話入力
  2. docker login nvcr.io --username '$oauthtoken' --password-stdin
  3. docker pull nvcr.io/nvidia/isaac-sim:5.1.0
  4. ~/work 配下のパーミッション緩和(sudo chmod -R a+rwX ~/work/
  5. git clone https://github.com/MuammerBay/isaac_so_arm101.git
  6. Isaac Sim 起動用の docker run コマンドを画面に表示

setup-isaac.sh (抜粋)

#!/bin/bash
set -euo pipefail
ISAAC_VERSION="${ISAAC_VERSION:-5.1.0}"                  # この変数で Isaac Sim のバージョンを切替可能
NGC_IMAGE="nvcr.io/nvidia/isaac-sim:${ISAAC_VERSION}"

# 1. NGC API Key を対話入力(履歴・ファイルには残さない)
echo "Enter your NGC API Key (input is hidden):"
read -rs NGC_API_KEY

# 2. NGC レジストリにログイン(Username は文字通り '$oauthtoken' 固定)
echo "${NGC_API_KEY}" | docker login nvcr.io \
  --username '$oauthtoken' --password-stdin
unset NGC_API_KEY

# 3. Isaac Sim コンテナを pull(~30 GB、初回は 5〜20 分)
docker pull "${NGC_IMAGE}"

# 4. SO-ARM101 の URDF をリポジトリから取得(uv sync は不要、URDF を借りるだけ)
mkdir -p ~/work && cd ~/work
[[ -d isaac_so_arm101 ]] || git clone https://github.com/MuammerBay/isaac_so_arm101.git

# 5. URDF Importer が同階層に USD ファイルを書き出すため、~/work の書込権限を緩める
#    (コンテナ内 root → ホスト ubuntu uid 1000 の書込問題を回避)
sudo chmod -R a+rwX "${HOME}/work"

# 6. Isaac Sim 用 cache ディレクトリを事前作成(GPU タイプ切替時はクリア推奨)
mkdir -p ~/docker/isaac-sim/{kit-cache,ov-cache,gl-cache,compute-cache,logs}

(2) Isaac Sim を Native GUI モードで起動

GitHub: scripts/launch-isaac.sh

DCV のデスクトップ画面に戻り、そのデスクトップ内のターミナルから、起動スクリプトを実行します。

$ ~/scripts/launch-isaac.sh

015

launch-isaac.sh は内部で以下を実行します:

  • DISPLAY 必須チェック(無ければエラーで停止)
  • cache ディレクトリを ~/docker/isaac-sim/{kit,ov,gl,compute}-cache + logs で事前作成
  • xhost +local:docker で X server へのアクセス許可
  • 既存 isaac-sim コンテナの残骸を docker rm -f
  • docker run --runtime=nvidia --gpus all --ipc=host --network=host ... --entrypoint /isaac-sim/kit/kit nvcr.io/nvidia/isaac-sim:5.1.0 /isaac-sim/apps/isaacsim.exp.full.kit --/app/extensions/registryEnabled=falseexec で起動

launch-isaac.sh (抜粋)

#!/bin/bash
set -euo pipefail

NGC_IMAGE="${NGC_IMAGE:-nvcr.io/nvidia/isaac-sim:5.1.0}"
EXPERIENCE="${EXPERIENCE:-/isaac-sim/apps/isaacsim.exp.full.kit}"

# 1. DISPLAY 必須チェック(SSM / SSH ターミナル等での誤実行を早期失敗させる)
if [[ -z "${DISPLAY:-}" ]]; then
  echo "Error: DISPLAY is not set. Run inside the DCV desktop terminal." >&2
  exit 1
fi

# 2. --clear-cache: GPU タイプ切替直後など、shader cache の不整合を解消したい時
if [[ "${1:-}" == "--clear-cache" ]]; then
  rm -rf ~/docker/isaac-sim/{kit-cache,ov-cache,gl-cache,compute-cache,logs}
fi

# 3. cache ディレクトリ確保 + X server アクセス許可 + 残骸コンテナ掃除
mkdir -p ~/docker/isaac-sim/{kit-cache,ov-cache,gl-cache,compute-cache,logs}
xhost +local:docker > /dev/null
docker rm -f isaac-sim 2>/dev/null || true

# 4. Native GUI を kit + experience を直接指定して起動
#    (./isaac-sim.sh は default で Streaming experience になるため使わない)
#    --/app/extensions/registryEnabled=false: online extension registry
#    (omni.kit.registry.nucleus)の同期を無効化。付けないと起動が数分 hang する
#    ことがある。URDF はローカルから読み込むので online registry は不要。
exec docker run --name isaac-sim --rm \
  --runtime=nvidia --gpus all \
  --ipc=host --network=host \
  -e DISPLAY="${DISPLAY}" -e ACCEPT_EULA=Y -e PRIVACY_CONSENT=Y \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v "${HOME}/work:/work" \
  -v "${HOME}/docker/isaac-sim/kit-cache:/isaac-sim/kit/cache:rw" \
  -v "${HOME}/docker/isaac-sim/ov-cache:/root/.cache/ov:rw" \
  -v "${HOME}/docker/isaac-sim/gl-cache:/root/.cache/nvidia/GLCache:rw" \
  -v "${HOME}/docker/isaac-sim/compute-cache:/root/.nv/ComputeCache:rw" \
  -v "${HOME}/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw" \
  --entrypoint /isaac-sim/kit/kit \
  "${NGC_IMAGE}" \
  "${EXPERIENCE}" \
  --/app/extensions/registryEnabled=false

数分待つと、DCV デスクトップに 「Isaac Sim Full 5.1.0」 のウィンドウが開きます。途中で「is not responding」ダイアログが出たら Wait を押して待ち続けます。

010

(3) URDF Import

メニュー File → Import を選び、ファイル選択ダイアログで URDF を選びます。

/work/isaac_so_arm101/src/isaac_so_arm101/robots/trs_so101/urdf/so_arm101.urdf

016

Import ボタンを押すと、3D Viewport に SO-ARM101 のロボットアームが表示されます。

初回は表示までにロボットのマテリアルのシェーダーコンパイルで数分かかります。2 回目以降はキャッシュが効いて速くなります。

012

(4) Physics Inspector で 6 関節を動かす

メニュー Tools → Physics → Physics Inspector を開きます。Stage パネルで so101_new_calib を選択した状態で、Physics Inspector 上部の 円形矢印アイコンをクリックします。

017

その後表示される Re-Enable authoring ボタンを押すと、Articulation がパースされ、6 関節のスライダーが表示されます。

各行の中央にある青いバー(Drive Target Position)をドラッグすると、3D Viewport で SO-ARM101 のリンクがリアルタイムに動きます。

018

(5) 2 回目以降の起動を速くする:シーンを USD として保存

URDF Import は そのたびに USD を生成し直すため、ロボットのマテリアルのシェーダーコンパイルが毎回走ります。これを避けるには、最初の 1 回だけ URDF Import し、結果を USD として保存して、次回からはそれを開きます。

  1. URDF Import してアームが表示された状態で、File → Save As で保存(例: /work/so_arm101_scene.usd
  2. 次回からは File → Import ではなく File → Open でその USD を開く

019

こうすると、シェーダーキャッシュ(~/docker/isaac-sim/{kit,ov,gl,compute}-cache にホスト保存)が効いて、2 回目以降はコンパイル待ちがほぼ無く開けるようになります。

シェーダーキャッシュは EBS に永続化されているので、Docker やインスタンスを再起動しても残ります。

7 g5.xlarge で対応できるか(実測)

「公式サポート外の g5.xlarge で本当に足りるのか」を、nvtopsudo apt install -y nvtop)で実測しました。

013

  • GPU-Util は定常 28% 前後(カメラ回転や関節操作の瞬間だけ一時的に 70〜75% 程度までスパイク)→ A10G は余裕
  • kit(Isaac Sim 本体)が CPU 約 245%(≒ 2.4 コア)を常時消費 → 4 vCPU の g5.xlarge では まだ大丈夫
  • dcvagent(DCV)は CPU 17% 程度(GPU エンコードを使うため軽い)

操作時の FPS は 100 前後出ており、SO-ARM101 を Physics Inspector で動かす程度なら g5.xlarge で問題なしと言えそうです。

020

今後、CPU が不足したら g5.2xlarge へ、GPU が不足したら g6e へ移行を検討することにします。

8 停止・t3.medium への移行

GUI 操作が必要ない(データのコピーなど)場合、 t3.medium へ戻すことでコスト削減となります。

GitHub: scripts/switch-to-t3.sh

./scripts/switch-to-t3.sh

なお、作業がない場合は、インスタンスは確実に停止してください。

9 完全削除

下記のコマンドで完全削除できます。

GitHub: scripts/teardown.sh

./scripts/teardown.sh

スクリプトは内部で pnpm exec cdk destroy --force を実行し、その後 EC2 / EBS の残留をチェックします。CDK 管理下のため、Stack 削除で EC2 / EBS / SG / IAM Role / VPC まで一括削除されます。

10 気になった点

(1) GRID driver では Isaac Sim 5.1.0 が動かない

私の環境だけかも知れませんが、NVIDIA GRID driver(Virtual Workstation 用)で Isaac Sim 5.1.0 を起動すると、librtx.scenedb.plugin.so!carbOnPluginStartup でクラッシュしてしまいました。

[Fatal] [carb.crashreporter-breakpad.plugin] 004: librtx.scenedb.plugin.so!carbOnPluginStartup+0x3b4de
...
Segmentation fault (core dumped)

今回は、GRID driver ではなく CUDA Datacenter driver nvidia-driver-570 を apt で入れました。

(2) headless

AWS の EC2 はモニタが接続されていない headless サーバなので、Option "AllowEmptyInitialConfiguration" "True" を含めないと Xorg が起動できません。

Section "Device"
    Identifier "Device0"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration" "True"
EndSection

(3) ./isaac-sim.sh はデフォルトで Streaming experience が起動する

nvcr.io/nvidia/isaac-sim:5.1.0/isaac-sim/isaac-sim.sh を実行すると、ログに Isaac Sim Full Streaming Version: 5.1.0-rc.19 と出て、WebRTC streaming プロファイルが起動します。この状態では DCV デスクトップに Native GUI ウィンドウが描画出来ませんでした。

docker run ... \
  --entrypoint /isaac-sim/kit/kit \
  nvcr.io/nvidia/isaac-sim:5.1.0 \
  /isaac-sim/apps/isaacsim.exp.full.kit

/isaac-sim/apps/ には isaacsim.exp.full.kit(Native)と isaacsim.exp.full.streaming.kit(Streaming)が分かれて存在しており、Native を明示することで DCV に Isaac Sim ウィンドウが表示できました。

(4) URDF Import で Could not create directory エラー

Isaac Sim の URDF Importer は URDF と同じディレクトリに USD ファイルを書き出します。setup-isaac.sh では、コンテナ内 root が書き込めるよう、ホスト側 ~/work のパーミッションを緩めています。

sudo chmod -R a+rwX ~/work/

(5) GPU タイプを切り替えたら shader cache をクリア

GPUタイプを変えて Isaac Sim を起動すると、[56s] omni.kit.registry.nucleus startup の段階で hang しました。

GPU タイプを変更したら cache を全削除して再生成が必要です。

rm -rf ~/docker/isaac-sim/{kit-cache,ov-cache,gl-cache,compute-cache,logs}
mkdir -p ~/docker/isaac-sim/{kit-cache,ov-cache,gl-cache,compute-cache,logs}

(6) NVIDIA driver の DKMS ビルドが gcc-11 で失敗する

kernel 6.8 環境では nvidia-driver-570 のモジュールビルドが、 gcc-11 で失敗します。gcc-12 を入れ、update-alternatives --set で明示的に切り替えてから 再構成して解消できました。

sudo apt-get install -y gcc-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
sudo update-alternatives --set gcc /usr/bin/gcc-12   # ← これが無いと gcc-11 のまま
sudo dpkg --configure -a                             # gcc-12 で nvidia-dkms 再ビルド

11 最後に

今回は、「継続的に Isaac Sim / Isaac Lab を学習したい」
ということで、EC2で環境を構築してみました。

「7 g5.xlarge で対応できるか(実測)」で確認した通り、SO-ARM101 を 1 体、Physics Inspector で手動操作 ぐらいの操作であれば、GPU(A10G) は余裕・CPU も操作中で 7 割程度に収まり、g5.xlarge で必要十分でした。

ただし、下記のような作業に進んだ場合、恐らく力不足となるでしょう。

  • 強化学習で並列環境を多数立てる(CPU/GPU の両方を食う)
  • 複数ロボット・複雑なシーンを同時に扱う
  • 物理シミュレーションを連続再生(Play)し続ける

最初の一歩として、まず g5.xlarge で安く始め、重い用途に進む段階でリソースの増強を考えることにします。

GitHub リポジトリ: aws-ec2-isaaclab-soarm101-gui

この記事をシェアする

関連記事