让大模型「打草稿」再「验收」,推测解码怎么白捡 2~3 倍推理速度

大模型推理提速这件事,大多数人想到的是换更强的显卡、或者把模型量化到更低的精度。但有一条路线既不用换硬件、也不用牺牲精度,甚至从数学上保证输出和原来一字不差,就能把生成速度提升 2 到 3 倍——这就是推测解码(Speculative Decoding)。它背后藏着一个反直觉但极其漂亮的洞察:大模型生成 token 之所以慢,慢的其实不是”算”,而是”等”。

让大模型「打草稿」再「验收」,推测解码怎么白捡 2~3 倍推理速度

Speculative Decoding 推测解码核心信息图

自回归解码到底慢在哪

要理解推测解码,先得把大模型生成文本的底层机制看清楚。

大语言模型生成文本是自回归的:一次只吐出一个 token,而且下一个 token 必须等上一个 token 算出来之后才能开始。用公式表达就是每一步从条件分布里采样一个词:xt+1 ~ p(· | x1, x2, …, xt)。这带来两个致命问题。

第一是串行依赖:第 100 个 token 依赖前 99 个 token 的结果,这个依赖链条没法并行化。你要生成一个 1000 token 的回答,就必须老老实实做 1000 次前向传播,一次都不能少。

第二、也是更隐蔽的问题是访存瓶颈。每次生成一个 token,都要把几百 GB 的模型权重从显存(HBM)读到计算单元里做一次矩阵乘法,然后只产出 1 个 token。也就是说,你花了巨大的力气”读”了整个模型,结果只换来一个 token。以 H100 上的 Llama-3.1-70B 为例,单个 token 的生成延迟大约 14 毫秒,一个 1000 token 的回答就要 14 秒。更尴尬的是,在单序列推理(batch=1)时,GPU 的计算单元利用率常常不足 10%——大部分时间都花在”等数据从显存里搬过来”上,而不是”算”上。

这就引出了推测解码赖以成立的那块基石:一个关键的、几乎是”免费”的特性。

核心洞察:验证是并行的,生成才是串行的

Transformer 有一个重要的性质:单次前向传播处理 k 个 token 的延迟,和只处理 1 个 token 的延迟差不多。原因正是上面说的访存瓶颈——读一遍模型权重这个动作,不管你这次要”算”多少个 token,读权重的代价是基本固定的。在内存带宽受限的区域里,一次算 1 个 token 和一次算 8 个 token,墙钟时间几乎一样。

这就打开了一扇门:既然”生成”必须串行,但”验证”可以并行,那我们能不能把一部分串行的生成,偷换成并行的验证?

推测解码的思路正是这样:用一个轻量的小模型(草稿模型,draft model)快速”猜”出接下来的几个 token,然后让大模型(目标模型,target model)一次性、并行地验证这几个猜测对不对。对的前缀直接收下,猜错的在第一个出错的位置停下来,由大模型自己补一个正确的 token。这样一轮下来,大模型只做了一次前向传播,却可能”通过”了好几个 token。

打个比方:大模型就像一个严格的老师,正常情况下学生每写一个字都要拿给老师看一次,老师看一个字要花很久。推测解码则让一个写字很快的”草稿助手”先一口气写下五六个字,再把这五六个字一起交给老师,老师一眼扫过去:”前三个字对了,第四个字错了。”——于是前三个字直接通过,只改第四个字。老师还是那个老师,答案还是那个答案,但效率高了好几倍。

两个模型、一篇奠基论文

推测解码的正式诞生,来自 2023 年两篇几乎同时独立提出的论文:

维度 Leviathan et al.(Google) Chen et al.(DeepMind)
标题 Fast Inference from Transformers via Speculative Decoding Accelerating LLM Decoding with Speculative Sampling
arXiv 2211.17192 2302.01318
发表 ICML 2023 Oral DeepMind 技术报告
核心术语 Speculative Decoding Speculative Sampling
草稿长度参数 γ(gamma) K
验证目标 T5-XXL(11B) Chinchilla 70B
实测加速 2~3× 2~2.5×

