Stage-6 — E2E V-JEPA2 encoder-unfreeze

Fine-tune the video encoder end-to-end on streamed data — break the frozen-feature ceiling, then the cross-lab OOD ceiling. 2026-06-20

in-dist 0.26→0.97OOD few-shot F1 0.91 / dir 0.88branch stage6-e2e-stream

TL;DR. The recurring "encoder-unfreeze is the next lever" (named across Stages 1–5) is validated. Unfreezing V-JEPA2 ViT-L end-to-end (trained on raw video streamed from HuggingFace, no pre-extraction) lifts in-distribution contact-F1 from 0.26 → 0.97 — the frozen encoder capped ~0.78 with direction collapse. Cross-lab zero-shot (held-out lab "crisp") needs more: direction is fixed by EE-frame label unification, contact by augmentation, but pure zero-shot plateaus ~0.47. A small dose of target data — few-shot adaptation on crisp episodes — breaks the OOD ceiling: 30 episodes → held-out F1 0.79, and 60 episodes → F1 0.91 / dir 0.88, matching the frozen-adapted 0.90 and far exceeding it on direction (which the frozen pipeline could never recover).

1. In-distribution — encoder-unfreeze breaks the frozen ceiling

checkpointcontact-F1dir cosMAE
frozen V-JEPA + TCN (Stages 1–5)~0.78collapse
probe (frozen, head only)0.260.711.59
E2E LP-FT ep50.720.890.51
E2E LP-FT final (run2)0.970.960.35

LP-FT: 2 probe epochs (frozen) → unfreeze last 8 blocks, LLRD 0.70, EMA 0.999, bf16. 4×A6000, streamed FMB+fmb_multi+REASSEMBLE.

2. Zero-shot cross-lab — the lever stack, then a plateau

-0.20.00.20.40.60.81.00.330.35run1world-dir0.330.38run2EE-dir0.450.47run3EE+augmentpeg F1eth F1dir cos (+ green / − red)

Crisp is a held-out lab, never trained on. run1 (world-frame dir) → direction collapses (cos −0.14/−0.21). run2 expresses force in the end-effector frame (R(ee_quat)ᵀ·Fworld) → direction recovers (+0.20/+0.28). run3 adds photometric+crop augmentation → contact + direction both rise (F1 0.45/0.47, dir 0.33/0.46). But zero-shot contact-F1 plateaus ~0.47 — below the trivial all-positive baseline (0.76). The cross-lab gap is too wide for pure zero-shot.

3. Few-shot target-adaptation — breaks the OOD ceiling

0.00.20.40.60.81.0trivial all-positive F1 = 0.760.420.540.790.900.430.540.730.860 eps15 eps30 eps60 epscrisp few-shot adaptation episodes (held-out eval)contact-F1dir cos
crisp episodespeg F1 / direth F1 / dir
0 (zero-shot run3)0.39 / 0.380.44 / 0.49
150.53 / 0.520.54 / 0.57
300.79 / 0.750.78 / 0.72
600.91 / 0.880.89 / 0.84

Fine-tune the run3 E2E checkpoint (encoder last-8 + TCN head, enc-lr 1e-5, EMA) on a few crisp train episodes; evaluate on held-out crisp episodes. ~30 episodes clears the trivial baseline; ~60 episodes reaches F1 0.91 / dir 0.88 — matching (and on direction, far exceeding) the frozen pipeline's 0.90, which was likewise crisp-adapted but with collapsed direction.

Engineering notes

Stream tap: lerobot 0.5.2 + lvjonok fsspec-streaming addon (fixes a chunked-video frame-index bug on HF Hub). Gotchas solved: 1-parquet-shard datasets → DDP shard by disjoint episodes; buffer-size 48 (256 OOMs multi-rank); batched encode (GPUs 100%); bf16 not fp16; delta_timestamps smooths force → crisp uses cached canonical labels joined to streamed video by frame index; 2-cam decode via a meta.video_keys property patch. All scripts + checkpoints on git branch stage6-e2e-stream.

Next: RH20T joint phase (video-tactile co-training — M3L / VTAM balanced cross-modal attention / ForceMapping) when RH20T encoding lands.