第 9 章 — 投机解码

发布于: 2026-05-01 最后更新于: 2026-07-08 版本: 1
第 9 章 — 投机解码

第 9 章 — 投机解码

LLM Primer VI: Scaling AI Systems》章节走读的第九篇。这一章要说的是:原来自回归那道顺序瓶颈里藏着一个数学漏洞 —— 而这一章给你什么时候用这个漏洞真的划算的那道算术。


这一章为什么存在

第 7、8 章攻的是并发,让 GPU 在多条序列间保持忙碌。哪一章都没改变"每条序列每次迭代仍然只拿一个输出 token"这个事实。这个地板看起来无法逾越,因为 transformer 的前向传播确实依赖上一个被选中的 token。投机解码的观察是:这份依赖是对"生成"的,不是对"验证"的:给定 token t+1 的一个候选,目标模型可以在一次前向传播里既问"我自己会不会选这个?",又在假设候选正确的前提下算 t+2 的分布。第 9 章走机制、draft 算法(EAGLE、Medusa、Lookahead、MTP、n-gram、后缀)、以及投机什么时候是赢的那道算术。

一句话:投机解码付出的是一次便宜的猜测和一次略宽的验证,如果猜得对得足够频繁,目标模型就能在一次前向传播的墙钟里产出好几个 token。

9.1 验证那一步的洞见能精确保住正确性

一个便宜的 draft 机制提出 N 个候选 token。目标 —— 我们想要的那个昂贵模型 —— 在前缀和这 N 个候选拼起来的序列上跑一次前向传播。因为 transformer 的前向传播对位置是并行的,目标模型能在这一次传播里对每一个 N+1 位置给出自己的下一 token 分布。候选和目标一致的最长前缀被接受;第一次不一致的地方就是 engine 转而承诺目标模型自己的选择、丢掉后面的地方。接受规则 —— 以概率 min(1, p(x)/q(x)) 接受从 draft q 里抽出来的 x,否则从归一化残差 (p−q)₊ 里采样 —— 让输出分布和普通目标采样完全一样。投机是"保正确性"的;draft 只影响速度。现代 GPU 上 N=4 的验证一次前向传播大约是一次普通 decode 步的 1.2–1.5×,因为 attention 现在跨 N+1 个 query 位置,但仍然稳稳落在带宽受限区间。

9.2 EAGLE 把 draft 绑到目标的隐状态上

早期实现用一个独立的小模型做 draft —— Llama-7B 给 Llama-70B 打草稿 —— 这可行,但要多流一份 draft 权重、而且接受率被两个模型不共享表示这一点卡住。EAGLE,2024–2025 年间迭代到 EAGLE-2、EAGLE-3,把 draft 绑到目标:一个单 transformer 层,训来预测目标下一层的隐状态,再通过目标自己的输出 embedding 投影。没有单独一份 7B 权重要流;draft head 只有几百 MB。EAGLE-2 加了动态 draft 树扩展 —— 一棵候选树用一份定制 mask 在一次 attention 里被一起验证 —— 让目标从几条路径里挑最好那一条,而不是 draft 那一个猜。EAGLE-3 加了多层特征混合,消费的是目标的中间层,而不是只倒数第二层。chat 和代码上,N 在 5–8 时接受率落在 75–85%,端到端对普通 decoding 的加速能达到 3–4×。Medusa 走另一条路 —— 用并行 draft head 在一次前向传播里预测好几个未来 token,而不是自回归地做 —— 训练故事更简单,接受率稍低。n-gram 和后缀解码是重复性工作负载(代码编辑、模板输出)的免费午餐,那些场景下 draft 就是对近期 context 的一次查表。

9.3 验证那一步本身变成天花板

加速公式精确到可以写下来:E[accepted_tokens] / (T_draft/T_decode + 1 + α·N),α 是每位置的验证开销,一般 0.05–0.15。两道天花板浮出来。第一,α·N 随 N 增大,无限加大 N 没用;p=0.8 时最佳在 N=6–8,p=0.9 时最佳在 N=10–12。硬编 N 的 engine 在工作负载变化时错过最佳点。第二,也更微妙,当 p 趋近 1 时的渐近加速是 1/α —— α=0.10 时约 10×、α=0.05 时约 20× —— 因为验证那一步本身就是那堵墙。生产 engine 在高度重复的工作负载上量出过接近这个范围的峰值加速,再往上就上不去了。投机也会和 batching 相互作用:高 batch 下目标的前向传播本来已经接近 compute-bound,额外的验证 token 把它进一步推进去,加速随 batch 增大而缩小。投机的甜点是延迟至上的工作负载在低到中等 batch —— 正好就是第 1 章那份空转算力所在的区间。

值得记住:投机是拿空转算力换回顺序瓶颈的延迟。它和 batching 是互补的,不是替代 —— 非常高 batch 下目标已经在用它的算力,验证那一步反而吃掉吞吐,而不是给吞吐加分。

第 9 章为下面铺了什么

第 5 到 9 章把模型和运行时那份工具箱走完 —— 量化、剪枝、蒸馏、batching、paged KV、投机解码。它们没有一个是 pip install 就能用的库。得有人把它们连接成一个运行时:占住 GPU 上的一个模型、跑一份 continuous batch、暴露一份推理 API。这个运行时就是 engine。第 10 章走一遍 2026 年占主导的五个 engine —— vLLM、TensorRT-LLM、SGLang、TGI、Ollama —— 以及那些决定"给定部署里哪个是对的选"的机制层面的取舍。


下一章 — 第 10 章:LLM Engine 层vLLM、TensorRT-LLM、SGLang、TGI、Ollama —— 把 engine 当单节点运行时,按机制而不是按 benchmark 来挑。

想看完整的全貌?书里这一章包括能跑的投机解码内层循环、Medusa 并行 head 架构、Lookahead 和 MTP 训练期变体、n-gram/后缀工作负载案例,以及那份根据负载放大或缩小加速的 batching 交互分析。在 Amazon 上查看 LLM Primer VI →

下田 昌平
下田 昌平
作为株式会社Receipt Roller的CEO兼CTO,目前负责开发电子收据服务以及自动将对话分类并生成行动任务的系统「ACTIONBRIDGE」。从小便接触编程,1996年参与开发测量仪器的相关程序,始终保持着对技术的深刻探索与热情。 在此前的职业生涯中,曾担任日本最大呼叫中心行业企业的子公司——一家研究开发公司的CEO/CTO,领导了多个技术开发项目。目前,我依然活跃在编程的最前沿,持续书写代码。