メインコンテンツまでスキップ
ステージ 4 · 第21章 · 実践

21. Isaac GR00T を用いた reBot Arm のファインチューニング

Seeed Physical AI ビギナーコース第21章では、環境構築、 ファウンデーションモデルのダウンロード、データセットパスの設定、単一 GPU / 複数 GPU でのファインチューニング、 VRAM と loss の監視、チェックポイント保存、実機での推論、トラブルシューティング、 そして学習のコツについて解説します。

この章は LeRobot + GR00T N1.7(nvidia/GR00T-N1.7-3B)を前提としています。第20章で作成したデータセットが準備できていることを確認してください。

Isaac GR00T によるファインチューニング

21.1 環境構築​

Environment

21.1 環境構築

環境構築

推奨ハードウェア​

構成推論の最小要件ファインチューニング推奨
GPU16 GB 以上(RTX 4090 で推論可能)40 GB 以上(L40 / A100 80GB / H100)。公式シミュレーションでのファインチューニングには 48 GB 以上が必要
システムLinux(Ubuntu 22.04+)ネイティブ Linux または WSL2
ストレージ空き 50 GB100 GB 以上(モデルキャッシュを含む)
警告

GR00T には CUDA GPU が必須であり、CPU のみでの学習はサポートされていません。デフォルトのファインチューニング(projector + DiT head)ではピークで約 35 GB を使用します。RTX 4090 / 24 GB ではフルファインチューニングはできず、推論専用としてのみ適しています。どうしても 24 GB で学習する場合は LoRA / PEFT(pip install "lerobot[peft]")を使用してください。ただし、その結果は公式のフルファインチューニングと直接比較できません。

LeRobot と GR00T 依存関係のインストール​

LeRobot インストールドキュメントに従って Python 3.12 環境を作成した後に実行します:

conda create -y -n lerobot python=3.12
conda activate lerobot

# Install ffmpeg (video decoding, Linux + TorchCodec)
conda install ffmpeg -c conda-forge

# Install LeRobot + GR00T + training tools
pip install "lerobot[groot,training]"

Flash Attention(重要)​

GR00T N1.7 は高速化のために Flash Attention に依存しています。まず CUDA に対応した PyTorch をインストールし、その後 flash-attn をインストールすることを推奨します:

# Example: CUDA 12.8 + PyTorch 2.7 (RTX 50 series can reference this combo)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128

pip install ninja "packaging>=24.2,<26.0"
pip install "flash-attn>=2.5.9,<3.0.0" --no-build-isolation

python -c "import flash_attn; print(f'Flash Attention {flash_attn.__version__} OK')"

flash-attn のコンパイルに失敗する場合、よくある原因は次のとおりです:

  1. PyTorch と CUDA のバージョン不一致 -> 対応する wheel を入れ直す。
  2. ビルドツール不足 -> sudo apt install build-essential を実行。
  3. VRAM / メモリ不足 -> 他の GPU プロセスを終了して再試行。

Hugging Face と W&B へのログイン​

huggingface-cli login
wandb login # optional, for training curve visualization

21.2 ファウンデーションモデルのダウンロード​

Model

21.2 ファウンデーションモデルのダウンロード

ファウンデーションモデルのダウンロード

ファウンデーションモデルは Hugging Face 上でホストされています:

nvidia/GR00T-N1.7-3B

初回の学習時には、LeRobot が自動的に ~/.cache/huggingface/hub/ にダウンロードします。N1.7 の VLM バックボーン nvidia/Cosmos-Reason2-2B はゲート付きモデルであり、huggingface-cli login を行う前に Hugging Face 上で利用規約に同意する必要があります。手動で事前ダウンロードすることもできます:

huggingface-cli download nvidia/GR00T-N1.7-3B --local-dir ./models/GR00T-N1.7-3B
huggingface-cli download nvidia/Cosmos-Reason2-2B

学習時の引数で次のように指定します:

--policy.base_model_path=nvidia/GR00T-N1.7-3B
注記

現時点の LeRobot がサポートしている GR00T は N1.7 のみです。N1.5 を使うには旧バージョン lerobot==0.5.1 を固定する必要があり、本チュートリアルでは扱いません。

21.3 データセットパスの設定​

Dataset path

21.3 データセットパスの設定

データセットパスの設定

ローカルデータセット​

データがローカルキャッシュ内(Hub にアップロードしていない)にある場合、repo_id は記録時に使用したものと一致している必要があります:

