投机解码:起草、验证、重复


投机解码:起草、验证、重复

本节摘要:自回归解码是串行的,每个 token 等前一个。投机解码打破这条链:便宜模型起草 N 个 token,昂贵模型一次前向验证全部 N 个——起草对了,你为 N 个生成只付一次大模型前向。70B LLM 在 H100 上采一个 token 约 30 ms,3B 草稿模型约 3 ms;让 3B 草稿前看 5 个 token、再跑一次 70B 验证全部 5 个,总耗时 5×3 + 30 = 45 ms 可换最多 5 个被接受的 token,而直推生成要 5×30 = 150 ms。这就是投机解码的全部卖点:用一点额外显存(草稿模型)换 2~4 倍更低的解码延迟。关键在于必须保持分布——Leviathan 等(2023)和 Chen 等同时引入的投机采样,保证输出序列与「大模型自己从头采」同分布,零质量损失,只是更快。2026 推理有四类草稿-验证对:原生投机(独立草稿模型)、Medusa(验证者上多个解码头并行预测,无独立草稿)、EAGLE(轻量草稿复用验证者隐状态,接受率最高,典型 3~4 倍加速)、Lookahead(Jacobi 迭代自投机,无需草稿)。本节带你实现投机采样的核心(拒绝步 + 残差分布),并验证输出分布与直采在卡方检验下一致。

学习目标

阅读完本节,你应当能够:

  1. 说清自回归解码为何串行,以及投机解码如何用「草稿 N 个 + 验证者一次前向」打破串行依赖。
  2. 写出投机采样六步算法:起草、并行验证、逐 token 接受/拒绝、首次拒绝从残差分布采、全接受则送一个奖励 token。
  3. 解释残差分布 (q-p)_+ 归一化为何能精确保持验证者的分布(Leviathan 定理)。
  4. 给出加速公式:每验证调用产出 (1-α^(N+1))/(1-α) 个 token,α=0.75, N=5 时约 3 倍大模型调用减少。
  5. 区分四类草稿-验证对(原生/Medusa/EAGLE/Lookahead)及各自的加速、成本、适用场景。

一、问题与直觉

自回归解码串行,投机解码打破它:便宜模型起草 N 个 token,昂贵模型一次前向验证全部。技巧必须保持分布——投机采样保证输出序列与大模型自己采同分布,零质量损失。

核心算法

给定验证者 M_q 和更便宜的草稿 M_p:

  1. 设 x_1..x_k 是已解码前缀。
  2. 起草:用 M_p 自回归提议 d_{k+1}..d_{k+N},带草稿概率 p_1..p_N。
  3. 并行验证:M_q 对 x_1..x_k, d_{k+1}..d_{k+N} 跑一次,得到位置 k+1..k+N+1 的验证概率 q_1..q_{N+1}。
  4. 逐个接受/拒绝(左到右):对每个 i,以 min(1, q_i(d_i)/p_i(d_i)) 的概率接受。
  5. 首次在位置 j 拒绝:从「残差」分布 (q_j - p_j)_+ 归一化后采 t_j,丢弃 j 之后所有草稿。
  6. 全接受 N 个:从 q_{N+1} 多采一个 t_{N+1}(免费奖励 token)。

残差分布技巧是保持输出精确按 M_q 从头采那样分布的数学洞见。

加速由什么决定

设 α = 每草稿 token 的期望接受率,c = 草稿对验证者的成本比。每步:

  • 朴素生成每 token 一次大模型调用。
  • 投机在 α 高时每 (1 - α^(N+1)) / (1 - α) ≈ 1/(1-α) 个 token 一次大模型调用。

经验法则:α=0.75, N=5 时大模型调用少 3 倍,草稿成本是 5 倍便宜,总墙钟降约 2.5 倍。

α 取决于:

  • 草稿近似验证者的程度。同家族/同训练数据显著提升 α。
  • 解码策略。greedy 草稿对 greedy 验证者:α 高;温度采样:难匹配,接受率降。
  • 任务类型。代码和结构化输出接受多(可预测);自由创意写作接受少。

Medusa——不要草稿模型的起草

Medusa 用验证者上的额外输出头替代草稿模型。位置 t:

共享主干 → 隐状态 h_t ├── head_0: 预测 t+1 的 token(标准 LM 头) ├── head_1: 预测 t+2 ├── head_2: 预测 t+3 ├── head_3: 预测 t+4 ​

