投机解码与 EAGLE-3


文档摘要

投机解码与 EAGLE-3 本节摘要:前沿 LLM 生成一个 token 要对数十亿参数做完整前向,而这前向严重超额配置——多数时候一个小得多的模型能猜对下 35 个 token,大模型只需校验。猜对就一个前向收 5 个 token。Leviathan 等 2023 让这变得数学精确(输出分布与目标完全相同),EAGLE-3(2025)把接受率推到聊天上每 token 超 0.9、每次校验约 4.5 个 token——3 到 6.5 倍端到端加速,零分布损失。本节带你从零实现完整投机循环:起草、校验、从残差拒绝采样、拒绝时回滚 KV 缓存、全接受时发奖励 token,并看清从原始投机到 EAGLE-3 的两年演进每步移除了什么限制。

投机解码与 EAGLE-3

本节摘要:前沿 LLM 生成一个 token 要对数十亿参数做完整前向,而这前向严重超额配置——多数时候一个小得多的模型能猜对下 3~5 个 token,大模型只需校验。猜对就一个前向收 5 个 token。Leviathan 等 2023 让这变得数学精确(输出分布与目标完全相同),EAGLE-3(2025)把接受率推到聊天上每 token 超 0.9、每次校验约 4.5 个 token——3 到 6.5 倍端到端加速,零分布损失。本节带你从零实现完整投机循环:起草、校验、从残差拒绝采样、拒绝时回滚 KV 缓存、全接受时发奖励 token,并看清从原始投机到 EAGLE-3 的两年演进每步移除了什么限制。

学习目标

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

  1. 一句话陈述 Leviathan 定理,证明投机循环产出的样本与校验模型同分布。
  2. 走过从原始投机(Leviathan 2023)经 EAGLE、EAGLE-2 到 EAGLE-3 的两年演进,说出每步移除的确切限制。
  3. 从接受率 α 与草稿/校验成本比 c 算预期加速,为各工况选最优草稿长 N。
  4. 从零实现完整投机循环:起草、校验、从残差拒绝采样、拒绝时回滚 KV 缓存、全接受时发奖励 token。

一、问题与直觉

70B 模型自回归解码在 H100 上约 35 token/秒。GPU 远未饱和——内存带宽是天花板:每 token 从 HBM 加载 70B 权重、做一步算术、产一个浮点,计算单元大部分时间闲着。

投机解码把这变成你可解的吞吐问题。便宜草稿用 N 次小前向提 N 个 token,校验模型在「前缀+N 草稿」上跑一次前向。若校验在位置 i 的分布(我们精确定义的统计意义下)同意草稿,接受;否则拒绝,从残差分布采修正。单次大模型前向产出至多 N+1 个被接受 token 而非一个。

要紧的定理是 Leviathan、Kalai、Matias(ICML 2023):输出分布与直接从校验模型采样完全相同,不是近似,是恒等。这就是投机解码在生产中可接受的全部理由——纯延迟优化,无质量权衡。

不变量:Leviathan 拒绝采样

p(t) 为草稿给定某前缀的下一 token 分布,q(t) 为校验的。采草稿 token d~p,以概率 min(1, q(d)/p(d)) 接受;拒绝时从残差分布 (q-p)_+/‖(q-p)_+‖₁ 采样。所得样本按 q 分布——无论 p 多差(p 越差越常拒,但输出仍精确)。

把 N 个这种调用背靠背堆,用校验在 前缀+d₁+...+d_N 上一次前向。校验同时返回 q₁..q_{N+1},从左到右走,首次拒绝在位置 j 时从 residual(q_j,p_j) 采样并停;全接受时从 q_{N+1} 采一个奖励 token。

什么决定加速

设 α 为每草稿 token 的预期接受率,c=cost(草稿)/cost(校验)为成本比。每校验前向的预期接受 token 数 E[接受]=(1-α^(N+1))/(1-α),每接受 token 的预期挂钟 (N*c+1)/E[接受],对 N 最小化得甜点。对 α=0.8、c=0.05:最优 N 约 5~7,加速 3.2×;对 α=0.95、c=0.02:最优 N 约 8~10,加速逼近 5×。最大的单一杠杆是 α——固定 N=5,α 从 0.6(原始草稿)到 0.9(EAGLE-3),预期接受 token 从 2.2 涨到 4.1,同校验近 2 倍吞吐。

两年演进

原始投机(Leviathan 2023):草稿是同家族独立训练的更小 LLM,易接,α≈0.6,加速最多约 2×。EAGLE-1(Li 等 2024):草稿不再独立,而是校验模型最后一层隐藏状态上的小 Transformer——条件于校验自身表示而非独立模型输出,α 升到约 0.75。EAGLE-2(2024):草稿从单条链变候选树,树注意力一次前向校验整棵树,动态调树形状按上下文,α 约 0.85。EAGLE-3(2025):两件事——(1) 去掉 EAGLE-1 的特征预测损失,直接在 token 预测上训;(2) 加「训练时测试」(TTT):训练时把草稿喂自己的输出(自回归),让训练与推理输入分布匹配,修曝光偏差。结果:α 超 0.9(聊天),每次校验约 4.5 个接受 token,3~6.5 倍端到端加速。

💡 关键概念:草稿越好加速越大。把草稿从「便宜近似」变成「校验自身表示上的专用微型网络」是 EAGLE 全程的核心动作——它在校验已知的东西上做草稿,而非从独立模型猜。

二、从零实现

Step 1:拒绝规则

