allenai/MolmoAct2-SO100_101-Dataset
Viewer • Updated • 8.42k • 1.41k • 7
How to use robocurve/gr00t-n1.7-so101-molmoact2 with LeRobot:
LoRA fine-tune of nvidia/GR00T-N1.7-3B (VLM
backbone frozen; adapters on the action head) for the SO-101 follower arm, trained on the
SO-101 subset of allenai/MolmoAct2-SO100_101-Dataset
with MolmoAct2's annotated language instructions. Adapters (55.4M params, 1.73% of 3.2B; via
peft + category-lora)
are merged into this repo's bf16 weights; raw adapters are in adapters/.
| Data | 39 source repos / 2,242 episodes / 1.8M frames, filtered from the 1,220-repo manifest (rule: robot_type contains so101, identifiable front+wrist cameras, ≥20 episodes, 6-dof state/action). Split: episode-level, 5% held out per repo (min 1), seed 17 → 2,130 train / 112 test episodes |
| Embodiment | NEW_EMBODIMENT with Isaac-GR00T's examples/SO100/so100_config.py; state & action single_arm → [0:5], gripper → [5:6] |
| Image preprocessing | uniform 256×256 letterbox (LongestMaxSize + pad; community repos mix 16:9 and 4:3 cameras), GR00T-default augmentations |
| Schedule | 22,000 steps @ global batch 64 (no accumulation), lr 3e-4 (5% warmup, decay), 1× H100 80GB |
| Checkpoint selection | argmin held-out eval loss over durable checkpoints saved every 250 steps → step 21,000 |
| Headline curve | held-out flow-matching loss: 1.129 → 0.0273 |
LR sweep (250 steps, bs=64, same eval): 5e-5→0.97, 1e-4→0.79, 3e-4→0.59, 6e-4→0.44, 1.2e-3→0.79. 6e-4 won short-horizon but NaN'd the full run at step ~2.5k; 3e-4 trained clean end-to-end.
CategorySpecificLinear, plus action-head norms. Frozen: LLM,
vision encoder, all base weights.fork_rng so values
are comparable across steps and runs. Upstream Isaac-GR00T has no working eval path; ours
is implemented in the training repo
(src/callbacks.py).| Trained by | Robocurve (jeqcho), 2026-07-06 → 07 |
| Training code | https://github.com/robocurve/gr00t-n1.7-so-101 (public: plan, decision records, incident log in CLAUDE.md) |
| Framework | Isaac-GR00T @ ab88b50c718f6528e1df9dcbaf75865d1b604760; torch 2.7.1+cu128, transformers 4.57.3, peft 0.17.1, category-lora 0a02f398 |
| Compute provider | Modal, 1× NVIDIA H100 80GB; 16 vCPUs / 64 GB RAM (video decode was the dataloading bottleneck) |
| Wall-clock | ~11.5 h across resumed segments; preemptions: 1, max steps lost ≤5 |
| Total compute | ≈4×10¹⁸ FLOPs: torch.utils.flop_counter on a real batch ×3 fwd→fwd+bwd heuristic; order-of-magnitude only (undercounts flash-attn, overcounts the frozen backbone) |
| Cost | ≈$70 (published run) / ≈$130 project-total incl. 7-config sweep and two failed attempts |
| Experiment tracking | Weights & Biases, project gr00t-n17-so101, run main-04 |
| Card authorship | written at publish time by the training session (first-hand), from trainer_state.json, wandb, and the repo's decision records |
from gr00t.model.policy import Gr00tPolicy
policy = Gr00tPolicy.from_pretrained("robocurve/gr00t-n1.7-so101-molmoact2")
front (third-person) and wrist (gripper-mounted), letterboxed
to 256×256; state single_arm → [0:5], gripper → [5:6] in LeRobot so101_follower
joint conventions (shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper).single_arm uses GR00T's relative-action representation,
gripper absolute (per so100_config.py); horizon 16 steps. Values are normalized with
per-dataset q01/q99 statistics shipped in experiment_cfg/
and processor/. The policy wrapper applies them; do not feed raw joint values elsewhere.gr00t/eval/run_gr00t_server.py; SO-101 client:
gr00t/eval/real_robot/SO100/eval_so100.py --robot.type=so101_follower. Requires Isaac-GR00T
at the pinned commit or later (N1.7).data/repos_filtered.json.ds_weights_alpha=0.5.CLAUDE.md.main is stable (single published checkpoint, step 21,000). Pin the revision hash for
exact reproduction. Superseding checkpoints will set new_version here.Base model
nvidia/GR00T-N1.7-3B