关于推测解码/MTP的交互式解释器

Reddit r/LocalLLaMA 工具

摘要

一个交互式指南,解释了大语言模型中的推测解码和多令牌预测,涵盖了从拒绝采样到Qwen 3.6和Gemma 4中使用的MTP等技术,配有实时图表和滑块。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/26 12:15

# 当大模型预测自己的预测——undef.dev 来源:https://undef.dev/writing/learn/speculative-decoding/ 现代大模型如何做到一个成本生成多个 token?这个技巧的名称借鉴自 CPU 中的**推测执行**(speculative execution),它会在猜测的分支上提前运行,如果猜错则回滚;推测解码对 token 下了同样的赌注。本文是一份实地指南,从原始的拒绝采样技巧,讲到 Qwen 3.6 内置的**多 token 预测**(multi-token-prediction)机制以及 Gemma 4 上附带的类似功能。下面的图表和控件是实时的——你可以运行解码器、拖动滑块、悬停观察遮罩。 ## 你的 GPU 咀嚼的速度快于被喂食的速度 自回归解码每次前向传播只产生一个 token,而每一次前向传播都必须将模型的**活跃权重**(以及相关的 KV 缓存)从高带宽内存流式传输到计算单元中。相比之下,它随后进行的算术运算微不足道。加载几个加速器试试看: 在 batch size 为 1 时,芯片算术容量中有超过 99% 处于空闲状态。每个 token 的延迟大致是 *传输字节数 / 带宽*,而 FLOPs 基本上免费。这些闲置的计算能力正是下文所有技术的基础材料。(具体分配会随着量化、MoE 路由以及 GQA/MLA 注意力机制而变化,但不变的是,在低 batch size 下算术强度始终很低。) ## 检查 *k* 个 token 的成本与生成一个 token 大致相同 对提示词*加上 k 个候选 token* 进行一次前向传播,权重从 HBM 中**只**流式传输一次,与单个 token 的情况完全相同。额外的位置搭上了闲置计算的便车。验证几乎是免费的;**生成**才是昂贵的,因为它是顺序的。 检查草稿 token 难道不是让模型“看到”它而作弊吗?不:因果遮罩使得每个位置只能关注它之前或当前的位置,因此给草稿 token 打分的预测是在根本不关注该 token 的情况下计算出来的。悬停某一行,查看每个位置具体关注了什么: 而这些额外位置的成本确实是不变的: 线性层在小 *k* 时仍然受限于内存,注意力主要由(未改变的)KV 缓存读取主导,而通信延迟与 *k* 无关(Chen et al. 2023 (https://arxiv.org/abs/2302.01318))。成本保持平稳,直到最终受限于计算。单次权重读取同时覆盖了两种 token: 草稿的键和值被**推测性地**写入:如果在位置 *j* 处被拒绝,则缓存会回滚到 *j* 之前;并且被拒绝的 token 及其之后的所有内容不再描述真实的序列。从这个角度看,验证是对猜测的 token 进行的**迷你预填充**;而普通的解码则是它所替代的慢速、一个 token 一步的路径。 所以赌注是这样的:如果某种廉价的方法能够*猜测*出接下来的几个 token,那么大模型就可以一次性地评估整个猜测。正确的猜测就是纯利润。错误的猜测几乎不费成本——你只是消耗了闲置的 FLOPs。 ## 经典算法:草稿,然后验证 一个小型的**草稿模型**自回归地提出 token。**目标模型**在一个前向传播中对所有这些 token 打分,接受最长正确前缀,修正第一个错误,并且(如果全部被接受)在末尾多发射一个额外的 token。每轮输出介于 1 到 *γ* 个 token 之间,因此进度是有保证的(Leviathan et al. 2022 (https://arxiv.org/abs/2211.17192); Chen et al. 2023 (https://arxiv.org/abs/2302.01318))。 ## 可证明的无损:与目标模型分布相同 **贪婪地**解码,保证是直接的。如果草稿 token 正是目标模型会选择的 token,则接受它;否则输出目标模型自己的 token。这是确定性的,并且*本质上*与普通的贪婪解码完全相同。真正的情况是**采样**(temperature),你不能仅仅检查相等性,因此解码器会执行一种拒绝采样形式。给定目标分布 *p* 和草稿分布 *q*,每个草稿 token 都要与一个均匀随机抽取值进行比较,并输出 token *x*: 该定理(Leviathan 附录 A.1 (https://arxiv.org/abs/2211.17192); Chen 定理 1 (https://arxiv.org/abs/2302.01318))指出:对于*任何*草稿模型,结果**完全**按照目标模型分布,尽管实际引擎中的批处理和浮点数可能仍会轻微改变一个 token。 ✕ 怀疑 相信我。 证明它!你知道什么是**最大耦合**(maximal coupling (https://colcarroll.github.io/couplings/static/maximal_couplings.html))吗? 是——一句话概括 这个采样器恰恰是 *p* 和 *q* 的**最大耦合**:联合分布 *γ* 具有边际分布 *p* 和 *q*,并且尽可能多的质量(*γ(x,x)*)放在对角线上。因此,抽取提议 *x~q* 并输出 *x* 却按照 *p* 分布的方式,本质上就是这样的。 不——请按步骤讲解 将目标分为草稿能够覆盖的部分和不能覆盖的部分: 因此 *α(x)* 是来自控件的**绿色重叠**部分,*p(x)-q(x)* 是**红色残差**部分,而 *α* 是它们的总重叠,也是接受率(正如我们即将展示的)。(如果 *q=p*,那么草稿已经是精确的,结论是直接的;所以假设 *q≠p*。) **论断**:抽取 *x~q* 并以概率 *p(x)/q(x)* 保留它;否则输出一个独立的 *x'~[p-αq]^+*。那么,对于任意 *q*,发射的 token *x* 按 *p* 分布。 **证明**:将发射分布分解为接受情况(*x=* 被选中的提议)和拒绝情况(*x=x'*),展开每一项,并简化接受项: 在对 *x* 求和后,接受项的总和等于接受率 *α*,拒绝项的总和为其补数: 代入并消去归一化项,得到 *p(x)*。 一个位置被接受的概率等于重叠率 *α*。拖动滑块,看看为什么匹配度更好的草稿会接受更多: ## 多 token 预测:一个名字,两种思路 “MTP”最初是一种**训练目标**:在每个位置,预测接下来的*几个* token,而不仅仅是最接近的那一个。强制模型提前规划几步提供了更密集的学习信号,并且留下的模块已经知道如何预测未来,这正是推测解码器所需要的。两个阵营以不同的方式实现了这一点。 **并行头**(Meta, Gloeckle et al. 2024 (https://arxiv.org/abs/2404.19737))将 *k* 个独立头附加到同一个最终隐藏状态上;第 *k* 个头预测偏移 *k* 的 token,同时完成。简单,且提供了强大的训练信号(在代码方面尤其出色)。但这些头无法互相看见:每个都是从*当前的相同快照*中进行猜测,因此更远的猜测会漂移,接受率随距离下降。 **顺序模块**(DeepSeek-V3 (https://arxiv.org/abs/2412.19437) → Qwen)一个接一个地预测未来 token:每个 MTP 模块接收前一步的隐藏状态,并将其与**实际下一个 token** 的嵌入拼接,因此每个猜测都基于前一个猜测。因果链保持完整,因此草稿读起来更像是模型实际会写的文本,这往往会提高接受率。 具体来说,**DeepSeek-V3 的顺序 MTP 模块**(Qwen 继承了它)是骑在主干上的一个 Transformer 块。它接收主干的隐藏状态和刚刚生成的 token 的嵌入,融合它们,运行这个块,并复用共享的 LM 头来预测**再往前**两个的 token。逐步操作: 一个机制,两个用途。**在训练中**,它作为一个辅助损失运行(*L_MTP*)。(DeepSeek-V3 只使用了一个额外的 token *t+1*,并在其 14.8 T token 的训练中退火处理权重。)监督这些额外的未来信息可以强化基础模型本身。**在推理时**,同一个模块成为内置的草稿生成器:它在主干发射 *x_t* 的同时提出 *x_{t+1}*。这就是**自身**推测解码——**没有第二个模型**,草稿成本几乎为零,接受率高,因为草稿生成器共享主干的嵌入、LM 头和隐藏状态。DeepSeek-V3 报告了**第二个 token 的接受率为 85–90%**,解码速度提升约 1.8 倍。(或者该模块可以被关闭,留下一个普通模型。) ### 构建块:特征–token 融合 放大看该模块的核心——将主干的隐藏状态与 token 的嵌入融合的步骤。这并不是 DeepSeek/Qwen 独有的;它是*每一个*特征级草稿生成器(包括 EAGLE (https://arxiv.org/abs/2401.15077))的构建块。为了廉价地草拟下一个 token,该模块依赖两种输入:目标的**隐藏状态**(已经是编码上下文内部向量;大多数草稿生成器使用单个最终层的隐藏状态——正是馈入 LM 头的那个——而 EAGLE-3 (https://arxiv.org/abs/2503.01840) 则融合多个层的状态)以及最近看到的一个或多个 token 的**嵌入**(实践中通常只是它正在继续的那个 token)。每种模型以不同方式填充这些输入。逐步查看变体: 在底层,它们是同一种操作。设 *H* 是它接入的主干层非空集合(*特征*侧:可以是 *L* 层的任意子集,通常只是最后一层),而 *T* 是它被馈入的 token。将两者作为 *z_i* 族收集起来,索引 *i* 遍历 *H∪T*,其中 *z_i* 是隐藏状态(对于 *i∈H*)或嵌入(对于 *i∈T*)。每个输入由其各自的归一化层处理,拼接起来,然后从主干宽度 *d_model* 投影到草稿生成器的宽度 *d_draft*: 其中 *Norm_i* 是该输入自身的归一化(RMSNorm/LayerNorm,或恒等映射),*W_proj* 是学到的投影。这个公式的边界确定了族:*|T|=0*(无 token)得到仅隐藏状态的 **Medusa** 头;而 *d_draft = d_model*(宽度共享)得到像 DeepSeek-V3 或 Qwen 那样的主干内头;*d_draft < d_model*(更窄)则得到像 Gemma 4 那样的独立草稿生成器。 底层数学——融合是投影的和 拼接再投影是从直和出来的线性映射:堆叠 *z* 落在 *R^{|H∪T|·d_*} 中,分块 *W* 将其分解为每源独立投影的和 *∑_i W_i z_i*。因此融合是一种*加法*组合(每个源一个权重块),而不是*乘法*组合(会建模特征–token 交叉项)。如果约束权重块 *W_i = W_j*,则退化为 Deep Sets (https://arxiv.org/abs/1703.06114) 的置换不变池化,而逐槽块的变体则特意避免这一点。 任何特征–token 交叉项会在后续的 Transformer 块中通过注意力(跨位置的交叉项)和门控 FFN(SwiGLU 的逐位置交叉项)出现。投影其实就是该块的输入层,保持宽度 *d_draft*,使得主干内头可以原样重用主干的嵌入表和 LM 头。 这种**特征–token 融合**就是为什么一个小型草稿生成器能够几乎免费地与庞大目标保持同步。它不需要重新读取上下文,而是依靠目标自身的隐藏状态。它没有一个标准名称(EAGLE 中称为“FC 层”,DeepSeek/Qwen 代码中称为 `eh_proj`)。这个单一的融合操作是 EAGLE、DeepSeek-V3 的 MTP、Qwen 的 NextN 以及 Gemma 的草稿生成器的共同核心;只有外围的包装不同。两个构架差异是:**它读取哪些隐藏状态**(仅主干的最终层,还是像 EAGLE-3 那样融合多个层)以及**它馈入什么块**(全宽度的主干内块,还是更窄的、独立的一到四层草稿生成器)。还有两个关于系统整体:**它是如何训练的**(作为辅助目标联合训练,还是针对冻结的目标事后训练)以及**它如何草稿**(单个 token、递归链或动态树)。确切地说:Gemma 4、Qwen 3.6 和 DeepSeek-V3 都提供了各自的**受 EAGLE 启发**的头,而**不是**字面上的 EAGLE-1/2/3 检查点——后者是一系列独立的草稿生成器,通过 vLLM/SGLang 附加到其他模型上。 ## 案例研究 A — Qwen 3.6:作为内置器官的 MTP Qwen 的谱系(Qwen3-Next → 3.5 → 3.6)继承了 DeepSeek 的设计:一个额外的“NextN”Transformer 块骑在主干上,与模型联合训练,共享其嵌入表和 LM 头(`mtp_num_hidden_layers: 1`)。官方 Qwen 只承诺“MTP:经过多步训练”;单块的内部结构来自发布的配置,而下面的接受率和加速数据是第三方测量的。 - **“MTP:经过多步训练”**(模型卡 (https://huggingface.co/Qwen)):在训练期间,该块会展开到多个未来步骤上,因此在推理时递归的多 token 草稿正好匹配它实际练习的内容。 - **草稿几乎免费:**该块占主干层数的 1/64,加上对大型词汇表运行共享 LM 头的矩阵乘法(每个草稿步骤一次),使得每一步的真实成本约为 *γ*,而使用外部小型草稿模型则为 0.2–0.3。 - **测量值(第三方):**在 *T=1* 时接受率约为 83%,端到端加速约 2.2 倍,在 *T=0.1* 时上升到约 2.4 倍。Qwen 公布了配方,未公布具体数字。 **GLM-5.2**(智谱 AI,2026 年 6 月)采用了相同的权重共享块(MTP 步骤间的参数绑定),但与 Qwen 不同,它记录了配方。其**发布博客 (https://z.ai/blog/glm-5.2)** 报告了**编码任务中在 7 个 MTP 步骤下接受长度为 5.47**,比基线块提升 20%,并堆叠了 IndexShare/KV 共享技巧、拒绝采样和端到端 TV 损失。这相当于我们模拟器中的 *γ≈5.5*。尝试下面的 **GLM-5.2 MTP** 预设。 ## 案例研究 B — Gemma 4:作为附带附件交付的 MTP Google 走了另一条路。Gemma 4 发布时*没有*推测解码资产;几周后,2026 年 5 月,才推出了 **“MTP 草稿生成器” (https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/)**:独立的轻量级检查点(`google/gemma-4-31B-it-assistant`),事后训练以模仿每个冻结的目标。一个专门构建的小模型,插入目标的内部结构,而不是主干内部的一个头。 - **4 层草稿生成器**(3 层滑动窗口 + 1 层全局注意力,根据 `-assistant` 配置),针对 31B 目标的参数约 0.5B;每个 Gemma 4 尺寸都有一个,一直到边缘模型。 - **与目标的三处耦合:**共享输入嵌入;在目标的最终隐藏状态上进行相同的特征–token融合;并且**重用目标的 KV 缓存**,因此上下文从未被重新编码。 - **边缘技巧(仅限 E2B/E4B):**对 262K token 的词汇表进行聚类,并只对可能的簇进行评分,避免了设备上的完整输出投影。 - **宣称(供应商报告):**在“零质量下降”的情况下速度提升高达 3 倍(最终验证仍由目标完成——无损保证的产品级版本,受引擎数值影响)。在 Apple Silicon 上,26B-A4B MoE 加速约 2.2 倍;未发布接受率。 ## “MTP”最终意味着什么 现在分歧已经很明显了。Qwen 将对未来预测的训练目标直接融入模型,并重用该头。Google 则事后训练专用的草稿生成器,并作为产品分发。 | Qwen 3.6(DeepSeek 学派) | Gemma 4(EAGLE 学派) | | :--- | :--- | | “MTP”是**训练目标**,其头同时充当草稿生成器 | **推理产品**:针对冻结目标的事后草稿生成器 | | 草稿生成器形式 | 检查点内的 1 个 Transformer 块 | 独立的 4 层 `-assistant` 小模型 | | 与目标的关联 | 共享嵌入 + 共享 LM 头 + 最终隐藏状态 | 共享嵌入 + 最终隐藏状态 + **共享 KV 缓存** | | 训练 | 联合训练,“多步”,辅助损失 → 可能改善基础模型 | 分开训练,目标冻结 → 对基础模型零风险,可后期发货 | | 部署 | 一个检查点;vLLM/SGLang 的一个打开草稿的标志 | 两个检查点;HF `assistant_model=...` | | 报告收益 | 约 83% 接受率 @ *T=1*;约 2.2–2.4 倍(第三方) | 高达 3 倍;在 Apple Silicon 上 MoE 约 2.2 倍(Google) | ## 实际能有多大加速? 你现在已经认识了上面的草稿生成器,而两个数字决定了它们中任何一个的回报:接受率 *β* 和单个草稿步骤的相对成本 *c*。每个目标前向传播期望的 token 数 *τ* 以及由此产生的端到端加速(Leviathan (https://arxiv.org/abs/2211.17192) 公式 1 和定理 3.8,i.i.d. 接受近似): 一阶盈亏平衡点:*β* 应超过草稿成本 *c*。草稿生成器必须正确回答的次数多于其昂贵的次数(实际系统会增加固定开销和批处理效应)。关于草稿长度:当 *β* 较高且 *c* 很小(MTP 预设下)时,更长的草稿持续受益;而对于一般的草稿生成器,最佳长度则很短。 ## 技巧何时失灵 推测解码消耗的是*闲置*的 FLOPs,因此它的成败取决于 FLOPs 是否过剩。在高 batch size 或高 QPS 下,解码变为了计算受限,推测解码可能变为**净负**(vLLM 在负载下测量到高达 1.8 倍的*减速*,之后才添加了动态禁用)。高

相似文章

什么是推测性解码?(在paperswithco.de上热门)[R]

Reddit r/MachineLearning

推测性解码是一种推理优化技术,它使用快速草稿模型提出未来 token,并由较大模型并行验证,从而提高 LLM 的生成速度。文章强调了它在 Papers with Code 上的热门状态,以及最近的 SGLang 博客文章,该文章介绍了使用 DFlash 模型实现的最先进延迟。

DFlash与Spec V2解码(14分钟阅读)

TLDR AI

Z Lab、SGLang和Modal发布DFlash,这是一种针对Qwen 3.5 397B-A17B的新型投机解码模型,采用块扩散和KV注入技术,相较于基线实现超过4倍吞吐量提升,相较于原生MTP实现1.5倍提升。