每个头出自己 logits,推理时从每个头采样得到候选序列,再用树注意力方案一次前向考虑所有候选续写。优点:无第二模型;缺点:加可训练参数,需监督微调阶段(约 10 亿 token),接受率比带好草稿的原生投机略低。

EAGLE——复用隐状态的更好草稿

EAGLE-1/2/3(Li 等,2024~2025)把草稿模型做成一个微型 Transformer(通常 1 层),摄入验证者最后一层隐状态。因为草稿看到验证者的特征表示,其预测与验证者输出分布强相关,接受率从约 0.6(原生)爬到 0.85+。EAGLE-3(2025)加了候选续写的树搜索,vLLM 和 SGLang 把 EAGLE-2/3 作为 Llama 3/4 和 Qwen 3 的默认投机路径。

KV 缓存之舞

验证一次前向把 N 个草稿 token 喂进验证者,把它的 KV 缓存扩展 N 项;若有草稿被拒,必须把缓存回滚到已接受前缀长度。生产实现(vLLM 的 --speculative-model、TensorRT-LLM 的 LookaheadDecoder)用 scratch KV 缓冲处理:先写,接受时提交。概念上不难,但繁琐。

💡 残差分布为何保持分布:朴素想,「接受 q≥p 的、拒绝 q<p 的」会偏向高概率 token。残差分布 (q-p)_+ 归一化精确补偿了这个偏置——拒绝时从「q 比 p 多出来的概率」里采,数学上等价于直接从 q 采。这是 Leviathan 定理的核心,也是投机解码零质量损失的根基。

二、从零实现

完整代码见原课程 phases/07-transformers-deep-dive/16-speculative-decoding/code/main.py。用手工分布的确定性 softmax 当「大模型」(便于解析验证接受数学)、用大模型的扰动当「草稿模型」、用产出与直采同边际分布的接受/拒绝循环,实现核心投机采样算法。

Step 1:拒绝步

def accept_or_reject(q_prob, p_prob, draft_token, u): ratio = q_prob / p_prob if p_prob > 0 else float("inf") return u < min(1.0, ratio) ​

u 是均匀随机数,q_prob 是验证者对草稿 token 的概率,p_prob 是草稿模型的概率。Leviathan 定理保证:这个伯努利决策加上拒绝时从残差采样,精确保持验证者分布。

Step 2:残差分布

def residual_dist(q, p): raw = [max(0.0, qi - pi) for qi, pi in zip(q, p)] s = sum(raw) return [r / s for r in raw] ​

q 逐元素减 p、负值截零、归一化,任何拒绝时从中采样。

Step 3:一次投机步

def spec_step(prefix, q_model, p_model, N, rng): drafts, p_probs, ctx = [], [], list(prefix) for _ in range(N): # 草稿自回归起草 N 个 p_dist = p_model(ctx) d = sample(p_dist, rng) drafts.append(d); p_probs.append(p_dist[d]); ctx.append(d) q_dists = [q_model(prefix + drafts[:i]) for i in range(N + 1)] # 并行验证 for i, d in enumerate(drafts): # 左到右接受/拒绝 q_prob = q_dists[i][d]; p_prob = p_probs[i] if rng.random() < min(1.0, q_prob / p_prob if p_prob > 0 else float("inf")): prefix = prefix + [d] else: # 首次拒绝:残差采样,丢弃之后 res = residual_dist(q_dists[i], p_model(prefix)) return prefix + [sample(res, rng)] return prefix + [sample(q_dists[N], rng)] # 全接受:奖励 token ​

五个接受 + 一个奖励 = 一次验证者 pass 产出六个 token。

Step 4:测接受率

在不同草稿质量水平下跑 1 万步投机,画接受率 vs 草稿与验证者分布的 KL 散度,应见干净的单调关系。

Step 5:验证分布等价

经验上:投机循环产出的 token 直方图应与从验证者直采的直方图匹配——这是 Leviathan 定理的实践,卡方检验在采样误差内确认。

设计要点:全接受时的「奖励 token」是投机解码的隐形红利——即使草稿全对,验证者的最后一次前向还顺带算出了下一位置的概率分布,白送一个 token,所以最理想情况是 N 个草稿 + 1 个奖励 = N+1 个 token 一次 pass。

