DFlash: Block Diffusion for Flash Speculative Decoding

UC San Diego · Jian Chen, Yesheng Liang, Zhijian Liu · 2026-02-06 · arXiv:2602.06036
关键词: speculative decoding · block diffusion · drafter · EAGLE-3 · KV injection · target hidden features

速读卡片 (TL;DR)

一句话:把 speculative decoding 里的 drafter 从"自回归"换成"block-diffusion + 5 层 target hidden 注入到每层 K/V cache",让 16 个 draft token 在一次 forward 里同时被预测出来,Qwen3-8B 上端到端 ~6× 加速,比 EAGLE-3 再快 ~2.5×。

6.08×
Math500 / Qwen3-8B 端到端
2.5×
vs EAGLE-3 平均加速比
τ ≈ 7.87
平均 acceptance length(block=16)

立场:这是一篇范式分叉论文。EAGLE 系列把"AR drafter"打到了天花板(τ ≈ 3,加速 ≈ 2×);DFlash 主张唯一突破口是把 drafter 换成 block-diffusion——让 drafting 时间几乎与 γ 解耦,从而能放下 5 层的"深"模型,同时把 target 5 层 hidden 永久驻留在 draft K/V 里,使 acceptance 也跟着深度涨。见 EAGLE 演化简报


1 · 动机:为什么 AR drafter 撞了天花板

1.1 历史脉络: Medusa → EAGLE-1/2/3 的路径与极限

过去两年 speculative decoding 的 drafter 路线基本可以画成一条单调向上的曲线,但方向只有一个: 把 draft 网络做得更小、跟 target 对齐得更紧、verification topology 做得更宽。这条线大体是这样:

问题是,从 EAGLE-1 到 EAGLE-3,虽然每代都涨,但涨幅在收敛。原因可以一句话写完:

L = (Tdraft + Tverify) / τ    ⟹    speedup ≈ τ · tsteptarget / (γ · tstepdraft + tverify)

AR drafter 必然有 Tdraft = γ · tstep——γ 个 token 就要走 γ 次 forward。为了让 Tdraft 不爆炸,EAGLE-3 把 drafter 砍到只剩 1 层 transformer。但 1 层 transformer 的 capacity 上限就在那;γ 拉到 7 以后,τ 已经接近平台。

这就是 AR drafter 的天花板: 论文里说得很直接——"This imbalance restricts achievable speedups to approximately 2−3×."

AR drafter (EAGLE-3) γ 个 token = γ 次 forward step1 step2 step3 step γ 深度 ≤ 1 层 (否则 γ × 时间爆炸) Diffusion drafter (DFlash) γ 个 token = 1 次 forward parallel denoise of γ masked tokens 深度可以 5 层(因为时间 ≈ 不变) drafting cost (γ 增加时) EAGLE-3 ~ γ · t DFlash ~ const
AR drafter 的本质问题: Tdraft ∝ γ。为了不让 drafting 占满时间,EAGLE-3 只能用 1 层网络。Block-diffusion drafter 把 γ 个 mask token 同时 denoise 出来,Tdraft 几乎与 γ 无关,所以可以放心做深(5–8 层),换更高的 draft 质量。

1.2 别的方案为什么不够

"AR drafter 撞墙"这件事大家都看到了,过去一年里出现过至少四种突围尝试。但每一种都有自己的硬伤:

方案核心想法谁做过硬伤
Tree-AR一次提议一棵 draft 树, target 用 tree-attention 并行验证SpecInfer / EAGLE-2/3每个枝干仍然是 AR; 树越大 verify cost 越高;在大 batch 下 tree 收益消失
Block-AR在 target 上加 K 个独立 prediction headMedusaK 个 head 共享同一个上下文;后位置 head 没有"已生成 token" 信息,质量梯度衰减
Continuous diffusion drafter把 token logits 看成连续向量做高斯噪声 + denoiseSpecDiff-1需要离散→连续的代理表示;一般要多步 denoise (10+),drafting 反而慢
Discrete (mask) diffusion 大模型当 drafter用 7B 的 LLaDA / Dream 当 drafterDiffuSpec / SpecDiff-2drafter 太大 (7B), drafting latency 占满, 实测加速 3–4× 上不去
Mimic-diffusion AR训一个小 AR 模型去"装"成一次出多 tokenPARD (An 2025)小 AR 容量不够,τ 上限 ~3, speedup ceiling ≈ 3×
Block-diffusion 小 drafter + target hidden 注入 👈5 层 mask-diffusion + 5 层 target hidden 进 K/V cacheDFlash本文主张这条是甜蜜点

看完这张表你就明白 DFlash 在选址上的位置:它同时避开了 (a) 大 drafter 的 latency 陷阱、(b) 小 AR 的 capacity 陷阱、(c) 多步 denoise 的延迟陷阱。具体怎么避的?——靠 5 层 target hidden 永久驻留在 draft K/V 里,把"小模型推理能力不足"的问题外包给了 target 自己。这正是论文那句口号 "the target knows best"

1.3 为什么"把 diffusion 嫁接给 spec decoding"非平凡

