← Back to project

Three Towers: folding sparse structure into one softmax

WilD3DGen v10 · weekly update · 2026-08-25
architecture3d-generationdiffusioneval

TL;DR

From-scratch failed for a mundane reason: v5–v8 were never warm-started. The config path was dead code.
v10 folds the sparse-structure tower (SS) into the same softmax as geometry and texture. No shared weights.
First eval where the model generates its own coordinates instead of being handed the ground truth.

1 · Why we changed course

Quality and conditioning, same probe. Both sat still through the 1.8M pool and distillation — distillation pushed conditioning down. The warm start moved both in 2,000 steps.
Capacity first, then data and distillation. Every attempt before day six was aimed at the wrong target.
The warm start won in 1/25 the steps. That settled the recipe.

2 · What v10 is

SS is a third key segment, not a side branch and not a gated add.

3 · How SS is stitched in

Upstream hands off once, at the end. v10 meets at every block.
The excluded segment is never gathered — not zeroed.
3π/2 for SS, so both readers can separate every pair.
Two ropes on one tensor. SS cell c sits between slat voxels 2c and 2c+1.

4 · Why the attention is dynamic

Flip a cell, and exactly its block moves. The attention row length moves with it.
A different point set per asset. SS always gets the same full grid.
One real batch: 4,496 to 16,324 keys. Nothing is padded.
91% of assets have each slat tower smaller than SS.

5 · Results at checkpoint 1500

14 up, 14 down, 4 unchanged. p = 0.75.
Texture MSE fell 65%; std came back from 146% to 89%.
What std 146% looks like. Same GT geometry in all three columns, so every difference is texture.
The two cups look identical yet score 0.18 apart — occ_iou punishes sub-voxel alignment. The real failure is object identity: an armchair became a sofa.

6 · Open questions

v10 · 3.9B all-trainable · 32×H200 · batch 256 · 11.0 s/it · 2,200 / 20,000 steps · val200, n=32 paired, coordinates never GT