export DATASET_REPO_ID="seeed_rebot_b601_rs/pick_cube"   # for DM: seeed_rebot_b601_dm/pick_cube

LeRobot は自動的に ~/.cache/huggingface/lerobot/ から読み込みます。

Hub データセット​

export HF_USER="your_hf_username"
export DATASET_REPO_ID="${HF_USER}/rebot_vla_pick_cube"

Hub 上のデータセットに、第20章で作成した meta/modality.json が含まれていることを確認してください。

21.4 単一 GPU でのファインチューニング開始​

Fine-tuning

21.4 単一 GPU でのファインチューニング開始

単一 GPU でのファインチューニング

以下のコマンドは、reBot Arm シングルアーム、new_embodiment を対象としています(RS / DM 用にはデータセットの repo_id を置き換えてください)。chunk_size=40 は公式 N1.7 の action_horizon に合わせています。LeRobot の groot ソースではデフォルトが 50 になっていますが、どちらも N1.5 / N1.6 の 16 よりはるかに大きいため、16 を使用しないでください。

export HF_USER="your_hf_username"
export DATASET_REPO_ID="seeed_rebot_b601_rs/pick_cube" # local or Hub; for DM use b601_dm
export REPO_ID="${HF_USER}/rebot_groot17_pick_cube" # uploaded model name after fine-tuning
export OUTPUT_DIR="outputs/train/${REPO_ID}"

lerobot-train \
--dataset.repo_id=${DATASET_REPO_ID} \
--dataset.image_transforms.enable=true \
--policy.type=groot \
--policy.device=cuda \
--policy.base_model_path=nvidia/GR00T-N1.7-3B \
--policy.embodiment_tag=new_embodiment \
--policy.chunk_size=40 \
--policy.n_action_steps=40 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]' \
--policy.use_bf16=true \
--policy.push_to_hub=true \
--policy.repo_id=${REPO_ID} \
--seed=42 \
--batch_size=32 \
--steps=20000 \
--save_checkpoint=true \
--save_freq=5000 \
--use_policy_training_preset=true \
--env_eval_freq=0 \
--eval_steps=0 \
--log_freq=10 \
--output_dir=${OUTPUT_DIR} \
--job_name=rebot_groot_finetune \
--wandb.enable=true \
--wandb.disable_artifact=true

主要パラメータ​

パラメータ値説明
--policy.typegrootGR00T ポリシーを使用
--policy.embodiment_tagnew_embodimentreBot 用カスタムエンボディメント
--policy.chunk_size40N1.7 の action_horizon=40 に合わせる(16 を使用しない)
--policy.n_action_steps40学習時は通常 chunk と同じ。推論時には減らすことも可能
--policy.use_relative_actionstrueLeRobot のジョイント相対前処理であり、Relative EEF ではない
--policy.relative_exclude_joints["gripper"]グリッパーは絶対制御のままにする
--policy.use_bf16true混合精度で VRAM を節約
--batch_size32(調整可)40 GB カードでは 32。OOM の場合は 8 または 16 に下げる
--steps20000ファインチューニングステップ数。データが少ない場合は 10000 まで減らしてもよい
--save_freq50005000 ステップごとにチェックポイントを保存

Hub にアップロードせずローカルのみに保存したい場合:

--policy.push_to_hub=false

21.5 複数 GPU でのファインチューニング開始​

Multi-GPU

21.5 複数 GPU でのファインチューニング開始

複数 GPU でのファインチューニング

複数 GPU 環境では、accelerate を使用します:

export NUM_GPUS=2
export BATCH_SIZE=16 # per-GPU batch; total batch = 16 x num GPUs
export NUM_STEPS=20000
export SAVE_FREQ=5000
export LOG_FREQ=10
export DATASET_REPO_ID="seeed_rebot_b601_rs/pick_cube"
export REPO_ID="${HF_USER}/rebot_groot17_pick_cube"
export OUTPUT_DIR="outputs/train/${REPO_ID}"

accelerate launch \
--multi_gpu \
--num_processes=${NUM_GPUS} \
$(which lerobot-train) \
--dataset.repo_id=${DATASET_REPO_ID} \
--dataset.image_transforms.enable=true \
--policy.type=groot \
--policy.device=cuda \
--policy.base_model_path=nvidia/GR00T-N1.7-3B \
--policy.embodiment_tag=new_embodiment \
--policy.chunk_size=40 \
--policy.n_action_steps=40 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]' \
--policy.use_bf16=true \
--policy.push_to_hub=true \
--policy.repo_id=${REPO_ID} \
--output_dir=${OUTPUT_DIR} \
--save_checkpoint=true \
--batch_size=${BATCH_SIZE} \
--steps=${NUM_STEPS} \
--save_freq=${SAVE_FREQ} \
--log_freq=${LOG_FREQ} \
--use_policy_training_preset=true \
--wandb.enable=true \
--wandb.disable_artifact=true \
--job_name=rebot_groot_multi_gpu

