GR00T N1.7-3B Fine-Tune β Unitree G1 "grab the bottle" (right hand, SONIC WBC)
v1 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 105 real-robot teleoperation episodes, for the UNITREE_G1_SONIC embodiment. Released as a reference fine-tune for teams building manipulation policies on the GR00T + SONIC + MuJoCo/G1 stack.
This is a behavior-cloning fine-tune of the full 3B model. Closed-loop evaluation on the real G1 is complete (4/12 grid, 2/5 at the fixed position) β 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-105ep-v1 β 105 episodes, 70,680 frames @ 50 Hz, 640Γ480 ego_view camera (no wrist cams) |
| 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) |
| Augmentation | color jitter (brightness 0.3, contrast 0.4, saturation 0.5, hue 0.08) |
| Wall-clock | β66 min (β4.6 it/s) |
| Final train loss | β0.0825 (from β1.2) |
Repository contents
checkpoint-20000/ # final (20k steps, ~13.6 ep) β the only published checkpoint (one checkpoint per repo, lineage storage policy)
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.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
Training signal. Train loss fell from β1.2 to β0.03 over 20,000 steps (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 β the 105-episode dataset is small and validation defaults to the training data, so treat the loss as a fit probe, not as a generalization measure.
Closed-loop evaluation β completed (real G1). checkpoint-20000 was run closed-loop on the physical G1 + SONIC stack. As the uncurated baseline it sets the floor the rest of the family (v2/v4/v5/v6) is measured against. 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. 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 | 4/12 | 33% |
| π§ Non-convergence (indecision loop) | 5/12 | 42% |
| π₯ Error (knocked bottle over) | 3/12 | 25% |
Fixed position (5 consecutive trials):
| Position | Success |
|---|---|
| Black 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. The baseline. v1 is the family floor: lowest grid success (4/12, 33%), the highest non-convergence rate (5/12, 42%), and only 2/5 at the fixed position. Every curated variant (v2/v4/v5/v6) beats it on grid success, confirming that curation β not raw fitting β drove the gains. The gap is telling: v1's final train_loss (0.0825) is ~2.7Γ v2's (0.0303), yet its closed-loop success is 4/12 vs v2's 10/12 β training loss does not predict closed-loop competence.
How to download
from huggingface_hub import snapshot_download
local = snapshot_download(
repo_id="cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-105ep-v1-finetune",
repo_type="model",
allow_patterns=["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-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.
- Possible overfit. Loss reached β0.03 over β13.6 epochs on 105 episodes. Only
checkpoint-20000is published (one checkpoint per repo, lineage storage policy); no intermediate rung is retained. - Closed-loop evaluated. 4/12 grid success (33%) + 2/5 at the fixed position β the family floor; every curated variant (v2/v4/v5/v6) beats it. See Evaluation.
- 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 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.
- 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 (this) | 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, ~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
- 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).
- NVlabs tutorials β data collection, VR whole-body teleop, VLA inference.
- Training dataset β
cloudwalk-research/gr00t-g1-grab-bottle-right-hand-105ep-v1(CloudWalk Research, 2026), PICO 4 Ultra teleoperation on the Unitree G1 with SONIC WBC. - Cluster runbook β End-to-end procedure (collect β finetune β deploy) tracked internally at CW-RL.
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_v1_2026,
title = {GR00T N1.7 Fine-Tune v1 --- Unitree G1 "grab the bottle" (right hand, SONIC WBC)},
author = {{CloudWalk Robotics Lab}},
year = {2026},
howpublished = {Hugging Face model repository},
url = {https://huggingface.co/cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-105ep-v1-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.
Model tree for cloudwalk-research/gr00t-n17-g1-grab-bottle-rh-105ep-v1-finetune
Base model
nvidia/GR00T-N1.7-3B