把 diffusion 拿来做 drafter 听上去就两步: ① 训一个 mask-diffusion 模型; ② 一次 forward 出 γ 个 token。但落到具体细节上,有四个深坑:

  1. K/V cache 不变性: AR 模型在 spec decoding 里已经把 K/V cache 玩成艺术——每接受 m 个 token,就 commit m 行 K/V。Diffusion drafter 要 mask 一段、再解 mask,每一步 K/V 写哪儿、清哪儿,需要重新设计;否则 K/V state 会被 mask 污染。
  2. 训练时如何保证 inference-train 一致: 标准 block diffusion 是"把 response 切成等大块,每块 mask 一些位置"。但 spec decoding 的 inference 行为是: target 给你一个 verified token (bonus),你以这个 token 为锚点,解后面 γ−1 个 mask。两者的"上下文形状"不一样——这就是论文为什么改成 "random anchor token + 块内剩下都 mask" 的训练策略 (§4)。
  3. Verification 拓扑: AR drafter 提议一条线、tree drafter 提议一棵树。Diffusion drafter 一次出 γ 个并行预测的 token——它们之间是条件依赖的(都从同一组 mask 上 denoise 出来),所以 token-i 是 sample 自 p(·|context, masks),不是 p(·|context, token_{1..i-1})。这导致 token-i+1 不能直接拼在 token-i 后头做 token-by-token rejection——需要重新审视 verification chain。论文(及 DFlash 的实现)走的是"把 γ 个 token 当作一条 sequence,顺序做 rejection"的路线; 一旦中间某位置 reject,后面整段全丢,所以早期位置 disproportionately 重要(这正是 §4 loss decay 设计的根因)。
  4. 训练数据质量与 target 对齐: 如果直接拿原始 Nemotron-V2 / CodeAlpaca 的 ground-truth response 训 diffusion drafter,drafter 会去对齐 ground truth, 但 inference 时它要对齐的是 target model 自己的输出分布。论文的 fix: 先用 target model 自己 generate response,把这个 response 当作训练目标 (§5 Datasets 段)。

没有这四个 fix 中任何一个,DFlash 都跑不出 6×。这才是论文真正的"系统贡献"——主结构是 block-diffusion,但能 work 的是上面这四个细节。


2 · 背景速查

2.1 关键术语

术语含义
Speculative Decodingdraft 提议 γ token, target 并行验证, rejection sampling 保证最终分布 = target 分布
τ (acceptance length)每个 spec 周期平均产出的 token 数, ∈ [1, γ+1] (含 verifier 的 bonus token)
Block diffusion把 sequence 切 block, 块内 mask + 并行 denoise, 块间 AR. 是 Arriola 2025 的"interpolating between AR and diffusion"
Mask token discrete diffusion 里的"未确定"占位符。forward process: clean→mask; reverse: mask→clean
Anchor tokenDFlash 训练里, 块的第一个位置放一个 clean token, 后面 γ−1 位都 mask. 这个 clean token 模拟 inference 时 verifier bonus token
Target context featuretarget model 5 层 hidden states concat → 一个轻量 projection → 紧凑的 fused feature, 注入 draft
KV injection把 fused feature 投影成 K, V, 直接挂到 draft 每层的 K/V cache 里, 持续可被 attend
EAGLE-3 fusion同样取多层 hidden, 但只 fuse 进 draft 的 token embedding 输入端 (input-side)
Flex AttentionPyTorch 提供的可编程 attention mask kernel(Dong 2024),DFlash 用它在训练时同时处理多个 block 的 sparse mask
SGLang Spec-v2SGLang 的 v2 调度,带 draft / verify overlap, 支持 block drafting

2.2 Mask diffusion for text 简版回顾

不需要太多 ELBO 数学,记住这几个事实就够看懂 DFlash:

DFlash 的关键工程小动作: T = 1 (一步出全 block, 不做多步迭代). 标准 block-diffusion 论文里多步 denoise 是为了高质量, 但 spec-decoding 场景下质量靠 verifier 的 rejection 兜底, 多步 denoise 反而拖慢 drafting. 这是 DFlash 与 dLLM-as-generator 路线最大的工程哲学差异.

2.3 EAGLE-3 行为简短复习

这一节是给已经熟悉 EAGLE-3 的人备查。EAGLE-3 的 drafter:

记住这一点: EAGLE-3 用 hidden 时只把它"喂进 input"。DFlash 的最大反向就是: 不要喂 input, 要把它焊在 K/V cache 里, 让 draft 每一层都能 attend 到。


3 · Drafter 架构详解

3.1 Block-diffusion drafter 全景 (paper Figure 2 重画)

从最高层看,DFlash 一个 spec 周期长这样:

  1. target prefill prompt → 第一个 token (verified bonus) + 5 层 hidden states.
  2. 5 层 hidden 在 token 维上 concat → projection → fused target feature, 形状 ≈ [Lprompt, d].
  3. fused feature 在每个 draft 层都过一次 (WK, WV) 投影, 写进该层 K/V cache. (这一步只发生一次, 后续 reuse.)
  4. draft input = (bonus token) ⊕ (γ−1 个 <m>); attend 到自己 + K/V 里的 target context.
  5. 1 次 forward 5 层 transformer → γ 个位置都 ready → LM head → top-1 (greedy) 或 sample.
  6. γ 个 token 当作一条 sequence 送给 target verify; rejection sampling 决定 acceptance 长度 m ∈ [0, γ]; target 顺手再吐 1 个 bonus token, 总产出 m+1 个.
  7. 下一步: bonus 当 anchor, 再 mask γ−1 个, 重复. 注意: target 的 K/V cache 也只增长 m+1, draft 的 K/V cache 只增长 m+1 (mask 位置不写 cache, 详见 §3.3).