三、框架对比:vLLM 与 TensorRT-LLM

生产:

# vLLM 配 EAGLE vllm serve meta-llama/Llama-3.1-70B-Instruct \ --speculative-model /models/llama-3.1-eagle-70b \ --speculative-draft-tensor-parallel-size 1 \ --num-speculative-tokens 5 # vLLM 配原生草稿模型 vllm serve meta-llama/Llama-3.1-70B-Instruct \ --speculative-model meta-llama/Llama-3.2-1B-Instruct \ --num-speculative-tokens 5 ​

TensorRT-LLM 有 2026 年中最快的 Medusa 路径;faster-whisper 给 Whisper-large 配小草稿包了投机解码。

选草稿:

策略 何时选 加速
原生草稿(1B/3B Llama 家族) 快速原型,不训练 1.8~2.3×
Medusa 头 能微调验证者 2~3×
EAGLE-2/3 生产,最大速度 3~4×
Lookahead 无草稿、无训练、无额外参数 1.3~1.6×

何时不投机解码:

  • 1~5 token 的单序列生成,开销主导。
  • 高度创意/高温度采样(α 降)。
  • 显存受限部署(草稿模型加 VRAM)。

四、可复用产物

原课程产出 outputs/skill-spec-decode-picker.md:一个选择器 Skill,为新推理负载选投机解码策略(原生/Medusa/EAGLE/Lookahead)和调参(N、草稿温度)。

五、练习

  1. (Easy) 跑 code/main.py,确认 5 万 token 上投机 token 分布与验证者直采分布在卡方 p>0.05 内一致。
  2. (Medium) 画加速(每次大模型前向的 token 数)作为 N 的函数,α=0.5, 0.7, 0.85,找出每个 α 的最优 N(提示:每次验证产出 (1-α^(N+1))/(1-α))。
  3. (Hard) 实现微型 Medusa:在第 14 节毕业项目 GPT 上加 3 个额外 LM 头预测 t+2、t+3、t+4,联合多头损失在 tinyshakespeare 上训,对比等参下截断同模型做的原生草稿的接受率。
  4. (Hard) 实现回滚:从 10 token 前缀 KV 缓存开始,喂 5 草稿 token,模拟位置 3 拒绝,验证下次迭代缓存读正确匹配「前缀 + 前 2 个接受草稿」。

本节要点回顾

  1. 自回归串行,投机解码打破它:便宜模型起草 N 个,昂贵模型一次前向验证全部,起草对了就为 N 个生成只付一次大模型前向。
  2. 六步算法:起草 → 并行验证 → 左到右接受/拒绝(min(1, q/p))→ 首次拒绝从残差采 → 丢弃之后 → 全接受送奖励 token。
  3. 残差分布 (q-p)_+ 归一化精确保持分布(Leviathan 定理):拒绝时从「q 比 p 多的概率」采,数学等价直采 q——零质量损失。
  4. 加速公式:每验证产出 (1-α^(N+1))/(1-α) ≈ 1/(1-α) token;α=0.75, N=5 时大模型调用少 3 倍、墙钟降约 2.5 倍。
  5. α 取决于:草稿近似度(同家族/同数据高)、解码策略(greedy 高于温度采样)、任务类型(代码/结构化高于创意写作)。
  6. 四类草稿-验证对:原生(独立草稿,1.82.3×)、Medusa(验证者多头,23×,需微调)、EAGLE(复用隐状态的微型草稿,34×,接受率 0.85+)、Lookahead(Jacobi 自投机,1.31.6×,无草稿)。
  7. 奖励 token 是隐形红利:全接受时验证者最后一次前向顺带算出下一位置,白送一个,最理想 N+1 token/pass。
  8. KV 缓存回滚:scratch 缓冲先写后提交,概念不难但繁琐;何时不投机:1~5 token 生成、高温度、显存受限。

本章到此结束。从第 01 节的「为什么需要 Transformer」到这里的投机解码,你已经走完了现代 Transformer 的完整图景——注意力、位置编码、编码器/解码器、BERT/GPT/T5、ViT、Whisper、MoE、KV 缓存与 Flash Attention、缩放定律、注意力变体、投机解码。下一章,我们将把这些积木带上新的战场。

作者与出处
原作者:Rohit Gupta
来源:rohitg00
许可证:MIT
整理人: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: Rohit Gupta 转发
评论区 (0)
U