From 9ec45302482b34877b3f49adffe7e53ca3f37e1e Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 12:41:13 +0000 Subject: [PATCH 01/15] docs(groot): update Training & hardware Evaluation commands Replace the multi-GPU accelerate-launch Training snippet with the current single-command 'uv run lerobot-train' N1.7 recipe (relative actions excluding gripper, bf16, flash attention, chunk/n_action_steps=16, bs64/20k steps). Replace the bimanual 'Evaluate in your hardware setup' rollout example with the SO-101 follower RTC 'uv run lerobot-rollout' command (strategy.type=base, inference.type=rtc, wrist+front cameras, place-the-vial task). Docs-only; no source/test changes. --- docs/source/groot.mdx | 76 +++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 21dc851ce..58c11b081 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -77,25 +77,31 @@ To use GR00T N1.7: Here's a complete training command for finetuning the base GR00T model on your own dataset: ```bash -# Using a multi-GPU setup -accelerate launch \ - --multi_gpu \ - --num_processes=$NUM_GPUS \ - $(which lerobot-train) \ - --output_dir=$OUTPUT_DIR \ - --save_checkpoint=true \ - --batch_size=$BATCH_SIZE \ - --steps=$NUM_STEPS \ - --save_freq=$SAVE_FREQ \ - --log_freq=$LOG_FREQ \ - --policy.push_to_hub=true \ +uv run lerobot-train \ + --dataset.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50_20260628_131121 \ + --dataset.image_transforms.enable=true \ --policy.type=groot \ - --policy.repo_id=$REPO_ID \ - --policy.tune_diffusion_model=false \ - --dataset.repo_id=$DATASET_ID \ - --wandb.enable=true \ - --wandb.disable_artifact=true \ - --job_name=$JOB_NAME + --policy.device=cuda \ + --policy.base_model_path=nvidia/GR00T-N1.7-3B \ + --policy.embodiment_tag=new_embodiment \ + --policy.chunk_size=16 \ + --policy.n_action_steps=16 \ + --policy.use_relative_actions=true \ + --policy.relative_exclude_joints='["gripper"]' \ + --policy.use_bf16=true \ + --policy.use_flash_attention=true \ + --policy.push_to_hub=true \ + --policy.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 \ + --seed=42 \ + --batch_size=64 \ + --steps=20000 \ + --save_checkpoint=true \ + --use_policy_training_preset=true \ + --env_eval_freq=0 \ + --eval_steps=0 \ + --log_freq=100 \ + --output_dir=outputs/train/sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 \ + --job_name=so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 ``` ## Performance Results @@ -153,25 +159,23 @@ Use `eval.n_episodes >= 50` per suite when reporting success rates. Once you have trained your model using your parameters you can run inference in your downstream task. Follow the instructions in [Policy Deployment (lerobot-rollout)](./inference). For example: ```bash -lerobot-rollout\ - --strategy.type=sentry \ - --strategy.upload_every_n_episodes=5 \ - --robot.type=bi_so_follower \ - --robot.left_arm_port=/dev/ttyACM1 \ - --robot.right_arm_port=/dev/ttyACM0 \ - --robot.id=bimanual_follower \ - --robot.cameras='{ right: {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}, - left: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30}, - top: {"type": "opencv", "index_or_path": 4, "width": 640, "height": 480, "fps": 30}, - }' \ +uv run lerobot-rollout \ + --strategy.type=base \ + --inference.type=rtc \ + --policy.path=outputs/train/sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42/checkpoints/020000/pretrained_model/ \ + --policy.base_model_path=nvidia/GR00T-N1.7-3B \ + --robot.type=so101_follower \ + --robot.port=/dev/ttyACM0 \ + --robot.id=orange_andrew \ + --robot.cameras='{ wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"} }' \ + --task="place the vial in the rack" \ + --duration=60 \ + --device=cuda \ --display_data=true \ - --dataset.repo_id=/eval_groot-bimanual \ - --dataset.single_task="Grab and handover the red cube to the other arm" \ - --dataset.streaming_encoding=true \ - --dataset.encoder_threads=2 \ - # --dataset.rgb_encoder.vcodec=auto \ - --policy.path=/groot-bimanual \ # your trained model - --duration=600 + --inference.rtc.enabled=false \ + --inference.rtc.execution_horizon=8 \ + --inference.queue_threshold=0 \ + --policy.n_action_steps=8 ``` ## License From 62ff497ebcc21c885f32163d98a3e5559f558112 Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 12:49:35 +0000 Subject: [PATCH 02/15] docs(groot): parameterize commands with env vars + fill LIBERO results - Introduce BASE_MODEL / DATASET_ID / REPO_ID / JOB_NAME / OUTPUT_DIR env vars in the training command and reuse OUTPUT_DIR + BASE_MODEL in the rollout cmd. - Fill the LIBERO benchmark table with GR00T-LeRobot success rates (Spatial 94%, Object 98%, Goal 93%, LIBERO 10/Long 90%; avg 93.75%), drop the OSS column and XX placeholders. LeRobot-focused. --- docs/source/groot.mdx | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 58c11b081..3ed422306 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -77,12 +77,19 @@ To use GR00T N1.7: Here's a complete training command for finetuning the base GR00T model on your own dataset: ```bash +# Set these for your run +export BASE_MODEL=nvidia/GR00T-N1.7-3B +export DATASET_ID=sreetz-nv/so101-clean-up-vials-into-rack-50_20260628_131121 +export REPO_ID=sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 +export JOB_NAME=so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 +export OUTPUT_DIR=outputs/train/$JOB_NAME + uv run lerobot-train \ - --dataset.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50_20260628_131121 \ + --dataset.repo_id=$DATASET_ID \ --dataset.image_transforms.enable=true \ --policy.type=groot \ --policy.device=cuda \ - --policy.base_model_path=nvidia/GR00T-N1.7-3B \ + --policy.base_model_path=$BASE_MODEL \ --policy.embodiment_tag=new_embodiment \ --policy.chunk_size=16 \ --policy.n_action_steps=16 \ @@ -91,7 +98,7 @@ uv run lerobot-train \ --policy.use_bf16=true \ --policy.use_flash_attention=true \ --policy.push_to_hub=true \ - --policy.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 \ + --policy.repo_id=$REPO_ID \ --seed=42 \ --batch_size=64 \ --steps=20000 \ @@ -100,8 +107,8 @@ uv run lerobot-train \ --env_eval_freq=0 \ --eval_steps=0 \ --log_freq=100 \ - --output_dir=outputs/train/sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 \ - --job_name=so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 + --output_dir=$OUTPUT_DIR \ + --job_name=$JOB_NAME ``` ## Performance Results @@ -124,17 +131,15 @@ NVIDIA publishes GR00T N1.7 LIBERO checkpoints at [`nvidia/GR00T-N1.7-LIBERO`](h | LIBERO Goal | `libero_goal` | | LIBERO 10 | `libero_10` | -Preliminary LeRobot integration results: +Preliminary LeRobot integration results (GR00T-LeRobot, `eval.n_episodes >= 50` per suite): -| Suite | Status | Success rate | n_episodes | -| -------------- | ------ | -----------: | ---------: | -| LIBERO Spatial | ✓ | ~95% | XX | -| LIBERO Object | ✓ | XX% | XX | -| LIBERO Goal | ✓ | XX% | XX | -| LIBERO 10 | ✓ | XX% | XX | -| **Average** | ✓ | **XX%** | **XX** | - -Replace the `XX` placeholders with final eval artifacts before merge. +| Suite | Success rate | +| ---------------------- | -----------: | +| LIBERO Spatial | 94% | +| LIBERO Object | 98% | +| LIBERO Goal | 93% | +| LIBERO 10 (Long) | 90% | +| **Average** | **93.75%** | Download the suite checkpoint locally, then point `--policy.base_model_path` at the downloaded subdirectory. `--policy.path` is reserved for LeRobot checkpoints that contain a LeRobot `config.json` with a `type` field. @@ -162,8 +167,8 @@ Once you have trained your model using your parameters you can run inference in uv run lerobot-rollout \ --strategy.type=base \ --inference.type=rtc \ - --policy.path=outputs/train/sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42/checkpoints/020000/pretrained_model/ \ - --policy.base_model_path=nvidia/GR00T-N1.7-3B \ + --policy.path=$OUTPUT_DIR/checkpoints/020000/pretrained_model/ \ + --policy.base_model_path=$BASE_MODEL \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=orange_andrew \ From a8ded211aac0f5af440c17be01bf10eccf24c79f Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 12:52:38 +0000 Subject: [PATCH 03/15] docs(groot): drop export block, reference env vars directly Use $DATASET_ID / $BASE_MODEL / $REPO_ID / $OUTPUT_DIR / $JOB_NAME as bare placeholders in the commands without concrete export assignments. --- docs/source/groot.mdx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 3ed422306..fa5d3382e 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -77,13 +77,6 @@ To use GR00T N1.7: Here's a complete training command for finetuning the base GR00T model on your own dataset: ```bash -# Set these for your run -export BASE_MODEL=nvidia/GR00T-N1.7-3B -export DATASET_ID=sreetz-nv/so101-clean-up-vials-into-rack-50_20260628_131121 -export REPO_ID=sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 -export JOB_NAME=so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 -export OUTPUT_DIR=outputs/train/$JOB_NAME - uv run lerobot-train \ --dataset.repo_id=$DATASET_ID \ --dataset.image_transforms.enable=true \ From be0bfd90cdd49b54abcb7a6ea2261ac230be208e Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 12:52:58 +0000 Subject: [PATCH 04/15] docs(groot): keep BASE_MODEL export in training command --- docs/source/groot.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index fa5d3382e..6e69e8d30 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -77,6 +77,8 @@ To use GR00T N1.7: Here's a complete training command for finetuning the base GR00T model on your own dataset: ```bash +export BASE_MODEL=nvidia/GR00T-N1.7-3B + uv run lerobot-train \ --dataset.repo_id=$DATASET_ID \ --dataset.image_transforms.enable=true \ From 8a60f06a7523c41802dad6ce7870ae88d2ada4ab Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 13:01:04 +0000 Subject: [PATCH 05/15] docs(groot): use literal HF repo IDs for dataset/policy repo_id Public-facing Hub references (--dataset.repo_id, --policy.repo_id) shown as concrete IDs; local-only values ($OUTPUT_DIR, $JOB_NAME) stay as placeholders. --- docs/source/groot.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 6e69e8d30..88c53e93e 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -80,7 +80,7 @@ Here's a complete training command for finetuning the base GR00T model on your o export BASE_MODEL=nvidia/GR00T-N1.7-3B uv run lerobot-train \ - --dataset.repo_id=$DATASET_ID \ + --dataset.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50_20260628_131121 \ --dataset.image_transforms.enable=true \ --policy.type=groot \ --policy.device=cuda \ @@ -93,7 +93,7 @@ uv run lerobot-train \ --policy.use_bf16=true \ --policy.use_flash_attention=true \ --policy.push_to_hub=true \ - --policy.repo_id=$REPO_ID \ + --policy.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 \ --seed=42 \ --batch_size=64 \ --steps=20000 \ From 602d710a7322da51331ef96ae06635955eba62de Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 14:02:02 +0000 Subject: [PATCH 06/15] docs(groot): add LIBERO training command example --- docs/source/groot.mdx | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 88c53e93e..b85ced1df 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -115,6 +115,41 @@ uv run lerobot-train \ GR00T N1.7 has demonstrated strong performance on the LIBERO benchmark suite. To reproduce LeRobot results, follow the instructions in the [LIBERO](./libero) section. +### Train on LIBERO + +Example training command for a LIBERO suite (here `libero_spatial`): + +```bash +lerobot-train \ + --dataset.repo_id=IPEC-COMMUNITY/libero_spatial_no_noops_1.0.0_lerobot \ + --dataset.root=/datasets/libero_spatial \ + --dataset.revision=main \ + --dataset.video_backend=pyav \ + --policy.type=groot \ + --policy.base_model_path=$BASE_MODEL \ + --policy.embodiment_tag=libero_sim \ + --policy.push_to_hub=false \ + --policy.max_steps=20000 \ + --batch_size=320 \ + --steps=20000 \ + --save_freq=2000 \ + --env_eval_freq=0 \ + --eval_steps=0 \ + --log_freq=10 \ + --wandb.enable=true \ + --wandb.project=lerobot \ + --wandb.mode=online \ + --wandb.disable_artifact=true \ + --num_workers=4 \ + --prefetch_factor=2 \ + --persistent_workers=true \ + --output_dir=$OUTPUT_DIR \ + --job_name=$JOB_NAME \ + --dataset.image_transforms.enable=true \ + --dataset.image_transforms.max_num_transforms=4 \ + --dataset.image_transforms.tfs='{"brightness":{"weight":1.0,"type":"ColorJitter","kwargs":{"brightness":[0.7,1.3]}},"contrast":{"weight":1.0,"type":"ColorJitter","kwargs":{"contrast":[0.6,1.4]}},"saturation":{"weight":1.0,"type":"ColorJitter","kwargs":{"saturation":[0.5,1.5]}},"hue":{"weight":1.0,"type":"ColorJitter","kwargs":{"hue":[-0.08,0.08]}}}' +``` + ### GR00T N1.7 LIBERO Checkpoints NVIDIA publishes GR00T N1.7 LIBERO checkpoints at [`nvidia/GR00T-N1.7-LIBERO`](https://huggingface.co/nvidia/GR00T-N1.7-LIBERO), with one subdirectory per LIBERO suite: From 92beebcaa9346aa361a595de600bac0074928915 Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 14:05:06 +0000 Subject: [PATCH 07/15] docs(groot): remove LIBERO checkpoints subdirectory section --- docs/source/groot.mdx | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index b85ced1df..d844592f7 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -150,16 +150,7 @@ lerobot-train \ --dataset.image_transforms.tfs='{"brightness":{"weight":1.0,"type":"ColorJitter","kwargs":{"brightness":[0.7,1.3]}},"contrast":{"weight":1.0,"type":"ColorJitter","kwargs":{"contrast":[0.6,1.4]}},"saturation":{"weight":1.0,"type":"ColorJitter","kwargs":{"saturation":[0.5,1.5]}},"hue":{"weight":1.0,"type":"ColorJitter","kwargs":{"hue":[-0.08,0.08]}}}' ``` -### GR00T N1.7 LIBERO Checkpoints - -NVIDIA publishes GR00T N1.7 LIBERO checkpoints at [`nvidia/GR00T-N1.7-LIBERO`](https://huggingface.co/nvidia/GR00T-N1.7-LIBERO), with one subdirectory per LIBERO suite: - -| Suite | Checkpoint subdirectory | -| -------------- | ----------------------- | -| LIBERO Spatial | `libero_spatial` | -| LIBERO Object | `libero_object` | -| LIBERO Goal | `libero_goal` | -| LIBERO 10 | `libero_10` | +### GR00T N1.7 LIBERO Results Preliminary LeRobot integration results (GR00T-LeRobot, `eval.n_episodes >= 50` per suite): From 488650678b14bbf1b173ac59963c36469e4fc518 Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 14:06:03 +0000 Subject: [PATCH 08/15] docs(groot): use $BASE_MODEL for base_model_path in LIBERO eval --- docs/source/groot.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index d844592f7..685540dfa 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -171,7 +171,7 @@ hf download nvidia/GR00T-N1.7-LIBERO \ lerobot-eval \ --policy.type=groot \ - --policy.base_model_path=./GR00T-N1.7-LIBERO/libero_spatial \ + --policy.base_model_path=$BASE_MODEL \ --policy.embodiment_tag=libero_sim \ --env.type=libero \ --env.task=libero_spatial \ From e88a0d6aef7935d7ee5b7971447b23b5c6258995 Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 14:09:48 +0000 Subject: [PATCH 09/15] docs(groot): drop hf download step from LIBERO eval, fix intro --- docs/source/groot.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 685540dfa..cd751ee6a 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -162,13 +162,9 @@ Preliminary LeRobot integration results (GR00T-LeRobot, `eval.n_episodes >= 50` | LIBERO 10 (Long) | 90% | | **Average** | **93.75%** | -Download the suite checkpoint locally, then point `--policy.base_model_path` at the downloaded subdirectory. `--policy.path` is reserved for LeRobot checkpoints that contain a LeRobot `config.json` with a `type` field. +Point `--policy.base_model_path` at your GR00T N1.7 base model. `--policy.path` is reserved for LeRobot checkpoints that contain a LeRobot `config.json` with a `type` field. ```bash -hf download nvidia/GR00T-N1.7-LIBERO \ - --include "libero_spatial/*" \ - --local-dir ./GR00T-N1.7-LIBERO - lerobot-eval \ --policy.type=groot \ --policy.base_model_path=$BASE_MODEL \ From e99c65f38aaa8c3a46cbafe657742892fcddaabf Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 14:10:09 +0000 Subject: [PATCH 10/15] docs(groot): restore suite checkpoint download intro sentence --- docs/source/groot.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index cd751ee6a..76f18f6ad 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -162,7 +162,7 @@ Preliminary LeRobot integration results (GR00T-LeRobot, `eval.n_episodes >= 50` | LIBERO 10 (Long) | 90% | | **Average** | **93.75%** | -Point `--policy.base_model_path` at your GR00T N1.7 base model. `--policy.path` is reserved for LeRobot checkpoints that contain a LeRobot `config.json` with a `type` field. +Download the suite checkpoint locally, then point `--policy.base_model_path` at the downloaded subdirectory. `--policy.path` is reserved for LeRobot checkpoints that contain a LeRobot `config.json` with a `type` field. ```bash lerobot-eval \ From a17da38b2acf4706f7ca8c61e34960fdd921de76 Mon Sep 17 00:00:00 2001 From: nv-sachdevkartik Date: Thu, 2 Jul 2026 14:21:30 +0000 Subject: [PATCH 11/15] docs(groot): remove checkpoint download note above LIBERO eval --- docs/source/groot.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 76f18f6ad..d1d9d58c6 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -162,8 +162,6 @@ Preliminary LeRobot integration results (GR00T-LeRobot, `eval.n_episodes >= 50` | LIBERO 10 (Long) | 90% | | **Average** | **93.75%** | -Download the suite checkpoint locally, then point `--policy.base_model_path` at the downloaded subdirectory. `--policy.path` is reserved for LeRobot checkpoints that contain a LeRobot `config.json` with a `type` field. - ```bash lerobot-eval \ --policy.type=groot \ From 0a1c2cb76cb871dd04c2c6307e890ef66f61d201 Mon Sep 17 00:00:00 2001 From: lbenhorin Date: Fri, 3 Jul 2026 12:02:08 +0300 Subject: [PATCH 12/15] docs(groot): update training and rollout commands with new parameters and dependencies --- docs/source/groot.mdx | 62 +++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index d1d9d58c6..9a6c02ed5 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -76,34 +76,49 @@ To use GR00T N1.7: Here's a complete training command for finetuning the base GR00T model on your own dataset: -```bash -export BASE_MODEL=nvidia/GR00T-N1.7-3B +This command is using the `new_embodiment` flag, which is used for the SO-101 robot, [read more about how GR00T handles different embodiments.](https://github.com/NVIDIA/Isaac-GR00T/blob/main/getting_started/policy.md#--embodiment-tag). -uv run lerobot-train \ - --dataset.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50_20260628_131121 \ +```bash +# install extra deps for training +pip install "lerobot[training]" + +hf auth login +wandb login + +export DATASET_NAME=your_data_set +export HF_USER=your_hf_username +export DATASET=$HF_USER/$DATASET_NAME +export REPO_ID="${DATASET}_GR00T17" #this is the model that will be uploaded to huggingface +export OUTPUT_DIR=outputs/train/$REPO_ID + +lerobot-train \ + --dataset.repo_id=$DATASET \ --dataset.image_transforms.enable=true \ --policy.type=groot \ --policy.device=cuda \ - --policy.base_model_path=$BASE_MODEL \ + --policy.base_model_path=nvidia/GR00T-N1.7-3B \ --policy.embodiment_tag=new_embodiment \ --policy.chunk_size=16 \ --policy.n_action_steps=16 \ --policy.use_relative_actions=true \ --policy.relative_exclude_joints='["gripper"]' \ --policy.use_bf16=true \ - --policy.use_flash_attention=true \ --policy.push_to_hub=true \ - --policy.repo_id=sreetz-nv/so101-clean-up-vials-into-rack-50-groot-n17-relact-bs64-20k-20260628_johnny_42 \ + --policy.repo_id=$REPO_ID \ --seed=42 \ --batch_size=64 \ --steps=20000 \ --save_checkpoint=true \ + --save_freq=5000 \ --use_policy_training_preset=true \ --env_eval_freq=0 \ --eval_steps=0 \ - --log_freq=100 \ + --log_freq=10 \ --output_dir=$OUTPUT_DIR \ - --job_name=$JOB_NAME + --job_name=$DATASET \ + --wandb.enable=true \ + --wandb.disable_artifact=true + ``` ## Performance Results @@ -179,23 +194,36 @@ Use `eval.n_episodes >= 50` per suite when reporting success rates. Once you have trained your model using your parameters you can run inference in your downstream task. Follow the instructions in [Policy Deployment (lerobot-rollout)](./inference). For example: ```bash +# install extra deps for roullout and real hardware +pip install "lerobot[feetech,viz]" + +export MODEL_ID=your_trained_model_on_huggingface + +# make sure that camera index matches your setup! +# find index using `uv run lerobot-find-cameras opencv` +WRIST_CAM='wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}' +FRONT_CAM='front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}' +export ROBOT_CAMERAS="{ $WRIST_CAM, $FRONT_CAM }" +export ROBOT_ID=follower_robot +export ROBOT_PORT=/dev/ttyACM0 + uv run lerobot-rollout \ --strategy.type=base \ - --inference.type=rtc \ - --policy.path=$OUTPUT_DIR/checkpoints/020000/pretrained_model/ \ - --policy.base_model_path=$BASE_MODEL \ + --policy.path=$MODEL_ID \ + --policy.base_model_path=nvidia/GR00T-N1.7-3B \ + --policy.n_action_steps=8 \ --robot.type=so101_follower \ - --robot.port=/dev/ttyACM0 \ - --robot.id=orange_andrew \ - --robot.cameras='{ wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"} }' \ + --robot.port=$ROBOT_PORT \ + --robot.id=$ROBOT_ID \ + --robot.cameras="$ROBOT_CAMERAS" \ --task="place the vial in the rack" \ --duration=60 \ --device=cuda \ --display_data=true \ + --inference.type=rtc \ --inference.rtc.enabled=false \ --inference.rtc.execution_horizon=8 \ - --inference.queue_threshold=0 \ - --policy.n_action_steps=8 + --inference.queue_threshold=0 ``` ## License From 7e2178e66b55050beeb6858fafb6da5aac07582a Mon Sep 17 00:00:00 2001 From: Andy Wrenn Date: Fri, 3 Jul 2026 05:20:49 -0700 Subject: [PATCH 13/15] Add sample so101 training command --- docs/source/groot.mdx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 9a6c02ed5..cdf053b0c 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -78,6 +78,31 @@ Here's a complete training command for finetuning the base GR00T model on your o This command is using the `new_embodiment` flag, which is used for the SO-101 robot, [read more about how GR00T handles different embodiments.](https://github.com/NVIDIA/Isaac-GR00T/blob/main/getting_started/policy.md#--embodiment-tag). +```bash +lerobot-train \ + --dataset.repo_id=my-so101-dataset \ + --dataset.revision=main \ + --dataset.video_backend=pyav \ + --policy.type=groot \ + --policy.base_model_path=nvidia/GR00T-N1.7-3B \ + --policy.embodiment_tag=new_embodiment \ + --policy.chunk_size=16 \ + --policy.n_action_steps=16 \ + --policy.use_relative_actions=true \ + --policy.max_steps=20000 \ + --batch_size=320 \ + --steps=20000 \ + --save_freq=2000 \ + --env_eval_freq=0 \ + --eval_steps=0 \ + --log_freq=10 \ + --num_workers=4 \ + --prefetch_factor=2 \ + --persistent_workers=true \ + --output_dir=outputs/train \ + --job_name=groot-n17-so101-my-env +``` + ```bash # install extra deps for training pip install "lerobot[training]" From 234ad0c9c7e4b8a1523392041f6a956c47e9b851 Mon Sep 17 00:00:00 2001 From: Andy Wrenn Date: Fri, 3 Jul 2026 05:24:49 -0700 Subject: [PATCH 14/15] Remove sample so101 training command --- docs/source/groot.mdx | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index cdf053b0c..9a6c02ed5 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -78,31 +78,6 @@ Here's a complete training command for finetuning the base GR00T model on your o This command is using the `new_embodiment` flag, which is used for the SO-101 robot, [read more about how GR00T handles different embodiments.](https://github.com/NVIDIA/Isaac-GR00T/blob/main/getting_started/policy.md#--embodiment-tag). -```bash -lerobot-train \ - --dataset.repo_id=my-so101-dataset \ - --dataset.revision=main \ - --dataset.video_backend=pyav \ - --policy.type=groot \ - --policy.base_model_path=nvidia/GR00T-N1.7-3B \ - --policy.embodiment_tag=new_embodiment \ - --policy.chunk_size=16 \ - --policy.n_action_steps=16 \ - --policy.use_relative_actions=true \ - --policy.max_steps=20000 \ - --batch_size=320 \ - --steps=20000 \ - --save_freq=2000 \ - --env_eval_freq=0 \ - --eval_steps=0 \ - --log_freq=10 \ - --num_workers=4 \ - --prefetch_factor=2 \ - --persistent_workers=true \ - --output_dir=outputs/train \ - --job_name=groot-n17-so101-my-env -``` - ```bash # install extra deps for training pip install "lerobot[training]" From 18a1342ecd93388e40b04aa68b62de237ba622e0 Mon Sep 17 00:00:00 2001 From: lbenhorin Date: Fri, 3 Jul 2026 15:28:19 +0300 Subject: [PATCH 15/15] docs(groot): remove optional Flash Attention setup instructions and update base model path for evaluation --- docs/source/groot.mdx | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/docs/source/groot.mdx b/docs/source/groot.mdx index 9a6c02ed5..25fe3e7fd 100644 --- a/docs/source/groot.mdx +++ b/docs/source/groot.mdx @@ -43,25 +43,6 @@ For a source checkout: pip install -e ".[groot]" ``` -### Optional: Flash Attention acceleration - -Flash Attention is a purely optional performance optimization. **LeRobot neither installs nor requires it**, and setting it up is up to the user as it has environment-specific build requirements (a matching PyTorch/CUDA toolchain). To enable it: - -1. Install a `flash-attn` build matching your PyTorch/CUDA environment (see the [Flash Attention project](https://github.com/Dao-AILab/flash-attention)): - -```bash -# Check https://pytorch.org/get-started/locally/ for the right CUDA wheel index for your system. -pip install "torch>=2.7,<2.12.0" "torchvision>=0.22.0,<0.27.0" \ - --index-url https://download.pytorch.org/whl/cu128 -pip install "ninja>=1.11.1,<2.0.0" "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__} imported successfully')" -``` - -2. Install lerobot with the groot extra. - -3. Opt in by passing `--policy.use_flash_attention=true` when training/evaluating GR00T. If the kernel is missing or fails to import, the backbone transparently falls back to SDPA. - ## Usage To use GR00T N1.7: @@ -141,7 +122,7 @@ lerobot-train \ --dataset.revision=main \ --dataset.video_backend=pyav \ --policy.type=groot \ - --policy.base_model_path=$BASE_MODEL \ + --policy.base_model_path=nvidia/GR00T-N1.7-3B \ --policy.embodiment_tag=libero_sim \ --policy.push_to_hub=false \ --policy.max_steps=20000 \ @@ -178,9 +159,11 @@ Preliminary LeRobot integration results (GR00T-LeRobot, `eval.n_episodes >= 50` | **Average** | **93.75%** | ```bash +export MODEL_ID=your_trained_model_on_huggingface + lerobot-eval \ --policy.type=groot \ - --policy.base_model_path=$BASE_MODEL \ + --policy.base_model_path=$MODEL_ID \ --policy.embodiment_tag=libero_sim \ --env.type=libero \ --env.task=libero_spatial \