Target Model (frozen) "Diffusion is good" layer 4, 8, 12, 20, 28 hidden (5 layers uniformly sampled) concat + linear projection fused target context feature Draft Model (5 layers, trainable) Draft Layer 1 (bidirectional attn) → K, V cache (frozen) Draft Layer 2 → K, V cache Draft Layer 5 → K, V cache Input to Draft "for" <m> <m> <m> <m> 1 anchor token + 15 mask = 16-block After 1 forward for "speculative" "decoding" "."
DFlash 推理一个 spec 周期: target 给 fused hidden → 注入 draft 5 层 K/V cache → draft 拿 1 anchor + 15 mask 跑 1 次 forward → 16 个 token 同时落地 → target 验证。注意整个 draft forward 没有任何"自回归循环"。

Worked example #1: 跟踪一个具体 token

假设 prompt 是 "Diffusion is good", target 给 bonus token "for"。Block size γ=16。draft 输入序列(长度 16)按位置写出来:

pos:    0      1     2     3     4     5     6     7     8     9    10    11    12    13    14    15
tok:  "for"                                             

位置 0 的 token "for" 经过 embedding → e ∈ ℝ⁴⁰⁹⁶。每个 mask 位置的 embedding 是 e_mask(共享一个特殊向量)。同时 draft 每一层的 K/V cache 已经预填好了 prompt + bonus 共 4 个时间步对应的来自 target 的 K, V 投影。Draft 第 ℓ 层的注意力计算粗略是:

Q = (X + e_pos) · WQ;
attn = softmax( Q [Kself | Ktgt] / √d ) · [Vself | Vtgt]

关键: Ktgt, Vtgt这一层独有的 target-feature 投影,不是所有层共享。也就是说每层都从 fused target context 里"自取所需"。这跟 EAGLE-3 把 target hidden 只拼在第 0 层 input 是天差地别。

反向论证 (为什么不能更简单)

"为什么不直接用 1 层 mask-diffusion?" — Table 8 给了答案: 5 层 + 没有 target hidden 注入,加速比只有 ~3×, τ ~4.6 (Math500)。少了 target hidden,小模型就成了 from-scratch 推理,质量崩。"为什么不维持 EAGLE-3 的 input 拼接?" — 见 §3.2 的层数消融, 加深没用。

3.2 5 层 target hidden 注入到每层 K/V (核心 fork 点)

这是论文的真正核心。如果只记一件事就记这个。

EAGLE-3 怎么用 multi-layer target hidden? — 拼在 token embedding 上,作为第 0 层的输入:

x(0)i = [embed(ti); fuse(htgt,1, htgt,8, htgt,16, ...)]

问题: 信息只在第 0 层"灌进去",经过 5 层 transformer 后,被 layer norm + residual + MLP 一次次稀释,深的层离 target 信号越来越远。EAGLE-3 自己的曲线: drafter 加层数 → τ 不涨(他们因此固定 1 层)。

DFlash 把同一组 hidden 投到每一层的 K/V:

∀ ℓ ∈ {1,...,5}: Ktgt = fused · WK-tgt;  Vtgt = fused · WV-tgt

每层 attention 都能直接 attend 到 target 信号,不被 residual 稀释。结果: 加 draft 层数 τ 一直涨 (Table 5: 3-L τ=5.64 → 5-L τ=5.99 → 8-L τ=6.33)。

EAGLE-3: input-side fusion (稀释) [embed ⊕ fused target] 输入 Layer 1 (强信号) Layer 2 (减弱) Layer 3 (更弱) Layer 4 (近乎丢失) Layer 5 (?) ∴ 加层数 τ 不涨 DFlash: per-layer K/V injection embed (干净 input) Layer 1 ← target K/V #1 tgt Layer 2 ← target K/V #2 Layer 3 ← target K/V #3 Layer 4 ← target K/V #4 Layer 5 ← target K/V #5 ∴ 加层数 τ 持续上升
EAGLE-3 把 target hidden "倒进 input layer 0", 经过若干 transformer block 后被 LN/MLP/residual 稀释殆尽。DFlash 把同一组 hidden 投影成每层专用的 K/V slots, 每层都能直接 attend, 信号永不衰减。这是为什么 DFlash 5–8 层的网络仍然有 acceptance gain。

Worked example #2: 5 层 hidden 是哪 5 层?

论文 §5 Implementation: "target hidden features are extracted from 5 layers uniformly selected between the second layer and the third-to-last layer of the target model." 对 Qwen3-8B (28 层 transformer):

每层 hidden ∈ ℝL × 4096, 5 层 concat → ℝL × 20480, 经过 projection Wfuse ∈ ℝ20480 × 4096 → fused ∈ ℝL × 4096。再对每个 draft 层做 K/V 投影 WK/V-tgt ∈ ℝ4096 × 4096。Draft 一共 5 层 → 引入 5 × 2 × 4096 × 4096 ≈ 168M 额外参数; 加上 fusion 那个 Wfuse 还有 84M。这是 DFlash drafter 比 EAGLE-3 重不少的根源, 但因为 drafting cost 与 γ 解耦, 这点参数没拖慢推理。

反向论证: 为什么不能"只用 1 层 hidden 进每层 K/V"?

