GR00T N1.7-3B Fine-Tune v8 β Unitree G1 "grab the bottle" (right hand, SONIC WBC, DP speedup + segment-removed dataset)
v8 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 405-episode / 47,944-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 v8 different β speedup resampling plus segment removal. v8's dataset is the same fusion of the two source sets (the 105-ep set + the 115-ep "worst-positions" set) that v7 used, processed by the same dynamic-programming (DP) resampling in the wrist's Cartesian space (targeting 3 mm of wrist travel per frame, merge cap max_K=40) β but now with the segment-removal ("cycle-removed") curation applied on top, which v7 deliberately left out. v7 was the speedup-only reference baseline ("better to start with just the speedup, for a reference"); v8 stacks segment removal on top of that fixed speedup, so the v7βv8 pair isolates the effect of segment removal. Segment removal split long episodes into shorter windows β more episodes (220β405) and fewer frames (60,163β47,944), landing near the frame count of the v4 (48,577) / v5 (50,496) zero-wandering sets.
Predecessors: v2 (β¦-210ep-v2-finetune) β the former production champion (superseded by v10 β¦-371ep-v10-finetune, 12/12) (checkpoint-20000, 10/12) β v4 (β¦-417ep-v4-finetune) (radius-5, eval pending), v5 (β¦-314ep-v5-finetune) (radius-20, eval pending), v6 (β¦-502ep-v6-finetune) (merged radius-20, eval pending), v7 (β¦-220ep-v7-finetune) (speedup-3mm only, eval pending), and v1 (β¦-105ep-v1-finetune).
This is a behavior-cloning fine-tune of the full 3B model. Status: trained 2026-06-26, closed-loop eval complete (1/12) β checkpoint-10000 + checkpoint-20000 are published; the family's worst closed-loop result (segment removal hurt vs the v7 speedup-only baseline) keeps v2 in production (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-3mm-cycle-removed-v1 β 405 episodes, 47,944 frames @ 50 Hz (~118 frames/ep), 480Γ640 ego_view camera (no wrist cams); fusion of the 105-ep + 115-ep "worst-positions" sets, DP wrist-Cartesian speedup resampling (3 mm/frame, max_K=40) + segment removal ("cycle-removed") |
| Robot target | Unitree G1 (29-DoF body) + built-in G1 hands (7-DoF/hand) + 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 | 20.02 @ 20k / 10.01 @ 10k (960k frame-views Γ· 47,944 frames) |
| Augmentation | color jitter (brightness 0.3, contrast 0.4, saturation 0.5, hue 0.08) |
| Wall-clock | ~68 min (1h 08m) for 20k steps on 6Γ B200; steady-state ~4.9 it/s |
| Final train loss | 0.0392 @ 20k (smoothed; mean over run 0.091, min 0.021); 0.0645 @ 10k |
| W&B run | redacted (project g1_grab_bottle, entity cloudwalk-research; offline β synced) |
Repository contents
checkpoint-10000/ # 10k steps (10.0 ep)
checkpoint-20000/ # 20k steps (20.0 ep)
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 β the 10k rung (10 ep) sits below v2's ~15.3-epoch sweet spot, the 20k rung (20 ep) above it.
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 = 20.02 epochs on the 47,944-frame speedup + segment-removed set (10,000 steps = 10.01 epochs). The {10k, 20k} pair brackets v2's validated ~15.3-epoch sweet spot β 10k below it, 20k above it (in the same zone as v4 at 19.8 and v5 at 19.0). The production checkpoint is chosen by closed-loop comparison, not by training loss. There is no held-out split; train loss is a fit probe, not a generalization measure.
Training loss (per-1k smoothed train loss, W&B run redacted). Clean monotone cosine decay; no divergence.
| step | 1k | 2k | 4k | 6k | 8k | 10k | 12k | 14k | 16k | 18k | 20k |
|---|---|---|---|---|---|---|---|---|---|---|---|
| loss | 0.232 | 0.119 | 0.086 | 0.101 | 0.057 | 0.065 | 0.057 | 0.041 | 0.038 | 0.040 | 0.039 |
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 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 β the model's grid performance was too poor to warrant it. 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 | 1/12 | 8% |
| π§ Non-convergence (indecision loop) | 1/12 | 8% |
| π₯ Error (knocked bottle over) | 10/12 | 83% |
β οΈ 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. v8 is the family's worst closed-loop performer β 1/12 (8%) grid success, dead last (v2 10/12 > v5 9/12 > v6 8/12 > v7 7/12 > v4 6/12 > v1 4/12 β« v8 1/12), and the highest knock-over rate in the family by a wide margin (10/12, 83%, vs v7's 5/12 and v4's 4/12). The central finding: stacking segment removal on top of the DP speedup hurt β v8 (1/12) is far below v7 (7/12), so the v7βv8 pair shows segment removal reduced competence rather than improving it. The dominant failure mode is the hand closing too high on the bottle, often grabbing air and toppling the objective; in the closer positions the thumb keeps striking (the hand cannot adjust in time). The low BC loss (0.0392 @20k) again confirms training loss does not predict closed-loop competence. Next steps: fine-tune v9 β the 105-episode top-performer source set reprocessed with the finer speedup-2mm resampling β to test whether the finer stride recovers precision without the segment-removal penalty. 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-405ep-v8-finetune",
repo_type="model",
allow_patterns=["checkpoint-20000/*"], # or checkpoint-10000/*
)
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
- 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.
- Speedup + segment-removal dataset. v8's data is the fusion of two source sets (the 105-ep set + the 115-ep "worst-positions" set) processed by DP wrist-Cartesian speedup resampling (3 mm/frame, max_K=40) and then segment removal ("cycle-removed"). It is the direct follow-up to the v7 speedup-only baseline; the v7βv8 pair isolates the segment-removal effect. Compare against the curated v4/v5/v6 lineage and the v2 champion.
- Epoch zone. 20,000 steps = ~20.0 epochs on 47,944 frames; 10,000 = ~10.0. The
{10k, 20k}pair brackets v2's validated ~15.3-epoch sweet spot, so the eval β not the training loss β picks the rung. No 40k extension is planned (recipe locked at 20k for comparability with v4βv7). - Two published checkpoints. Both
checkpoint-10000andcheckpoint-20000are published so the closed-loop eval can pick the better rung. - 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. - Grip anticipation (family-wide). Expected as a family property: as a member of this family trained on data derived from a speedup-resampled + segment-removed version of the merged set (which included the 20 "empty-scene" episodes before processing), v8 should share the grip-anticipation artifact observed on v1βv7 β performing the full grasp motion (approaching and closing the hand) even when no bottle is on the table, and even with the table removed, as if the bottle were present. v8's closed-loop eval was the 12-position grid (which did not include a no-bottle / no-table probe), so this remains an expectation pending a dedicated probe. 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.
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). |
| 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 merged set; no segment removal β reference baseline. |
| v8 (this) | speedup-3mm-cycle-removed-v1 | 405 | 47,944 | 20.0 | 1/12 (8%) | DP speedup + segment removal ("cycle-removed"): the v7 speedup baseline with segment removal stacked on top. Segment removal hurt (1/12 vs v7 7/12) β family's worst performer + highest knock-over (10/12). Saves {10k, 20k}; the v7βv8 pair isolates the segment-removal effect. |
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-3mm-cycle-removed-v1(CloudWalk Research, 2026), PICO 4 Ultra teleoperation on the Unitree G1 with SONIC WBC; fusion of the 105-ep + 115-ep "worst-positions" sets, DP wrist-Cartesian speedup resampling (3 mm/frame, max_K=40) + segment removal (405 episodes, 47,944 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_v8_2026,
title = {GR00T N1.7 Fine-Tune v8 --- Unitree G1 "grab the bottle" (right hand, SONIC WBC, DP speedup + segment-removed 405-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-405ep-v8-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-405ep-v8-finetune
Base model
nvidia/GR00T-N1.7-3B