🤖 LeRobot SO-101 アーム用 GR00T N1.6 のファインチューニングと AGX Orin でのデプロイ
🚀 はじめに
このwikiでは、LeRobot SO-101 アーム用にNVIDIA Isaac GR00T N1.6をファインチューニングし、AGX Orin 64Gにデプロイする方法を説明します。このwikiで使用されているAGX Orinキャリアボードとロボットアーム SO-ARM は、以下のリンクから購入できます:
- 🔧 LeRobot SO-101とAGX Orin 64Gのハードウェア準備
- 💻 AGX Orin 64GでのGR00T N1.6のソフトウェア環境セットアップ
- 🎯 LeRobot トレーニングプラットフォームの使用:データ収集、データセット形式化、SO-101 アーム用ファインチューニング
- 🚀 L20(サーバーグレード GPU)でのトレーニング済み GR00T N1.6 ポリシー(LeRobot + SO-101)のデプロイワークフロー例
- 🛠️ トラブルシューティングのヒントと一般的な落とし穴

📚 初期セットアップから完全なデプロイまでをサポートするため、詳細なステップバイステップの手順と参考文書が提供されています。
このwikiは、データ収集にLeRobotプロジェクトを基盤とし、それをGR00T N1.6がサポートするデータセット形式に変換します。AGX Orinに加えて、事前トレーニング済みモデルのファインチューニングには48GB以上のVRAMを持つデバイスが必要です(サーバーレンタルを推奨)。最後に、ファインチューニング済みモデルをAGX Orin 64Gにデプロイして推論を行い、皿から果物を掴むタスクを実現します。
このwikiはJetPack 6.2に基づいており、AGX Orin 64GBモジュールを使用しています。
🛠️ GR00T N1.6 環境のセットアップ
AGX OrinとX86アーキテクチャサーバーでのGR00T N1.6環境のセットアップは似たプロセスに従いますが、Jetsonでは一部の依存関係を手動でインストールする必要があります。
🔧 AGX Orin での環境セットアップ
GR00T N1.6のソースコードをクローンし、ディレクトリ構造を完成させます:
git clone https://github.com/NVIDIA/Isaac-GR00T.git
cd Isaac-GR00T
git checkout d483f00b1c13116bda020bead9d16dca497b2f6d
git submodule update --init --recursive
Isaac-GR00Tディレクトリに留まり、仮想環境を作成して依存関係をインストールします:
cd Isaac-GR00T
# Create virtual environment
uv venv .venv --python python3.10
source .venv/bin/activate
# Install LeRobot related dependencies
cd gr00t/eval/real_robot/SO100
uv pip install -e . --verbose
uv pip install --no-deps -e ../../../../
事前コンパイル済みのwheelファイルをAGX Orinにダウンロードします。これらは手動でインストールする必要があります。以下のリンクをクリックしてダウンロードしてください:
📦 必要なWheelファイル:
- PyTorch: ダウンロードはこちら
- TorchVision: ダウンロードはこちら
- Flash-Attention: ダウンロードはこちら
- TorchCodec: ダウンロードはこちら
- Triton: ダウンロードはこちら
Jetson用のその他のwheelファイルは以下からダウンロードできます:
🔗 https://pypi.jetson-ai-lab.io/jp6/cu126
.whlファイルをダウンロードした後、仮想環境をアクティベートしてpip経由でインストールします:
source .venv/bin/activate
pip install xxxx.whl
# For example:
# pip install torch-2.8.0a0+gitba56102-cp310-cp310-linux_aarch64.whl
flash-attnとtorchvisionはpytorchの後にインストールする必要があります
ソースコードの作業ディレクトリに戻り、最終的な依存関係のインストールを完了します:
cd Isaac-GR00T
source .venv/bin/activate
pip install -e .[base]
# We recommend using ffmpeg version 7.x
sudo apt update
sudo apt install ffmpeg
🖥️ ファインチューニングサーバーでの環境セットアップ
GR00T N1.6のソースコードをクローンし、ディレクトリ構造を完成させます:
git clone https://github.com/NVIDIA/Isaac-GR00T.git
cd Isaac-GR00T
git checkout d483f00b1c13116bda020bead9d16dca497b2f6d
git submodule update --init --recursive
Isaac-GR00Tディレクトリに留まり、仮想環境を作成して依存関係をインストールします:
cd Isaac-GR00T
# Create virtual environment
uv venv .venv --python python3.10
source .venv/bin/activate
# Install LeRobot related dependencies
cd gr00t/eval/real_robot/SO100
uv pip install -e . --verbose
uv pip install --no-deps -e ../../../../
サーバーのCUDAバージョン(著者はCUDA 12.8を使用)に基づいて、PyTorch公式ウェブサイトからtorch 2.8とtorchvision 0.22.0のGPUバージョンに対応するインストールコマンドを見つけます:
依存関係をインストールする際は、仮想環境がアクティベートされていることを確認してください:
source .venv/bin/activate
# For example
# pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128
flash-attnとtorchvisionはpytorchの後にインストールする必要があります
ソースコードの作業ディレクトリに戻り、最終的な依存関係のインストールを完了します:
cd Isaac-GR00T
source .venv/bin/activate
pip install --no-build-isolation flash-attn==2.8.2.post1
pip install -e .[base]
pip install torchcodec==0.4.0
# We recommend using ffmpeg version 7.x
sudo apt update
sudo apt install ffmpeg
📊 SO-ARM を使用したデータ収集
データ収集の詳細なチュートリアルについては、以下のリンクを参照してください:
https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#record-the-dataset
このリンクには、設定、組み立て、キャリブレーション、データ収集、トレーニング、推論をカバーするSO-ARMの完全なチュートリアルが含まれています。
lerobotロボットアームのデータ収集は、PCまたはJetsonデバイス上で直接実行できます。
- 方法1: Jetsonを使用してデータを収集
- 方法2: Ubuntu PCを使用してデータを収集(推奨)
両方の方法でのデータ収集手順は基本的に同じです。
LeRobot 環境セットアップ(オプション)
Lerobotの開発環境セットアッププロセスは、以下のリンクのサブセクションで確認できます:
🔗 https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#install-lerobot
モーターの設定
SO-ARMの各関節のモーターは、組み立て前に設定する必要があります。設定手順は以下のリンクのサブセクションで確認できます:
🔗 https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#configure-the-motors
組み立て
SO-ARMのマスターアームとフォロワーアームのインストールプロセスは、以下のリンクのサブセクションで確認できます:
🔗 https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#assembly
SO-ARM キャリブレーション
SO-ARMが完全に組み立てられた後、キャリブレーションが必要です。キャリブレーション手順については、以下のリンクのサブセクションを参照してください:
🔗 https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#calibrate
ロボットアームをキャリブレーションする際は、USBカメラを接続しないでください。ポートの競合や不正なポート割り当てが発生する可能性があります。
キャリブレーションスクリプトを実行した後、ロボットアームの各関節を手動で動かして、完全な可動域に到達することを確認してください!これを怠ると、テレオペレーション中にリーダーアームとフォロワーアームの姿勢が一致しない可能性があります。
カメラセットアップ
一般的に、ロボットアームの手首/グリッパーに1台のカメラを、デスクトップ表面にもう1台のカメラを設置して、アームの姿勢を適切にカバーすることが推奨されます。 具体的な設置方法はアプリケーションシナリオによって異なります。以下に示す例は参考用です。
詳細については、以下のリンクのサブセクションを参照してください:
🔗 https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#カメラを追加
データ収集
GR00T N1.6では、手首カメラのパラメータ名は wrist にし、三人称視点カメラのパラメータ名は front にする必要があります。
例:
--robot.cameras="{ wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}, front: {type: opencv, index_or_path: 6, width: 640, height: 480, fps: 30}}"
データ収集時にこれらのパラメータ名を使用しない場合、後続のトレーニングとデプロイメントプロセスでソースコード内のパラメータファイルとキーワードを修正する必要があります。
カメラの設置とロボットアームのキャリブレーションの両方が完了した後、データセット収集手順は以下のリンクのサブセクションで確認できます:
https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#データセットを記録
収集したデータの可視化
SO-ARMで収集したデータを可視化するには、以下のリンクのサブセクションを参照してください:
🔗 https://wiki.seeedstudio.com/ja/lerobot_so100m_new/#データセットを可視化
クラウドでポリシーをトレーニングすることを選択した場合、データセットが事前にクラウドサーバーにアップロードされているか、Hugging Face Hubからダウンロードされていることを確認してください。ただし、Hugging Face Hubから直接ダウンロードする際のネットワークの問題の可能性があるため、データセットを手動でクラウドサーバーにアップロードすることを強く推奨します。
🚀 L20を使用したポリシーのトレーニング
著者は事前トレーニング済みモデルのファインチューニングにNVIDIAのL20 GPUを選択しました。他のサーバーグレードGPUをレンタルすることもできますが、ファインチューニングプロセスで48GBの利用可能なVRAMがあることを確認してください。
データセット形式の変換
まず、前のセクションで収集したトレーニングデータセットをGR00T N1.6で使用される形式に変換する必要があります。著者はプロセスについてこのリンクを参照しています。
LeRobot v2形式のデータセットを既にお持ちの場合は、データセット形式変換プロセスをスキップできます。
LeRobot v3.0形式のデータセットをお持ちの場合は、このスクリプトを使用してLeRobot v2形式に変換してください。
他の形式のデータセットをお持ちの場合は、以下の要件を満たすLeRobot v2形式に変換してください。
📁 構造要件 フォルダは以下のような構造に従い、これらのコアフォルダとファイルを含む必要があります:
.
├─meta
│ ├─episodes.jsonl
│ ├─modality.json # -> GR00T LeRobot specific
│ ├─info.json
│ └─tasks.jsonl
├─videos
│ └─chunk-000
│ └─observation.images.ego_view
│ └─episode_000001.mp4
│ └─episode_000000.mp4
└─data
└─chunk-000
├─episode_000001.parquet
└─episode_000000.parquet
データセット形式変換スクリプトは Isaac-GR00T/scripts/lerobot_conversion にあります。以下のコマンドを使用してデータセット形式を変換してください:
python convert_v3_to_v2.py --repo-id seeed/grap_fruit
--repo-id は変換するソースデータセットへのパスです。
SO-ARMを使用していて、収集したデータセットに modality.json が不足している場合は、demo_dataディレクトリで見つけることができます:
🔗 https://github.com/NVIDIA/Isaac-GR00T/blob/main/demo_data/cube_to_bowl_5/meta/modality.json
事前トレーニング済みモデルのダウンロード
事前トレーニング済みモデルの重み( GR00T-N1.6-3B)をHugging Faceの公式ウェブサイトからダウンロードできます。ダウンロードページ: 🔗 https://huggingface.co/nvidia/GR00T-N1.6-3B
以下の画像に示されている内容を選択し、ダウンロードをクリックしてください。ダウンロードしたファイルを同じフォルダに配置してください。

