← Back to project

molmo3-3d — Conditioning 3D Generation directly with a VLM

Exploration summary · TRELLIS.2-4B × Qwen3.5-2B · June 2026
condition swapcache + split-training infra DINO × Qwen fusionmulti-task I1/IM/Tmulti-view diagnosis

1 · Background & Goal

The backbone is TRELLIS.2-4B: a cascade 3D generator (SS sparse-structure flow → shape SLAT@512 → texture SLAT@512), natively conditioned on DINOv3 visual features through a cross-attention DiT (the 3D latent is the main sequence; the condition is read as K/V by cross-attention).

Goal: replace the condition with representations from Qwen3.5-2B (a VLM), to drive 3D generation from a single unified interface — {single-image, multi-image, text} → 3D — and lay the groundwork for 3D editing / conversational generation.

2 · Model Architecture

The cascade backbone. The condition enters every DiT block once via cross-attention (as K/V). Key property: the condition is a read-only dictionary — it does not co-evolve with the 3D latent across layers (contrast with MMDiT/joint-attention, §6).
How we evolved the conditioning. (1) native DINOv3; (2) Qwen-only via a small connector (V3); (3) the current best: concatenate raw DINOv3 tokens with connector(Qwen) into one cross-attn, plus DINO-dropout and (for multi-image) a per-view embedding.

3 · Exploration Timeline

V3 · Condition swap
Qwen last-layer hidden → small connector → replace DINOv3. Works, but geometric alignment is limited (Qwen's last layer is semantic, weak on geometry).
Infra · VLM cache + split training
Precompute the frozen VLM hiddens to disk (no VLM at train time); train the three cascade components separately. ≈5× throughput.
Fusion · DINO × Qwen in one cross-attn
cond = [raw DINOv3 tokens ; connector(Qwen)] concatenated into the same cross-attn, with a DINO-dropout curriculum. Beats Qwen-only across the board; reaches teacher-level fidelity.
Multi-task · I1 + IM + T
One set of weights handles three input types (single-image / multi-image / text). I1 fidelity preserved; IM works; T (text→3D) path alive but weak.
Multi-view deep dive
Diagnosed IM "mushiness": ruled out resolution; isolated narrow training view-coverage + OOD viewpoints; in-distribution multi-view is in fact effective.

4 · Key Results

4.1 Fusion reaches teacher-level fidelity

Result: feeding raw DINOv3 tokens and Qwen together into the same cross-attn (DINO bypasses the connector, keeping its native distribution) beats Qwen-only at half the steps — the dome becomes solid, the L-shaped lot reappears, texture hallucinations vanish. Stable at both CFG settings.
Fusion @3000 final. Columns: input | TEACHER (DINOv3) | Qwen-only (S2) | Fusion | Fusion (CFG5) | Qwen-only ablation. Fusion matches TEACHER fidelity; the Qwen-only column shows the dome opening a hole, camo texture on the teapot, etc.

4.2 Ablation: who carries the quality?

On single-image: Fusion ≈ DINO-only (Qwen's marginal ≈ 0), while Qwen-only ≈ the Qwen baseline (the path stays alive, not damaged by fusion training). So single-image fidelity is carried by DINO; Qwen is a "harmless passenger" on single-image and earns its keep on multi-image / text tasks.
Segment ablation. Columns: input | Fusion (both segments) | DINO-only | Qwen-only | TEACHER. Fusion ≈ DINO-only on single-image; Qwen-only still produces an object (the path is alive).

4.3 Multi-task: one model, three input types

Stage-3, three tasks. Top: I1 (single-image, fidelity preserved) / middle: IM (multi-image) / bottom: T (text → 3D). T produces coherent 3D from text alone (non-trivial), but text-to-geometry alignment is still weak (frozen Qwen + only last-20 tuned + text weight 0.2).

5 · Multi-view (IM) — see the dedicated report

The multi-image / multi-view investigation (why IM looked "mushy", and what actually causes it) is written up separately so it can stand on its own: "Multi-view (IM) Diagnosis" (on the hub dashboard). In short: it is not resolution, and not "multi-view is broken" — the bottleneck is training view-coverage / OOD robustness (a data issue). In-distribution, multi-view helps.

6 · Where this sits in the literature

Three "frozen-VLM → generative model" works point to the same signal:

WorkHow the condition is injected
MolmoAct2Per-layer KV-cache: the expert reads the VLM's K/V at the same depth, every layer
EVA-01Concatenated sequence + global self-attention (3D tokens see vision tokens at every layer)
Qwen-RobotWorldDouble-stream MMDiT, layer-wise joint attention (frozen Qwen + VAE, two streams)
Ours (current)Last-layer hidden → small connector → single cross-attn (condition is a read-only dictionary)

Common thread: the ones that work let the condition tokens participate in per-layer joint attention, rather than being queried once by cross-attention. This is the clear direction for our next architecture upgrade (cost: TRELLIS is a cross-attn DiT; moving to joint-attention is major surgery).

7 · Conclusions & Next Steps

molmo3-3d · auto-generated exploration summary (images are real evaluation renders, single seed, pinned views). Infra: VLM-hidden cache + 3-component split training (~5× speedup).