两篇论文不约而同地证明了一件至关重要的事:这个方法无损——不管草稿模型猜得有多差,最终输出的 token 分布都和”直接用大模型生成”完全一致。这一点,是推测解码能被工业界大规模采用的根本原因:它不是一个”牺牲一点质量换速度”的近似,而是一个”数学上严格等价”的免费加速。

draft-then-verify:算法一步步拆开

推测解码的完整流程,可以分成三个阶段,每一轮循环里都会走一遍。

阶段一:Draft(起草)。给定已有的上下文,让草稿模型 q 自回归地生成 γ 个候选 token。因为草稿模型很小(比如目标模型 70B,草稿模型可能只有 7B 甚至更小),这一步快得几乎可以忽略。

阶段二:Verify(验证)。把”已有上下文 + 这 γ 个候选 token”整体作为输入,喂给大模型 p,做一次前向传播。大模型一次性输出这 γ+1 个位置各自的完整词表概率分布。

阶段三:Accept / Reject(接受 / 拒绝)。从第一个候选 token 开始逐个判断:对第 i 个候选 token xi,算出大模型给它概率 p(xi)、草稿模型给它概率 q(xi),接受概率为 αi = min(1, p(xi) / q(xi))。用一个随机数 r(0 到 1 之间均匀采样)和 αi 比较:r 小于 αi 就接受这个 token,继续判断下一个;一旦在某一步拒绝,就从”大模型概率减去草稿模型概率”的残差分布里重新采样一个正确 token,然后停止本轮、进入下一轮。

这里的玄机在于那个接受概率公式 min(1, p/q)。当大模型比草稿模型更”看好”某个 token(p ≥ q)时,直接接受;当大模型没那么看好(p < q)时,也以 p/q 的概率”碰运气”接受。这个看似随意的设计,恰恰是保证最终输出无损的数学关键,下面专门讲。

为什么它是”无损”的:一段漂亮的证明

推测解码最让人放心的一点,是它有一个严格到不能再严格的保证:最终生成的 token 序列,其分布和”直接用大模型逐 token 采样”一模一样。这意味着你完全不用担心”加速之后模型变笨了”。

证明的核心只用一个单 token 的情形就能说清。假设我们要输出一个 token t,它有两种来源:

情况一:草稿模型采样到了 t,并且 t 被大模型接受了。这个概率是 q(t) × min(1, p(t)/q(t)) = min(q(t), p(t))。

情况二:草稿模型的候选被拒绝,t 是从”残差分布” max(0, p(t) − q(t)) 里重新采样出来的。这个概率是拒绝概率 × 残差里 t 的占比,整理后恰好等于 max(0, p(t) − q(t))。

把两种情况加起来:P(输出 t) = min(q(t), p(t)) + max(0, p(t) − q(t))。而数学上恒等式 min(a, b) + max(0, a − b) = a 对任意 a、b 都成立,所以 P(输出 t) = p(t)。

换句话说,无论草稿模型 q 有多差,最终输出都精确等于大模型 p 的分布。草稿模型猜得准,只是让”被接受的 token 更多”、从而更快;猜得再不准,也不会让输出偏离大模型一丝一毫。这个性质,让推测解码成为推理优化里少有的”没有代价的免费午餐”。

决定收益的关键:接受率和草稿模型

虽然无损,但推测解码不一定总能加速。它到底能快多少,取决于一个核心指标:接受率(acceptance rate)——草稿模型猜出来的 token,有多大比例能被大模型接受。

逻辑很直观:草稿模型猜得越准,一轮验证能通过越多 token,省下的大模型调用次数就越多;猜得越差,草稿模型等于白跑,反而还搭进去了草稿模型自己的开销。业界测出来的典型接受率是:

  • 代码生成:65%~80%(代码有大量固定语法、常见句式,最好猜);
  • 结构化输出(JSON、SQL):60%~75%;
  • 英文聊天:50%~65%;
  • 多语言或创意写作:35%~55%(越”出其不意”越难猜)。