论文 Table 6: 3-hidden vs 5-hidden, 后者 τ=5.64 / 前者 τ=5.38, 差 ~5%. 同时 3-hidden 训练时 storage 减小线性比例 (offline 训练要 cache 全部 hidden). 5 层是经验甜蜜点, 不是定理. 但作者说"continues to outperform", 暗示更多 (7? 9?) 还能涨, 只是收益递减 + 训练 IO 成本顶不住.

3.3 Mask schedule 与"一步解 16 个"的微观过程

这是 DFlash 与"标准 block diffusion"最大的简化: 推理时denoise 步数 T = 1。看时间轴:

DFlash 推理: 一步 denoise 16 个 token t = 1 (start) a m m m m m m m m 1 anchor + 15 masks (block size 16) 1 forward (5 draft layers, bidirectional attn) t = 0 (end) a t₁ t₂ t₃ t₄ t₅ t₆ t₇ t₁₅ 所有 15 个 mask 同时 denoise → top-1 / sample target 1 forward 验证 16 个位置 accept t₁..t₄, reject @ t₅, target replaces with bonus → 5 个 token 落地
DFlash 推理时 T=1: 给 anchor + 15 mask, 一次 forward, 同时输出 15 个 token 预测。然后 target 一次 forward 验证整段, rejection sampling 顺序判断每个位置 (见 §5)。被 reject 的位置之后所有 token 全部丢弃, 这就是为什么"早 token 比晚 token 重要" (见 §4 loss decay)。

Worked example #3: 一个具体 mask 的 denoise

设 anchor = "for", target context 已被注入到每层 K/V (5 层 hidden 投影了 prompt + bonus 共 N 个时间步)。block size 16, 所以 input 长度 16. 看位置 1 (第一个 mask):

  1. embedding: em (mask token 的 embedding) + pos_emb(1)
  2. Layer 1 attention: Q 来自 em, K/V = (其他 15 个位置的当前 hidden) ∪ (5 层 hidden 的 layer-1 K, V slot, 长度 = N)
  3. Layer 1 输出 → MLP → Layer 2 (再次 attend, 这次 K/V 包含 Layer 2 的 target slot)...
  4. Layer 5 输出 hfinal ∈ ℝ⁴⁰⁹⁶
  5. LM head (target 的, frozen): logits = Wlm hfinal ∈ ℝ|V|
  6. greedy: argmax → 比如 "speculative"; 或 sample (但 spec decoding 中 draft 的采样温度通常等于 target 的)

注意位置 1 的输出能"看到"位置 2 (是个 mask) 的 hidden, 也能看到位置 15 的 mask hidden, 因为是双向 attention. 这与 AR drafter 的 causal mask 完全相反, 但因为后面位置都是 mask token, 信息量很低, 主要还是从 target K/V 拿信息.

"为什么不做多步 denoise?"

标准 dLLM (LLaDA, LLaDA-V, MMaDA) 推理时跑 T=10–20 步多步 denoise, 每步预测 + remask 低置信度位置, 显著提升 generation quality. DFlash 反其道行之,坚持 T=1, 论证如下:

这其实是论文的隐藏哲学: "diffusion 的多步 denoise 是为了独立生成时质量, 但放到 spec decoding 里, verifier 已经在做"质量保险", 所以可以激进地砍 denoise 步数."


4 · 训练程序

DFlash 的训练直接抓住了"inference 时是什么样, 训练时就照搬"原则。但相比标准 block-diffusion, 改了 5 处:

设计标准 block diffusionDFlash
K/V 注入每层 K/V 接 5-层 fused target hidden
Block 划分等宽切, 每块 mask 随机一些位置从 response 随机抽 anchor 位置, 每个 anchor 起头一块, 块内剩下全 mask
同时训练多块单块或几个固定块同一 sequence 取 ~512 anchors → 512 块, Flex Attention 一次跑完
Loss在 mask 位置 uniform CE位置 k 加权 wk = exp(−(k−1)/γ_decay)
Embedding / LM head独立训共享 target 的, frozen

4.1 Random-anchor 数据增强 (Figure 4 重画)

训练: 一条 sequence 拆成多个 anchor-led blocks (block size 4 演示) 原始: p1 p2 p3 p4 r1 r2 r3 r4 r5 r6 r7 r8 训练用 anchors 随机选 r2, r5, r6: p1 p2 p3 p4 r2 m m m r5 m m m r6 m m m 每块预测的 ground truth 是 r3,r4,r5 / r6,r7,r8 / r7,r8,r9 Sparse attention (Flex Attention) 块内: 双向 attention; 块间: 互不可见 (避免互相泄露 ground truth) 每块都能 attend 到 prompt p1..p4 的 target K/V
训练时 sequence-level 处理: 一条样本里 random-sample ~512 个 anchor, 每个 anchor 起头一块, 块内剩余位置 mask. 块间用 Flex Attention 阻断, 让 ~512 个 (anchor + γ−1 mask) block 在一次 forward + backward 里同时被训练。这样训练成本几乎不随 anchor 数线性增长 (kernel 内 sparse mask 走 0 计算)。

为什么这种构造比"等宽块 + 随机 mask"更好

Inference 时, draft 总是看到 1 个 verifier 给的 clean token + 后面全 mask。等宽块 + 随机 mask 训出来的模型, 看到的格式是 "块内偶尔有 clean、偶尔有 mask, 顺序随机", 与推理分布偏离。Random-anchor 训练把"块第 0 位 = clean, 后面 = mask"这个固定 pattern 焊在数据里, 和推理对齐。Table 9: 这一改进让 Math500 τ 从 4.94 → 5.64, +14%。

