GR00T N1.7-3B Fine-Tune v2 β€” Unitree G1 "grab the bottle" (right hand, SONIC WBC, curated dataset)

v2 fine-tune of NVIDIA GR00T N1.7-3B (paper) on a Unitree G1 humanoid driven by the SONIC whole-body controller.

Single-handed pick task ("grab the bottle", RIGHT hand). Trained at the CloudWalk Robotics Lab (CW-RL), 2026-06, on a curated 210-episode real-robot teleoperation dataset, for the UNITREE_G1_SONIC embodiment. Released as a reference fine-tune for teams building manipulation policies on the GR00T + SONIC + MuJoCo/G1 stack.

Predecessor: cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-105ep-v1-finetune β€” v1, trained on the original 105-episode dataset and validated closed-loop. v2 re-trains the same recipe on a cleaned dataset: the v1 episodes were split into shorter windows with low-quality segments removed.

This is a behavior-cloning fine-tune of the full 3B model. v2 was validated closed-loop and outperforms v1 β€” it grasps the bottle from object poses where v1 failed (see Evaluation).

Quick facts

Base GR00T-N1.7-3B β€” Qwen3-VL vision-language backbone + flow-matching diffusion-transformer (DiT) action head
Parameters 3.14 B total / 1.62 B trainable (51.5%)
Dataset cloudwalk-research/gr00t-g1-grab-bottle-right-hand-v2 β€” 210 episodes, 62,772 frames @ 50 Hz, 640Γ—480 ego_view camera (no wrist cams); curated from the 105-ep v1 dataset (longer episodes split into shorter windows, low-quality segments removed)
Robot target Unitree G1 (29-DoF body) + Inspire FTP hands (7-DoF/hand: 6 finger joints + 1 grip pad, via InspireFTPGripMapper) + SONIC whole-body controller
Embodiment tag UNITREE_G1_SONIC (unitree_g1_sonic)
State space 43-D (left_leg 6 + right_leg 6 + waist 3 + left_arm 7 + left_hand 7 + right_arm 7 + right_hand 7)
Action space [40 Γ— 78] = 40-step horizon Γ— (64 motion_token + 7 left_hand_joints + 7 right_hand_joints)
Hardware 6Γ— NVIDIA B200 (sm_100 / Blackwell)
Mixed precision bf16
Optimizer AdamW, lr 1e-4 cosine, warmup_ratio 0.05, weight_decay 1e-5
Steps / batch 20,000 (champion) β†’ continued to 40,000 / global batch 48 (8 per GPU Γ— 6 GPUs)
Epochs β‰ˆ15.3 @ 20k Β· β‰ˆ30.6 @ 40k (frame-views Γ· 62,772 frames)
Augmentation color jitter (brightness 0.3, contrast 0.4, saturation 0.5, hue 0.08)
Wall-clock β‰ˆ65 min to 20k + β‰ˆ68 min for 20kβ†’40k (6Γ— B200, β‰ˆ4.6–4.9 it/s)
Final train loss β‰ˆ 0.0303 @ step 20,000 (from β‰ˆ1.27) Β· β‰ˆ0.02 per-step @ step 40,000 (W&B curve; the HF summary train_loss 0.0135 is resume-deflated β€” see Evaluation)

Repository contents

checkpoint-20000/    # 20k steps (~15.3 ep) β€” closed-loop champion (10/12 grid + 5/5 fixed; validated); the only published checkpoint
README.md            # this file

Each checkpoint-NNNNN/ is a self-contained, deploy-ready snapshot:

  • model-00001-of-00002.safetensors + model-00002-of-00002.safetensors (~6.5 GB, bf16)
  • model.safetensors.index.json
  • config.json
  • embodiment_id.json (contains unitree_g1_sonic)
  • processor_config.json
  • statistics.json (dataset normalization stats)
  • experiment_cfg/ (training config snapshot)

DeepSpeed ZeRO partition states, optimizer, scheduler and RNG files are intentionally omitted β€” they are needed only to resume training and would add several GB per checkpoint.

Evaluation

Training signal. Train loss fell from ~1.27 to β‰ˆ 0.0303 over 20,000 steps (cf. v1 final train_loss β‰ˆ 0.0825). Full curves (loss, grad_norm, learning_rate, GPU util) are tracked in W&B (private run). There is no held-out split β€” validation defaults to the training data, so treat the loss as a fit probe, not as a generalization measure.

Closed-loop evaluation β€” completed (v2 is the former champion; superseded by v10, 12/12). checkpoint-20000 was run closed-loop on the physical G1 + SONIC stack. It grasps the bottle from object poses where the v1 policy failed β€” a qualitative improvement attributed to the distance-to-goal curation (shorter, cleaner windows) β€” and now has a quantitative grid result behind it. Low BC loss is a healthy prerequisite, not evidence of a good policy β€” this closed-loop result is the load-bearing signal.

