一句话主线:MTP 让模型在训练期学会”一次 forward 多预测几个 token”;EAGLE-3 用专门训练的 Draft Head 自回归地猜;DFlash 一口气并行猜一整块;DSpark = DFlash 并行 backbone + 轻量 Markov Head + Confidence Head + 负载感知调度。 三者都是”自草稿、不养独立小 LM”,只是草稿拓扑不同。
先纠正一个最容易混淆的点:DSpark 不是 MTP,也不是简单地”一个 Draft 模型自回归生成多个 token”。DSpark 的 Draft 核心是「DFlash 的 block-parallel backbone + 轻量 Markov Head」,再加一个 Confidence Head——即”并行生成 + 轻量序列依赖 + 置信度调度”。官方论文与 vLLM Speculators 文档都是这么描述的。下面把这整条链路拆开讲。
一、MTP Head 到底是什么
MTP = Multi-Token Prediction。普通 LM Head 一次只出下一个 token:
A B C D → Transformer → LM Head → P(E | ABCD) → E
而 MTP 在原模型上额外挂多个 prediction head / MTP module,一个 forward 同时得到一串未来 token:
A B C D → Transformer
├─ LM Head → E
├─ MTP-1 Head → F
├─ MTP-2 Head → G
└─ MTP-3 Head → H
于是一次 forward 得到 E F G H。核心思想就是:在训练阶段显式训练模型预测未来多个 token(vLLM Speculators 对 MTP 的定义也是”finetune 模型原生的 multi-token prediction head”)。
注意:MTP Head 并不是”4 个完全独立的 Linear”。现代 MTP 会让后面的预测位置利用前面的 hidden/token 信息,不同模型的具体 MTP module 结构不同。
二、为什么 MTP 能用于 Speculative Decoding
MTP 预测出 E F G H 后,Target / verifier 可以并行验证整条:
A B C D → E ✓
F ✓
G ✓
H ✗
最终接受 E F G、丢掉 H,并让 Target 在 G 之后纠正。所以 MTP 本身就是现成的 speculative decoding Drafter——DeepSeek 系列里常见的「Target Model 挂 MTP modules → 并行 verify」就是这么来的。
三、EAGLE-3 和 MTP 有什么区别
这是最关键的一层。EAGLE-3 属于专门训练出来的 Draft Head / Speculator,不是给原模型外挂几个 MTP Head:
Target Model → hidden states → Eagle3 Draft Head → 自回归生成 t1→t2→t3→t4 → Target Verify
EAGLE-3 的 draft token 之间有明显的序列依赖(vLLM 文档把它描述成 “autoregressively predict draft tokens using Llama-style draft layers”)。而 MTP 是模型原生、训练期就嵌入的多令牌头。二者都能当 Drafter,但来源和草稿拓扑不同。
四、DFlash 又是什么
DFlash 走完全不同的方向——一次 forward 直接并行预测整个 block:
Eagle3(串行): DFlash(并行):
t1 Input ┬→ t1
↓ ├→ t2
t2 ├→ t3
↓ ├→ t4
t3 ├→ t5
↓ └→ t6
t4
DFlash 优势是非常快;代价是 token 与 token 之间依赖不足,越往后接受率越低——这就是 acceptance decay / suffix decay(DSpark 论文明确指出,纯 parallel drafter 的主要短板就是块内 token dependency 不足)。
五、DSpark 到底怎么解决
DSpark 的主体仍是 DFlash 的并行生成,但在上面加一个轻量 Markov Head,让第 k 个 token 感知前一个 token:
Anchor → DFlash Parallel Backbone → t1 t2 t3 ... tN
│
Markov Head
│
加入 token-to-token 局部依赖
即”并行 backbone + 很轻的局部序列依赖”,这也是论文标题 Semi-Autoregressive Generation 的由来。
六、Markov Head 为什么有用
纯并行时,每个 t_k 只依赖 context;加 Markov Head 后,t_k 还依赖前一个 token t_{k-1}。官方实现里 Markov Head 是一个低秩 logit bias:
B = W1 @ W2 (默认 rank = 256)
根据前一个 token 对当前 draft logits 加 bias,开销几乎为零,却补上了并行草稿尾部 incoherent / 易被拒的短板。
七、然后才轮到 Confidence Head
Confidence Head 是一个轻量 head:
hidden state → Linear → sigmoid → c_k
其中:
c_k = P(token k 被接受 | 前面的 token 都被接受)
这非常重要——它不是”这个 token 自己有多大概率”,而是”如果前面全部正确,那么这个 token 继续正确的条件概率是多少”。
八、“高置信度”是不是就是”高概率”
是,但要非常精确地说:这里的”高置信度” = Confidence Head 预测的 acceptance probability 高。例如 c1=0.95, c2=0.90, c3=0.85, c4=0.40——它对应的是
P(t1 被接受 | 前面正确)
P(t2 被接受 | t1 正确)
P(t3 被接受 | t1,t2 正确)
P(t4 被接受 | t1,t2,t3 正确)
而不是 P(t1), P(t2), P(t3), P(t4) 这些 token 自身的生成概率。所以严格叫 conditional acceptance probability。
九、为什么叫 Prefix Survival Probability
真正关心的是”前面这一整段能不能全部活下来”。把条件概率连乘:
Prefix 1: 0.95
Prefix 2: 0.95 × 0.90 = 0.855
Prefix 3: 0.95 × 0.90 × 0.85 = 0.727
Prefix 4: 0.95 × 0.90 × 0.85 × 0.40 = 0.291
DSpark 论文给出的定义就是 a_{r,j} = ∏_{i=1}^{j} c_{r,i}——prefix survival probability 是各位置 conditional probability 的连乘。
十、DSpark 的完整结构
把上面串起来,端到端流程是:Target 先生成 anchor → DSpark 并行出 E F G H + confidence → scheduler 截断成 prefix → Target 并行验证。
十一、DSpark 与 EAGLE-3 / DFlash / MTP 的关系
把四个放到一张图:EAGLE-3 = 浅层自回归 drafter;DFlash = 并行 drafter;MTP = 原生多令牌头;DSpark = DFlash + Markov Head + Confidence Head + Hardware-aware Scheduler。所以 DSpark 与 EAGLE-3 的关系不是”DSpark = 改进版 EAGLE-3”,而是”在并行草稿(DFlash)上叠顺序头与置信度调度”。官方 Speculators 文档明确把 DSpark 定义成 “extends DFlash with Markov head + confidence head”。
<text x="250" y="222">· 自回归逐位置特征预测</text>
<text x="250" y="244">· 动态草稿树 + 树注意力</text>
<text x="250" y="266">· 多层融合 + Training-Time Test</text>
<text x="250" y="288">· 加速最高 6.5×</text>
<text x="250" y="310">· 自草稿流派的开山祖</text>
<text x="470" y="222">· 主模型挂 D 个头(预训练)</text>
<text x="470" y="244">· 每头预测 offset d+1</text>
<text x="470" y="266">· 推理作草稿头(零成本)</text>
<text x="470" y="288">· 复用主模型权重</text>
<text x="470" y="310">· V4 MTP-1 基线被其替换</text>
十二、DSpark 的 Draft 是不是”一次生成多个 token”
是。 但要拆成两层看:
- DFlash Backbone:一次 forward,并行产出整个 block 的候选 token(
t1..t6)。 - Markov Head:利用
previous token → logit bias修正每个位置,增加 token 间依赖。
所以 DSpark 是”并行 backbone + 轻量级 sequential dependency”,既不是纯并行、也不是纯自回归——这正是 Semi-Autoregressive Generation。
十三、最容易记的对比表
| 方法 | Draft 怎么产生 | Token 间依赖 | 一次 forward | 主要问题 / 优势 |
|---|---|---|---|---|
| 普通 Decode | Target | 强 | 1 token | 慢 |
| EAGLE-3 | 自回归 Draft Head | 强 | 多步 | Draft 串行 |
| DFlash | Block Parallel | 弱 | 多 token | 后缀 acceptance decay |
| DSpark | DFlash + Markov | 中等 | 多 token | 兼顾速度和 acceptance |
| MTP | 原生 MTP Head | 取决于具体 MTP 结构 | 多 token | 需模型原生支持 / 训练 |
一句话收尾:EAGLE-3 是一个一个猜但猜得准;DFlash 一口气猜一堆但后面容易猜歪;DSpark 是一口气猜一堆,同时用 Markov Head 让后面的猜测参考前一个 token,再用 Confidence Head 判断这一串到底值得验证到哪里。 而”高置信度 = 高概率”的精确含义是:该位置在前缀已正确的条件下被 Target 接受的概率,把这些条件概率连乘得到 prefix survival probability,scheduler 再据此决定验证长度。论文在 DeepSeek-V4 线上流量中报告,相比生产 MTP-1 基线,per-user generation speed 提升约 60%–85%。
本篇属于「推测解码手记」系列 Ep7。前情:DFlash 深度解析、DSpark 深度解析、DFlash vs DSpark、EAGLE-3 深度解析;回到系列首页见推测解码手记。
💬 留言
NaphJohn/LLM-blog尚未启用 Discussions:请在 GitHub 仓库 Settings → General → Features 勾选 Discussions 后刷新本页,评论区即自动显示。