4.2 Loss decay (Equation 4)

wk = exp( −(k−1) / γ )

这里的 γ 是个 decay 超参 (注意它跟 block size 不是同一个 γ; 论文 Appendix A.1: block 16 用 γ_decay=7, block 10 用 5, block 8 用 4)。每个 mask 位置 k 的 loss 权重 = wk。位置 1 (第一个 mask) 权重 = 1.0; 位置 16 (最后一个 mask) 权重 = exp(−15/7) ≈ 0.117。早期位置的损失约是后期位置的 8.5×。

k (位置)wk (block 16, γ=7)wk (block 10, γ=5)wk (block 8, γ=4)
11.0001.0001.000
20.8670.8190.779
40.6510.5490.472
80.3680.2470.174
160.1170.0500.024

物理直觉: spec decoding 一旦中间 reject, 后面 token 全废, 所以早期 token 的正确率"决定整段长度"。但训练时简单 uniform CE 会让网络平均地分配容量, 把后期低重要性的 token 也练得准。Loss decay 让网络把容量集中在"有可能被接受的早期位置", 加速收敛 (Figure 5 显示同样 epoch 数下 acceptance length 高 ~0.4 个 token)。

4.3 共享 frozen embedding & LM head

Draft 的 token embedding 和 LM head 直接复用 target 的 frozen 副本。这有两个好处:

4.4 训练数据 & 长上下文友好

800K 样本来自 Nemotron Post-Training v2 + CodeAlpaca, 但 response 不直接用 ground-truth, 而是用target model 自己 generate 的 response。这是 self-distillation 风格, 和 EAGLE-3 一致, 但放在 diffusion 设定下重要性更突出: diffusion drafter 学的不是"语言模型分布", 而是"target 在每个位置的下一步是什么", 必须用 target 自产数据。

长上下文支持: 标准 EAGLE-3 在长上下文下做"training-time test"——drafter 自回归地展开一段, 然后在最后位置算 loss——这个递归非常昂贵 (深度 ∝ steps)。DFlash 不需要这种递归, 因为它在一次 forward 里就把所有 mask 解了, 训练时直接对每个 anchor block 算 CE 即可。论文 §4.2 说这让"long-context training 几乎免费"。


5 · 推理与验证拓扑

5.1 为什么 DFlash 不用 tree

EAGLE-2/3 的胜负手是 dynamic draft tree (60 节点)——一棵树同时提议 60 个候选 token, 用 tree-attention 一次 verify, 把 acceptance 拉到 3.5。但 tree 有自己的代价:

DFlash 选了"一条直线"路线: 提议 16 个连续 token, target 1 次 verify, sequence-level rejection sampling。简单, 但因为 acceptance 本身高 (τ=7+), 总产出比 tree 还高。论文 §5.1 直接秒杀: "DFlash also surpasses EAGLE-3 with tree size 60, achieving higher acceptance length while incurring substantially lower verification overhead."

5.2 Sequence rejection sampling 在 diffusion drafter 下的细节

Leviathan 2023 的标准 rejection sampling 是为 AR drafter 设计的: token-i 由 pdraft(·|t1..i-1) 采样, 用 min(1, ptgt(ti|·)/pdraft(ti|·)) 接受。Diffusion drafter 的 token 不是 AR 采样的, 而是 marginal — token-i 的概率分布是 pdraft(ti|context, all_masks), 不依赖 t1..i-1。这看上去会破坏 rejection sampling 的等价性。

DFlash 怎么处理? 论文没有展开, 但从"6× lossless"可推断它仍然走标准 rejection。一个合理解释:

  1. 把 draft 的 16 个 token 当作一条 sequence, 顺序对每个位置做 rejection。
  2. 每次 rejection 用的 qdraft(ti) 是 draft 在那个位置的边缘分布 (因为 draft 一次就预测了)。
  3. 这其实仍然给出 "samples from ptgt"——条件是 qdraft 在每个位置都对 ptgt 有支撑 (绝对连续), 这一点 mask-diffusion 的 softmax 输出天然满足。

核心数学不变: 只要 reject 的 fallback 分布是 (ptgt − qdraft)+, 接受 / 拒绝混合后的边缘就是 ptgt。所以 DFlash 是 lossless 的, 与 EAGLE-3 同地位。

Worked example #4: 一段具体 rejection 跟踪

设 draft 输出 16 个 token: t = ["speculative", "decoding", ".", "It", "achieves", "lossless", "speedup", "by", ...]; greedy 模式 (温度 0)。target 1 次 forward 给出每个位置的 logits。greedy 验证退化为等价比较: 接受当 tidraft = argmax ptgt(·|t1..i-1) 时, 否则 reject。设比较结果是 ✓ ✓ ✓ ✓ ✗ — 接受 4 个, 第 5 位置被替换为 target argmax (比如 "without"), 第 6+ 全丢, target 顺手再吐 1 个 bonus。本周期产出 = 4 (accepted) + 1 (replacement) + 1 (bonus) = 6 个 token。

这就是为什么 τ ∈ [1, γ+1]; γ=16 的话 τ 上限 17。Qwen3-8B 实测 τ ≈ 7.87 → 平均每周期产 7.87 个 token, 即接受了 ~6.87 个 draft + 1 个 bonus, 接受比 6.87/16 ≈ 43%。听起来不高, 但因为 drafting cost 接近 0, 这个比例已经够推到 6×。

