
AWSのPhysical AI Scaffolding Kit (PASK)を試す⑤ — 学習済みGR00TポリシーをIsaac Simで動かして挙動確認する
連載第5回。第2回・第4回で学習したGR00Tポリシーを、Isaac SimのGUI上で実際に動かして、ロボットがタスクを実行する様子を見る回です。第4回のphysaiの評価はヘッドレス実行で動画が出ないため、ここでは第3回のワークステーションを土台に、推論に必要な一式(LeIsaac + GR00T)を入れてGUIで走らせます。
これまでの記事はこちら
はじめに
- 第2回: HyperPod上でGR00Tをファインチューニング(手動
sbatch) - 第4回: physaiパイプラインで学習〜評価。PickOrangeで成功率50%、ただし評価はヘッドレスで動画は出力されない
「学習済みポリシーが実際にロボットを動かす様子」を映像で見たい、というのが第5回の動機です。
このサンプルのゴールは、「S3に退避した学習済みチェックポイントを、Isaac Sim GUI上でロボットに実行させ、挙動を目で確認・録画する」ことです。
前提
- 第4回で学習したチェックポイントをS3に退避済みであること(
model-*.safetensors+experiment_cfg/+statistics.json等。学習再開用のoptimizer.pt等は推論には不要) - 第3回の
isaacsim-workstation(NICE DCVでGUIが使えるGPU EC2)の手順が使えること
最初に押さえる3つのポイント
① 推論は「GR00Tサーバ + LeIsaacクライアント」の2プロセス構成
GR00Tの推論は、ポリシーサーバ(チェックポイントをロードして動作を返す)と、LeIsaac側の実行スクリプトpolicy_inference.py(simを回してサーバに問い合わせる)の2プロセスに分かれています。GUIで見るには、後者を--headlessを付けずにDCVデスクトップ内で起動します(ヘッドレスだと画面に出ません)。
② flash-attnのビルドにCUDA toolkit(nvcc)が要る
GR00Tはflash-attnに依存し、これはソースからコンパイルされます。physaiのコンテナはcuda:...-devel(nvcc入り)がベースでしたが、Isaac SimワークステーションAMIにはnvccが無いため、そのままだと次で失敗します。
OSError: CUDA_HOME environment variable is not set.
UserWarning: flash_attn was requested, but nvcc was not found.
CUDA toolkitを入れて解決します(torchがcu128なので12.8を合わせる。ドライバは変えたくないのでcuda-toolkit-12-8)。
cd /tmp
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/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 cuda-toolkit-12-8
export CUDA_HOME=/usr/local/cuda-12.8
export PATH="$CUDA_HOME/bin:$PATH"
③ omniはIsaac Sim起動後にしかimportできない
import leisaacを素のPythonで試すとModuleNotFoundError: No module named 'omni'になります。これは異常ではありません。omni(Isaac Sim/Kitの拡張)はAppLauncher/SimulationAppを起動して初めてパスが通るため、policy_inference.pyのように「先にIsaac Simを起動してからimport leisaac」する順序でのみ成功します。単体importでの動作確認はできない、と覚えておくと混乱しません。
全体像
| フェーズ | やること | 目安 |
|---|---|---|
| 1 | isaacsim-workstationをdeploy(g6e.4xlarge / L40S 48GB) | 約10分 |
| 2 | DCV接続 | 数分 |
| 3 | LeIsaac + GR00Tをインストール(CUDA toolkit含む) | 1〜2時間 |
| 4 | S3からチェックポイントを取得 | 数分 |
| 5 | 2プロセス起動(GR00Tサーバ + policy_inference GUI)→ 録画 | 数分〜 |
| 6 | 後片付け(cdk destroy) |
— |
手順
Phase 1〜2: ワークステーション構築と接続
第3回と同じです。isaacsim-workstation/cdk.jsonのInstanceTypeをg6e.4xlarge(L40S 48GB)にしてdeployし、Status Check 3/3を待ってパスワード設定 → DCV接続します(グレー画面ならsudo reboot)。詳細は第3回を参照。
Phase 3: LeIsaac + GR00Tのインストール
physaiの評価コンテナが持っていた一式を、ワークステーションに手で再現します。バージョンはphysaiのproject.yamlに合わせます(LEISAAC_REF, GR00T_REF=n1.6-release, IsaacSim 5.1.0, torch 2.7/cu128, Python 3.11)。
長時間かかるのでtmuxの中で実行してください。
# 環境変数(physai の project.yaml と同一)
export LEISAAC_DIR="$HOME/leisaac"
export GR00T_DIR="$HOME/gr00t"
export GR00T_REF="n1.6-release"
export LEISAAC_REF="d2cbfd2e33517f2094e1904ff817aa17de6e8939"
export OMNI_KIT_ACCEPT_EULA="YES"
# システムパッケージ + uv
sudo apt-get update && sudo apt-get install -y \
build-essential git cmake unzip curl ffmpeg libegl1 libxt6 libglu1-mesa libxext6
curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sudo -E sh
# LeIsaac(Isaac Sim 5.1 pip + Isaac Lab)
uv python install 3.11
git clone https://github.com/LightwheelAI/leisaac.git "$LEISAAC_DIR"
cd "$LEISAAC_DIR" && git checkout "$LEISAAC_REF" && git submodule update --init --recursive
uv venv --python 3.11 .venv && uv pip install pip
source .venv/bin/activate
pip install torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128
pip install 'isaacsim[all,extscache]==5.1.0' --extra-index-url https://pypi.nvidia.com
pip install -e source/leisaac
pip install --no-build-isolation flatdict==4.0.1
( cd dependencies/IsaacLab && ./isaaclab.sh --install none )
pip install msgpack msgpack-numpy pyzmq
deactivate
# LeIsaac アセット(ロボットUSD + シーン)
mkdir -p "$LEISAAC_DIR/assets/robots"
curl -L -o "$LEISAAC_DIR/assets/robots/so101_follower.usd" \
https://github.com/LightwheelAI/leisaac/releases/download/v0.1.0/so101_follower.usd
cd "$LEISAAC_DIR/assets"
curl -L -o kitchen_with_orange.zip \
https://github.com/LightwheelAI/leisaac/releases/download/v0.1.0/kitchen_with_orange.zip
unzip -q kitchen_with_orange.zip -d scenes && rm kitchen_with_orange.zip
続けてGR00T。ここでCUDA toolkit(ポイント②)を先に入れておくこと。flash-attnのコンパイルはメモリを食うのでMAX_JOBSで並列度を制限します。
# ポイント② の cuda-toolkit-12-8 を入れて CUDA_HOME/PATH を通しておく
export MAX_JOBS=8
git clone https://github.com/NVIDIA/Isaac-GR00T.git "$GR00T_DIR"
cd "$GR00T_DIR" && git checkout "$GR00T_REF"
uv sync # ここで flash-attn がコンパイルされる(20〜40分)
uv pip install -e .
インストール確認(omniはポイント③のとおり単体では見ないこと):
~/gr00t/.venv/bin/python -c "import flash_attn, gr00t; print('gr00t OK', flash_attn.__version__)"
Phase 4: チェックポイントの取得
第4回でS3に退避したチェックポイントと、学習時に使ったmodel_config(今回はdualcam)をワークステーションに落とします。ワークステーションにAWS CLIが無ければ入れます。
# AWS CLI v2(未インストールなら)
cd /tmp && curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip -q awscliv2.zip && sudo ./aws/install
# 取得(<BUCKET> は第4回の退避先)
mkdir -p ~/ckpt ~/model_config
aws s3 cp --recursive s3://<BUCKET>/physai-pickorange-n1.6/ ~/ckpt/
aws s3 cp --recursive s3://<BUCKET>/model_config/so101-dualcam/ ~/model_config/so101-dualcam/
ls ~/ckpt # model-00001/00002-of-00002.safetensors 等が見えればOK
Phase 5: 起動して動かす
両方ともDCVデスクトップ内のターミナルで実行します。
ターミナル②は新しいターミナルを開いて実行します。
ターミナル① GR00Tポリシーサーバ(サーバなので起動したまま放置):
cd ~/gr00t
.venv/bin/python gr00t/eval/run_gr00t_server.py \
--model-path ~/ckpt \
--embodiment-tag NEW_EMBODIMENT \
--modality-config-path ~/model_config/so101-dualcam/modality_config.py \
--port 48135
# → "Server is ready and listening on tcp://0.0.0.0:48135" を待つ
ターミナル② policy_inference(GUI)
cd ~/leisaac
.venv/bin/python scripts/evaluation/policy_inference.py \
--task=LeIsaac-SO101-PickOrange-v0 \
--eval_rounds=20 \
--policy_type=gr00tn1.6 \
--policy_host=localhost --policy_port=48135 \
--policy_timeout_ms=5000 --policy_action_horizon=16 \
--policy_language_instruction="Pick up the orange and place it on the plate" \
--device=cuda --enable_cameras
数十秒でIsaac Simのウィンドウが開き、キッチンのシーンにSO-101が現れて、オレンジを掴んで皿に置く動作を実行します。
大量に出る
[Error] ... triangle mesh collision ... falling back to convexHullは、シーンの当たり判定に関する通知なので無視してOKです。実行には影響しません。
結果と考察
ターミナル②には、エピソードごとの結果が出ます。
[Evaluation] Episode 1 is successful!
[Evaluation] Episode 2 timed out!
[Evaluation] now success rate: 0.5 [1/2]
...
[Evaluation] Final success rate: 0.500 [10/20]
第4回のヘッドレス評価と同じく成功率はおよそ50%。成功エピソードではオレンジを掴んで皿に運び、失敗エピソードではアームが目標付近で細かく震えたまま(ガクガク)タイムアウトします。これは今回が簡易的な小規模学習であることの影響かと思われます。
コストと後片付け
インスタンスは起動している限り課金されるので、終わったら止めます。
cd isaacsim-workstation
export AWS_PROFILE=<利用プロファイル>
pnpm exec cdk destroy
第3回同様、全リソースがRemovalPolicy.DESTROYなのでS3 Filesバケット含め完全に消えます。退避チェックポイントを置いたS3バケットは別管理なので、次回もまた同じ手順で挙動確認できます。
まとめ
第4回で学習したポリシーを、Isaac Sim GUI上で実際に動かして挙動を確認しました。