Procedure. The bottle was placed at 12 fixed positions spanning one half-side of the table (the table is fixed relative to the robot). These are the same 12 positions used for data collection (see the source dataset card). One trial per position (12 trials) gives the grid result; then 5 consecutive trials were run at the fixed black-rectangle position, and (for v2) 5 more at a second fixed blue-rectangle position. Legend: πŸŸ₯ red = knocked the bottle over Β· 🟧 orange = stuck in an "indecision" loop, never reaching the bottle Β· 🟩 green = successfully grasped the bottle. The policy was invoked with the task prompt "grab the bottle" β€” the same prompt used to collect the data.

Closed-loop eval: 12-position grid + fixed positions, checkpoint-20000

Results β€” checkpoint-20000.

Grid (12 fixed positions, 1 trial each):

Outcome Count Rate
🟩 Success 10/12 83%
🟧 Non-convergence (indecision loop) 1/12 9%
πŸŸ₯ Error (knocked bottle over) 1/12 8%

Fixed positions (5 consecutive trials each):

Position Success
Black rectangle 5/5 (100%)
Blue rectangle 2/5 (40%)

⚠️ Single-trial methodology. Each of the 12 grid positions is tested once (1 trial/position); repeated placements at the same spot can succeed or fail differently β€” the fixed-position repeat test, where run, shows this per-position variance. Treat the grid score as a single-pass signal, not a repeated-trial mean.

Conclusion. v2 is the former production champion (superseded by v10, 12/12): highest grid success (10/12, 83%), perfect at the black fixed position (5/5), and the tied-lowest knock-over rate (8%, tied with v6). The distance-to-goal curation's shorter, cleaner windows beat every other curation strategy in the family (v4/v5/v6).

Continued training (20k β†’ 40k). The 20k champion was continued to 40,000 steps (true resume). The per-step train/loss fell from β‰ˆ0.04 (at the 20k restart) and settled around β‰ˆ0.02 by 40k (W&B, private run). The HF summary train_loss of 0.0135 is resume-deflated β€” on resume HF divides the 20k-step loss sum by max_steps=40,000, so the real per-step loss is β‰ˆ2Γ— that (the curve is the source of truth). At β‰ˆ30.6 epochs on 62,772 frames this risks overfit, and lower training loss (no held-out split) is not evidence of better closed-loop behavior. checkpoint-20000 remains the validated, production champion and the only checkpoint published on HF; the 40k continuation was logged in W&B but not published as a checkpoint (one checkpoint per repo, lineage storage policy).

How to download

from huggingface_hub import snapshot_download

local = snapshot_download(
    repo_id="cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-210ep-v2-finetune",
    repo_type="model",
    allow_patterns=["checkpoint-20000/*"],   # champion (the only published checkpoint)
)
print(local)

How to deploy

Start the GR00T policy server (from an Isaac-GR00T environment) pointing at the downloaded checkpoint:

python -m gr00t.eval.run_gr00t_server \
    --model-path <local>/checkpoint-20000 \
    --embodiment-tag UNITREE_G1_SONIC \
    --device cuda:0 --host 0.0.0.0 --port 5550

Closed-loop control of the G1 (sim or real) is driven by the SONIC whole-body controller in GR00T-WholeBodyControl: the policy emits motion_token + hand-joint targets that the SONIC WBC decodes into whole-body joint commands. The server must be launched with the same UNITREE_G1_SONIC embodiment tag used in training. See the NVlabs VLA inference tutorial. This checkpoint is not plug-and-play on hardware β€” it requires the SONIC C++ deploy stack and the matching G1 setup.

