投机解码到底能加速多少:把接受率、草稿成本与墙钟收益算清楚
投机解码用一个又快又便宜的草稿模型先猜几个 token,再让大模型一次并行验证,据称能把手感延迟压掉一半以上。但它到底快多少,并不是「猜得准就快」这么简单:本文从单条解码的带宽瓶颈出发,把接受率 α、草稿长度 γ 与草稿成本系数 c 三者如何共同决定墙钟加速比一步步推出来,并用原论文的实测数字逐项校验;结论是同一份加速比公式里,草稿模型「猜得准」(α 高)与「跑得贵」(c 大)会互相抵消——在该论文的 TPU 实验条件下(EnDe 翻译、温度 0),11B 目标模型配 800M 草稿的实测加速(约 1.7 倍)反而低于配 77M 草稿(约 3.4 倍),主因就是成本系数从 0.02 抬到了 0.11(加速比公式据此可解释 3.2→2.5),其余落差来自实现细节与 i.i.d. 假设失效。
线上跑过推理的人都见过这个场面:同一台卡、同一个模型,批次一大就快、批次一小就慢得让人着急。更反直觉的是,当你把并发压到 1 的时候,GPU 的利用率会掉到个位数——算力明明闲着,出字却比挤牙膏还慢。投机解码(speculative decoding)就是冲着这个场面去的:它用一个又快又便宜的草稿模型,先把接下来的几个 token 一次猜出来,再让真正的大模型一次并行把这几猜都验一遍,猜对的照单全收。论文里报出的数字很诱人——Leviathan 等在 T5-XXL(单 TPU-v4、batch=1)上实测 2 到 3 倍(arXiv:2211.17192);Chen 等在 Chinchilla 70B 的分布式设置下 2 到 2.5 倍(arXiv:2302.01318);EAGLE 在 LLaMA2-Chat 70B 上 2.7 到 3.5 倍(arXiv:2401.15077)。这三组的硬件、批次与采样口径各不相同,不能直接互相比较,只是用来标出量级。
但「能加速」和「加速多少」是两个问题。很多人对投机解码的直觉是「只要草稿模型猜得准,就能一直快下去」,而这个直觉只对了一半。本文想把它算清楚:加速比不是接受率的单调函数。有一篇论文(arXiv:2211.17192)里有一个几乎是反例的实测结果——草稿模型从 T5-small(7700 万参数)换成 T5-large(8 亿参数)后,接受率从 0.75 升到了 0.82,实测加速却从 3.4 倍掉到了 1.7 倍。注意这里要把落差分成两段(相关符号见第二节):加速比公式本身只能解释 3.2→2.5 这一段(分母里的成本系数被抬高),剩下的 2.5→1.7 落差来自实现细节与「各位置接受率独立同分布」假设的失效——本文第五、六、十节会分别交代这两段。
本文按「先给直觉 → 约定符号 → 形式化 → 推导 → 工程含义 → 边界与未解」的顺序展开。凡是引用他人结论处,一律标注出处(论文名 + 章节/表格);凡是本文自己算出来的数字,在文末「本文自行推导」一节单列,与官方数字分列,不作官方口径引用。
一、直觉:单条解码是被显存带宽掐住的
要理解投机解码为什么有用,先理解朴素解码为什么慢。
大模型在**预填充(prefill)阶段一次吃进整段提示词,矩阵乘法是稠密的、算术强度高,算力被用满,所以那一阶段相对快、且对批次大小不那么敏感(为什么「稠密」就快,见下文的算术强度分析)。真正慢的是后面的逐 token 解码(decode)**阶段:每生成一个 token,都要把整个模型的权重从显存(HBM)搬进计算单元过一遍。搬一次权重、算一次乘加——其中「算」的量小得可怜。Hugging Face 的官方博客把这条链路讲得很直白:前向传播由矩阵乘法主导,而矩阵乘法在这里受限于内存带宽(把权重从显存搬到计算核心),不是受限于算力(Hugging Face Blog,2023-05-11)。
用算术强度(arithmetic intensity,单位是 FLOP/字节)来量化这件事。对一个参数量为 的模型,单个 token 的解码大约需要
同时要把这 个权重都读一遍,若用 fp16 存储,则
两者相除,得到算术强度
一块主流加速器的「脊点」(ridge point,即算力峰值 ÷ 带宽,是从「算力受限」翻转为「带宽受限」的那个拐点)通常在10² 到 10³ FLOP/字节的量级。把两者摆在一起看:
也就是说,单条解码离脊点差了两三个数量级,它是彻头彻尾的带宽受限:GPU 的时间都花在等权重从显存搬过来,计算单元大部分时候在空转。这也正是 Leviathan 等在论文里点明的动机——「大模型的推理往往不是被算术运算卡住,而是被内存带宽和通信卡住」(arXiv:2211.17192,§1)。顺着这个判断,作者还补了一句关键前提:这类负载下「额外的计算资源往往是可用的」。
把这两个数换成看得见的时间:一个 70B 参数的模型用 fp16 存权重约需 140 GB;若显存带宽取 2 TB/s 一档,光把权重搬一遍就要约 70 ms,对应单条吞吐上限约 14 token/秒——而这期间 GPU 的计算单元大部分时间在等数据;带宽换成 3 TB/s 则升到约 21 token/秒,降到 1 TB/s 则跌到约 7 token/秒。单条解码的吞吐几乎与带宽成正比,与算力峰值关系很小——这正是投机解码能插进来的缝。(以上为本文按公式估算,只计权重搬运,见文末 D2。)
既然是带宽受限,一个自然的想法就冒出来了:既然权重反正要搬一遍,为什么要只算一个 token? 同一次搬权重,如果能让计算单元同时为好几个候选 token 打分,那么「多验几个」的边际成本接近于零——反正权重已经在寄存器里了。投机解码正是把这个「并行验证」的空档利用起来:
- 草稿:让一个小模型(或某种廉价启发式)串行地猜出后面若干 token;
- 验证:把「前缀 + 这些候选 token」拼成一条序列,让大模型一次前向,给每个位置算出它真正的概率分布;
- 接受:从前往后逐位比对,接受那些「大模型也会这么选」的候选,遇到第一个不接受的为止,然后从这个位置按修正后的分布再补一个 token。
下面的图说明了一次投机迭代里,草稿与验证两条流水线是如何接在一起的——关键在右侧:草稿的 γ 步是串行的,而验证只有 1 步,且那一步把 γ 个位置一起算了。
flowchart TD
A["前缀 x0..xt(已确定)"] --> B["草稿模型 M_q 自回归采样 γ 个候选"]
B --> C["候选 x1..xγ,各自带草稿概率 q"]
A --> D["目标模型 M_p 一次并行前向"]
C --> D
D --> E["得到目标概率 p(xi) 与第 γ+1 位的分布"]
E --> F{"逐位比较 min(1, p/q) 是否接受"}
F -->|"接受第 i 位"| G["保留 xi,继续看下一位"]
F -->|"遇到第一个拒绝"| H["从残差分布 max(0, p-q) 归一化后重采样 1 个"]
G --> I["本轮产出 = 接受数 + 1 个 token"]
H --> I
I --> A这张图说明了什么:一次投机迭代里,目标模型只跑 1 次前向(图中 D→E),却可能一次性吐出多个 token(图中 I)。草稿模型付出的串行代价(B)能不能被这笔收益覆盖,取决于两个量——草稿猜得准不准(决定「接受数」),以及草稿本身跑得贵不贵(决定 B 的代价)。这两者就是下文的 与 ,而它们分别在加速比公式的分子与分母里,方向正好相反。
二、符号约定与术语表
把讨论对齐到一套记号,后面所有推导都用它。本文的记号尽量与 Leviathan 等(arXiv:2211.17192)一致。
| 记号 | 含义 | 说明 |
|---|---|---|
| 目标模型 | 要加速的那个大而准的模型 | |
| 草稿模型 / 近似模型 | 小而快,负责猜 | |
| 目标模型给出的下一个 token 分布 | 经过采样参数(温度、top-k 等)调整后的分布 | |
| 草稿模型给出的分布 | 同上 | |
| 每轮草稿的 token 个数 | 即草稿长度 / look-ahead 步数 | |
| 一轮里被接受的草稿 token 数 | 上限为 的截断几何变量,见第四节 | |
| 接受率 | 单个草稿 token 被接受的概率, | |
| 成本系数 | 草稿单次前向耗时 ÷ 目标模型单次前向耗时, | |
| (大写) | 一轮产出的 token 数 | ,随机变量,见第四节 |
| 算术量比 | 草稿每 token 的算术量 ÷ 目标模型每 token 的算术量 | |
| 全变差距离 | ||
| 松弛因子 | 把草稿分布缩小到 倍以放宽判据,见第八节 |
| 术语 | 一句话解释 |
|---|---|
| 投机解码(speculative decoding) | 草稿 + 并行验证的整体框架 |
| 投机采样(speculative sampling) | 保证输出分布不变的那套接受/拒绝采样规则 |
| 草稿模型(draft model) | 独立的小模型;也可换成 n-gram、MLP 投机头等 |
| 树注意力(tree attention) | 一次并行验证多条候选路径的注意力掩码技巧 |
| 无损(lossless) | 输出分布与不用投机时逐位相同(在硬件数值精度内) |
| 接受率(acceptance rate) | 被接受草稿 token 占全部草稿 token 的比例 |
三、为什么它是无损的:接受概率与残差分布
投机解码最容易让人半信半疑的一点是:用一个可能猜错的小模型来加速,凭什么保证大模型的输出分布不变? 这不是工程上的「大致差不多」,而是有严格证明的。这一步的推导是整个方法的地基,值得完整走一遍。
先看单个 token。我们要从目标分布 采样,但为了省算力,我们改从草稿分布 采一个候选 ,再决定要不要:
- 以概率 接受 ;
- 否则拒绝,并从残差分布
里重新采一个。
这个「拒了就按残差重采」的规则,是它与普通拒绝采样的关键差别。普通拒绝采样拒了会退回从 原样重采(等价于多跑几次大模型),而这里从残差重采,保证了「被草稿高估的那部分」会被修正回来。
证明的核心是一条恒等式。把接受与拒绝两条路径对最终分布的贡献分开写,则输出为 的总概率是两者之和:
先算拒绝的总概率。由 ,正差之和等于负差之和,于是残差分布的分母满足
把它代回拒绝路径, 恰好被约掉:
于是两条路径相加:
证毕:不论草稿模型多差,复合采样的边际分布都是 。论文把完整证明放在附录 A.1(arXiv:2211.17192,§A.1)。这也解释了为什么 EAGLE、Medusa 系列都反复强调自己「保持分布不变」——那是这套采样规则的直接结论,不是经验观察。
顺带得到一个非常有用的副产品:接受率本身有闭式表达。若按上面的规则采,单个草稿 token 被接受的概率恰好是两个分布的重叠部分:
这条式子(Leviathan 等定义为「自然散度」并在 Corollary 3.6 里给出,arXiv:2211.17192,§3.2)把「草稿猜得准不准」翻译成了一个纯几何量:草稿分布与目标分布的重叠面积越大, 越高。两极也自洽——若 ,则 ,草稿猜什么都被接受;若两者完全错开,则 ,一个都留不下。这也解释了为什么采样参数会影响加速:温度越低、分布越「尖」, 和 越容易在同一个峰上重叠, 就越高。原论文在多种模型组合上都观察到「调整后的分布越尖, 越高」,且同组合下贪心解码(温度 0)的接受率普遍高于标准采样(温度 1)——T5-small 做草稿时是 0.75 对 0.62(arXiv:2211.17192,§4.2)。
四、一轮到底能产出多少 token:截断几何分布
有了 ,就能回答第一个关键问题:一次投机迭代平均产出几个 token?
做两个简化假设(原论文同样采用,arXiv:2211.17192,§3.1):把每个草稿 token 的接受看成独立同分布、接受率都为 。
先数「被接受的草稿 token 数」,记作 。它是一个上限为 的截断几何变量:
而一轮产出的 token 数 等于被接受的草稿数,再加上目标模型补的那 1 个校正 token,即 ——所以一轮至少产出 1 个 token。在目标模型串行次数这个意义上,它与普通解码相比永不更慢:每次并行前向至少产出一个新 token,串行次数不会比朴素自回归更多(arXiv:2211.17192,§2.1)。把 的分布写出来:
可以自行验证各项相加为 1:。
用期望的尾和公式来算最省力:一轮产出至少 个 token,等价于前 个草稿都被接受,在 i.i.d. 假设下概率为 ,于是
这正是原论文的式 (1)(arXiv:2211.17192,Eq. 1):它把一轮产出刻画成一个「上限为 、成功率为 的截断几何变量再加 1」,期望产出就是这个有限等比级数。几个可自检的极限:
- :,退化成朴素解码(每次只多一个 token),符合预期;
- :,一轮吃满 个草稿再加 1 个校正 token;
- :,不再投机。
把 摊成一张速查表(每格是该 组合下每轮平均产出的 token 数):
| γ \ α | 0.4 | 0.6 | 0.8 | 0.9 |
|---|---|---|---|---|
| 1 | 1.40 | 1.60 | 1.80 | 1.90 |
| 2 | 1.56 | 1.96 | 2.44 | 2.71 |
| 4 | 1.65 | 2.31 | 3.36 | 4.10 |
| 6 | 1.66 | 2.43 | 3.95 | 5.22 |
| 8 | 1.67 | 2.47 | 4.33 | 6.13 |
| 10 | 1.67 | 2.49 | 4.57 | 6.86 |
(表内数值由本文按公式计算,仅作量级参考。)两个规律一眼可见: 越低,加 越没用; 越高,加 的收益越大。几个读法:
- :,比 (1.40)只多 0.27——低接受率下加大 几乎白费;
- :,比 (1.80)多 2.77——高接受率下加大 很值;
- :,正逼近理论上界 ——接受率越高,越接近「一轮吃满 γ+1 个」。
- 对照这张表与第五节的墙钟公式可以看出: 决定 的天花板,而成本系数 决定这个天花板能不能兑现。
举两个具体数:若 ,则 ;若 ,则 ——即每次跑一次大模型,平均能拿到约 3.7 个 token,而不是 1 个。原论文在引言里给过一个更醒目的例子:一句 38 个 token 的话,只用了 9 次目标模型(9700 万参数)的前向就生成完了,靠的是一个 600 万参数的近似模型(arXiv:2211.17192,§1)——平均每次前向产出约 4.2 个 token。这里要提醒三个量不要混:38 是「整句」的 token 总数(9 轮合计),4.2 才是与 同量纲的「单轮平均产出」(本文由 38÷9 算出,见文末 D6),而 3.36/3.69 是另两个参数组合下的单轮平均产出。
五、墙钟加速比:把草稿成本算进来
第四节只数了「产出多少 token」,还没算「代价多少」。这是投机解码最常被讲漏、也是最能解释那个反例的一步。
一轮迭代的时间分成两笔:
- 草稿模型跑 次(串行),每次耗时约为目标模型单次前向的 倍,合计约 (以「一次目标前向」为单位);
- 目标模型跑 1 次(并行验证 γ 个位置)。
所以一轮的代价 ≈ (单位:一次目标前向)。而朴素解码产出一个 token 的代价恰好是 1 次目标前向。两者相除,得到墙钟加速比:
这就是原论文的 Theorem 3.8(arXiv:2211.17192,§3.3)。它把整件事说透了:加速比 = 每轮多产的 token 数 ÷ 每轮多付的代价。分母里那个 就是「草稿的过路费」, 是成本系数(论文 Definition 3.7 定义为草稿单次前向耗时与目标单次前向耗时之比)。论文还提醒:与 不同, 不是模型固有属性,它取决于硬件配置与实现细节(§3.3)。
一个立刻能用的判据。 取最简单的 代入:,分母 ,于是
要让这个值大于 1,只需
这条判据不是本文首创:论文在 Corollary 3.9 里给出了同一结论——「若 ,则存在 使加速成立,且加速比至少为 」(arXiv:2211.17192,§3.3)。本文做的只是把 代进 Theorem 3.8,验证它正好复现该下界。也就是说:只要接受率高于成本系数,就有正收益;反之若 ,草稿比它省下的时间还贵,投机只会拖慢。
现在回头看开头那个反例。论文实测(arXiv:2211.17192,Table 2 与 Table 4):
- T5-XXL(11B)配 T5-small(77M):;
- T5-XXL(11B)配 T5-large(800M):。
代进公式(本文复算,见文末):
- T5-small:,论文给出理论 3.2、实测 3.4;
- T5-large:,论文给出理论 2.5、实测仅 1.7。
T5-large 的接受率更高(0.82 > 0.75),理论加速却更低(2.5 < 3.2)。原因全在分母:800M 的草稿比 77M 的草稿贵了约 5 倍, 从 0.14 抬到 0.77,把多出来的那点接受率吃了个干净。这就是「猜得更准 ≠ 跑得更快」的算术证据——公式能解释到 2.5,剩下 2.5→1.7 的落差来自实现细节与 i.i.d. 假设的失效(见第十节第 1、2 条),本文不把这两段混为一谈。
关于最优 γ。 公式里还有第三个可以调的旋钮。对固定的 ,把 从 0 往上扫,加速比先升后降——因为 随 单调增但增幅递减(收敛到 ),而分母 是线性增的。论文指出最优 就是最大化 Theorem 3.8 的那个整数,可以用数值方法直接扫出来(§3.5)。把它写成一个连续优化问题,就是让「多产一个 token 的边际收益」等于「多跑一步草稿的边际成本」:
由于 是 的凹函数、分母是 的线性函数,目标函数先增后减(单峰),直接从小到大扫到首次下降即可,无需解析解。有一个特例很常用:若 (草稿几乎免费),最优 尽量大,加速比的上限就是
这给了一个漂亮的「理论天花板」: 的草稿,无论 多大,加速比都不会超过 2;要摸到 4 倍, 至少要 0.75。
六、用论文数字校验公式(对照表)
光有一个公式不足信,用原论文的实验数据把它逐项对一遍。下表左半是论文 Table 2 与 Table 4 的原始记录,右两列是本文按上式独立复算的结果;两列吻合即说明「接受率 → 产出 token 数 → 墙钟加速比」这条链是自洽的。
| 任务 | 草稿模型 | 温度 | γ | α | c | 论文理论加速 | 本文复算 | 论文实测加速 |
|---|---|---|---|---|---|---|---|---|
| EnDe 翻译 | T5-small (77M) | 0 | 7 | 0.75 | 0.02 | 3.2 | 3.16 | 3.4 |
| EnDe 翻译 | T5-base (250M) | 0 | 7 | 0.80 | 0.04 | 3.3 | 3.25 | 2.8 |
| EnDe 翻译 | T5-large (800M) | 0 | 7 | 0.82 | 0.11 | 2.5 | 2.50 | 1.7 |
| EnDe 翻译 | T5-small (77M) | 1 | 7 | 0.62 | 0.02 | 2.3 | 2.26 | 2.6 |
| 新闻摘要 | T5-small (77M) | 0 | 5 | 0.65 | 0.02 | 2.4 | 2.40 | 3.1 |
| EnDe 翻译 | 二元模型 (bigram) | 0 | 3 | 0.20 | ≈0 | 1.25 | 1.25 | — |
数据来源:arXiv:2211.17192 的 Table 2(实测)、Table 4(理论预期 + 成本系数)与 §3.6/§4.2(bigram 一行给出 γ=3、1.25×);「本文复算」一列由 代入得出。
这张表里有三个值得单独拎出来的观察:
- 实测普遍高于理论或略有偏差,因为 i.i.d. 假设只是近似,且实现优化程度与基线不同(论文自己在 §A.3 说明)。数量级一致即可,不必苛求逐位相等。
- T5-base 是「又好又不贵」的甜点区吗? 不是——它的理论加速(3.25)几乎追平 T5-small(3.16),但实测(2.8)反而低于 T5-small(3.4)。理论没算进「实际草稿前向的固定开销」,这正是纸上公式与线上墙钟的落差。
- 零成本草稿也能有一点加速。bigram 模型的接受率只有 0.20,但由于 (查表即可,几乎不耗时),加速比仍有约 1.25 倍。这条事实很关键:当草稿的过路费接近零时,哪怕猜得很烂也不会亏——这也解释了后文 n-gram / 后缀解码这类「无草稿模型」路线为什么在特定负载下值得一用。
下面另看一组「换一个任务、换一批模型」的接受率 α(论文 §4.2 / Table 3 的实测汇总)。要提醒的是:这张表的一列是「接受率」,与上一张表的「加速比」是两回事——高接受率不等于高加速,上一张表里的 T5-large 就是活例子。
| 目标模型 | 草稿 | 温度 | α |
|---|---|---|---|
| GPT-like 97M | unigram | 0 | 0.03 |
| GPT-like 97M | bigram | 0 | 0.05 |
| GPT-like 97M | GPT-like 6M | 0 | 0.88 |
| GPT-like 97M | GPT-like 6M | 1 | 0.89 |
| T5-XXL (EnDe) | unigram | 0 | 0.08 |
| T5-XXL (EnDe) | bigram | 0 | 0.20 |
| T5-XXL (EnDe) | T5-small | 0 | 0.75 |
| T5-XXL (EnDe) | T5-base | 0 | 0.80 |
| T5-XXL (EnDe) | T5-large | 0 | 0.82 |
| T5-XXL (EnDe) | T5-small | 1 | 0.62 |
两个规律:其一,同架构、同任务的真·小模型(GPT-like 6M 对 97M)能拿到惊人的高接受率(0.88–0.89),远高于 n-gram;其二,无参数的 n-gram 接受率只有个位数到两成(本文所引这段里为 0.03–0.20),但胜在成本为零。 与 的这种「此高彼低」关系,就是选型时要拿捏的。
七、草稿从哪来:五种来源的取舍
公式里的 与 不是天上掉下来的,它们由「草稿从哪来」决定。把主流的几种草稿来源按 与 的权衡排一下,就是选型地图。
flowchart LR
Q["一个推理请求"] --> R{"prompt 与历史里重复多吗"}
R -->|"很多:代码编辑 / agent 循环"| S["n-gram / 后缀解码:零草稿模型"]
R -->|"不多:彼此独立的请求"| T{"能否加载或训练草稿模型"}
T -->|"能,可接受额外显存"| U["独立草稿模型 / EAGLE / Medusa / MLP 投机头"]
T -->|"不能,只要轻量"| V["n-gram / MLP 投机头"]这张图说明了什么:选哪条路线,本质上是在回答「这活里 与 哪个更值钱」——只有当你既有高重复度、又不想加载第二个模型时,n-gram 才划算;当请求彼此独立、又没有廉价草稿可用时,才轮到「训练一个专门的投机头」。
- 独立草稿模型:最经典的做法,直接拿一个同架构的小模型(如 T5-small 配 T5-XXL)。优点是简单、无需训练、无损;缺点是要额外加载一个模型、占一份显存, 完全由两模型尺寸比决定。原论文观察到「草稿比目标小约两个数量级」时通常最划算(arXiv:2211.17192,§3.6)。
- Medusa(多头解码头):不再需要第二个模型,直接在目标模型上加若干个解码头并行预测后续 token,用树注意力一次验证多条候选路径。它在冻结主干时叫 Medusa-1,可做到「无损加速 2.2 倍以上」;连主干一起微调的 Medusa-2 把加速提到 2.3–3.6 倍(arXiv:2401.10774 摘要)。代价是需要训练解码头。
- EAGLE(特征层自回归):观察是「在第二顶层特征上做自回归比在 token 层更直接」,但特征层本身的不确定性会拖累它;EAGLE 用「把 token 序列提前一个时间步」的方式消除这个不确定性,在 LLaMA2-Chat 70B 上做到 2.7–3.5 倍延迟加速、吞吐翻倍(arXiv:2401.15077 摘要)。
- EAGLE-2(动态草稿树):发现草稿 token 的接受率不只取决于位置、还与上下文有关,于是用「上下文感知的动态草稿树」自适应调整,把加速推到 3.05–4.26 倍,比 EAGLE-1 快 20%–40%(arXiv:2406.16858 摘要)。
- MLP 投机头 / 组合投机器:在 Medusa 的多头 MLP 基础上,让每个头同时条件于「基座状态向量」与「上一步真正采到的 token」,并配论文所述的两阶段训练(先对齐基座输入行为、再对齐输出行为);IBM 报告在生产环境把四款模型加速 2–3 倍(arXiv:2404.19124;「四款」这一表述见其配套的官方 PyTorch 博客)。
- n-gram 与后缀解码:完全不用神经网络草稿,直接从 prompt 与历史输出里做模式匹配。n-gram 用最近若干 token 去 prompt 里找相同片段来续猜;后缀解码(Suffix Decoding)进一步用后缀树缓存长序列,并在接受可能性高时多投机、低时少投机,在 SWE-Bench、Text-to-SQL 等 agentic 基准上做到最高 5.3 倍加速(arXiv:2411.04975 摘要)。这类方法的 通常不高,但 ,所以「猜错也不亏」。
把上面六种来源放到同一张表里对照,差异一目了然:
| 来源 | 典型 α | 成本系数 c | 是否需训练 | 额外显存 | 备注 |
|---|---|---|---|---|---|
| 独立草稿模型 | 高(0.6–0.9) | 中(由尺寸比定) | 否 | 一份小模型 | 最经典、无损 |
| Medusa(多头 MLP) | 中高 | 低 | 是 | 几个解码头 | Medusa-1 冻结主干 |
| EAGLE / EAGLE-2 | 高 | 低–中 | 是 | 一个轻量草稿 | 动态草稿树 |
| MLP 投机头 | 中高 | 低 | 是 | 若干投机器 | 生产环境 2–3 倍 |
| n-gram | 低(0.03–0.20) | ≈0 | 否 | 无 | 峰值流量不增负担 |
| 后缀解码 | 低–中(自适应) | ≈0 | 否 | 一个后缀树 | 高重复负载最高 5.3 倍 |
树注意力是怎么一次验完多条路径的? Medusa、EAGLE 这类方法会一次性给出多条候选路径(一棵「草稿树」),要把它们塞进一次前向里验证,靠的是一个专门的注意力掩码:它的作用是让每条候选路径只能「看见」自己的祖先节点、看不见兄弟分支,从而在同一次前向里为每条路径算出互不串扰的概率。下图是这棵树的形状(节点名里的 A1/A2a/A2b 等是为了区分同一父路径下的不同分支):
flowchart TD
Z["位置 t 的隐藏状态 z"] --> A1["路径 A 第 1 步"]
Z --> B1["路径 B 第 1 步"]
A1 --> A2a["路径 A 第 2 步 · 分支 1"]
A1 --> A2b["路径 A 第 2 步 · 分支 2"]
B1 --> B2["路径 B 第 2 步"]
A2a --> VA["树注意力:一次并行验证全部路径"]
A2b --> VA
B2 --> VA这张图说明了什么:草稿不再是一条线,而是一棵树;树注意力让多个候选共享同一次前向的算力,从而在不增加串行步数的前提下把「多猜几条」的命中概率抬高。EAGLE-2 的贡献正是把这棵树从「静态」改成「随上下文动态调整」(见上文 bullet)。
值得单独说一句 n-gram / 后缀解码为什么在 agent 负载里翻身:这类工作流的输入往往高度重复(多 agent 流水线在跑相似子任务、自反思循环反复改写同一段输出),于是「从历史里找相同片段」的命中率飙升。第六节里那个「接受率只有 0.20 的 bigram 也能有 1.25 倍加速」的观察,在这里被放大成了一个可用的工程手段——代价是它对低重复度负载几乎无用。
八、松弛:允许一点点失真,能多换多少加速
前七节都在「无损」这个约束下讨论。但如果愿意接受一点点、且有界可言的失真,加速比还能再抬一截。这属于原论文附录 A.5 的「lenience」(松弛)一节。
做法是给比较加一个松弛因子 :把草稿分布缩小到原来的 倍(等价于把接受判据放宽 倍)后再与目标比较。用公式写出来,松弛就是把接受判据从 放宽成带 的形式:
即退回到无损的原式。它保留了一个很有用的保证——任何 token 被采到的概率都不会超过它真实概率的 倍;换句话说,极其稀有的 token 仍会保持稀有。但代价是:这种松弛只约束上界、不约束下界,因此可能损害输出的多样性。下表是论文的实测(T5-XXL 配 T5-small,即 那组, 固定):
| 松弛因子 β | 允许的最大放大(论文取整) | 加速比 |
|---|---|---|
| 1(无损) | 1× | 2.5 |
| 0.5 | 2× | 3.1 |
| 0.3 | 3×(1/β≈3.33) | 3.6 |
| 0.1 | 10× | 5.0 |
数据来源:arXiv:2211.17192,§A.5 与 Table 5(论文把 1/β 的放大倍数表述为 1X / 2X / 3X / 10X)。⚠️ 这张表与第六节那张对照表的同配置行(T5-XXL + T5-small、温度 1)数值不完全相等(此处 β=1 行给 2.5,第六节理论 2.3 / 实测 2.6),原因是两处的成本系数取值不同(§A.5 该处取 ,第六节表取 )——同量不同源,不要相互代入。
可以看到,把允许的失真从「零」放宽到「不改超过 10 倍」,加速比从 2.5 抬到了 5.0——几乎翻倍。这条曲线也再次印证了第五节的主线:加速比其实是在「产出量」和「代价」之间讨价还价,而「无损」只是把 钉死了的其中一个极端。实际系统里是否用松弛,取决于你是否允许输出分布偏离目标——对绝大多数要复现官方行为的场景,答案是不用。
九、工程含义:从公式到线上参数
公式落到工程上有几条直接可用的判断:
第一,加速比有上限,且那个上限由 与 共同决定。 当草稿几乎免费()时,加速比趋近 ,上限为 。把 调大能抬高上限,但收益递减—— 越高,多加一步草稿越值; 若只有 0.2,把 从 5 加到 10, 几乎不动(约 1.25)。
第二,算力不是免费的,只是被藏起来了。 投机解码并不是「凭空多出 token」:它用额外的并行算力换墙钟时间。原论文 Table 1 给出了一组 (α, γ) 下的「算术量增幅 / 理想加速比」对照(理想加速比一列为 的上界):
| α | γ | 算术量增幅 | 理想加速比 |
|---|---|---|---|
| 0.6 | 2 | 1.53× | 1.96× |
| 0.7 | 3 | 1.58× | 2.53× |
| 0.8 | 2 | 1.23× | 2.44× |
| 0.8 | 5 | 1.63× | 3.69× |
| 0.9 | 2 | 1.11× | 2.71× |
| 0.9 | 10 | 1.60× | 6.86× |
数据来源:arXiv:2211.17192,Table 1。含义很清楚:当显存带宽是瓶颈、算力有余量时,投机解码是净赚;一旦机器已经算力打满(大 batch、高并发),它只会白烧算力。论文也据此指出,投机解码「假设计算资源足以支撑提高的并发度」(§3.4)。
第三,接受率随负载漂移, 最好动态调。 论文指出,既然各位置 不完全相同,就能通过「预测当前 并相应改变 」拿到额外收益;在无算力上限的乐观假设下,这个提升的上界约为固定 的 60%(论文原文为 up to ~60% higher,arXiv:2211.17192,§3.5)。工程上的对应实现就是「动态草稿树 / 自适应投机步数」。
第四,它在服务框架里已经是标配选项。 vLLM 官方文档把投机方法列成一排:模型类方法(EAGLE、MTP、独立草稿模型、PARD、MLP)延迟收益最好,而 n-gram 与后缀解码这类轻量路线「在峰值流量下不额外增加负载」,适合低到中等增益的场景。文档也把已知边界写清楚了:投机解码目前不能与流水线并行组合(vllm<=0.15.0),且早期版本(vllm<=0.10.0)不支持独立草稿模型。vLLM 还专门声明了「无损保证」的三个层次——理论无损(到硬件数值精度)、算法无损(有拒绝采样收敛性与贪心一致性测试兜底)、以及 logprob 稳定性不保证(同一请求跨运行的输出可能不同)(vLLM 官方文档,Speculative Decoding)。
第五,草稿「准」受物理限制,「贵」能靠工程压下去。 把第五节的公式对着第一性原理再读一遍: 是受物理限制的——它被 卡住,一个小模型对一个大模型的分布重叠有天花板;而 是可以被工程压下去的(更小的草稿头、量化、缓存、甚至零成本的 n-gram)。所以真实的优化方向往往是「在不显著抬高 的前提下尽量抬高 」,而不是单纯追求一个更大的草稿模型。IBM 的实测也印证了这一点:草稿头数不是越多越好——语言模型 3–4 个头、代码模型 6–8 个头最划算,头数再多,多出来的算力消耗会抵消收益(PyTorch 官方博客)。
第六,批大小会吃掉收益。 官方 PyTorch 博客在头数/批大小的效率说明里,原文记下了这条经验边界:「We begin to observe throughput reduction beyond a batch size of 64」。这与第一节的「带宽受限才有空档」一致——batch 一大,算力被打满,投机赖以生存的「闲置算力」就没了。这也解释了为什么投机解码的收益通常只在低到中等 QPS下显现。
十、边界、未解与小结
按惯例,把这篇能证明的、不能证明的、以及仍未解决的问题逐条列清楚。
- 公式是模型,不是真值。 第四、五节的加速比建立在「各位置接受率独立同分布」的假设上(arXiv:2211.17192,§3.1)。真实文本的位置相关性强,所以理论值与实测值会有偏差——本文对照表里最大的一处(T5-large:理论 2.5、实测 1.7)就是这个假设失效的体现,不宜把理论值当承诺。
- 成本系数 c 依赖硬件与实现,不是模型的固有属性。论文明确:与 α 不同,c 取决于硬件配置与软件实现细节(§3.3)。所以「同一对模型在同一卡上」才可比,跨硬件引用具体加速比要格外小心。
- 本文复算的数字只作量级一致性检查。 表里「本文复算」一列是把论文的参数代入公开公式得到的结果,用于验证公式链自洽,不得作为官方数值引用;论文实测列才是原作者的测量值。
- 接受率高的模型组合未必更快,这是本文最想纠正的直觉:T5-small(α=0.75)实测 3.4 倍 > T5-large(α=0.82)实测 1.7 倍。选草稿时,「目标模型/草稿模型尺寸比」与「草稿的实际墙钟开销」要和 α 一起看。
- 「无损」不是一个开关,而是有层次的。 理论无损(实数概率)、算法无损(实现层面有测试保证)、数值无损(硬件浮点)是三层;vLLM 明确说明它不保证跨运行的 logprob 完全稳定(vLLM 文档)。逐字节可复现的场景要把这层差异算进去。
- 松弛(第八节)以失真换加速,而且只约束概率上界、不约束下界,可能损害输出多样性。用它就要接受「输出分布不再严格等于目标分布」。
- 不同论文的加速比口径不完全可比。 有的报延迟加速、有的报吞吐,有的在不同温度、不同 batch、不同硬件上测。本文表格里每一行都标了任务/温度/参数,正是为了不把不同口径的数字并置。
- 仍未解决的问题: 的最优值随 漂移,而 又逐位置变化,「预测 α 并实时调 γ」目前只在理论上有上界估计(§3.5),工业界的动态方案仍在演进;「跨词表草稿模型」(草稿与目标用不同 tokenizer)在 vLLM 中目前也只支持贪心草稿采样,带温度的接受还未开放;此外,本刊未独立复现任一加速比,「哪个组合在你的硬件上最划算」仍要在你自己的负载上实测。
小结:投机解码的加速比可以写成一个干净的式子——。分子衡量「猜得多准」,分母衡量「猜得多贵」。它之所以有效,是因为单条解码本就困在显存带宽里、算力大量闲置;它之所以常常不如预期,是因为草稿的过路费()与接受率之间有一场此消彼长的拉锯。把这两个量分别看清楚,比记一个「能加速 2–4 倍」的结论有用得多。
📋 来源与核验记录
一手论文与官方材料(均于 2026-10-06 实访 arXiv/官网当日页面;论文版本与修订日期以各自 arXiv 页面的 Submission history 为准,对 arXiv 未列修订历史者——如 arXiv:2406.16858、arXiv:2404.19124——以当日页面为准):
- Yaniv Leviathan, Matan Kalman, Yossi Matias, Fast Inference from Transformers via Speculative Decoding, ICML 2023(arXiv 页面标注 Oral),arXiv:2211.17192,v2 修订于 2023-05-18(v1 2022-11-30)。含 §1、§2.1、§3.1、Eq. 1、§3.2 Corollary 3.6、§3.3 Theorem 3.8 与 Corollary 3.9、§3.4、§3.5(动态 γ 的理论上界约 +60%)、§3.6、§4.1–4.2、Table 1/2/3/4/5、§A.1、§A.3、§A.5 松弛。https://arxiv.org/abs/2211.17192
- Charlie Chen, Sebastian Borgeaud, Geoffrey Irving, Jean-Baptiste Lespiau, Laurent Sifre, John Jumper, Accelerating Large Language Model Decoding with Speculative Sampling, arXiv:2302.01318,v1 2023-02-02(Chinchilla 70B,2–2.5 倍分布式解码加速,无损)。https://arxiv.org/abs/2302.01318
- Tianle Cai et al., Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads, arXiv:2401.10774,v3 修订于 2024-06-14(v1 2024-01-19)。Medusa-1 无损 >2.2 倍、Medusa-2 2.3–3.6 倍;Tri Dao 为共同作者。https://arxiv.org/abs/2401.10774
- Yuhui Li, Fangyun Wei, Chao Zhang, Hongyang Zhang, EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty, arXiv:2401.15077,v3 修订于 2025-03-04(v1 2024-01-26)。LLaMA2-Chat 70B 延迟加速 2.7–3.5 倍、吞吐翻倍。https://arxiv.org/abs/2401.15077
- Yuhui Li et al., EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees, EMNLP 2024 主会(本文所引 3.05–4.26 倍 / 比 EAGLE-1 快 20%–40% 取自其 arXiv 摘要,arXiv:2406.16858)。https://arxiv.org/abs/2406.16858
- Gabriele Oliaro et al., SuffixDecoding: Extreme Speculative Decoding for Emerging AI Applications, NeurIPS 2025 Spotlight,arXiv:2411.04975,v3 修订于 2025-10-07(v1 2024-11-07;agentic 基准最高 5.3 倍)。https://arxiv.org/abs/2411.04975
- Davis Wertheimer et al.(IBM Research), Accelerating Production LLMs with Combined Token/Embedding Speculators, arXiv:2404.19124(生产环境 2–3 倍;两阶段训练方案;语言模型 3–4 头、代码模型 6–8 头)。https://arxiv.org/abs/2404.19124
- vLLM 官方文档,Speculative Decoding(方法清单、无损保证三层、与流水线并行/早期版本的兼容限制;2026-10-06 实访)。https://docs.vllm.ai/en/latest/features/speculative_decoding/
- Hugging Face Blog(João Gante),Assisted Generation: a new direction toward low-latency text generation,2023-05-11(从显存带宽角度解释延迟瓶颈)。https://huggingface.co/blog/assisted-generation
第三方分析与工程博客:
- 官方 PyTorch Blog,A Hitchhiker’s Guide to Speculative Decoding(IBM 生产部署 2 倍/代码模型 3 倍;头数与 batch 的经验边界,原文「We begin to observe throughput reduction beyond a batch size of 64」;2026-10-06 实访)。https://pytorch.org/blog/hitchhikers-guide-speculative-decoding/
本文自行推导(仅作量级一致性检查,不得作为官方数值引用):
- D1|单条解码算术强度 FLOP/字节:由 FLOP 与 字节(fp16 权重)相除得到;脊点量级(10²–10³ FLOP/字节)为行业常识量级,本文未绑定具体型号(第一节)。
- D2|70B 模型 fp16 权重约 、单条解码吞吐估算:以约 1.0 / 2.0 / 3.0 TB/s 三档显存带宽代入「权重字节数 ÷ 带宽」,得约 7 / 14 / 21 token/秒。此估算只计权重搬运、不计 KV Cache 与 kernel 效率,仅示数量级(第一节)。
- D3|加速比公式的逐项复算:、、、、、bigram()≈1.25,六格与论文 Table 2/Table 4/§3.6 逐项吻合(第六节)。
- D4|Table 1 的算术量增幅复现:以「每轮算术量 ≈ 、除以 」在 下得到 1.53 / 1.58 / 1.23 / 1.63 / 1.11 / 1.60;其「理想加速比」一列为 时由加速比公式得到的上界(1.96 / 2.53 / 2.44 / 3.69 / 2.71 / 6.86)。两者均与论文 Table 1 逐项一致(第九节)。此处的 假设系本文为复现而试出,非论文原文声明。
- D5|无成本草稿的加速上限 :由 令 得(第五节)。
- D6|38÷9≈4.2:把论文 §1 的「38 个 token / 9 次前向」换算成平均每次前向产出(第四节)。
- 另:第五节的判据 与下界 出自论文 Corollary 3.9(arXiv:2211.17192,§3.3);本文做的只是以 代入 Theorem 3.8 复现该下界,不计入本文自行推导。
数据截至 2026-10-06。文中各项加速比均为对应论文/官方文档在其各自硬件、批次与采样设置下的报告值,本刊未做独立复现;理论值与实测值的落差已在第六、十节标明。本文由 AI 辅助整理,一手来源与推导步骤已如实标注,供读者自行核验。