GR00T N1.7 โ€” OpenArm bimanual bottle sort (checkpoint 15,000)

Post-trained nvidia/GR00T-N1.7-3B on an OpenArm bimanual manipulation dataset.

Task: "Put the two bottles on the left into the left bowl and the two bottles on the right into the right bowl."

This repo is the step 15,000 checkpoint (2.23 epochs) of a 20,000-step run. Sibling checkpoints from the same run are published separately:

These checkpoints have not been ranked by any validation metric. GR00T's fine-tuning path cannot compute a validation loss (launch_finetune.py exposes no --eval-strategy flag and gr00t/data/dataset/factory.py asserts eval_strategy == "no"), so the table above is training loss only. A lower training loss does not establish better generalization. Rank them with open-loop evaluation before choosing one.

Embodiment

OpenArm bimanual, 16-D joint space, 3 cameras.

embodiment tag NEW_EMBODIMENT
state / action left_arm(7) left_hand(1) right_arm(7) right_hand(1)
cameras chest_view, left_wrist_view, right_wrist_view โ€” 480x640
action representation arms RELATIVE, hands ABSOLUTE, both NON_EEF
action horizon 16 steps @ 30 fps (~0.53 s)
language key annotation.human.action.task_description

A matching modality config is required at inference time; see Usage below.

Training

base model nvidia/GR00T-N1.7-3B (VLM backbone nvidia/Cosmos-Reason2-2B)
data 600 episodes / 224,608 frames @ 30 fps, single task
trainable projector + flow-matching DiT action head โ€” the 2B backbone stays frozen
batch size 32 (global, 1x A100 80GB)
optimizer AdamW, lr 1e-4, cosine decay, warmup ratio 0.05, weight decay 1e-5
precision bf16
steps 15,000 of 20,000
hardware 1x A100 80GB PCIe, ~5 h for the full 20,000 steps

--tune-llm and --tune-visual were left off, so this checkpoint adapts the action head and projector only.

Usage

Requires Isaac-GR00T (N1.7 / gr00t_n1d7) and access to the gated backbone nvidia/Cosmos-Reason2-2B.

from gr00t.model.gr00t_n1d7.setup import Gr00tPolicy
from gr00t.data.embodiment_tags import EmbodimentTag

# register the modality config for NEW_EMBODIMENT first โ€” see the repo's
# openarm_config.py (arms RELATIVE, hands ABSOLUTE, action horizon 16)
import openarm_config  # noqa: F401

policy = Gr00tPolicy(
    model_path="PID0930/groot-n1d7-openarm-bottle-sort-ckpt15000",
    embodiment_tag=EmbodimentTag.NEW_EMBODIMENT,
    device="cuda",
)

Open-loop evaluation against a held-out episode:

uv run python gr00t/eval/open_loop_eval.py \
    --dataset-path <your lerobot dataset> \
    --embodiment-tag NEW_EMBODIMENT \
    --model-path PID0930/groot-n1d7-openarm-bottle-sort-ckpt15000 \
    --traj-ids 0 --execution-horizon 16 --steps 400 \
    --modality-keys left_arm left_hand right_arm right_hand

Contents

Full training-state checkpoint, including optimizer.pt so training can be resumed. Inference needs only the safetensors shards plus config.json, processor_config.json, statistics.json and embodiment_id.json.

Limitations

  • Trained on a single task with a fixed scene layout. Episodes are unusually uniform (357-386 frames, 11.9-12.9 s), so robustness to layout, lighting or object changes is untested.
  • No validation or real-robot success rate has been measured. Treat as a research artifact.
  • The frozen backbone means visual features were not adapted to this robot's cameras.

License

Apache 2.0, inherited from nvidia/GR00T-N1.7-3B.

Downloads last month
21
Safetensors
Model size
3B params
Tensor type
F32
ยท
Video Preview
loading

Model tree for PID0930/groot-n1d7-openarm-bottle-sort-ckpt15000

Finetuned
(140)
this model