Instructions to use omkarpatil/blue-cylinder-handover-groot-sharednorm with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use omkarpatil/blue-cylinder-handover-groot-sharednorm with LeRobot:
- Notebooks
- Google Colab
- Kaggle
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
- -
Model tree for omkarpatil/blue-cylinder-handover-groot-sharednorm
Base model
nvidia/GR00T-N1.7-3B