← Back to project

Molmo2 Codec V5 Architecture Audit — vs. AdaCodec / JoyAI-VL-Interaction

Code-level comparison · audited 2026-07-24 · V5 is implemented but has not been trained
Molmo2AdaCodecJoyAI-VL-InteractionV5architecture auditMLVU

1 · Verdict

Bottom line
Yes — structural risk
The current P path does not satisfy Molmo2's pretrained visual-interface contract.
What V5 fixes
Temporal zero-collapse
Useful, but it leaves the dominant connector, mask, and Stage-1/2 bridge mismatches unchanged.
Recommended move
Build V6 before 130k
Run a 5k-step native-interface pilot before committing a full V5-scale training run.

2 · Evidence boundary: what is and is not comparable

EvidenceWhat it supportsBoundary
AdaCodec paperCodec architecture, attention mask, 64→16 native merger, two-stage recipe, scale, benchmark and efficiency numbersPrimary reference for the codec
JoyAI-VL-Interaction paperInteraction system, Qwen3-VL base, per-second decisions, 4M+ aligned clips, AdaCodec integration claimSystem-level evidence, not released codec code
Official JoyAI repositoryReleased inference/system codeCodec version is still an unchecked TODO; a literal code-to-code codec comparison is impossible
Molmo2 codec repositoryOur implementation and integration pathAudit snapshot: local commit 59320178; V5 commit is not yet on the public remote
Interpretation rule: “JoyAI comparison” below means our code vs. the AdaCodec paper used by JoyAI, plus released JoyAI system claims. It does not imply access to unreleased JoyAI codec source.

3 · The decisive architecture difference

AdaCodec / JoyAI paper Molmo2 V5 — current Molmo-native target 5-channel uₜresidual RGB + motion Trainable E_P ViTblock mask preserves patch stream 64 latent states → 8×8 gridspatial capacity before compression native 2×2 merger64 → 16 P tokens LLM interfacematching intermediate layersvia Qwen3-VL DeepStack 5-channel uₜresidual RGB + clipped motion Trainable E_P ViTstandard full self-attention 16 queries, final layer onlyno 8×8 latent grid fresh Linear 1152→2560native Molmo connector bypassed LLM interface mismatchI: [-3,-9]+attn-pool+MLPP: final-layer+Linear same 5-channel uₜretain codec front end E_P + block maskpatches cannot attend to latents 64 latent states → 8×8read layers −3 and −9 native attention_meanq pool2×2 cells: 64 → 16 pretrained Molmo MLPsame feature contract as I framesfreeze vision-side in Stage 2
Mismatch 1
No block mask
Our appended queries participate in ordinary bidirectional ViT self-attention, so they can perturb patch states at every layer.
Mismatch 2
16 direct queries
AdaCodec first produces 64 spatial latent states, then applies the base model's native 2×2 merger to reach 16.
Mismatch 3
Wrong feature contract
P uses final-layer states plus a fresh Linear; I uses two selected ViT layers, attention pooling, and a pretrained MLP.

4 · Risk matrix

ComponentAdaCodec / JoyAI referenceMolmo2 V5RiskExpected consequence
Base visual interfaceReuse Qwen3-VL native merger and matching intermediate featuresBespoke final-layer Linear for P framesP0LLM receives an out-of-distribution visual embedding family
Latent topology64 latents on 8×8 grid → 2×2 merger → 1616 unconstrained queries directlyP0Less capacity and no native spatial aggregation
Attention maskPatch tokens cannot attend to latent tokensFull self-attentionP0Pretrained patch computation is no longer preserved
Stage-1 targetFeature prediction aligned to the deployed visual stackFinal ViT layer → adaptive 3×3 average pool → HφP0Proxy success does not establish LLM-interface compatibility
Stage-2 freezeDiscard Hφ; freeze visual-side modules; update LLMFreeze E_P; train P Linear and Molmo connector with LLMP0Short SFT must repair the interface while the two visual paths drift differently
Temporal coveragee_t trained over GOP positionsSinusoidal e_t covers 1…16, but Stage-1 launcher still uses 8 framesP1No zero rows, but no learned deep-GOP behavior
Motion valuesMotion passed to widened stem without the documented ±16 clamp±48 search; divide by 16; clip to ±1P1All motion components above 16 px collapse to the same magnitude
GOP thresholdOne globally calibrated γgamma=None → per-video calibrationP1Each video is forced toward a similar I/P ratio; token allocation is less content-adaptive
New-host portabilityEnvironment-specific, but launch inputs must resolveV5 launcher and Stage-1 trainer still hardcode the old /weka/... project, model, data, cache, and Conda pathsP1V5 cannot launch on the current host without path parameterization
P-tokenizer fallback safetyRegistered E_P or a safe explicit fallbackself.vit_p = None sits after a return and is unreachableP2Current attach paths mask it; an unattached fallback can raise AttributeError
2 fps, patch-aligned blocks, trainable E_P, N_P=16RequiredImplementedAlignedThese are not the remaining blocker
Molmo DeepStack / 3D M-RoPEQwen-specific integrationMolmo base has neitherP2Do not copy Qwen mechanics literally; preserve Molmo's own connector contract instead

5 · Why the Stage-1 proxy can improve while MLVU remains weak

Stage 1 trains
E_P + 16 queries + e_t + Hφ
P Linear excluded
Proxy target
last-layer ViT → avg-pool 3×3
not Molmo's deployed connector
Stage 2 consumes
final-layer queries → fresh Linear
E_P frozen; P Linear trained
Corrected Stage 1
E_P + mask + 64-grid latents
Native Molmo contract
layers −3/−9 + attention pool + MLP
Stage 2
freeze all visual-side modules; train LLM

