LLM·

D3D diffusion drafter — Asynchronous speculative decoding — What does it mean?

The news. On November 4, 2026, researchers from Fudan University and partner institutions posted D3D to arXiv: a standalone diffusion drafter that drafts the next blocks during verification. Across seven benchmarks it averages 5.00× and 5.71× decoding speedup over plain decoding with Qwen3-8B and Qwen3-32B targets. Read the paper →

Picture a kitchen where the head chef tastes each plate before it leaves, and the sous-chef plates the next course. In the usual setup the sous-chef waits for the head chef's notes on the plate just approved, and only then starts the next one. The pass is fast, but the two never work at the same time. That is how a target-conditioned drafter behaves: the next draft needs fresh hidden states from verification, so drafting and verifying run one after the other, even though the drafter fills a whole block in one forward pass. See how the draft-verify loop works for the base loop.

D3D removes the notes. Its drafter reads only the token prefix, never the target's hidden states, so it does not have to wait for verification to finish. Two training choices make that workable. Blockwise denoising teaches it to fill in a block of 16 tokens in one pass, and an auxiliary autoregressive loss on target-generated responses keeps the guesses coherent. Setting that loss weight to 1 raised acceptance length by 0.24 to 0.40 tokens over diffusion-only training in the paper's ablation. With these in place, D3D beat every baseline in acceptance length on all seven benchmarks.

Now the sous-chef can start early, but there is a catch: nobody knows yet where the head chef will stop approving. So the sous-chef pre-plates one tray for each plausible outcome, all in a single packed drafter pass. Each tray extends the current prefix by the tokens accepted before a rejection point, a different token at that point, and a fresh block after it. One more tray covers the case where every token passes. When verification ends, if the verified prefix matches a prepared tray, that tray is served immediately; if not, the target waits while D3D drafts synchronously, exactly as before. The paper takes this scheme from Speculative Speculative Decoding, which did it with autoregressive drafters, and shows it with a single-pass diffusion drafter. A related idea for looped models is covered in LoopSpec.

The size of the packed pass is a budget you choose: with block size B, rejection positions covered C, and F alternative tokens per position, the draft budget is B × [(C − 1) × F + 2] tokens. The next table shows why more coverage is not automatically better.

Setting (B = 16, AIME25)Draft budgetCache hit rateEffect on speedupSource
C = 12, F = 2384 tokens71.3%Best, about 5.0×Paper, Sec. 4.3
C = 16, F = 2512 tokens (from the formula)78.3%Lower than C = 12Paper, Sec. 4.3
C = 12, F = 5912 tokens81.8%Lower than F = 2Paper, Sec. 4.3

Read the table row by row: a higher hit rate bought a lower speedup, because every packed pass also computes trays that verification never picks. The paper therefore chooses the budget by measured speedup, not by hit rate.

Here is the arithmetic with (illustrative) timings, since the paper reports end-to-end speedups and not these latencies. Say one packed drafting pass takes 8 ms and one verification pass takes 20 ms, and a hit rate of 71.3%. Without overlap every round costs 8 + 20 = 28 ms. With overlap, a hit hides the draft entirely, so the round costs only the 20 ms of verification. A miss costs 20 + 8 = 28 ms, because the target waits for a fresh draft. The expected round is 0.713 × 20 + 0.287 × 28 ≈ 22.3 ms, so 28 ms falls to about 22.3 ms per round, about 1.26× faster before counting any change in acceptance length. The condition for a clean hide is that drafting finishes within the verification time, which is why a bigger budget can backfire.

That condition also explains the second D3D idea, acceptance-guided layer pruning: removing layers with the smallest effect on acceptance length, with recovery training between removals. On Qwen3-8B, dropping 5 of 36 drafter layers (13.9%) kept over 99% of mean acceptance length and raised mean speedup from 4.44× to 4.69× on three benchmarks. Two limits are worth keeping in mind. The gain shrinks as load grows: with the D3D-1.7B drafter and Qwen3-32B on the Transformers backend, MATH-500 speedup fell from 6.1× at one request to 2.7× at 16, while throughput still rose. And the study uses Qwen3 targets only, so the numbers are not a guarantee for other models or serving engines. For how drafters differ, see draft model variants.

Goes deeper in: LLM Serving → Speculative Decoding → The Draft-Verify Idea

Frequently Asked Questions

Check what you knowMap your AI & GPU knowledge across every track — free, role-based