This post is a deep technical dissection of DDTree, presented in the paper *Accelerating Speculative Decoding with Block Diffusion Draft Trees* (Liran Ringel, Yaniv Romano, Technion; arXiv: 2604.12989).
- Paper: arXiv 2604.12989 (2026.4.14)
- Code: https://github.com/liranringel/ddtree
- Project page: https://liranringel.github.io/ddtree/
- Proposition 1 (additivity):
E_{Y~Q}[α_T(Y)] = Σ_{u∈T} q(u)— the expected acceptance length decomposes into a sum over tree nodes, with no cross terms. Proof: writeα_T(Y) = Σ_d 1[Y_1:d ∈ T]and swap expectation and summation. - Proposition 2 (structure of optimum): the top-B prefixes by
q(u)form a valid (prefix-closed) tree and are optimal. Prefix-closure is automatic since any parent has strictly higher probability than its child. Tree construction thus reduces from combinatorial optimization to sorting. - Lemma 1 (top-K suffices): only the top-K = min(B, |V|) tokens per position matter, shrinking the search space from O(|V|^L) to O(K^L).
- Proposition 3 (best-first heap): a max-heap over rank tuples, expanding siblings (next token at same depth) and children (extend one position), pops exactly the top-B prefixes. Complexity O(B log B) vs. O(K^L) brute force and O(B·L·K) beam search (which is not even optimal).
- File graph:
benchmark.py→distributed.py,model/(DFlash drafter, utils),dflash.py, andddtree.py(core), with an optionalcompact_attention.cppC++ extension. - Stage pipeline: DFlash uses (draft, verify, commit); DDTree extends it to (draft, tree_build, tree_compile, verify, commit), with
tree_buildsplit into copy / heap / visibility sub-stages, each CUDA-timed. - The heap is implemented with GPU tensor parallelism (argmax over active path scores per batch) rather than a Python heapq.
- Tree topology is encoded as
tree_indices = [position_in_tree, parent_position], the basis for the attention mask. model/utils.py: draft layers condition on target hidden states sampled uniformly from intermediate layers (skipping the last ~3 layers, which are less informative); supports datasets including gsm8k, math500, aime24/25, alpaca, mt-bench, humaneval, mbpp, lbpp, swe-bench, livecodebench.- Best-first vs. beam search: best-first guarantees optimality at O(B log B); beam search is a local heuristic.
- Node budget vs. depth limit: budgeting by node count lets the algorithm concentrate capacity on high-probability paths of varying depth.
- Flash Attention: required for the drafter (DFlash always uses it); the target verifier is forced to
torch.sdpafor compatibility with the custom tree mask. - DART: relies on external N-gram tries and continuity heuristics; DDTree needs only the drafter's own distribution and has theoretical guarantees.
- OPT-Tree: needs L drafter forward passes; DDTree needs one, thanks to block diffusion.
- Medusa: requires training extra heads and uses fixed static trees; DDTree is dynamic and training-free beyond the DFlash checkpoint.
- EAGLE-3: feature-based autoregressive drafting, layer-by-layer; DDTree drafts in a single pass.
- Gains scale with task openness: largest on Alpaca and MT-Bench (~60%+), moderate on GSM8K/MATH-500 and HumanEval/MBPP (~20–40%), smallest on AIME and SWE-bench (~10–20%) where solutions are highly deterministic.
- DDTree helps more at temperature 1.0 than at greedy, since flatter distributions make alternative paths more valuable.
- Budget sweep B ∈ {16,...,1024}: B=64–128 is the sweet spot; returns diminish beyond 256.
- Experiments on 8× H200 with Qwen3-4B/8B and Qwen3-Coder-30B; tree benefits are relatively larger for bigger models.
- Future: adaptive block size, adaptive node budget (e.g., entropy-driven), multi-block cascades, joint fine-tuning with the target model, multimodal extension.
- Debt: C++ extension portability (CUDA toolchain required), tree attention tuned for Qwen3's GQA, hard Flash Attention dependency, batch-size-1 optimization focus, and memory peaks during tree construction at large B.
Key points
1. Problem: what DFlash wastes
DFlash is a block diffusion drafter: one forward pass on [b, MASK, ..., MASK] (b = bonus token) yields per-position marginal distributions q_1, ..., q_L. Greedy decoding takes the argmax of each, producing a single trajectory. But marginals carry unused information — e.g., if "the"=0.4, "a"=0.35, "an"=0.2 at position 1, 55% of the probability mass on viable alternatives is discarded. Since marginals do not condition on earlier choices, DDTree exploits this by building a tree of the B most valuable prefixes, where value = probability of being accepted. Because target-model path-conditioned probabilities are unknown at draft time, DDTree uses the drafter's factorized distribution Q(y_1:L) = ∏_i q_i(y_i) as a surrogate objective.
2. Mathematical core (three propositions)
3. Code architecture
4. Tree attention: ancestor-only mask
Each tree node attends only to: past context (KV cache), the bonus token (root), its ancestors, and itself — never to siblings or other branches, avoiding cross-branch contamination. Unlike Medusa's static trees, DDTree rebuilds the mask every round.
5. KV cache compaction
After verification, only the accepted path is kept; tree tokens are interleaved in the cache, so simple slicing fails. A C++ extension (compact_tail_inplace) does in-place sparse compaction directly on CUDA memory; a Python fallback (index_select) works but is slower. Without compaction the cache would grow by tree_budget tokens per round.
6. Verifier walk
Verification is a tree walk state machine (INIT → WALK → ACCEPT/REJECT → OUTPUT): the target model samples/argmaxes, descends into the matching child if present, and the first unmatched token becomes the next bonus token. With temperature > 0, standard speculative sampling rules preserve the target distribution exactly.
7. Design trade-offs
8. Comparison with related work
9. Experimental interpretation
10. Future directions and technical debt
11. Engineering philosophy
The entire algorithm fits in ~50 lines of pseudocode: run the drafter once, take top-K per position, find top-B prefixes with a max-heap, build the tree mask, verify once. No extra training components, no external resources — minimalism is DDTree's core design aesthetic.
*(Source post truncated; sections covered above reflect the complete published structure.)*