5.3 KV cache 在每次周期间的演化

Draft 的 K/V cache 每周期增长 m+1 行 (m = accepted 数)。Mask 位置不写 cache, 因为它们的预测下个周期就过期了 (会重新 mask)。这点跟 AR drafter 完全一样, 但实现要小心: 当 draft forward 完, 只 commit 前 m+1 个位置的 K/V, 后面 γ−1−m 个位置的 K/V 丢弃。SGLang 的 Spec-v2 支持这种 "partial commit"。

Target 的 K/V 也只增长 m+1 行 (verifier 验证后 commit)。两个 cache 在 prompt 阶段已经"对齐"过一次 (target 给 draft 提供 fused K/V), 之后两边各走各的。


6 · 公式与数值理解

6.1 加速比的解析模型

从 Equation 1 出发:

L = (Tdraft + Tverify) / τ;  η = Ltarget / L

对 EAGLE-3 (16) on Qwen3-8B / Math500: 假设 tstepdraft ≈ 0.5 ms (1 层), γ=7 → Tdraft ≈ 3.5 ms; Tverify ≈ 5 ms; τ ≈ 3.49; Ltarget ≈ 12 ms (B200 Qwen3-8B 单 token); L_eagle = (3.5+5)/3.49 ≈ 2.43 ms; η = 12/2.43 ≈ 4.9× — 但实际只有 2.05× (per Table 1) 因为 verify 还有 tree-attention 的额外开销 + 调度损耗。

对 DFlash: tparalleldraft ≈ 5 ms (5 层一次性, Figure 3 实测); γ=16; Tverify ≈ 8 ms (target 一次过 16 位); τ ≈ 7.87; L_dflash = (5+8)/7.87 ≈ 1.65 ms; η = 12/1.65 ≈ 7.3× — 实测 6.08× 与之吻合。

变量EAGLE-3 (16)DFlash (16)
γ (draft tokens)16 (tree)16 (block)
Tdraft~7×0.5 = 3.5 ms (7 个 AR step)~5 ms (1 forward, 5 层)
Tverify~5 ms (tree)~8 ms (sequence)
τ~3.49~7.87
L(3.5+5)/3.49 ≈ 2.43 ms(5+8)/7.87 ≈ 1.65 ms
η (vs ~12 ms)~4.9× (理论) / 2.05× (实测)~7.3× (理论) / 6.08× (实测)

6.2 Loss decay 的灵敏度

给一个直觉表: 假设各位置接受概率 pk 单调减 (因为后位置错的可能性大), 整段被全部接受的概率是 ∏ pk。期望接受长度:

E[m] = ∑k=1..γj=1..k pj
p1p2p3... (decay 0.95)γ=16, E[m]
0.950.900.85...≈ 5.6
0.850.850.850.85≈ 4.7
0.990.950.90...≈ 7.4

读法: 提升 p1 0.05 (从 0.95→0.99) 比同样幅度提升 p10 价值大几个量级——所以 loss decay 把训练 budget 偏向 p1..3 是数学上正确的。

6.3 Drafting cost vs γ 的标度律 (Figure 3 重画)

Number of draft tokens γ Drafting latency (ms) 4 8 16 0 10 20 EAGLE-3 (1L) DFlash (1L) DFlash (3L) DFlash (5L) ★ drafting latency vs γ (单位时间含 K/V 写入开销)
EAGLE-3 (即使是只有 1 层): drafting latency ∝ γ。DFlash (3L, 5L): latency 与 γ 几乎无关, 因为 1 次 forward 输出全 γ 个 token; 即使 5 层模型, γ=16 时延迟仍低于 EAGLE-3 1 层 8 token. 这是 DFlash 整个故事的物理基础。

7 · 实验关键结果

7.1 Qwen3-8B / Transformers backend (Table 1 精读)

BenchEAGLE-3 (16)EAGLE-3 (60)DFlash (16)提升 vs E3-60
GSM8K (T=0)1.94× / τ=3.232.23× / τ=3.715.15× / τ=6.54×2.31
Math5001.81× / 3.022.05× / 3.496.08× / 7.87×2.97
AIME251.79× / 3.002.05× / 3.445.62× / 7.08×2.74
HumanEval1.89× / 3.172.17× / 3.655.14× / 6.50×2.37
MBPP1.69× / 2.821.93× / 3.254.65× / 5.95×2.41
LiveCodeBench1.57× / 2.651.81× / 3.035.51× / 7.27×3.04
MT-Bench1.63× / 2.831.90× / 3.262.75× / 4.24×1.45
平均1.76×2.02×4.86××2.41

读法:

7.2 Reasoning mode (Table 2 精读)

Q3-8B + thinking mode (long CoT 数据训练). Math500 / GPQA / AIME25:

关键: reasoning model 的生成长度大 (上千 token), spec decoding 加速直接乘到端到端 latency, 实际收益绝对值最大。

7.3 SGLang on B200 + FA4 (Table 3 精读)

Model + benchconcurrency=1=8=32τ
Q3-8B / Math5005.1×4.5×2.8×8.01
Q3-8B / HumanEval4.2×3.6×2.4×6.50
Q3-Coder-30B / HumanEval3.5×3.2×3.1×8.09
Q3-Coder-30B / LCB2.6×2.3×2.3×6.42

