GR00T N1.7 β€” blue-cylinder-handover (shared-norm)

Fine-tune of nvidia/GR00T-N1.7-3B on blue-cylinder-handover for the ROBOTIS FFW SG2 Rev1 bimanual platform, trained with the shared-norm recipe so it can be composed in score space with its group siblings.

Composition group

This model is one of three that share one identical normalization transform:

Model Episodes Frames
pick-blue-cylinder-right-arm-groot-sharednorm 25 4796
pick-blue-cylinder-left-arm-groot-sharednorm 26 4666
blue-cylinder-handover-groot-sharednorm 11 2408

Statistics (mean/std/min/max/q01/q99 for observation.state and action) were computed by pooling all 11,870 frames of all three tasks, then written identically into each member's training dataset. The resulting statistics.json is byte-identical across all three checkpoints:

sha256(new_embodiment stats)[:16] = c89d17a12a2d8642

Because every policy in the group applies the same invertible transform, their scores can be combined directly. Only compose models that report this same hash.

Why shared-norm rather than no-norm

GR00T was pretrained with per-embodiment normalization β€” the base model ships a statistics.json with a separate block for each pretraining corpus (oxe_droid_…, real_g1_…, real_r1_pro_…, xdof_…) and use_percentiles: true, so each was mapped to β‰ˆ[-1, 1] by its own q01/q99 min-max with clipping.

Shared-norm preserves that input range while still giving a composition group one common transform β€” just at group granularity instead of per-dataset. The alternative ("no-norm", identity statistics) achieves composability too, but by making the head predict raw joint radians, which lands well outside the range the pretrained head has ever seen.

Training β€” fully stock

No code patches. Only the dataset statistics differ from a default fine-tune:

Entrypoint gr00t/experiment/launch_finetune.py (unmodified)
Normalization q01/q99 min-max β†’ [-1, 1], use_percentiles=True
Outlier clipping clip_outliers=True (stock, ~2% tail)
Precision load_bf16=False β†’ fp32 (stock)
Base model nvidia/GR00T-N1.7-3B (3.14 B params, 1.62 B trainable)
Embodiment NEW_EMBODIMENT β€” FFW SG2 Rev1
State / action dims 22 / 16 (arm_left 0:8, arm_right 8:16, head 16:18, lift 18:19, odometry 19:22)
Cameras cam_left_head, cam_left_wrist, cam_right_wrist
Data rate 15 fps, 16-step action chunk (β‰ˆ1.07 s horizon)
This task 11 episodes / 2408 frames
Steps 20 000
LR / schedule 1e-4, warmup ratio 0.05, weight decay 1e-5
Batch 32 global, grad accum 1
Final train loss 0.03711
Runtime 3h 59m on one A100-80GB

Task instruction: "Hand over the blue cylinder".

Note on loss: shared-norm losses are not comparable to no-norm losses, which are computed against raw-radian targets on a different scale.

Attention runs via PyTorch sdpa, not flash-attention-2 (the training host's glibc was too old for the prebuilt wheel). Both are exact attention, but results are not bit-reproducible against a flash-attn build.

Contents

Inference-ready only. optimizer.pt and the intermediate checkpoint-10000 are not included, so this cannot resume training.

config.json
model-0000{1,2,3}-of-00003.safetensors   weights, fp32 (β‰ˆ12.6 GB)
model.safetensors.index.json
processor/                    processor_config.json, statistics.json, embodiment_id.json
experiment_cfg/               conf.yaml, config.yaml, dataset_statistics.json, ...

Provenance

Datasets were converted from raw ROS 2 MCAP recordings with the ROBOTIS cyclo_data converter at 15 fps, then given pooled group statistics.

Downloads last month
-
Safetensors
Model size
3B params
Tensor type
F32
Β·
Video Preview
loading

Model tree for omkarpatil/blue-cylinder-handover-groot-sharednorm

Finetuned
(129)
this model