Known caveats

  1. Right-hand-only, single task. The dataset is one task ("grab the bottle") executed with the right hand. Left-hand and locomotion action dims reflect the (largely stationary) demonstrations; do not expect bimanual or locomotion behavior.
  2. Single camera. Only the ego_view (head) camera was recorded β€” no wrist cameras. The policy has never seen wrist views.
  3. Deployment needs the SONIC stack. The checkpoint outputs motion_token + hand joints for UNITREE_G1_SONIC; it only produces robot motion through the SONIC WBC + ZMQ deploy pipeline. It is not directly executable on a bare G1.
  4. Train loss is not held-out. No episode split; the loss is a smoothed train-fit probe, not a generalization metric.
  5. Possible overfit. The run was continued to 40,000 steps (β‰ˆ30.6 epochs on 62,772 frames) in W&B; more epochs on a small dataset can regress. Only checkpoint-20000 (β‰ˆ15.3 ep) is published β€” the validated champion (one checkpoint per repo, lineage storage policy); the 40k continuation was not published as a checkpoint.
  6. Curated dataset. v2 is a cleaned re-cut of the v1 data: episodes were split into shorter windows and low-quality segments dropped. Closed-loop eval confirms this helped β€” v2 grasps from poses where v1 failed.
  7. Closed-loop eval is now quantitative. v2 was validated on a fixed 12-position grid (10/12, 83%) plus a fixed 5-trial position (5/5), and beats v1 on the same grid (4/12). See Evaluation.
  8. Grip anticipation (family-wide). Observed in closed-loop eval: the policy performs the full grasp motion β€” approaching and closing the hand β€” even when no bottle is on the table, and even with the table removed entirely, as if the bottle were present. This grip-anticipation artifact is shared across the whole grab-bottle family (the same training demonstrations). Worth gating on bottle detection for downstream deployment.
  9. Prompt conditioning β€” untested. All training data was collected with the task prompt "grab the bottle", and the same prompt is used to invoke the policy at inference β€” a constant across every episode and every model in this family. We have not tested whether conditioning the prompt on the bottle's presence (e.g. "grab the bottle if there is one in the image") would gate the grasp and reduce the grip-anticipation artifact noted above (the robot closing its hand even with no bottle present). It is a plausible mitigation, but unverified: the model may have learned the grasp as an unconditional reflex from the demonstrations, independent of prompt phrasing.
  10. Training environment. Trained on 6Γ— B200 GPUs with NCCL_IB_DISABLE=1 NCCL_P2P_LEVEL=NVL (InfiniBand off, P2P over NVLink) and W&B in offline mode (synced post-run). These affect only the training run, not the weights.

Lineage

Version Dataset Episodes Frames Epochs @20k Closed-loop Notes
v1 105ep-v1 105 70,680 13.6 βœ… 4/12 (33%) First GR00T N1.7 + SONIC fine-tune at CW-RL; right-hand bottle pick.
v2 (this) right-hand-v2 210 62,772 15.3 βœ… 10/12 (83%) β€” former champion Curated (episodes split into shorter windows, bad segments removed). checkpoint-20000 = former production champion (10/12), superseded by v10 (12/12).
v4 radius-5 417 48,577 19.8 βœ… 6/12 (50%) Zero-wandering, most aggressive curation (radius 5 β†’ short windows).
v5 radius-20 314 50,496 19.0 βœ… 9/12 (75%) Zero-wandering, least aggressive curation (radius 20 β†’ longer windows, ~161 f/ep).
v6 radius-20-merged 502 120,017 8.0 βœ… 8/12 (67%) Merged (105-ep + 115-ep "worst-positions"), radius-20 with grasp-frame preservation. Largest set β†’ 20k = only ~8 ep (underfit risk).
v7 speedup-3mm-v1 220 60,163 ~16.0 7/12 (58%) DP speedup resampling (wrist-Cartesian, 3 mm/frame, max_K=40) of the merged set; no segment removal β€” reference baseline. β‰ˆ16 ep @20k lands on v2's sweet spot.

References

Attribution

Developed by cloudwalk-research in the CloudWalk Robotics Lab (CW-RL). Fine-tuned from nvidia/GR00T-N1.7-3B using Isaac-GR00T; targets the Unitree G1 with the SONIC whole-body controller.

Citation

If you build on this checkpoint, cite both upstream GR00T/SONIC and this fine-tune:

@misc{cwrl_gr00t_grab_bottle_v2_2026,
  title        = {GR00T N1.7 Fine-Tune v2 --- Unitree G1 "grab the bottle" (right hand, SONIC WBC, curated 210-ep dataset)},
  author       = {{CloudWalk Robotics Lab}},
  year         = {2026},
  howpublished = {Hugging Face model repository},
  url          = {https://huggingface.co/cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-210ep-v2-finetune}
}

@article{gr00t_n1_2025,
  title         = {GR00T N1: An Open Foundation Model for Generalist Humanoid Robots},
  author        = {{NVIDIA}},
  year          = {2025},
  eprint        = {2503.14734},
  archivePrefix = {arXiv},
  url           = {https://arxiv.org/abs/2503.14734}
}

@article{sonic_2025,
  title         = {SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control},
  author        = {Luo, Zhengyi and others},
  year          = {2025},
  eprint        = {2511.07820},
  archivePrefix = {arXiv},
  url           = {https://arxiv.org/abs/2511.07820}
}

@software{isaac_gr00t,
  title  = {{Isaac-GR00T}: NVIDIA's open foundation model stack for generalist humanoid robots},
  author = {{NVIDIA}},
  url    = {https://github.com/NVIDIA/Isaac-GR00T},
  year   = {2025}
}

License

Inherits the NVIDIA Open Model License Agreement of the base model nvidia/GR00T-N1.7-3B β€” see the license terms. This is a research preview: not intended for safety-critical use; closed-loop deployment on a physical humanoid requires human oversight.

Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Model tree for cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-210ep-v2-finetune

Finetuned
(71)
this model

Dataset used to train cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-210ep-v2-finetune

Collection including cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-210ep-v2-finetune

Papers for cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-210ep-v2-finetune