有趣观察: concurrency 上升, speedup 下降, 但比起 EAGLE-3 在大 batch 跌到 0.6× 已经好很多。30B-A3B (MoE) 的 speedup 反而在大 batch 更稳, 因为 MoE 在小 batch 下 GPU 浪费率高, draft 节省的 verification 占比相对大。

7.4 LLaMA-3.1-8B head-to-head (Table 4 精读)

这是与 EAGLE-3 在相同训练数据 (UltraChat + ShareGPT) 下的公平对比。block size 用 10 (不是 16) 是因为 LLaMA-3.1 与 Qwen3 字典 / 模型结构不同, 经验最优。

Bench / concEAGLE-3 (10)EAGLE-3 (60)DFlash (10)
GSM8K conc=11.6×1.9×2.4×
GSM8K conc=321.0×0.6×1.6×
HumanEval conc=12.0×2.0×2.8×
HumanEval conc=321.2×0.6×1.8×
Alpaca conc=320.9×0.5×1.4×

注意 conc=32 下 EAGLE-3 (60) 跌到 0.5×(比 baseline 慢 2 倍!)。tree 越大, verification 越占满, 在大 batch 下 spec decoding 的"draft 成本免费"假设破产。DFlash 因为没有 tree 这个负担, 即使 conc=32 仍维持 1.4–1.8×。


8 · 消融实验

8.1 Draft 层数 (Table 5)

Number of draft layers Math500 speedup × 3-L 5-L 8-L 4.69× 4.71× ★ best 4.64× τ: 5.64 5.99 6.33
Table 5 重画: τ 单调上升 (5.64 → 5.99 → 6.33), 但加层数同时让 drafting cost 上升, 5 层是甜蜜点 (τ vs cost balance)。这是 §3.2 KV 注入设计真正发力的体现——只有"每层都能 attend target"时, 加层数 τ 才会涨。

8.2 Target hidden 层数 (Table 6)

SettingMath500 speedup / τHumanEvalMT-Bench
3 hidden4.49× / 5.383.80× / 4.472.32× / 3.07
5 hidden4.69× / 5.643.90× / 4.612.38× / 3.18

5 hidden 一致好于 3。但代价: offline training 要 cache 5 层 hidden, IO 翻 5/3 倍。论文没试 7+ 层, 估计是工程上 unlocking 收益不够 cover 训练成本。

8.3 Block-size mismatch (Table 7)

train BStest BSMath500 speedup / τ
16164.64× / 6.33
1683.87× / 5.09
8163.78× / 5.02
883.97× / 5.21

清晰的不对称性: 训大用小 (16→8) 不太掉, 训小用大 (8→16) 掉得明显。原因: 大 block 训出来的 attention 已经学会"看远处的 mask 信号", 缩小到 8 没有 gap; 反过来训 8 的从来没 attend 过 8 个以上 mask, 推理时 16 直接 OOD。这条性质支持动态 block-size 调度: 训一次 BS=16, 推理时根据负载动态在 8/16 之间切换 (大 batch 走 8 节省 verify cost, 小 batch 走 16 拉 acceptance)。

8.4 Loss decay (Figure 5) 与 random anchor (Table 9)

消融项关掉后 vs 开Math500 τ 提升
Loss decay (Eq 4)uniform vs decay (γ=7)+0.4 (≈ epoch 收敛快 2×)
Random-anchor maskingstandard block split vs anchor+0.7 (从 4.94 → 5.64)

这两条配合: random-anchor 让训练分布对齐推理 (块结构正确), loss decay 让训练目标对齐 spec decoding 的"早 token 重要"(损失权重正确)。两者各贡献 ~10% 加速, 缺一不可。

8.5 没有 target hidden (Table 8) — 严重退化

Bench5L diffusion (no target hidden)5L DFlash (with hidden)
GSM8K (T=0)2.83× / τ=3.385.15× / τ=6.54
Math5003.73× / 4.616.08× / 7.87
AIME253.35× / 4.075.62× / 7.08

剥离 target hidden 注入后, 模型退化到与 PARD / 一般 small diffusion drafter 同档 (3× 上限)。这条消融 = "DFlash 的全部魔法在 K/V 注入"的实证。


9 · 与 EAGLE-3 / Medusa / DiffuSpec / PARD 的逐项对比

维度EAGLE-3MedusaDiffuSpec / SpecDiff-2PARDDFlash
Drafter 类型1 层 ARK 个独立 head7B mask diffusion小 AR mimic-diffusion5 层 mask diffusion
每周期 draft 步数γ (序列)1 (并行)多步 denoise (10+)γ (序列)1 (并行)
Target hidden 用法融入 input layer 0无 (head 直接接 hidden)无 (drafter 自己强)注入每层 K/V
Verification topologyTree (60 节点)TreeSequenceSequenceSequence (16)
典型 τ3.5~35–6 但 latency 高~37–8
End-to-end speedup2.0×~2×3–4×~3×5–6×
Drafter 参数量~1.5B (1 层 80% target)~K × small head7B~1B~1.5B (5 层 + 注入)
大 batch 表现tree-60 跌到 0.5×退化drafter 占满OK仍维持 ≥ 1.4×
训练 data 需要self-distillself-distill大规模 web textself-distillself-distill (target generated)
训练 costtraining-time test 贵便宜独立预训便宜便宜 (无 recursive expand)

