7.3 Speculative Decoding:投机采样加速 PagedAttention 让显存利用率提升、量化让权重变小,但 LLM 生成的「每步一次前向」的串行瓶颈仍未突破——Speculative Decoding 用「小模型草稿 + 大模型校验」的妙招,让大模型一次能生成多个 token,做到「无损加速」2-3 倍。 7.3.1 自回归的串行瓶颈 回顾第 6 章 6.2 节:LLM 自回归生成是「每步一次前向,每步一个 token」。这种严格的串行性是 LLM 生成的根本瓶颈——无论硬件多快,生成 N 个 token 至少要 N 次前向。 这种串行性在 Decode 阶段尤其浪费:每步只算 1 个 token,GPU 的并行计算能力严重闲置(瓶颈在显存带宽而非算力)。
PagedAttention 让显存利用率提升、量化让权重变小,但 LLM 生成的「每步一次前向」的串行瓶颈仍未突破——Speculative Decoding 用「小模型草稿 + 大模型校验」的妙招,让大模型一次能生成多个 token,做到「无损加速」2-3 倍。
回顾第 6 章 6.2 节:LLM 自回归生成是「每步一次前向,每步一个 token」。这种严格的串行性是 LLM 生成的根本瓶颈——无论硬件多快,生成 N 个 token 至少要 N 次前向。
这种串行性在 Decode 阶段尤其浪费:每步只算 1 个 token,GPU 的并行计算能力严重闲置(瓶颈在显存带宽而非算力)。如果能「一次算多个 token」,就能让闲置的算力派上用场。
Speculative Decoding(投机解码,也称 Speculative Sampling) 就是为此而生。它的核心思想是:用一个小的「草稿模型」快速猜多个 token,再用大的「目标模型」一次性校验,校验通过的 token 直接采纳。
Speculative Decoding 的基本流程:
关键观察:大模型校验 γ 个 token 只需一次前向(因为 Transformer 可以并行处理一个序列),而小模型生成 γ 个 token 需要 γ 次前向。所以:
Speculative Decoding 的精妙之处在于「无损保证」——它不是简单「接受或拒绝」,而是设计了一个接受/拒绝采样机制,让最终输出与纯大模型生成的分布严格一致。
具体来说,对于草稿模型建议的 token x:
这种「rejection sampling」保证了:
💡 判读:「无损」是 Speculative Decoding 区别于其他加速技术(如量化有损)的关键。它不改变输出质量,只是让目标模型更高效地工作。这种「数学上严格等价」的特性让它成为高敏感场景(如代码生成、数学推理)的首选加速方案。
Speculative Decoding 的实际加速比取决于「草稿被接受的概率」(acceptance rate / hit rate):
影响命中率的因素:
| 因素 | 影响 |
|---|---|
| 草稿与目标的相似度 | 高 → 命中率高 |
| γ(草稿长度) | 适中最好,太大后面 token 命中率下降 |
| 任务类型 | 简单/重复任务命中率高,创造性任务低 |
| 温度 | 低温度(确定性强)命中率高 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 260" font-family="sans-serif" font-size="12"> <text x="360" y="22" text-anchor="middle" font-size="15" font-weight="bold">Speculative Decoding 加速比与命中率</text> <line x1="80" y1="220" x2="680" y2="220" stroke="#475569" stroke-width="1.5"/> <line x1="80" y1="220" x2="80" y2="50" stroke="#475569" stroke-width="1.5"/> <!-- 加速曲线 --> <path d="M 80 210 Q 250 200 400 130 T 680 60" fill="none" stroke="#16a34a" stroke-width="3"/> <text x="600" y="80" font-size="11" fill="#16a34a">加速比</text> <g font-size="10" fill="#64748b"> <text x="80" y="240" text-anchor="middle">0%</text> <text x="240" y="240" text-anchor="middle">25%</text> <text x="400" y="240" text-anchor="middle">50%</text> <text x="560" y="240" text-anchor="middle">75%</text> <text x="680" y="240" text-anchor="middle">100%</text> <text x="350" y="255" text-anchor="middle">命中率</text> <text x="74" y="225" text-anchor="end">1x</text> <text x="74" y="150" text-anchor="end">2x</text> <text x="74" y="80" text-anchor="end">3x</text> </g> <text x="360" y="180" text-anchor="middle" font-size="11" fill="#475569" font-style="italic">典型场景命中率 50%-80%,加速 1.5-2.5x</text> </svg>
⚠️ 现实代价:Speculative Decoding 不是「总是加速」。如果草稿模型选得差,命中率低,整体可能比纯大模型还慢(小模型前向的额外开销没被节省的大模型前向抵消)。生产部署要先 benchmark 命中率。
围绕「草稿怎么生成」这一核心,业界演化出了多种变体:
用一个独立的草稿模型生成。这是最早、最基础的方案。优势是简单,劣势是要维护两个模型。
Medusa 在目标模型上额外训练几个「MEDUSA HEAD」,每个 head 预测后续若干位置的 token。这样草稿就是目标模型自己生成的,无需独立草稿模型。
EAGLE 用目标模型的隐藏层特征(而非仅 token)作为草稿模型的输入,让草稿更精准。
Self-Speculative Decoding(如 LayerSkip)让目标模型「跳过几层」作为草稿模型——同一个模型,浅层作草稿、深层作校验。无需独立草稿模型,无需训练 head。
Lookahead Decoding 用 N-gram 匹配(从已生成内容找候选)生成草稿,完全无需神经网络草稿模型。适合代码、结构化文本(重复模式多)的场景。
| 变体 | 草稿来源 | 训练成本 | 命中率 | 部署复杂度 |
|---|---|---|---|---|
| 经典(两模型) | 独立小模型 | 无需 | 中-高 | 中 |
| Medusa | 目标模型 head | 训练 head | 中 | 中 |
| EAGLE | 特征驱动 | 训练草稿 | 高 | 中高 |
| Self-Speculative | 跳层 | 无需 | 中 | 低 |
| Lookahead | N-gram | 无需 | 中(结构化高) | 低 |
Speculative Decoding 与第 6-7 章的其他优化是叠加关系,可以同时使用:
二者完全兼容。草稿与目标模型的 KV Cache 都用 PagedAttention 管理,加速与高显存利用率兼得。
草稿模型可以用 INT4 量化(更小、更快),目标模型也可以量化。叠加效果显著。
Speculative 主要加速 Decode(生成阶段),与 Prefill 阶段无关。二者作用于不同阶段,可同时用。
💡 判读:现代 LLM 推理优化的精髓是「多管齐下」——PagedAttention 治显存、量化治算力、Chunked Prefill 治调度、Speculative 治串行。这些优化作用在不同维度,可以叠加使用。一个生产 LLM 推理服务通常同时启用全部四种优化。
实际部署 Speculative Decoding 的几个挑战:
选什么作为草稿模型?理想是「与目标模型同家族、参数量 1/10-1/50」的小模型。如目标 LLaMA-70B,草稿可用 LLaMA-7B 或 1B。但有些模型没有同家族小模型,要训练专门的草稿。
草稿模型自身也要算力。如果草稿模型大(如 7B),它生成 γ 个 token 的开销可能抵消大模型节省的开销。要权衡草稿大小与命中率。
γ(草稿长度)选多少?太大后面 token 命中率下降、浪费;太小节省的开销少。典型值 4-8,要根据负载实测。
在 Continuous Batching 下,多个请求的草稿生成与校验要协调——可能不同请求的草稿长度不同,校验时机不同。这增加了调度复杂度,现代引擎(vLLM、SGLang)已较好支持。
Speculative Decoding 的命中率与加速比要可观测。如果命中率突然下降(如输入分布变化),加速比可能反转,要能监控并切换回纯目标模型。
Speculative Decoding 不是「默认开」的优化,它有适用场景:
| 场景 | 推荐度 | 理由 |
|---|---|---|
| 实时聊天(低延迟优先) | 强烈推荐 | 显著降低 TTFT/TPOT |
| 代码生成 | 推荐 | 代码重复模式多,命中率高 |
| 数学推理 | 推荐 | 推理步骤确定性强 |
| 创意写作 | 一般 | 创造性高,命中率低 |
| 批量离线(吞吐优先) | 不推荐 | 加速单请求不如直接大 batch |
| 多租户高并发 | 看负载 | 高并发时算力已被 batch 占用,speculative 收益下降 |
💡 判读:Speculative Decoding 的最大价值在「延迟敏感」场景——让用户感觉「秒回」而非「等秒」。对延迟敏感的实时应用(聊天、代码助手),它几乎是必选项;对吞吐敏感的离线场景,量化与 PagedAttention 的优先级更高。
Speculative Decoding 是 2023-2024 年最活跃的 LLM 推理研究方向之一。几个趋势:
这些方向正在快速演进,未来 1-2 年的 LLM 推理延迟可能会有进一步突破。
下一节《7.4 分离式推理与多模态/Agent 推理》将讲清 PD 分离这一架构级创新。