step 18000 (best val 0.0041); full training README
Browse files- README.md +121 -14
- assets/train_config.pkl +1 -1
- metadata.pt +1 -1
- model.safetensors +1 -1
README.md
CHANGED
|
@@ -1,26 +1,133 @@
|
|
| 1 |
---
|
| 2 |
license: apache-2.0
|
|
|
|
|
|
|
| 3 |
tags:
|
| 4 |
- robotics
|
| 5 |
- vla
|
| 6 |
- pi0
|
|
|
|
| 7 |
- droid
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
# MolmoBot-Pi0
|
| 11 |
|
| 12 |
-
MolmoBot-Pi0 (PaliGemma-decoder VLA
|
| 13 |
-
|
| 14 |
-
|
| 15 |
|
| 16 |
-
**
|
| 17 |
-
(trained reasoning-only on the same DROID data) is folded into the PaliGemma
|
| 18 |
-
decoder weights in-place, so the full-FT starts from a reasoning-initialized
|
| 19 |
-
backbone (a weight-space prior), rather than plain base weights.
|
| 20 |
|
| 21 |
-
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
license: apache-2.0
|
| 3 |
+
library_name: openpi
|
| 4 |
+
pipeline_tag: robotics
|
| 5 |
tags:
|
| 6 |
- robotics
|
| 7 |
- vla
|
| 8 |
- pi0
|
| 9 |
+
- paligemma
|
| 10 |
- droid
|
| 11 |
+
- manipulation
|
| 12 |
---
|
| 13 |
|
| 14 |
+
# MolmoBot-Pi0 β DROID absolute-joint, reasoning-init full fine-tune
|
| 15 |
|
| 16 |
+
MolmoBot-Pi0 (a PaliGemma-decoder VLA with a flow-matching action expert),
|
| 17 |
+
**fully fine-tuned** on equad DROID with **absolute joint-pose** action targets,
|
| 18 |
+
starting from a **reasoning-initialized** backbone.
|
| 19 |
|
| 20 |
+
**Checkpoint: step 18000** β best held-out validation loss (`val_action_loss = 0.0041`).
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
+
---
|
| 23 |
+
|
| 24 |
+
## What "reasoning-init" means
|
| 25 |
+
|
| 26 |
+
Standard full fine-tuning starts from the base VLA weights. Here we first bake a
|
| 27 |
+
**frozen reasoning LoRA** into the PaliGemma decoder, then full-fine-tune from that
|
| 28 |
+
point. The reasoning adapter is *not* kept as a separate module β its delta is folded
|
| 29 |
+
directly into the base weights:
|
| 30 |
+
|
| 31 |
+
```
|
| 32 |
+
W <- W + (alpha / r) * (B @ A) # applied in-place, per target module
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
+
with `r = 64`, `alpha = 128` (scaling `2.0`), folded across **207 modules**. The
|
| 36 |
+
adapter came from a reasoning-only training run on the *same* DROID data
|
| 37 |
+
(Gemini-annotated chain-of-thought, PaliGemma prompt format).
|
| 38 |
+
|
| 39 |
+
So reasoning enters as a **weight-space prior on the initialization**, not as an
|
| 40 |
+
auxiliary loss and not as a runtime module. After the fold the model is a plain flat
|
| 41 |
+
checkpoint β inference is identical to any other pi0 checkpoint, with no reasoning
|
| 42 |
+
code path and no extra parameters.
|
| 43 |
+
|
| 44 |
+
On resume the fold is deliberately skipped (the delta is already inside the saved
|
| 45 |
+
weights), so it is applied exactly once, at step 0.
|
| 46 |
+
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## Action space
|
| 50 |
+
|
| 51 |
+
Absolute joint pose, 8-dim per step:
|
| 52 |
+
|
| 53 |
+
| dims | meaning |
|
| 54 |
+
|---|---|
|
| 55 |
+
| `0:7` | absolute future joint positions, `arm[t] = q[t+1]` (7 arm joints) |
|
| 56 |
+
| `7` | gripper command (0β1) |
|
| 57 |
+
|
| 58 |
+
Action horizon 16. At execution the prediction is used **directly** as the target
|
| 59 |
+
joint pose β no current-position offset (contrast with the `joint_delta` variant,
|
| 60 |
+
where `target = current_q + pred`).
|
| 61 |
+
|
| 62 |
+
Normalization statistics are bundled in `assets/droid_equad/norm_stats.json`; arm
|
| 63 |
+
stats follow the `observation.state` distribution, gripper from the action gripper dim.
|
| 64 |
+
|
| 65 |
+
---
|
| 66 |
+
|
| 67 |
+
## Training setup
|
| 68 |
+
|
| 69 |
+
| | |
|
| 70 |
+
|---|---|
|
| 71 |
+
| Base checkpoint | `MolmoBot-Pi0-DROID` |
|
| 72 |
+
| Reasoning adapter | reasoning-only LoRA, r=64 / Ξ±=128, same DROID data |
|
| 73 |
+
| Dataset | `droid-equad-stage-1` (LeRobot v3.0) |
|
| 74 |
+
| Cameras | `exterior_1_left`, `wrist_left` |
|
| 75 |
+
| Config | `molmobot_pi0_lerobot_droid_absjoint` |
|
| 76 |
+
| Trainable | **entire model** (full FT, no LoRA, no freezing) |
|
| 77 |
+
| Hardware | 4 Γ NVIDIA L40 (46 GB), DDP |
|
| 78 |
+
| Batch | 64 Γ grad-accum 8 β **effective 512** |
|
| 79 |
+
| Optimizer | AdamW, weight_decay 1e-10, grad clip 1.0 |
|
| 80 |
+
| LR | peak 5e-5, warmup 1000 steps, constant thereafter |
|
| 81 |
+
| Precision | bf16 |
|
| 82 |
+
| Throughput | ~30 s / step |
|
| 83 |
+
| Steps | **20000** (early-stopped; 30000 was the cap) |
|
| 84 |
+
|
| 85 |
+
### Checkpoint selection
|
| 86 |
+
|
| 87 |
+
Validation runs every 1000 steps on **8 fixed held-out batches** (flow noise reseeded
|
| 88 |
+
so the metric is deterministic and comparable across steps). Retention keeps the
|
| 89 |
+
**latest** checkpoint (for resume) plus the **2 best** by `val_action_loss`.
|
| 90 |
+
|
| 91 |
+
### Early stopping
|
| 92 |
+
|
| 93 |
+
Training was supervised by a self-chaining job that, each time a training job ended,
|
| 94 |
+
read the cumulative validation series and either resumed training (if val was still
|
| 95 |
+
improving) or stopped. It resumed 3 times and stopped at step 20000 once no new best
|
| 96 |
+
appeared for 2 consecutive validation points β leaving 10000 of the budgeted steps
|
| 97 |
+
unspent.
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
|
| 101 |
+
## Validation curve
|
| 102 |
+
|
| 103 |
+
`val_action_loss`, every 1000 steps:
|
| 104 |
+
|
| 105 |
+
| step | val | step | val | step | val | step | val |
|
| 106 |
+
|---|---|---|---|---|---|---|---|
|
| 107 |
+
| 1000 | 0.0346 | 6000 | 0.0074 | 11000 | 0.0057 | 16000 | 0.0060 |
|
| 108 |
+
| 2000 | 0.0199 | 7000 | 0.0067 | 12000 | 0.0063 | 17000 | 0.0046 |
|
| 109 |
+
| 3000 | 0.0128 | 8000 | 0.0071 | 13000 | 0.0089 | **18000** | **0.0041** |
|
| 110 |
+
| 4000 | 0.0112 | 9000 | 0.0064 | 14000 | 0.0057 | 19000 | 0.0059 |
|
| 111 |
+
| 5000 | 0.0096 | 10000 | 0.0082 | 15000 | 0.0054 | 20000 | 0.0045 |
|
| 112 |
+
|
| 113 |
+
Roughly an 8Γ reduction from the first validation point, with most of the gain by
|
| 114 |
+
step ~6000 and a slow, noisy tail after ~11000.
|
| 115 |
+
|
| 116 |
+
---
|
| 117 |
+
|
| 118 |
+
## Contents
|
| 119 |
+
|
| 120 |
+
```
|
| 121 |
+
model.safetensors # flat full model (7.0 GB), reasoning delta folded in
|
| 122 |
+
metadata.pt # global_step and training bookkeeping
|
| 123 |
+
assets/droid_equad/norm_stats.json # state + action normalization statistics
|
| 124 |
+
assets/train_config.pkl # serialized openpi TrainConfig
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
Optimizer state is not included (10.9 GB) β this checkpoint is for inference and
|
| 128 |
+
evaluation, not for resuming training.
|
| 129 |
+
|
| 130 |
+
## Related
|
| 131 |
+
|
| 132 |
+
- `shrg7/MolmoBot-Pi0-DROID-absjoint` β same data and action space, **without** reasoning-init (the control)
|
| 133 |
+
- `shrg7/MolmoAct2-DROID-absjoint` β MolmoAct2 on the same absolute-joint DROID targets
|
assets/train_config.pkl
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 1691
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1aa91058f7970777d4acfd8235eacdbf9cde38ac5e5e0fd0131d41ea5ed79df6
|
| 3 |
size 1691
|
metadata.pt
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 2931
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:21ad27a7a6daed6d6c9b6c5777d2f92d077c310972878e543419304856d18317
|
| 3 |
size 2931
|
model.safetensors
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 7011248944
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cca36677d1d8ca6f6772b9edfbd71e931a4053e254e267cbf87424be63ade8c8
|
| 3 |
size 7011248944
|