关键解读 1 — drafter 容量是不是免费的 lunch? EAGLE-3 砍到 1 层是因为 AR 加层数 ∝ 时间。DFlash 5 层在 GPU 上由于 batch=16 一次过, 实际 latency ≈ 1 层 + 4 层并行计算的 epsilon, 不算"免费"但近似免费。所以"drafter 加深"这条在 diffusion-drafter 路线下重新打开了。

关键解读 2 — 为什么 DiffuSpec 7B drafter 会输给 1.5B DFlash? 因为 7B drafter 单步 forward ≈ 几十 ms, 即使每步出 16 token, 摊到每 token 仍贵。DFlash 1.5B + target hidden 注入相当于"借了 target 的脑子但只跑 1.5B 的腿"。这是论文那句 "diffusion adapter that efficiently leverages the deep context features modeled by the large target model" 的精确表达。


10 · 局限 / 个人 take / 待验证问题

10.1 已知 / 推测的局限

10.2 个人 take

这篇论文的真正贡献不在"用 diffusion 做 drafter"——这条路 PARD / DiffuSpec / SpecDiff-2 都试过——而是在把 5 层 target hidden 焊到每层 K/V cache这个具体工程决策。它一次性解决了:

  1. "加 draft 层数 τ 不涨"(EAGLE-3 痛点, 通过每层 inject 解决)
  2. "小 drafter 智商不够"(通过把 target 知识打在 K/V 里解决)
  3. "diffusion 多步太慢"(因为质量靠 target hidden 兜底, T=1 即可)
  4. "tree verification 大 batch 不 work"(取消 tree, 用 sequence)

之后想继续加速, 突破口可能在: (a) 让 K/V 注入也针对 query 自适应 (e.g. attention over hidden layers); (b) 做 dynamic block-size 调度; (c) 在 reasoning model 上挖更多 routing 信息 (因为 long CoT 局部高度可预测)。我个人觉得 DFlash 的设计已经把"AR drafter 范式 → 单层 + tree"和"大 dLLM drafter 范式 → 7B 多步"的中间地带占满了, 后续真正的下一步可能是非 spec decoding 的, 比如 lookahead-decoding 风格 / latent-space decoding。

10.3 待验证问题

  1. 5 层选择是 fixed uniform; 如果用 attention 学一个 layer-routing weights, 是否更好?
  2. Block size 16 是 Qwen3-8B 上的甜蜜点。30B 模型 / MoE 是不是仍然 16 最优? 论文 Coder-30B 用 8 层 + BS 16, 可能 BS 还能更大。
  3. Sequence rejection sampling 在 diffusion drafter 下的 lossless 性, 论文断言"lossless"但没正式证明。理论上需要 qdraft(ti) ≪ ptgt(ti) (绝对连续), mask diffusion softmax 输出能保证, 但温度 T → 0 时的 argmax 行为可能违反, 严格证明缺。
  4. 训练时若改用 random 长度 block (而不是固定 16), 会不会让模型同时支持多 block-size 而不掉点?
  5. 能否把 K/V 注入与 LoRA 复用——同一个 LoRA-adapter target model 上, 是否需要重训 drafter?
  6. Reasoning model thinking-mode 下 τ=5–6, 比 Math500 (τ=7+) 低, 为什么? 是 long CoT 的中段 reasoning step 内在熵更高, 还是数据 coverage 问题?
  7. 对超大模型 (Qwen3-Coder-30B-A3B = 30B MoE active 3B), DFlash 用 8 层 drafter, drafter 参数量已经 ~3B 接近 active expert 大小, 还能不能再扁平化到 5 层?
  8. 比较 baseline 缺: TiDAR / Samragh-LoRA 这两个最相关方案没开源, 论文没对比。如果这俩开源后, DFlash 优势 margin 会缩小到哪里?

11 · 速记盒 (memory points)

立场 Drafter 范式从 AR 分叉到 block-diffusion + per-layer K/V 注入, 让 spec decoding 加速从 2× 跳到 6×。
核心机制 5 层 target hidden → fused → 投影成每层 draft K/V cache, attention 永远能 attend, 不被 layer 稀释。
物理直觉 AR drafter T_draft ∝ γ 强迫深度 ≤ 1; diffusion drafter T_draft ≈ const 解锁 5–8 层。
数字 Q3-8B Math500: 6.08× speedup, τ=7.87 (vs EAGLE-3 (60) 2.05× / τ=3.49). MT-Bench 收益最小 2.75×。
推理简化 denoise 步数 T=1 (而非标准 dLLM 的 10+); 质量靠 verifier 兜底。
训练关键 random anchor block + loss decay w_k = exp(-(k-1)/γ) + Flex Attention 一次跑 ~512 块。
数据 800K 样本, response 必须用 target 自产 (不是原 ground truth)。
无 tree 不用 tree-attention; sequence-level rejection sampling, 大 batch 下比 EAGLE-3 (60) 鲁棒得多。
block-size 不对称 训 16 推 8 几乎不掉; 反向掉 ~20%。支持动态 block-size 调度。
消融 关掉 target hidden 注入直接退到 3×; 关掉 random anchor 掉 ~14%; 关掉 loss decay 收敛慢 2×。
局限 chat 任务收益缩到 2.75×; 大 batch 仍降级; 5-hidden offline cache 大。
未来 自适应 layer routing / 动态 block-size 调度 / 与 reasoning router 配合 / 严格 lossless 证明。

arXiv:2602.06036 · DFlash · UC San Diego · 精读笔记 · 2026-05-07