有个经验红线:接受率一旦掉到 40% 以下,推测解码很可能就”净负收益”了——草稿模型的开销盖过了省下来的时间。所以落地时,接受率是一个必须先测、再决定开不开启的指标。

那怎么选草稿模型?有三条经验法则:

  1. 大小差 4~10 倍:草稿模型要明显比目标模型小,这样它起草的速度优势才够大;但也不能小到完全猜不中。
  2. 尽量同族:草稿模型和目标模型要来自同一模型家族(Llama 配 Llama、Qwen 配 Qwen)。因为同族模型共享相同的分词器(tokenizer)和相近的 token 分布,接受率会显著更高。跨家族配对是常见误区——分词器对不上会直接毁掉接受率。
  3. 数据同源:有条件的话,让草稿模型在目标模型训练数据相似的语料上做微调,能进一步提高接受率。

还有一个容易被忽略的限制:草稿模型和目标模型得共享显存、各自维护自己的 KV cache。这意味着推测解码更适合”有富余算力”的场景,在高并发大 batch 下收益会衰减——这点放到后面专门讲。

从”一个小模型”到一整片变体家族

原始推测解码要额外准备一个独立的草稿模型,这带来一个麻烦:多一个模型就多一份显存、多一份部署复杂度。于是研究者们围绕”草稿 token 从哪来”这个问题,发展出了一整片变体。

Medusa(美杜莎):不给目标模型配小模型,而是在大模型上加几个额外的”预测头”,让它们直接预测”接下来第 1、2、3…个 token”。这样就不再需要独立的草稿模型了,属于”自推测”(self-speculative)路线。

EAGLE(1/2/3 代):进一步利用大模型自己的隐藏状态来生成草稿 token,草稿质量更高、接受率也更高,据报告能带来 3~4 倍的加速。

Multi-Token Prediction(MTP,多 token 预测):这个思路已经进入了前沿开源模型的标配。DeepSeek-V3 发布时自带 MTP 头,让它天然支持推测解码,成为旗舰开源模型部署的组成部分。

此外还有 SpecInfer(用树状结构一次性投机多个候选序列)、Lookahead Decoding(借用雅可比迭代做并行解码)、ReDrafter(循环神经网络草稿)等变体,各自在不同维度上优化草稿生成的效率。

这些变体万变不离其宗,都遵循同一个骨架:用一个”便宜”的方式快速产出候选,再用大模型一次性并行验收。理解了原始版本,再看任何变体都只是”候选从哪来”的差异。

真实效果:2~3 倍是常态,但要分场景

论文里报的是 2~3 倍,那生产环境里到底能拿到多少?综合多个部署实践的公开数据,一个诚实的答案是:取决于你的任务类型和草稿模型选得好不好

以 70B~123B 量级的目标模型、3B~14B 量级的草稿模型为例,聊天类负载通常能拿到 p50 吞吐 1.8~2.5 倍的提升、p99 延迟 1.5~2 倍的改善;代码生成因为最好猜,能达到 2.5~3.5 倍;而长文本创意写作这类”高熵”任务,往往只有 1.3~1.7 倍。

值得注意的是,这些是”实测的真实数字”,而不是某些论文里假设了理想批处理或窄场景后才出现的 5~10 倍。AMD 在其 MI300X 加速卡上的官方测试也给出了类似结论:在 batch size 为 1 的情况下,推测解码相对朴素 LLM 推理能带来 1.3 倍到 3 倍的吞吐提升。

还有一个规律:目标模型越大、越慢,推测解码的百分比收益越明显。一个每秒只能吐 7 个 token 的 70B 模型,草稿模型那点几乎固定的开销相对它省下的时间微不足道;而一个每秒已经 75 token 的 8B 模型,本身就不怎么”带宽饥饿”,推测解码能榨出的空间就小得多。

哪些场景适合,哪些要慎重

