GR00T N1.7-3B Fine-Tune v9 β Unitree G1 "grab the bottle" (right hand, SONIC WBC, gentle 2 mm DP speedup on the curated v2-lineage data)
v9 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 193-episode / 32,786-frame 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.
What makes v9 different β a gentle 2 mm DP speedup applied on top of the curated (v2-lineage) data. v9's dataset is not in the raw-merged branch that v7/v8 used. Its source is gr00t-g1-grab-bottle-right-hand-v2 β the 210-episode wandering-removed set that is the same curation lineage as the v2 production champion. On top of that already-purposeful motion, a dynamic-programming (DP) resampling in the wrist's Cartesian space is applied at a finer 2 mm/frame target (vs 3 mm in v7/v8), keeping a frame only once the wrist has travelled β2 mm (cost Ξ£(arc_gap β target)Β², max_K=40, min_frames=40). Because the source is already wandering-removed, the finer 2 mm target preserves the fine wrist adjustments during the grasp phase that a coarser 3 mm stride would collapse. Result: 210 β 193 episodes (17 dropped for <40 DP-kept frames), 32,786 frames (β25,259 40-action training chunks; 53.1% of the curated source's frames kept). The natural comparison is therefore v9 vs the v2 champion β does a gentle speedup help the champion's already-curated data? β not v7βv9 (different sources β confounded).
Predecessors: v2 (β¦-210ep-v2-finetune) β the former production champion (superseded by v10 β¦-371ep-v10-finetune, 12/12) (checkpoint-20000, 10/12), whose curated data is v9's source β v4 (β¦-417ep-v4-finetune) (radius-5, 6/12), v5 (β¦-314ep-v5-finetune) (radius-20, 9/12), v6 (β¦-502ep-v6-finetune) (merged radius-20, 8/12), v7 (β¦-220ep-v7-finetune) (speedup-3mm raw, 7/12), v8 (β¦-405ep-v8-finetune) (speedup-3mm + cycle-removed raw, 1/12) β and v1 (β¦-105ep-v1-finetune) (4/12).
This is a behavior-cloning fine-tune of the full 3B model. Status: trained 2026-06-26, closed-loop eval complete (8/12) β both checkpoint-10000 + checkpoint-20000 are published; a strong mid-pack result with zero non-convergence, but it does not beat the v2 champion (see Evaluation).Recipe locked to the v5/v6/v7/v8 recipe (20,000 steps, save every 10,000 β {checkpoint-10000, checkpoint-20000}). Closed-loop comparison against the v2 champion is pending (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-speedup-2mm-v3 β 193 episodes, 32,786 frames @ 50 Hz (~170 frames/ep), 640Γ480 ego_view camera (no wrist cams); DP wrist-Cartesian speedup (2 mm/frame, max_K=40) on top of the curated (wandering-removed, v2-lineage) v2 210-ep set |
| 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 / global batch 48 (8 per GPU Γ 6 GPUs); checkpoints saved every 10,000 β {checkpoint-10000, checkpoint-20000} |
| Epochs | 29.28 @ 20k / 14.64 @ 10k (960k frame-views Γ· 32,786 frames) |
| Augmentation | color jitter (brightness 0.3, contrast 0.4, saturation 0.5, hue 0.08) |
| Wall-clock | β64 min (1:03:57) for 20k steps on 6Γ B200; steady-state β5 it/s |
| Final train loss | 0.0308 @ 20k / 0.0561 @ 10k (run mean 0.0845, min 0.0159) |
Repository contents
checkpoint-10000/ # 10k steps (14.6 ep) β natural production candidate (β v2 sweet spot)
checkpoint-20000/ # 20k steps (29.3 ep) β most-trained rung in the lineage (overfit risk)
README.md # this file
Both
{checkpoint-10000, checkpoint-20000}are published (the two rungs the run produces) so the closed-loop eval can pick the better one. Unlike most prior versions, the bet here is on the 10k rung: at 14.6 epochs it lands almost exactly on v2's validated ~15.3-epoch sweet spot, whereas 20k (29.3 ep) is the most-trained rung in the entire lineage.
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.jsonconfig.jsonembodiment_id.json(containsunitree_g1_sonic)processor_config.jsonstatistics.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
Epoch math. This run trains for 20,000 steps = 29.28 epochs on the 32,786-frame 2 mm-speedup set (10,000 steps = 14.64 epochs). The 32,786-frame set is the smallest in the lineage, so 20k pushes the highest epoch count of any version (vs v6 8.0, v2 15.3, v7 16.0, v5 19.0, v4 19.8, v8 20.0). The {10k, 20k} pair brackets v2's validated β15.3-epoch sweet spot β but, unlike v6 (which sat below it), here 10k (β14.6 ep) lands right on the sweet spot and is the natural production candidate, while 20k (β29.3 ep) carries a real overfit risk. The production checkpoint is chosen by closed-loop comparison, not by training loss β and the default bet is the 10k rung. There is no held-out split; train loss is a fit probe, not a generalization measure.
Closed-loop evaluation β completed (real G1). checkpoint-20000 was run closed-loop on the physical G1 + SONIC stack and measured against the v2 checkpoint-20000 champion and the v4/v5/v6/v7/v8 lineage. 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. The fixed-position 5-trial probe was not run. 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.
Results β checkpoint-20000.
Grid (12 fixed positions, 1 trial each):
| Outcome | Count | Rate |
|---|---|---|
| π© Success | 8/12 | 67% |
| π§ Non-convergence (indecision loop) | 0/12 | 0% |
| π₯ Error (knocked bottle over) | 4/12 | 33% |
β οΈ 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. v9 lands mid-pack β 8/12 (67%) grid success, tied with v6 on the count but a cleaner 8/12: like every speedup variant (v5, v7), v9 posts zero non-convergence (0/12) β the DP speedup's committed, decisive motion eliminates the indecision loops that plague the un-speedup sets (v1 5/12, v6 3/12). It is also a decisive recovery from v8's 1/12: the gentle 2 mm speedup on the curated v2-lineage data works, where v8's 3 mm speedup + segment removal on the raw merged set collapsed. The trade-off (seen across the speedup family) holds: speedup fixes non-convergence but costs close-position precision β the positions needing more adjustment time suffer, while the far positions are handled well. A speedup-specific artifact also appeared: a few moments where the wrist adjusted too low in z and the hand struck the table. v9 does not beat the v2 champion (10/12), but its zero-non-convergence profile and the v8 recovery confirm the curated-speedup branch is viable. v2 remains in production.
How to download
from huggingface_hub import snapshot_download
local = snapshot_download(
repo_id="cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-193ep-v9-finetune",
repo_type="model",
allow_patterns=["checkpoint-10000/*"], # or checkpoint-20000/*
)
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-10000 \
--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
- 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.
- Single camera. Only the
ego_view(head) camera was recorded β no wrist cameras. The policy has never seen wrist views. - Deployment needs the SONIC stack. The checkpoint outputs
motion_token+ hand joints forUNITREE_G1_SONIC; it only produces robot motion through the SONIC WBC + ZMQ deploy pipeline. It is not directly executable on a bare G1. - Train loss is not held-out. No episode split; the loss is a smoothed train-fit probe, not a generalization metric.
- Gentle-speedup-on-curated-data dataset. v9's data is the
v2dataset (the first curation of the family: 105-ep source with distance-to-goal wandering removal β 210-ep), DP-resampled in wrist-Cartesian space at a fine 2 mm/frame target (max_K=40). It is a different branch from the v7/v8 raw-merged 3 mm speedup sets β so compare v9 against the v2 champion, not against v7/v8 as a speedup-isolation pair. - Epoch zone β overfit-leaning. 20,000 steps = β29.3 epochs on 32,786 frames; 10,000 = β14.6. The
{10k, 20k}pair brackets v2's β15.3-epoch sweet spot, with 10k on the sweet spot and 20k the most-trained rung in the lineage (overfit risk). The eval β not the training loss β picks the rung, and the default bet is 10k. No 40k extension is planned (recipe locked at 20k for comparability with v4βv8). - Two published checkpoints. Both
checkpoint-10000andcheckpoint-20000are published so the closed-loop eval can pick the better rung. - 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.
- 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 expected 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.
- 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 | 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). Its curated data is v9's source. |
| 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). Saves only {10k, 20k}. |
| 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 raw merged set; no segment removal β raw-branch baseline. |
| v8 | speedup-3mm-cycle-removed-v1 | 405 | 47,944 | 20.0 | 1/12 (8%) | DP speedup + segment removal on the raw merged set (the v7 follow-up). Saves {10k, 20k}. |
| v9 (this) | speedup-2mm-v3 | 193 | 32,786 | 29.3 | 8/12 (67%) | Gentle 2 mm DP speedup on the curated (wandering-removed, v2-lineage) data β a different branch from v7/v8's raw-merged sets. Smallest set β 10k β 14.6 ep sits on v2's sweet spot (natural pick); 20k = 29.3 ep is the most-trained rung (overfit risk). Compare against the v2 champion. |
References
- GR00T N1 β Open foundation model for generalist humanoid robots; base policy fine-tuned here. Paper (arXiv:2503.14734), base model.
- Isaac-GR00T β Training / inference / deployment stack used for this fine-tune. GitHub.
- GR00T-WholeBodyControl (SONIC) β Whole-body controller + teleop + VLA deployment for the G1. GitHub, SONIC paper (arXiv:2511.07820).
- Training dataset β
cloudwalk-research/gr00t-g1-grab-bottle-right-hand-speedup-2mm-v3(CloudWalk Research, 2026), PICO 4 Ultra teleoperation on the Unitree G1 with SONIC WBC; DP wrist-Cartesian speedup (2 mm/frame, max_K=40) on top of the curatedv2210-ep wandering-removed set (193 episodes, 32,786 frames).
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
@misc{cwrl_gr00t_grab_bottle_v9_2026,
title = {GR00T N1.7 Fine-Tune v9 --- Unitree G1 "grab the bottle" (right hand, SONIC WBC, gentle 2 mm DP speedup on the curated 193-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-193ep-v9-finetune}
}
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.
Model tree for cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-193ep-v9-finetune
Base model
nvidia/GR00T-N1.7-3B