model card
Browse files
README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
base_model: nvidia/GR00T-N1.6-3B
|
| 4 |
+
tags:
|
| 5 |
+
- robotics
|
| 6 |
+
- gr00t
|
| 7 |
+
- unitree-g1
|
| 8 |
+
- inspire-hand
|
| 9 |
+
- manipulation
|
| 10 |
+
datasets:
|
| 11 |
+
- birbirll/g1-inspire-piston-pick-place
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
# GR00T N1.6 — G1 + Inspire piston pick-and-place
|
| 15 |
+
|
| 16 |
+
Fine-tune of `nvidia/GR00T-N1.6-3B` on
|
| 17 |
+
[birbirll/g1-inspire-piston-pick-place](https://huggingface.co/datasets/birbirll/g1-inspire-piston-pick-place)
|
| 18 |
+
(102 success episodes, LeRobot v2.1). Picks up a piston from a table with the
|
| 19 |
+
right Inspire hand (Unitree G1, fixed base). Closed-loop verified in IsaacLab.
|
| 20 |
+
|
| 21 |
+
## Contents
|
| 22 |
+
|
| 23 |
+
- Model weights (bf16 safetensors) + processor/experiment configs — loadable
|
| 24 |
+
with Isaac-GR00T's `run_gr00t_server.py` (`--embodiment_tag NEW_EMBODIMENT`).
|
| 25 |
+
- **`g1_inspire_modality_config.py`** — the modality config used for training
|
| 26 |
+
(register via `--modality-config-path`): state = arms 14 + hands 12 + waist 3
|
| 27 |
+
(dims 29:63 of the raw state are unused tactile); action = 30-D
|
| 28 |
+
(left_arm 7 | right_arm 7 | left_hand 6 | right_hand 6 | base_height 1 |
|
| 29 |
+
navigate 3), 30-step horizon; arms trained RELATIVE (decoded to absolute by
|
| 30 |
+
the server).
|
| 31 |
+
|
| 32 |
+
## Training recipe (single RTX 4090, ~2.5 h)
|
| 33 |
+
|
| 34 |
+
```bash
|
| 35 |
+
python gr00t/experiment/launch_finetune.py \
|
| 36 |
+
--base-model-path nvidia/GR00T-N1.6-3B \
|
| 37 |
+
--dataset-path <local dataset> \
|
| 38 |
+
--embodiment-tag NEW_EMBODIMENT \
|
| 39 |
+
--modality-config-path g1_inspire_modality_config.py \
|
| 40 |
+
--num-gpus 1 --output-dir ./out \
|
| 41 |
+
--max-steps 10000 --save-steps 1000 --save-total-limit 2 \
|
| 42 |
+
--global-batch-size 8 --gradient-accumulation-steps 4 \
|
| 43 |
+
--state-dropout-prob 0.8 \
|
| 44 |
+
--color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
Key knobs: `--state-dropout-prob 0.8` (forces vision conditioning — without it
|
| 48 |
+
the policy shortcuts through proprioception and ignores the camera);
|
| 49 |
+
effective batch 32; default LR 1e-4; loss ~1.16 → ~0.011. On 24 GB GPUs you
|
| 50 |
+
must additionally set the optimizer to `paged_adamw_8bit` and enable gradient
|
| 51 |
+
checkpointing in `launch_finetune.py` (upstream defaults OOM); on A100-class
|
| 52 |
+
hardware the upstream defaults are fine.
|
| 53 |
+
|
| 54 |
+
## Serving notes
|
| 55 |
+
|
| 56 |
+
- The processor expects `shortest_image_edge: 256` — send **raw camera
|
| 57 |
+
frames** and let the server's own transform do all resizing. A client-side
|
| 58 |
+
resize (e.g. to 224) silently degrades the policy.
|
| 59 |
+
- Deployment chunk pacing: 30-step chunks; we execute 20 steps per inference
|
| 60 |
+
cycle, **temporal ensembling OFF** (at low replan rates ACT-style ensembling
|
| 61 |
+
averages stale chunks — measured grasp closure 0.22 with vs 0.99 without).
|