CoolFace
Modelpublic

Cybernetic-Labs/openarm-packingbench-v2-groot-n17-90k-390ep

sourceHugging Facecc-by-4.0updated 2mo agoView on Hugging Face
0likes51downloads
Model Card

GR00T N1.7 — OpenArm Bimanual, PackingBench v0.2 (390 episodes, 90k steps)

A GR00T N1.7 finetune for the PackingBench v0.2 carton-packing benchmark on an OpenArm v2 bimanual robot (16-DOF: 7 arm joints + 1 gripper per arm) in Isaac Sim.

This is published as a baseline, including its failure modes — see Results and Known issue below, which are the most useful part of this card.

Task

Pack required items into a cardboard carton, leave them stable, and close the four flaps. Four prompts, 12 benchmark instances:

promptepisodes
Pack one required item into the carton and leave it stable.45
Pack one required item into the carton, leave it stable, and close it.75
Pack two required items into the carton, leave them stable, and close it.135
Pack three required items into the carton, leave them stable, and close it.135

Training

  • —Base: nvidia/GR00T-N1.7-3B (backbone nvidia/Cosmos-Reason2-2B, gated)
  • —Data: `openarm-packingbench-v2-groot-lerobot` — 390 teleop episodes, 579,471 frames, 30 fps
  • —90,000 steps, global batch 8, lr 1e-4, cosine decay
  • —Tuned: diffusion model + projector. Frozen: LLM + visual encoder
  • —Single-frame state ("nohist"), 16-step absolute non-EEF action horizon
  • —4 cameras: front, high_opposite, wrist_left, wrist_right
  • —Final train loss 0.0206–0.023; ~11 h on one RTX 6000 Ada

Note: trainer_state.json reports epoch: 1.0, but that is global_step / max_steps, not real dataset passes. 90,000 steps × batch 8 ÷ 579,471 frames ≈ 1.24 true epochs.

Observation / action contract

State and action are both 16-dim, ordered left_arm(7), left_gripper(1), right_arm(7), right_gripper(1).

Gripper values are RADIANS, not degrees — action gripper range is [0, 0.785] left and [-0.785, 0] right. An earlier converter wrote degrees (±45) against radian state (±0.785), a silent 57× mismatch that ruins training. If you retrain from the raw data, check this first.

Results (PackingBench v0.2, 12 instances)

Weak. Across the benchmark it approached objects but mostly failed to grasp: 3/12 instances picked, 1/12 placed, 0/12 closed the carton.

Known issue: the dataset mix, not the recipe

The cause was the training mix, not the hyperparameters. GR00T samples by frame, not by episode, and episode length varies a lot per task (pack-1 ≈ 527 frames, pack-3 ≈ 1,971). Adding the 135 pack-3 episodes pushed multi-item packing to 81% of all training frames and collapsed pack-1-and-close from 78% → 15%.

An earlier 120-episode model trained only on single-item episodes, with an identical recipe, actually packed and closed the carton. So more data made the learnable task worse — negative transfer through frame-share dilution.

If you train on this dataset: compute each task's share of frames, not episodes, and keep the target skill dominant. GR00T's SingleDatasetConfig.mix_ratio gives per-dataset sampling weights.

Files

Standard GR00T checkpoint (model-0000{1,2,3}-of-00003.safetensors, experiment_cfg/, statistics.json, trainer_state.json) plus data_config.py (the OpenArmBimanual4CamDataConfig used at inference) and model_config.json (evaluation-platform metadata: action_dim 16, exec_horizon 8, camera mapping).

Related