shrg7 commited on
Commit
c037506
Β·
verified Β·
1 Parent(s): 254296c

step 18000 (best val 0.0041); full training README

Browse files
Files changed (4) hide show
  1. README.md +121 -14
  2. assets/train_config.pkl +1 -1
  3. metadata.pt +1 -1
  4. 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-DROID-absjoint-reasoninit
11
 
12
- MolmoBot-Pi0 (PaliGemma-decoder VLA) **full fine-tune** on the equad DROID data
13
- (`shrg7/droid-equad-stage-1`), with **absolute joint-pose** action targets
14
- (`arm[t] = q[t+1]`, 7 joints + gripper).
15
 
16
- **Reasoning-init variant:** before full fine-tuning, a frozen reasoning LoRA
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
- - Config: `molmobot_pi0_lerobot_droid_absjoint`
22
- - **Checkpoint: step 2000 (intermediate β€” training in progress)**, held-out
23
- `val_action_loss = 0.0199`.
24
- - Contents: `model.safetensors` (flat, full model), `metadata.pt`,
25
- `assets/droid_equad/norm_stats.json`, `assets/train_config.pkl`.
26
- Optimizer state omitted.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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:025f507e7c8f0d7cb753f9bf1c6eca541b90e6ec7b549fbcac683328f75739a8
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:c56cf90a614fdd2e32ea6e352c05b545f484360f11de7e943c3b5e49d8a9b19d
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:60c394e7d6a0218a31460fb7caf68510f46bbe66f9be692cfcbd555d4d17a2ab
3
  size 7011248944
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cca36677d1d8ca6f6772b9edfbd71e931a4053e254e267cbf87424be63ade8c8
3
  size 7011248944