21.6 VRAM、損失、およびトレーニングログのモニタリング​

モニタリング

21.6 VRAM、損失、およびトレーニングログのモニタリング

VRAM、損失、およびトレーニングログのモニタリング

VRAM モニタ​

別のターミナルで次を実行します:

watch -n 1 nvidia-smi
症状対処
OOM(メモリ不足)まず GPU が 40 GB 以上であることを確認し、そのうえで --batch_size を下げ、--policy.use_bf16=true を維持します。24 GB の場合は、フルファインチューニングのためにバッチサイズを無理に小さくするのではなく、LoRA/PEFT を使用します
VRAM に余裕がある学習を高速化するために batch_size を適切に増やします
使用率が低いnum_workers を確認し、データがローカル SSD 上にあることを確認します

損失曲線​

W&B を有効にしたら、Web 上で train/loss の減少傾向を確認します。健全なファインチューニングの例:

  • 最初の 1000 ステップで損失が急速に低下します。
  • 5000 ステップ以降はプラトーになります。
  • 損失が減少しない場合:modality.json、データ次元、言語アノテーションを確認します。

ローカルログ​

tail -f ${OUTPUT_DIR}/logs/*.log

または W&B のオフライン/オンラインダッシュボードを参照します。

21.7 チェックポイントの保存​

チェックポイント

21.7 チェックポイントの保存

チェックポイントの保存

トレーニング中、チェックポイントは次の場所に保存されます:

outputs/train/<REPO_ID>/
├── checkpoints/
│ ├── 005000/
│ │ └── pretrained_model/
│ ├── 010000/
│ ├── 015000/
│ ├── 020000/
│ └── last/
│ └── pretrained_model/ ← latest weights, use this for inference
└── logs/

特定のチェックポイントでの推論​

--policy.path=outputs/train/${REPO_ID}/checkpoints/010000/pretrained_model

Hub へのアップロード​

--policy.push_to_hub=true の場合、トレーニング終了時に自動的にアップロードされます。手動アップロード:

huggingface-cli upload ${REPO_ID} \
outputs/train/${REPO_ID}/checkpoints/last/pretrained_model

21.8 実機ロボットでの推論と評価​

推論

21.8 実機ロボットでの推論と評価

実機ロボットでの推論と評価

方法 A: lerobot-record とポリシー記録(初心者に推奨)​

ACT 評価フローと同じですが、GR00T チェックポイントに差し替えるだけです。以下では B601-RS を例に示します。DM の場合は type / port / can_adapter を置き換えます。

export HF_USER="your_hf_username"
export MODEL_PATH="${HF_USER}/rebot_groot17_pick_cube" # Hub or local path

# RS CAN
sudo ip link set can0 down 2>/dev/null
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up

lerobot-record \
--robot.type=seeed_b601_rs_follower \
--robot.port=can0 \
--robot.id=follower1 \
--robot.can_adapter=socketcan \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--display_data=true \
--dataset.repo_id=${HF_USER}/eval_groot_rebot \
--dataset.num_episodes=10 \
--dataset.single_task="put the black cube on the blue tray" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=15 \
--policy.path=${MODEL_PATH} \
--policy.base_model_path=nvidia/GR00T-N1.7-3B \
--policy.embodiment_tag=new_embodiment
警告

--robot.cameras 内の front と side は、トレーニングデータセットのキー名と一致している必要があります。

方法 B: lerobot-rollout によるリアルタイムデプロイ(上級者向け)​

低レイテンシの閉ループ制御に適しており、RTC(Real-Time Chunking)をサポートします:

export MODEL_PATH="${HF_USER}/rebot_groot17_pick_cube"

lerobot-rollout \
--strategy.type=base \
--policy.path=${MODEL_PATH} \
--policy.base_model_path=nvidia/GR00T-N1.7-3B \
--policy.embodiment_tag=new_embodiment \
--policy.chunk_size=40 \
--policy.n_action_steps=20 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]' \
--robot.type=seeed_b601_rs_follower \
--robot.port=can0 \
--robot.id=follower1 \
--robot.can_adapter=socketcan \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--task="put the black cube on the blue tray" \
--duration=60 \
--device=cuda \
--display_data=true \
--inference.type=rtc \
--inference.rtc.enabled=true \
--inference.rtc.execution_horizon=20 \
--inference.queue_threshold=2

RTC によってジッタが発生する場合は、--inference.rtc.enabled=false を設定します。queue_threshold は 2〜5 を推奨します(0 に設定すると再推論が頻発し、ジッタが発生しやすくなります)。

21.9 トラブルシューティング FAQ​

トラブルシューティング

21.9 トラブルシューティング FAQ

トラブルシューティング FAQ

モデルのダウンロード失敗​

# Set mirror or proxy and retry
export HF_ENDPOINT=https://hf-mirror.com # optional
huggingface-cli download nvidia/GR00T-N1.7-3B
huggingface-cli download nvidia/Cosmos-Reason2-2B # gated; accept terms on HF first

CUDA / PyTorch バージョンの不一致​

python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.version.cuda)"
nvidia-smi

ドライバーバージョンが PyTorch CUDA の要件を満たしていることを確認してください。

Flash Attention のインストール失敗​

  1. nvcc --version が PyTorch CUDA と一致していることを確認します。
  2. 事前ビルド済みホイールを試します:pip install flash-attn --no-build-isolation。
  3. RTX 50 シリーズでは次を試せます:pip install flash_attn==2.8.0.post2 torch==2.7.1 --no-build-isolation。
  4. それでも失敗する場合は、公式 Isaac GR00T ドキュメントを参照してください。

トレーニング損失は正常だが実機ロボットの動きがおかしい​

想定される原因調査内容
ジョイント順序の不整合データセットメタ情報と --robot.cameras / ドライバを比較します
角度単位の誤りトレーニングと推論の間で deg/rad が一貫していることを確認します
カメラキー名の不一致front/side がトレーニングデータと整合していること
embodiment_tag の誤りnew_embodiment である必要があります
言語指示の不一致--task の文パターンがトレーニングデータと一致していること
相対アクションが正しく復元されていないuse_relative_actions がトレーニングと推論の間で一致していることを確認します。これはジョイント相対であり、Relative EEF ではありません

mean is infinity エラー​

通常、評価時のカメラキー名がトレーニング時と一致していないことが原因です。--robot.cameras のキー名を確認してください。

21.10 トレーニング改善の提案​

改善

21.10 トレーニング改善の提案

トレーニング改善の提案
方向性提案
データ量単一タスクで 50 エピソードから始め、その後 100 以上に拡張します
データ多様性物体位置、照明、初期姿勢を変化させます
画像拡張--dataset.image_transforms.enable=true を維持します
ステップ数データが少ない場合は 10k〜15k、多い場合は 20k〜30k
推論まず n_action_steps=20 を試します(トレーニング時の chunk_size=40 以下である必要があります)、その後 RTC をチューニングします
イテレーション失敗ケースのデータを収集 -> データセットをマージ -> 継続してファインチューニング

21.11 章のまとめ​

まとめ

21.11 章のまとめ

  • 環境:pip install "lerobot[groot,training]" + Flash Attention + ファインチューニングには 40 GB 以上の GPU(推論のみなら 16 GB)。
  • 基盤モデル:nvidia/GR00T-N1.7-3B(バックボーンは Cosmos-Reason2-2B)。
  • トレーニング:lerobot-train --policy.type=groot --policy.embodiment_tag=new_embodiment。
  • reBot の主要設定:ジョイント空間 + オプションの LeRobot ジョイント相対アクション(グリッパーは絶対)+ chunk_size=40(N1.7 と整合)。
  • モデルバリアント:RS は seeed_b601_rs_follower + can0 + socketcan を使用し、DM は seeed_b601_dm_follower + /dev/ttyACM0 + damiao を使用します。
  • 評価:lerobot-record または lerobot-rollout を使用し、カメラと言語はトレーニングと整合させます。
  • チェックポイントは outputs/train/<REPO_ID>/checkpoints/last/pretrained_model にあります。

この章を完了すると、自然言語の指示で reBot Arm 上の VLA ポリシーを動作させられるようになっているはずです。結果が思わしくない場合は、まず第 20 章に戻ってデータ品質を確認し、その後デモンストレーション数を増やしてファインチューニングを繰り返してください。

Loading Comments...