第 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、后缀)、以及投机什么时候是赢的那道算术。
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 章那份空转算力所在的区间。
第 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 来挑。