ファインチューニングの実行
エントリーポイントとして gr00t/experiment/launch_finetune.py を使用します。起動前にuv環境が有効になっていることを確認してください。これは uv run bash <example_script_name> コマンドを実行することで行えます。
📋 利用可能な引数を表示
# Display all available arguments
python gr00t/experiment/launch_finetune.py --help
🔧 ファインチューニングの実行
単一GPUでファインチューニングを行う場合は、以下の画像の赤でハイライトされた部分に従って /Isaac-GR00T/gr00t/data/dataset/factory.py を修正する必要があります:

# Change torch.distributed.barrier() to:
import torch.distributed as dist
if dist.is_available() and dist.is_initialized():
dist.barrier()
ファインチューニングには以下のコマンドを使用してください:
export NUM_GPUS=1
CUDA_VISIBLE_DEVICES=0 python \
gr00t/experiment/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.6-3B \
--dataset-path ./demo_data/cube_to_bowl_5 \
--embodiment-tag NEW_EMBODIMENT \
--modality-config-path examples/SO100/so100_config.py \
--num-gpus $NUM_GPUS \
--output-dir /tmp/so100 \
--save-total-limit 5 \
--save-steps 2000 \
--max-steps 2000 \
--use-wandb \
--global-batch-size 32 \
--color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \
--dataloader-num-workers 4
📊 主要パラメータ
| パラメータ | 説明 |
|---|---|
--base-model-path | 事前トレーニング済みベースモデルチェックポイントへのパス |
--dataset-path | トレーニングデータセットへのパス |
--embodiment-tag | ロボットの実体を識別するタグ |
--modality-config-path | ユーザー指定のモダリティ設定へのパス(NEW_EMBODIMENTタグの場合のみ必要) |
--output-dir | チェックポイントが保存されるディレクトリ |
--save-steps | N ステップごとにチェックポイントを保存 |
--max-steps | トレーニングステップの総数 |
--use-wandb | 実験追跡のためのWeights & Biasesログを有効化 |
🚀 AGX Orin 64Gでのファインチューニング済みモデルによる推論
前の手順に従ってAGX Orin上でGR00T N1.6環境を設定していることを確認してください。
🖥️ ターミナル1:ローカル推論サーバーの開始
最初のターミナルを開き、仮想環境をアクティベートし、以下のコマンドでローカル推論サーバーを開始してください:
source .venv/bin/activate
uv run python gr00t/eval/run_gr00t_server.py \
--model-path /tmp/so100_finetune/checkpoint-10000 \
--embodiment-tag NEW_EMBODIMENT
ここで --model-path はファインチューニング済みモデルの重みへのパスです。
🤖 ターミナル2:ローカル推論クライアントの開始
2番目のターミナルを開き、仮想環境をアクティベートし、以下のコマンドでローカル推論クライアントを開始してください:
source .venv/bin/activate
uv run python gr00t/eval/real_robot/SO100/eval_so100.py \
--robot.type=so101_follower --robot.port=/dev/ttyACM0 \
--robot.id=orange_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--policy_host=localhost --policy_port=5555 \
--lang_instruction="grasp fruit into plate"
ここで --robot.port パラメータは実際のシリアルポート名に応じて修正し、index_or_path も2つのカメラのデバイスインデックス番号に応じて修正する必要があります。
🎥 デモ結果
推論リクエストを起動した後、ターミナルでGR00T N1.6が出力するアクションシーケンスを確認できます。各推論では8つのアクションが生成されます:

AGX Orin 64G上でのGR00T N1.6の著者の推論結果を以下のビデオで示します。前半ではGR00T N1.6プログラム開始後のターミナルでの推論出力を示しており、推論ごとに8つのアクションが出力されることがわかります。後半では実世界での結果を実演しており、ロボットアームが果物を正常に掴んで皿の上に置くことに成功しています。
📚 参考文献
- 🔗 https://developer.nvidia.com/embedded/jetpack
- 🔗 https://github.com/NVIDIA/Isaac-GR00T/tree/main
- 🔗 https://huggingface.co/nvidia/GR00T-N1.6-3B
🤝 技術サポート & 製品ディスカッション
弊社製品をお選びいただき、ありがとうございます!弊社製品での体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。

