状态传导图
γ 太短摊不薄验证成本,太长又可能在后半段频繁被拒。
观察点 01
快模型先低成本猜出一小段候选
Drafter 逐 token 生成 γ 个草稿,也可以用多头、树或半自回归方式一次提出多个候选。它必须足够快,同时与目标模型保持较高一致。
- 草稿成本较低
- 候选覆盖长度一小段
草稿不是最终答案;它的价值是把多个位置凑成一次目标模型验证。
小 Drafter 先串行生成多个候选 token;大 Target 用一次并行前向给这些位置评分,再按拒绝采样规则接受前缀并保证分布正确。
状态传导图
γ 太短摊不薄验证成本,太长又可能在后半段频繁被拒。
观察点 01
Drafter 逐 token 生成 γ 个草稿,也可以用多头、树或半自回归方式一次提出多个候选。它必须足够快,同时与目标模型保持较高一致。
草稿不是最终答案;它的价值是把多个位置凑成一次目标模型验证。
状态传导图
验证仍需读取目标模型权重;矩阵变大后可提高硬件利用率。
观察点 02
把上下文与整段草稿送进 Target。因果注意力允许每个位置并行得到对应分布,不必像正式 decode 那样逐次调用大模型。
省下的是目标模型调用轮数,不是省掉目标模型对候选的计算。
状态传导图
严格拒绝采样方案可保持目标模型分布;贪心近似是另一种口径。
观察点 03
从左到右做接受检验;若前两枚通过、第三枚拒绝,就接受前两枚,在第三处按校正分布采样,并丢弃后续依赖错误前缀的草稿。
“连续前缀”很关键:被拒位置之后的候选建立在错误历史上。
状态传导图
线上应看吞吐、TPOT、尾延迟与不同请求长度,而不是只报接受率。
观察点 04
端到端收益取决于平均接受长度、草稿生成成本、目标验证效率、batch 与服务调度。草稿很准但接近目标模型一样慢,也不会有好加速。
投机解码优化的是“每次昂贵验证换回多少有效 token”。
你现在应该能解释:投机解码优化的是“每次昂贵验证换回多少有效 token”。
投机解码(Speculative Decoding)先让一个便宜的草稿猜出接下来几个 token,再让目标模型一次性批量评分——接受得多时,一轮就能前进多个 token。标准投机采样用接受/校正规则保持目标模型的输出分布;但实际加速可能小于 1×,也可能超过 3×,取决于草稿一致度、验证实现、batch、硬件和上下文。近似接受法则则不一定严格分布等价。
p 再采的额外 token;一般情形会从左到右接受,并在首次拒绝处校正。猜得越准,一轮平均发出的 token 越多。图是机制简化;“无损”特指标准算法保持目标分布,并不保证两次随机采样得到逐字相同的文本。查看原图 ↗大模型生成慢,是因为它逐字(自回归)蹦——每吐一个 token 都要把整个大模型再跑一遍。投机解码的点子很简单:让一个便宜的「草稿员」先把接下来几个字猜出来,大模型不用一个个写,只要「一次性批改」这串草稿。批改是并行的,所以一轮能前进好几个字。
p 与草稿分布 q 的概率比接受;第一次拒绝时,不是简单“让目标模型随便重采”,而是从校正残差 (p-q)+ 归一化后的分布采一个替代 token。数学上可证,标准算法最终仍采自目标分布。自回归生成:每生成一个新 token,都要做一次完整的大模型前传(KV Cache 能省掉重算历史,但仍是「一步一个、必须串行」)。问题是——在小 batch / decode 阶段,这一步前传的瓶颈往往不是算力,而是把上百 GB 的模型权重从显存搬进计算单元(带宽受限)。既然搬一次权重很贵,那「搬一次只产 1 个 token」就太亏了。
这是忽略调度等开销的近似式:Tdraft=一轮草稿耗时、Tverify=一轮目标验证耗时、E[Nemit]=每轮实际发出 token 数的期望(包含拒绝处的校正 token,或全接受后的额外 token)。三个主要杠杆是:草稿更快、草稿与目标更一致、验证更高效。
一轮标准投机采样:草稿模型自回归提出 γ 个候选,目标模型用一次批量前传给这 γ 个位置及其后一位置评分;随后从左到右随机接受。若首次拒绝,就丢弃该 token 及后缀,并从校正残差分布采一个替代 token;若 γ 个全接受,则从目标分布再采一个额外 token。
p、草稿分布为 q。对从 q 采到的草稿 token x,以下面的概率接受:
p 重采:
p。注意:这是算法层的分布等价,不是固定随机种子下逐字或逐 bit 相同。基础推导要求 p 与 q 是同一 token 空间中、分别经过各自 sampling processor 后的真实归一化分布;两边的 temperature、top-k 或 top-p 不必取相同值,只要验收使用实际的 p/q。设置越不一致,通常只是接受率越低。异词表实现则还要显式做 token 映射或交集,不能直接套公式。p=[0.6, 0.3, 0.1],草稿分布 q=[0.4, 0.4, 0.2]。草稿被接受后留下的无条件概率质量是 min(p,q)=[0.4, 0.3, 0.1],合计 0.8;因此拒绝总概率是 0.2。校正残差 (p-q)+=[0.2,0,0],归一化后为 [1,0,0],乘上拒绝概率贡献 [0.2,0,0]。两部分相加正好得到 [0.6,0.3,0.1]=p。这是单 token 的最小证明;多 token 算法逐位置应用同一不变量。
α 被接受,一轮草稿长度为 γ,标准算法每轮发出长度的期望是:
α=1 时取极限 γ+1。取 α=0.7、γ=3,则 E[Nemit] = (1-0.7⁴)/(1-0.7) ≈ 2.533。若一次目标验证成本记为 1、每个草稿步成本为 0.05,理想化加速约为 2.533 ÷ (1+3×0.05) ≈ 2.20×,不是 2.53×。真实系统还要计调度、树构造、KV 和 batch 影响;该例只用于看清“发出更多”与“草稿也要付费”的权衡。
投机解码减少的是目标模型的串行轮次,却会增加草稿计算、验证位置、KV 写入和调度工作。低并发、decode 受显存带宽约束时,它往往最有机会获益;并发与 batch 上升后,普通解码本身已能摊薄权重读取,而验证的有效 batch 近似变成 B×K,收益会收窄,甚至应把草稿长度 K 降到 0。
| 引擎 | 当前官方文档列出的路线 | 部署时要核对 |
|---|---|---|
| vLLM | EAGLE、MTP、独立 draft、PARD、DFlash、DSpark、MLP、n-gram、suffix、Dynamic SD | 官方把适用场景指向中低 QPS、memory-bound 负载;动态策略会随并发缩短 K,高负载可关闭投机。当前 Dynamic SD 只注明已测 EAGLE / EAGLE-3 / DFlash,且不兼容 data parallel。 |
| TensorRT-LLM | draft-target、EAGLE-3、MTP、n-gram、PARD、DFlash、suffix 等 | 发布的 latest 功能页仍写“不能动态关闭”;当前 main 的 PyTorch backend 开发者接口已提供 draft_len_schedule / max_concurrency,但仅对支持 dynamic draft length 的 speculative mode 生效,可在 batch 阈值外把草稿长度置 0。两处存在文档时差,必须按安装版本与 backend 实测。 |
| SGLang | EAGLE-2/3、MTP、DFlash、STANDALONE、NGRAM,并提供 Adaptive SD | 当前 Adaptive SD 仅支持 EAGLE-2(算法值 EAGLE)或 EAGLE-3(算法值 EAGLE3),且 topk=1;不同路径也不能任意叠加 DP attention、PP 或 overlap scheduler。 |
“理论无损”也不是“工程逐字复现”:精确接受算法保持目标概率分布;浮点归约、batch 形状、kernel、随机数消费顺序仍可能改变一次具体输出。vLLM 文档还明确不保证投机模式下稳定返回 token logprob。验收应分开检查统计分布/质量与bitwise reproducibility。
投机解码的关键权衡是「草稿如何既便宜、又与目标模型一致」。从 2018 年的 blockwise 前身到 2026 年的并行 drafter,可以看到两种演化方向:草稿来源从外置小模型扩展到并行解码头、目标特征条件 drafter 与原生 MTP 模块;候选结构从单链扩展到树和整块并行。它们不是严格替代关系,不同负载仍可能选择不同路线。
| 流派 | 草稿怎么来 | 代表 / 年代 |
|---|---|---|
| 独立小模型 | 另训或选用小而兼容的模型逐字猜 | Leviathan/Chen · 2023 |
| 树状验证 | 候选展开成树、一次验多路 | SpecInfer · 2023 |
| 多解码头 | 目标模型末隐状态加几个并行头 | Medusa · 2024 |
| 特征级自回归 ★ | 在特征层外推、轻量 transformer 层 | EAGLE-1/2/3 · 2024-25 |
| 原生 MTP 模块 | 训练时加入多步预测头或顺序模块 | MTP / DeepSeek · 2024 |
| 并行 / 半自回归 | 掩码、扩散或并行骨干一次吐整块 | PARD / DFlash / DSpark · 2025-26 |
| 无模型旁支 | n-gram 池 / 目标模型跳层自草稿 | Lookahead · 自投机 |
两条主线一句话:① 草稿来源从独立小模型扩展到并行解码头、目标特征条件 drafter、原生 MTP 模块;三者的 checkpoint、隐藏态捕获和 serving 成本不同,不能都叫“挂几个头”。② 候选结构从单链 → 树 → 整块并行/半自回归演进;越并行不等于端到端越快,仍要把验证与负载算进去。
MTP(Multi-Token Prediction,多 Token 预测)不是一种固定网络,也不是“主模型一次直接吐出多个最终 Token”。它先是一类训练监督:让同一位置预测多个未来目标;只有当预测头或模块被保留、推理引擎会调用它、候选再经过目标模型验收时,它才成为投机解码的 drafter(草稿器)。
n 个独立、由 Transformer layer 实现的预测头,并共享 unembedding(隐藏表示到词表 logits 的输出矩阵)。论文观察到规模增大后代码任务收益更明显,但这是一组特定模型、数据与训练预算下的实验结果,不是“MTP 必然增强推理能力”的定律。k 个头预测距离当前位置 k 步的真实 Token,一个常见写法是:x≤t 预测 xt+3,并没有先读取第 1、2 个头猜出的 Token。原论文实验为了公平,在新增 n−1 个头层时从共享主干移除 n−1 层,保持总参数量相当;其“训练时间无额外开销”来自具体的内存/计算排程,不能外推成任意实现都零成本。k 个 MTP 模块把上一深度的表示,与更近未来真实 Token 的 embedding 分别归一化后拼接、投影,再经过一个 Transformer block,最后复用主模型 embedding 与输出头。训练总目标可概括为:| 实现形态 | 权重与数据流 | 工程含义 |
|---|---|---|
| 并行 horizon heads | 共享主干上接多个独立预测头;各头直接对齐不同未来位置 | 可一次提出多位置候选;候选相关性与树构造由解码器另行处理 |
| 多个顺序模块 | 第 k 层承接第 k−1 层表示,并融合近一位 Token embedding | 保留草稿因果链;更多物理层会增加 checkpoint 与激活成本 |
| 单模块递归复用 | Checkpoint 只有一套 block,训练或推理按深度重复调用 | 物理权重少于展开步数,但每步 forward、采样和状态更新仍要付费 |
| 独立 MTP assistant | 辅助 checkpoint 走引擎专用 MTP 路径,可与目标共享部分状态 | “MTP”不必与主权重装在同一仓库;例如 vLLM 当前为 Gemma 4 assistant 提供专门映射 |
| 口径 | 回答的问题 | 常见误读 |
|---|---|---|
Dtrain · 训练展开深度 | 每个位置向未来监督几步,或共享模块在训练图里展开几次? | 等同于 checkpoint 里有几套独立层 |
Mphys · 物理模块数 | 权重文件实际保存几套 MTP 参数? | num_nextn_predict_layers=1 就只能起草 1 步 |
K · 运行时草稿长度 | 本轮 verifier 前,drafter 最多提出几个 Token? | 模型天生固定值;忽略它可按引擎和负载调整 |
A · 接受前缀长度 | 草稿从左到右有多少个通过验证?取值通常为 0…K | 直接当作端到端 speedup,或与 per-token acceptance rate 混用 |
Nemit · 实际发出长度 | 在线性标准算法中,首次拒绝时提交 A 个接受草稿和 1 个校正 Token;全接受时提交 K 个草稿和 1 个额外 Token,因此通常 Nemit=A+1,EOS 或输出上限截断除外 | 把它当成独立于 A 的数,或不声明口径就跨论文横比 |
mtp.layers.0,而官方模型卡的 vLLM 示例把 num_speculative_tokens 设为 2;GLM-5 的公开配置同样是 num_nextn_predict_layers=1,技术报告却让同一套参数在 3 个训练预测深度复用,并用 4 speculative steps 做接受长度实验。前者描述物理权重,后两者描述展开/运行时策略。| 模型 / 证据 | 可确认的 MTP 合同 | 数字边界 |
|---|---|---|
| DeepSeek-V3 | 公开权重有 1 个顺序 MTP 模块;共享 embedding / output head,另含投影与一个完整 Transformer block;普通推理可丢弃该模块 | 报告称第二 Token 接受率约 85%–90%,其 MTP 评估达到约 1.8× TPS;报告未披露足以跨系统复现的完整 serving 条件,也不是所有 MTP 的保证 |
| Qwen3-Next | 公开 checkpoint 只有一个 mtp.layers.0,融合主 hidden 与当前草稿 embedding,复用主 LM head;运行时可递归调用 | 模型卡给出 K=2 的 vLLM 示例,没有给跨框架固定接受率或加速倍数 |
| GLM-5 | num_nextn_predict_layers=1;同一套约 9.953B 额外参数在 3 个训练深度共享 | 作者实验在同为 4 steps 时报告 accept length 2.76;不是公开 workload 的端到端速度 |
| GLM-5.2 | 继续共享 MTP 参数;后续草稿步复用第一步 Index 与 KV,并用 rejection-sampling 目标与端到端 TV loss 降低训推差异 | 基于 GLM-5.1 backbone 的编码消融、训练与推理均 7 steps:4.56 → 5.47(+20%)是接受长度,不是 20% TPS |
| MiniMax M3 | 公开 config 同时列出 num_mtp_modules=7 与 num_nextn_predict_layers=1 | 发布博客未给两字段的完整映射、训练目标或生产投机 recipe;不能仅凭字段名断言 7 层、7-step 或固定加速 |
B×K 的验证位置;batch 大时可能从带宽受限转为算力受限。
K=0/1/2/… 与真实并发,而不是只测 batch 1;K=0 的回退。
上面讲「通用原理」,这里挂具体论文的深度拆解——想钻细节的往这看(陆续增加)。
核查日期:2026-07-26。本文速度、吞吐和接受率均按原论文的模型、任务、硬件与基线陈述;它们不是跨部署环境的保证。文中的 70% 接受率与三项分布案例均是用于解释公式的简化手算,不是实测结果。MTP checkpoint 字段按公开配置与权重索引记录;未公开的字段映射不作推断。引擎能力按核查日官方文档记录,后续版本可能变化。