推测解码不是万金油,它的收益高度依赖场景。适合的场景包括:

  • 代码补全与生成:接受率最高、收益最稳定,是最”无脑开”的场景;
  • 结构化输出:JSON、SQL、配置文件这类格式固定的输出,草稿模型很好猜;
  • 长文本生成:token 数量大,加速效果能充分复利;
  • 单用户、低并发的交互:此时”验证并行化”的红利最大。

反之,以下场景要慎重:

  • 高并发大 batch:batch 很大时,GPU 已经靠”批处理”把带宽吃满了,推测解码”一次算多个 token”的优势被稀释,甚至可能负收益;
  • 短问答:回答只有几十个 token,加速来不及”复利”,草稿模型的开销反而占比高;
  • 高温度采样、创意写作:温度越高、越随机,草稿模型越难猜,接受率越低;
  • 预填充(prefill)为主:推测解码只加速”生成(decode)”阶段,长 prompt 的预填充阶段它帮不上忙。

一个稳妥的落地姿势是:按任务类型分别测接受率,接受率低于 40% 的路由就关掉推测解码,高于阈值的才开启。很多生产团队正是这么做的——推测解码是”默认开、按需关”,而不是一刀切。

主流推理框架都已内置

好在今天的开发者基本不用从零实现推测解码——主流推理框架都已经把它做成了开箱即用的开关。

vLLM:作为最流行的开源推理框架之一,原生支持推测解码,可以指定草稿模型做加速。

NVIDIA TensorRT-LLM:支持 EAGLE-3、多 token 预测(MTP)等先进的推测解码技术,配合英伟达硬件能把收益压满。

SGLang:在结构化生成上做了大量创新,同样内置推测解码支持。

Hugging Face Transformers:在推理接口里提供了推测解码的 assistant model 参数,写几行代码就能挂一个草稿模型。

这意味着,对绝大多数用户来说,开启推测解码的复杂度已经从”实现一个算法”降到了”选一个合适的草稿模型、再配一个开关”。真正需要花心思的,只剩下那件最朴实的事:量一下你自己的负载,接受率到底是多少

为什么它和量化、批处理”搭”而不”抢”

推测解码常常被拿来和另外两类推理优化放在一起讨论,但它们解决的是不同维度的问题,彼此可以叠加。

量化解决的是”每个权重占多少位”——通过降低精度减少显存占用和计算量;连续批处理(continuous batching)解决的是”GPU 的利用率”——让请求随时进出、GPU 别闲着;而推测解码解决的是”生成阶段的串行依赖”——把串行的生成偷换成并行的验证。三者不是非此即彼,而是可以从不同方向叠加:一个做了 FP8 量化、开了连续批处理的服务,照样能再叠加推测解码,进一步榨出延迟。

但也要清醒:推测解码和批处理之间确实存在张力。批处理越大,推测解码的边际收益越小,因为 GPU 已经不”闲”了。所以在高吞吐优先的离线批处理场景,推测解码的意义有限;而在低并发、延迟敏感的在线交互场景,它才是主角。理解这层关系,才能避免”盲目堆优化”。

小结:一个几乎没有代价的免费午餐

推测解码之所以值得被单独拿出来讲,是因为它在推理优化里占据了一个很特殊的位置:它是少数几个”数学上无损、几乎不需要改模型、却能实打实提速”的技术之一。它不要求你换硬件,不要求你接受精度损失,甚至不要求你重新训练——只要求你多准备一个小一点的草稿模型,就能把生成速度提升 2 到 3 倍。

它的核心思想只有一句话:既然验证可以并行、生成只能串行,那就用一个小模型把”生成”偷换成”验证”。这个洞察,从 2023 年两篇论文出发,已经演化成了 Medusa、EAGLE、MTP 一整片变体,并进入了 vLLM、TensorRT-LLM 等所有主流推理框架,成为生产部署的标配。

落到实践,记住三件事就够了:选一个和目标模型同族、小 4~10 倍的草稿模型;先测你真实负载的接受率,低于 40% 就关;在低并发、代码和长文本场景里优先开启。做到这三点,这顿”免费午餐”你就能吃得明明白白。

主要菜单