6 · Training scale: current run vs. reference

Bar length = fraction of AdaCodec reference scale
Stage-1 steps
60k / 130k
Stage-2 steps
1.5k / 45k
Stage-2 best tried
3k / 45k
Global batch
64 / 128
GPU count
8 / 64
AxisAdaCodec referenceOur observed / planned stateRead
Stage 1130k steps, GBS 128, LR 1e-4, 4k warmup, cosineV4 checkpoint 60k; V5 plans 130k, BS 16 per process on 8 GPUsV5 step count matches on paper; architecture does not
Stage 245k steps, GBS 128; 40k at 64k token budget + 5k at 224k1500-step matched result; 3000-step trial; GBS 64; 8k contextLarge scale gap, but scaling a mismatched interface is expensive evidence
Corpus3,904,313 Stage-2 examples400k Stage-1 pool; 448k cached videos; Stage-2 mixture is not directly comparableDo not equate cache size with SFT example count
Compute64 H800 GPUs, approximately 12 days8-GPU jobsReference result has much more optimization budget
Decision: scale is a real contributor, but it should be addressed after the P0 interface fixes. AdaCodec's near-lossless result makes the current −23 point gap too large to attribute to scale alone.

7 · V1 → V5: what changed, what did not

V1
skeleton
  • 5 P tokens
  • ±8 motion
  • single-P Stage 1
  • end-to-end smoke only
V2
temporal chain
  • 8 P tokens
  • ±16 motion
  • learned e_t
  • MLVU ≈35 / dense 75
V3
codec alignment
  • 2 fps
  • ±48 search
  • 16 P tokens
  • frozen E_P proxy stays weak
V4
capacity fix
  • trainable 381M E_P
  • proxy gap ≈14× V3
  • MLVU 52 / dense 75
  • 33% token budget
V5
implemented, untrained
  • fixed sinusoidal e_t
  • base 100; scale init 8
  • V4 E_P warm-start
  • P0 interface unchanged
V5-specific launcher defect: the script claims deep-GOP coverage, but omits --max_frames; the trainer default remains 8. The code removes zero embeddings for t≥8 without training E_P on those chain lengths.

8 · Evaluation: same design family, opposite outcome

Codec − dense MLVU accuracy delta
AdaCodec / Qwen3-VL
+3.1
Molmo2 V4, step 1500
−23.0
Molmo2 V4, step 3000
−24.5
Visual scale: each half-axis represents 25 percentage points. Cross-system absolute scores are not directly comparable; the within-system codec delta is the diagnostic.
SystemDenseCodecDeltaToken read
AdaCodec / Qwen3-VL-8B62.265.3+3.115.4% measured overall; 62.7 at ~1/7 tokens
Molmo2 V4, MLVU n=20075.052.0−23.033% in the evaluated setup
Molmo2 V4, 3000 steps75.050.5−24.5More Stage-2 steps did not improve the codec gap
Interpretation: the extra Stage-2 training point argues against “just train the same implementation longer” as the first action. It does not rule out scale after interface alignment.

9 · V5 temporal fix: valid but incomplete

04812 t=1481216 V5 initial norm = 8 for every t V4 t≥8 = exactly zero Stage-1 default clip ends here V5 removes zero-collapse, but the launch script still uses max_frames=8; deep-GOP dynamics remain unseen.
Fixed
No zero rows
Every GOP position 1…16 receives a distinct, non-zero sinusoidal vector.
Unproven
Base = 100
Reasonable short-range encoding choice, but it is a new design choice rather than a paper-matched result.
Still missing
Deep-chain training
The V5 launcher still caps the source clip at 8 frames through the trainer default.

10 · Recommended experiment order

GateChangeBudgetPass criterionWhy this order
Gate AUnit-test block mask: patch states must be invariant to latent-query values at initializationCPU / 1 GPUPatch-state max error ≈ numerical noiseCheap proof that the pretrained patch stream is preserved
Gate B64 latent grid; export layers −3 and −9; route through Molmo attention_meanq + MLP1 GPU smoke16 P outputs in the same LLM feature distribution as I outputsRepairs the dominant feature-contract mismatch
Gate CStage-1 target after the deployed native connector; include P connector parameters in Stage 15k Stage-1 pilotheld-out real < shuffled; plus connector-space cosine / norm parityMakes proxy success relevant to Stage 2
Gate DFreeze all visual-side modules in Stage 2; train only LLM500 and 1500 stepsMLVU n=200 beats V4 52 by ≥5 points at matched tokensSeparates architecture gain from scale
Gate E--max_frames 17; global γ; remove/recalibrate motion saturationablation after Gate Ddeep-GOP quality flat across t; stable I/P distributionPrevents secondary codec-front-end effects from masking the interface result
ScaleOnly then run 130k Stage 1 + long Stage 2full runmatched-budget MLVU, MVBench, VideoMME; quality vs GOP depth; TTFT/memorySpend full compute only after the causal gates pass
Do not do first
Full V5 130k
It preserves all three P0 structural mismatches.
Best next artifact
V6 interface pilot
Minimal proof: native connector alignment, block mask, 64→16 latent grid.
Decision point
MLVU ≥57
A ≥5-point gain over V4 at 1500 matched steps is a strong signal to scale.
Sources: AdaCodec · JoyAI-VL-Interaction · official JoyAI repository · Molmo2 codec repository. External claims are separated from local code-audit findings and engineering inferences.