def accept_or_reject(draft_token, draft_probs, verifier_probs): p = draft_probs[draft_token] + 1e-10 q = verifier_probs[draft_token] if np.random.random() < min(1.0, q/p): # Bernoulli 接受 return True, None return False, None # 拒绝:下一步从残差采

min(1, q(d)/p(d)) 是 Bernoulli 接受概率。p≥q 时必接受(草稿给了比校验更高的概率,没理由拒);p<q 时按 q/p 概率接受。

Step 2:残差分布

拒绝时必须从残差分布采,才能保持输出精确按 q 分布。

def residual_distribution(verifier_probs, draft_probs): residual = np.maximum(verifier_probs - draft_probs, 0) # (q-p)_+,负处截零 s = residual.sum() return residual / s if s > 0 else verifier_probs # 归一化

残差是校验与草稿分布的正部分,截零归一化——这是拒绝时采样的正确分布。全零(两分布相同)退化回校验分布。

Step 3:完整投机步

def speculative_step(draft_model, verifier, prefix, N=5): drafts = [draft_model.generate(prefix + drafts[:i]) for i in range(N)] # 草稿自回归产 N full = prefix + drafts q_list = verifier.forward(full) # 校验一次前向产 q₁..q_{N+1} accepted = [] for j in range(N): if accept(drafts[j], draft_probs[j], q_list[j]): accepted.append(drafts[j]) else: accepted.append(sample_from(residual(q_list[j], draft_probs[j]))) return accepted, truncate_kv_to(verifier, len(prefix)+len(accepted)) # KV 回滚 # 全接受:送一个奖励 token accepted.append(sample_from(q_list[N])) return accepted, None

Step 4:KV 回滚记账

拒绝时校验的 KV 缓存含被拒草稿的项,必须回滚到接受前缀长度,否则下次前向上下文错误。

def truncate_kv_to(verifier, accepted_len): verifier.kv_cache.seq_len = accepted_len # 截断到接受前缀

Step 5:Leviathan 校验

写个统计测试:跑投机循环产 10 万 token,跑直接校验采样产 10 万 token,比两者的 token 频率分布——应统计无别,证明数学精确。

Step 6:加速 vs α

对 α 从 0.3 到 0.95、c=0.05,算 E[接受]=(1-α^(N+1))/(1-α) 与加速 (N*c+1)/E[接受] 的倒数,绘加速曲线。α=0.6 加速约 2.2×,α=0.9 约 4.1×,直观看到 EAGLE 把 α 从 0.6 推到 0.9 的回报。

三、框架对比

vLLM、SGLang、TensorRT-LLM 在 2026 年默认都内置 EAGLE-3 风格投机解码。vLLM 的 --speculative_model 接草稿模型或 EAGLE 头;SGLang 用树注意力原生支持 EAGLE-2/3;TensorRT-LLM 把投机编译进核。生产中你给草稿头路径或启用标志,引擎处理拒绝采样、KV 回滚、奖励 token、树注意力。底层与我们手写的循环相同,但核融合与树注意力让它快得多。

四、可复用产物

本节产出 outputs/skill-speculative-decoding-tuner.md——一个技能,给定校验模型、目标延迟、可用草稿预算,推荐草稿长 N、草稿模型大小、是否用树注意力,并从 α 与 c 算预期加速。

五、练习

  1. (Easy) 实现统计 Leviathan 校验:跑投机与直接采样各 10 万 token,比 token 频率分布,确认统计无别。

  2. (Medium) 对 α=0.6、0.75、0.85、0.95 各绘「预期接受 token vs N」与「加速 vs N」曲线,标出每工况的最优 N。

  3. (Medium) 实现树状投机(EAGLE-2 风格):每层 2 分支共 3 层=8 叶,用树注意力一次前向校验整棵树,对比线性投机的每轮接受 token。

  4. (Hard) 实现训练时测试(TTT)的简化版:训练草稿时 50% 概率把上一步草稿输出而非真值喂下一步输入,对比有无可见曝光偏差减少。

  5. (Hard) 构建混合投机:前 2 个草稿用 N-gram 查表(零成本),后续用 EAGLE 头,对比纯 EAGLE 与混合的延迟与接受率。

本节要点回顾

  1. Leviathan 定理:拒绝规则 min(1,q(d)/p(d)) 加残差采样,输出与校验模型完全同分布,非近似——生产可接受的全部理由。
  2. 残差分布是关键:拒绝时从 (q-p)_+ 归一化采,不是从 q 重采,这才保精确。
  3. 加速由 α 主导:α 从 0.6(原始)到 0.9(EAGLE-3),固定 N=5,接受 token 从 2.2 涨到 4.1。
  4. 最优 N 随 α、c 变:α=0.8、c=0.05 时 N 约 5~7;α=0.95、c=0.02 时 N 约 8~10。
  5. EAGLE-1 校验自身表示:草稿条件于校验最后层隐藏状态,α≈0.75,非独立模型。
  6. EAGLE-2 动态树:候选树加树注意力一次前向校验整树,α≈0.85。
  7. EAGLE-3 训练时测试:去特征预测损失直训 token,训练时草稿喂自己输出修曝光偏差,α>0.9。
  8. 拒绝要 KV 回滚:校验 KV 缓存含被拒草稿项,必须截回接受前缀长,否则下次上下文错。
  9. 全接受送奖励 token:N 草稿全对时从 q_{N+1} 多采一个,零额外校验成本。
  10. 2026 生产默认 EAGLE-3:3~6.5 倍加速、零分布损失,vLLM/SGLang/TensorRT-LLM 默认内置。

下一节,差分注意力(Differential Attention V2):用两个注意力通道相减消除噪声,像降噪耳机之于注意力。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U