Update to iter-16300 (default) + iter-6200 best-val; new planning eval, training chart
Browse files- .gitattributes +1 -0
- README.md +61 -32
- cac-combined-16k.png +3 -0
- cac_bestval_fp32.safetensors +3 -0
- cac_fp32.safetensors +1 -1
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
cac-combined-16k.png filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -22,45 +22,71 @@ Meta's exact `src.models.ac_predictor.vit_ac_predictor` (from
|
|
| 22 |
layers, 1024 dim, 16 heads, ~305M params, RoPE, frame-causal block attention,
|
| 23 |
action + state token conditioning (7-dim each). Identical to the shipped AC.
|
| 24 |
|
| 25 |
-
##
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
|
| 39 |
## Evaluation (240 held-out DROID episodes, frozen ViT-g)
|
| 40 |
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
|
|
|
| 49 |
|
| 50 |
-
|
| 51 |
-
~51k-episode data scale helps). On planning, CAC's plan L2 (0.048) is now **on
|
| 52 |
-
par** with AC (0.043); direction still lags (+0.54 vs +0.66) β the axis bound by
|
| 53 |
-
iter count, and Meta trained ~16Γ longer. Open-loop L1 prediction now **beats a
|
| 54 |
-
static baseline at every horizon** (the undertrained iter-2,750 snapshot could
|
| 55 |
-
not), CAC points the right direction on 82% of episodes, and its CEM plan beats
|
| 56 |
-
a random action on 85%. Prediction cosine is a lenient metric; planning quality
|
| 57 |
-
is the real test.
|
| 58 |
|
| 59 |
-
|
|
|
|
|
|
|
| 60 |
|
| 61 |
-
`
|
| 62 |
-
Safetensors metadata: `iter`, `architecture`. Loads `strict=True` into
|
| 63 |
-
`vit_ac_predictor(...)`.
|
| 64 |
|
| 65 |
## Load
|
| 66 |
|
|
@@ -78,6 +104,9 @@ predictor.load_state_dict(sd, strict=True)
|
|
| 78 |
|
| 79 |
## Caveats
|
| 80 |
|
|
|
|
|
|
|
|
|
|
| 81 |
- Train/eval split is index-based on DROID's deterministic institution ordering
|
| 82 |
(first 240 held out), so the eval set is institution-concentrated, not random.
|
| 83 |
- Trained on public DROID data using Meta's published recipe; independent
|
|
|
|
| 22 |
layers, 1024 dim, 16 heads, ~305M params, RoPE, frame-causal block attention,
|
| 23 |
action + state token conditioning (7-dim each). Identical to the shipped AC.
|
| 24 |
|
| 25 |
+
## Checkpoints
|
| 26 |
+
|
| 27 |
+
**Two** checkpoints are published from one continued run toward Meta's
|
| 28 |
+
94,500-iter recipe (still a snapshot, not the finished run):
|
| 29 |
+
|
| 30 |
+
| file | iter | held-out val cosine | note |
|
| 31 |
+
|---|---|---|---|
|
| 32 |
+
| `cac_fp32.safetensors` | **16,300** | 0.818 | default β the most-trained checkpoint |
|
| 33 |
+
| `cac_bestval_fp32.safetensors` | 6,200 | **0.824** | peak held-out val cosine of the run |
|
| 34 |
+
|
| 35 |
+
`--predictor cac` / `download_cac()` resolve to `cac_fp32.safetensors` (the
|
| 36 |
+
iter-16,300 model). Why both are published: see the val-cosine decline below.
|
| 37 |
+
|
| 38 |
+
## Training
|
| 39 |
+
|
| 40 |
+
Effective batch 256, LR 7.5e-5 β 4.25e-4 β 0 (WSD, scheduled over the full 94.5k
|
| 41 |
+
horizon), AdamW wd 0.04, bf16, `torch.compile`. Loss: L1 teacher-forcing + 2-step
|
| 42 |
+
autoregressive rollout (faithful port of Meta's `app/vjepa_droid/train.py`).
|
| 43 |
+
Data: ~51,000 DROID left-cam episodes (~58 h footage β essentially the full DROID
|
| 44 |
+
1.0.1 raw corpus), 8 frames @ 4 fps, 256 px; first 240 held out for eval.
|
| 45 |
+
|
| 46 |
+
Trained across three seamless resume segments: **1ΓH100 to iter 2,800**, then
|
| 47 |
+
**2ΓH100 DDP** to 5,800 and on to 16,300 (5.82 s/iter, ~1.98Γ single-GPU β near
|
| 48 |
+
linear over NVLink). No loss spike across either resume boundary; the WSD LR
|
| 49 |
+
schedule continued on the 94.5k horizon throughout.
|
| 50 |
+
|
| 51 |
+
### The val-cosine decline (why two checkpoints)
|
| 52 |
+
|
| 53 |
+

|
| 54 |
+
|
| 55 |
+
Training L1 (teacher-forced + rollout) falls smoothly **1.02 β ~0.28** across all
|
| 56 |
+
three runs. But held-out val cosine **peaks ~0.823 around iter 6,000 then slowly
|
| 57 |
+
declines to ~0.818 by iter 16,300**, while val held-out L1 drifts *up* β mild
|
| 58 |
+
overfitting on the encoder-dominated cosine metric. Cosine is a lenient proxy,
|
| 59 |
+
though; planning is the real test, and there the iter-6,200 and iter-16,300
|
| 60 |
+
checkpoints are **statistically indistinguishable** (see below). So the extra
|
| 61 |
+
~10k iters regressed the cheap metric at **no measurable planning cost** β hence
|
| 62 |
+
both checkpoints are shipped, for anyone who wants to probe the trade-off.
|
| 63 |
|
| 64 |
## Evaluation (240 held-out DROID episodes, frozen ViT-g)
|
| 65 |
|
| 66 |
+
Offline CEM planning gate (`plan --random-step`: CEM-planned action vs the true
|
| 67 |
+
logged action `a_t` from a random step), identical protocol for all three:
|
| 68 |
+
|
| 69 |
+
| model | plan L2 β true β | cos(plan, true) β | beats random | points right |
|
| 70 |
+
|---|---|---|---|---|
|
| 71 |
+
| V-JEPA 2-AC (Meta) | **0.0396** | +0.650 | 93% | 90% |
|
| 72 |
+
| CAC iter 16,300 (this, default) | 0.0418 | +0.644 | 94% | 88% |
|
| 73 |
+
| CAC iter 6,200 (best-val) | 0.0446 | +0.648 | 92% | 87% |
|
| 74 |
|
| 75 |
+
- **CAC 16,300 vs 6,200**: paired Wilcoxon *p*=0.065 (L2), *p*=0.40 (cosine) over
|
| 76 |
+
238 paired episodes β a statistical tie. CEM's own sampling noise (~0.0003 on
|
| 77 |
+
L2 run-to-run) is a meaningful fraction of the gap.
|
| 78 |
+
- **vs Meta's AC** (trained ~16Γ longer): AC still leads on plan L2, but the gap
|
| 79 |
+
is small and CAC matches it on direction cosine.
|
| 80 |
+
- Open-loop **prediction** cosine is β0.79 for CAC (mean over horizons) β it
|
| 81 |
+
plateaus early and, as the chart shows, is *not* a reliable planning proxy.
|
| 82 |
|
| 83 |
+
## Files
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
|
| 85 |
+
- `cac_fp32.safetensors` β predictor state_dict, fp32, 305M params, 300 tensors,
|
| 86 |
+
iter 16,300 (default). Safetensors metadata: `iter`, `architecture`.
|
| 87 |
+
- `cac_bestval_fp32.safetensors` β same format, iter 6,200 (peak val cosine).
|
| 88 |
|
| 89 |
+
Both load `strict=True` into `vit_ac_predictor(...)`.
|
|
|
|
|
|
|
| 90 |
|
| 91 |
## Load
|
| 92 |
|
|
|
|
| 104 |
|
| 105 |
## Caveats
|
| 106 |
|
| 107 |
+
- Planning numbers are from a `--random-step` CEM gate on 240 held-out episodes;
|
| 108 |
+
they are a custom intermediate probe, not Meta's downstream real-robot success
|
| 109 |
+
metric.
|
| 110 |
- Train/eval split is index-based on DROID's deterministic institution ordering
|
| 111 |
(first 240 held out), so the eval set is institution-concentrated, not random.
|
| 112 |
- Trained on public DROID data using Meta's published recipe; independent
|
cac-combined-16k.png
ADDED
|
Git LFS Details
|
cac_bestval_fp32.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:94fe9843ec6f911eec7bce9e15214e35c2e67735e00bda5e793b2dee89698f5b
|
| 3 |
+
size 1220915504
|
cac_fp32.safetensors
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 1220915504
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6850759a1e1d08564bef8690118a4c54cfebe1568fea0a2ae6ec9fc91fee8968
|
| 3 |
size 1220915504
|