投机解码和
Type: Build
Languages: Python (with numpy)
Prerequisites: Phase 10 Lesson 12 (Inference Optimization), Phase 10 Lesson 04 (Pre-training Mini-GPT)
Time: ~75 minutes
问题
对于 H100 的 70B 类型的代码输出通常为 40-80 代币/秒.每个代币需要一个全前传输,读取HBM 的所有模型重量.你不能使模型变小而不改变输出.你不能增加更大的批量.你卡在,除非你可以让模型输出超过一个代币.
后代的产量看起来是连续性的:x_{t+1} = sample(p(· | x_{1:t}))如果您有一个廉价的预测器,它说"下一个4个代币可能是 [a,b,c,d]"您可以验证所有5个位置在asingle forward pass of the big model接收最长的相匹配的前.
利维雅坦,卡莱,马蒂亚斯 (2023,通过投机解码从变体中快速推理) 通过一个聪明的接受/拒绝规则来实现这一点,以保持目标模型的样本分布.同样的输出分布, 2-4 倍更快.
概念
两种模式的设置
- Target model
M_p您实际上想要的样本是大,慢,高质量的模型.p(x)现在,我们要去. - Draft model
M_q快速,低质量的小型模型.q(x)五到三倍小.
每一步:
- 拟议的模型草案
K代币自动下降:x_1, x_2, ..., x_K ~ q现在,我们要去. - 目标模型在所有情况下运行一个前进通行
K+1位并行,产生p(x_k)对于每一个拟议的代币. - 通过下面修改的拒绝样本规则,从左到右接受/拒绝每个代币. 接受最长的匹配前.
- 如果任何代币被拒绝,请从纠正的分布中取代代代币的样本,然后停止.
p(· | x_1...x_K)现在,我们要去.
如果草案完全匹配目标,你会得到每一个目标前进的K+1代币.如果草案在位置1上错误,你只会得到1代币.
准确性规则
预测解码是provably equivalent in distribution to sampling from p拒绝的规则:
For each drafted token x_t:
r ~ Uniform(0, 1)
if r < p(x_t) / q(x_t):
accept x_t
else:
sample replacement from residual: (p - q)+ / ||(p - q)+||_1
stop在哪里(p - q)+标志着点差的正面部分.p ≈ q) 接受率接近 1. 当他们不同意时,残余分布是这样构建的,使整体样本仍然是准确的p现在,我们要去.
Greedy case.对于温度=0的样本,请检查argmax(p) == x_t如果是,接受;如果不是,输出argmax(p)停止.
预期的增速
如果草案模型的代币级接受率为α预期每次目标前进通行产生的代币为:
在α = 0.8, K = 4其他(1 - 0.8^5)/(1 - 0.8) = 3.36预期期期货的代币.cost_q * K + cost_p(K草案步骤加上一个目标验证).cost_p >> cost_q * K速度增速率为3.36× / 1 = 3.36×通过量.
唯一真正的参数是α根据"项目目标"的结合, 一个好的项目是一切.
培训项目:蒸
随机的小模型做了一个糟糕的草稿.
- 选择一个小的架构 (70B目标的~1B,7B目标的~500M).
- 运行目标模型在一个大文本体内;存储其下一个代币分布.
- 根据目标分布 (而不是实地真相代币) 进行KL分歧训练.
结果是:α在编码中通常是0.6-0.8,在自然语言聊天中是0.7-0.85.
:树木绘制+重用特征
李,韦,张,张 (2024, ":投机性样本需要重新思考特征不确定性") 观察到标准投机性解码中的两个效率低下:
- 草案执行K序列步骤,每个都是完整的. 但草案可能会重新利用目标的特性 (隐藏状态) 从最近验证 目标已经计算了丰富的表示,该草案是从零中重新衍生.
- 如果草案可以输出候选人的树 (每个节点都会多次猜测),目标的单一向前传递可以通过树注意力面具并行验证多个候选人的路径,并选择最长的接受分支.
-1变化:
- 预示输入 = 目标在位置 t 的最后隐藏状态,而不是原始代币.
- 草案架构 = 1 变压器解码器层 (不是单独的小模型).
- 输出 = K 的树 = 每个深度4-8个候选,深度4-6.
子-2 (2024) 增加了动态树木拓:树在不确定的地段上长得更宽,而在自信的地方保持狭窄.α_effective没有增加验证成本.
3 (Li等) 2025年",EAGLE-3:通过训练时间测试扩大大型语言模型的推理加速") 消除了固定的顶层功能依赖性,并将草案训练以新的"测试时间模拟"损失. 接受率从0.75 (EAGLE-2) 升至0.82 (EAGLE-3) ,平均代币/验证率从3.0升至4.5. 这些数据来自一个参考设置. 接受取决于模型对,草稿树和流量:第10期15期在聊天基准上每次接受路径代币0.88至0.92的报价,第17期05期计划在生产总值聊天上0.6至0.8.
树木注意力检查
目标模型通过一个单个前进传输来验证树的输出.tree attention mask一个因果化面具,它编码树木拓而不是纯线.每个代币只为树上的祖先服务.验证通过仍然是前面,一条马特尔;拓化面具只花费了几次额外的KV入口.
root
/ \
a b
/ \ / \
c d e f如果a, b竞争的第一代代标志候选人c, d, e, f输出是任何接受的路径上最长的前.
当它胜利时,当它不胜利时
Wins:
- 通过可预测的文本进行聊天/完成 (代码,普通英语,结构化输出).
α了. - 设置在解码过程中未使用的GPU计算 (内存绑定阶段).树草图使用可用的FLOP.
Loses / no win:
- 极高的性输出 (高温创意写作).
α落到1/|vocab|现在,我们要去. - 批量服务具有非常高的同时批量已经填补了FLOP,对树木验证的空间很少.
- 非常小的目标模型,其中的草案并不小.
制作商店通常会报告聊天的速度2~3倍,代码生成3~5倍,创意写作几乎是零.
建立它
code/main.py其他:
- 参考
speculative_decode(target, draft, prompt, K, temperature)执行确切的拒绝规则并验证它保留了目标分布 (实验性KL <0.01对平凡目标采样). - 树的设计师, 构建一个深度K树,
- 树木注意力面具制造器,为验证器产生了正确的因果模式.
- 通过一个小LM (从GPT-2-中目标中除一个GPT-2-小) 运行的接受率带.
def speculative_step(p_target, q_draft, K, temperature=1.0):
"""One round of speculative decoding. Returns list of accepted tokens."""
# 1. Draft K tokens
draft_tokens = []
q_dists = []
state = draft_state_init()
for _ in range(K):
probs = softmax(q_draft(state) / temperature)
t = np.random.choice(len(probs), p=probs)
draft_tokens.append(t)
q_dists.append(probs)
state = draft_step(state, t)
# 2. Target computes p at every drafted position + 1 extra
p_probs_all = target_forward_batched(p_target, draft_tokens, temperature)
# 3. Accept/reject left-to-right
accepted = []
for k, tok in enumerate(draft_tokens):
r = np.random.uniform()
if r < p_probs_all[k][tok] / q_dists[k][tok]:
accepted.append(tok)
else:
residual = np.maximum(p_probs_all[k] - q_dists[k], 0)
residual /= residual.sum()
accepted.append(np.random.choice(len(residual), p=residual))
return accepted
# 4. All K accepted → sample bonus token from target
accepted.append(np.random.choice(len(p_probs_all[-1]), p=p_probs_all[-1]))
return accepted用它
- vLLM其他SGLang在vLLM中,通过
--speculative-config具有 JSON 对象method现在model其他num_speculative_tokens3是"method": "eagle3"现在,我们要去. - NVIDIA TensorRT-LLM支持梅杜萨和树的本土.
- Reference draft models其他
Qwen/Qwen3-0.6B(Qwen3-32B草案),meta-llama/Llama-3.2-1B-Instruct(关于Llama 3.x 70B的草案) - Medusa heads(Cai et al. 2024,"Medusa:简单的LLM推理加速框架与多个解码头"):而不是一个草案模型,将K平行预测头添加到目标本身.更简单的部署,接受度略低于EAGLE.
运送它
这一课产生了outputs/skill-speculative-tuning.md一个技能,可以描述目标模型的工作负载,并选择:草案模型,K (草案长度),树宽度,温度,以及何时回到简单的解码.
运动
- 执行确切的拒绝规则,经验验证它.
speculative_decode通过简单的目标样本采集,计算两个输出分布之间的电视距离. 应为<0.01.
- 计算加快公式,给定了
α其他K预期的代币按目标前进. 找到最佳的代币K为了\alpha \in \lbrace 0.5, 0.7, 0.9 \rbrace现在,我们要去.
- 训练一个小的草稿. 拿一个124MGPT-2目标,并在100M代币上除一个30MGPT-2草稿.
α预期:0.6至0.7.
- 执行EIGLE样式的树草图. 代替链条,将草图输出的每一个深度上三个分支. 构建树注意力面具. 检查目标接受最长正确的分支.
- 测量失败模式.在温度=1.5 (高性) 运行投机解码.显示 α 崩,算法由于开支的草图而比普通解码慢.
关键词
| Term | What people say | What it actually means |
|---|---|---|
| Target model | "The big model" | The slow, high-quality model you want samples from (p distribution) |
| Draft model | "The speculator" | The small, fast predictor (q distribution); 5-30x smaller |
| K / draft length | "Look-ahead" | Number of speculated tokens per verify pass |
| α / acceptance rate | "Hit rate" | Per-token probability that the draft's proposal is accepted |
| Exact rejection rule | "The accept test" | r < p/q compare that preserves target's distribution |
| Residual distribution | "Corrected p-q" | (p - q)+ / |
| Tree drafting | "Branching speculation" | Draft outputs a tree of candidates, verified in one pass with tree-structured attention mask |
| Tree attention mask | "Topological mask" | Causal mask encoding the tree topology so each node attends only to its ancestors |
| Medusa heads | "Parallel heads" | K extra prediction heads on the target itself; no separate draft model |
| EAGLE feature reuse | "Hidden-state draft" | Draft input is target's last hidden state, not raw tokens, shrinking the draft |
| Test-time simulation loss | "EAGLE-3 training" | Train draft on outputs matching target's test-time distribution, not teacher forcing |
进一步阅读
- Leviathan, Kalai, Matias, 2023 — "Fast Inference from Transformers via Speculative Decoding"准确的拒绝规则和理论加速分析
- Chen, Borgeaud, Irving et al., 2023 — "Accelerating Large Language Model Decoding with Speculative Sampling"深思维的同时投机性采样论文
- Cai, Li, Geng, Wang, Wang, Zhu, Dao, 2024 — "Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads"平行头替代草案模型
- Li, Wei, Zhang, Zhang, 2024 — "EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty"重用特征和树木设计
- Li et al., 2024 — "EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees"动态树木拓
- Li et al., 2025 — "EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test"火车时间测试时间匹配
- Fu, Haotian, Peng et al., 2024 — "Break the Sequential Dependency of LLM Inference Using Lookahead Decoding" Jacobi/lookahead解码,一个无投机者的替代方案
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.