投机采样 (Speculative Decoding):让 LLM 推理速度起飞的“快慢速”协作机制
在 LLM 的推理过程中,最令人头疼的瓶颈始终是 Token-by-Token 的自回归生成模式。无论模型多么强大,生成 100 个词就必须经过 100 次完整的模型前向传播。对于参数量巨大的模型(如 Llama-3-70B 或 GPT-4),这意味着极高的延迟。

投机采样 (Speculative Decoding):让 LLM 推理速度起飞的“快慢速”协作机制
在 LLM 的推理过程中,最令人头疼的瓶颈始终是 **Token-by-Token** 的自回归生成模式。无论模型多么强大,生成 100 个词就必须经过 100 次完整的模型前向传播。对于参数量巨大的模型(如 Llama-3-70B 或 GPT-4),这意味着极高的延迟。
为了打破这个瓶颈,学术界和工业界引入了一种极其巧妙的方案:**投机采样 (Speculative Decoding)**。
核心逻辑:用“快”猜,用“慢”验
投机采样的核心思想是:**并非所有 Token 的预测难度都一样。**
在一段话中,“我喜欢吃”后面大概率跟着“苹果”或“米饭”,这种简单的预测不需要 70B 的参数量也能完成;而涉及到复杂的逻辑推理或专业知识时,才需要大模型的全力支持。
投机采样通过引入一个**小规模的草稿模型 (Draft Model)** 和一个**大规模的目标模型 (Target Model)** 来协作:
1. **投机阶段 (Speculation):** 小模型(速度极快)连续预测接下来的 $K$ 个 Token(例如 5 个)。由于小模型轻量,这 $K$ 次前向传播的时间远低于大模型一次传播的时间。
2. **验证阶段 (Verification):** 大模型一次性将这 $K+1$ 个 Token 输入,并行计算它们的概率分布。
3. **接受与修正:** 大模型检查小模型的预测是否在自己的概率分布可接受范围内。
- 如果前 3 个是对的,第 4 个错了 $\rightarrow$ 接受前 3 个,修正第 4 个,丢弃后续所有投机结果。
- 如果全部正确 $\rightarrow$ 一次性产出 $K+1$ 个 Token。
工程实现中的关键权衡
在实际部署投机采样时,工程师需要面对三个核心挑战:
1. 草稿模型的选择 (The Draft Model Gap)
如果小模型太弱,预测准确率低,大模型会频繁地拒绝(Reject)投机结果并触发重新生成。此时,投机采样不仅不能加速,反而因为增加了小模型的运行开销而导致整体延迟增加。理想的草稿模型应该是目标模型的“精简版”(如通过蒸馏得到),在保持基本语言分布一致的前提下尽可能轻量。
2. 接受准则 (Acceptance Criterion)
不能简单地要求大模型输出的 Token 与小模型完全一致(因为 LLM 是概率性的)。通常采用 **$\text{argmax}$** 或 **核采样 (Nucleus Sampling)** 的变体。只要小模型选出的 Token 在大模型的分布中具有足够的概率权重,就被视为“正确”。
3. KV Cache 的同步
为了实现高效验证,大模型必须能够快速处理投机序列。这意味着 KV Cache 需要支持快速的追加和回滚操作。当投机失败时,系统必须能迅速将 Cache 回退到最后一个被接受的 Token 位置。
实战效果与适用场景
投机采样在以下场景中表现最为显著:
- **低熵文本生成:** 如代码补全、格式化文档、重复性较高的对话。在这种场景下,小模型的命中率极高,加速比可达 $2\times \sim 3\times$。
- **高延迟 API 服务:** 当用户对首字延迟(TTFT)不敏感但对整体吞吐量有要求时,投机采样能显著提升每秒生成的 Token 数(TPS)。
然而,在进行深度逻辑推理或创意写作时,由于 Token 的不可预测性增强,投机采样的加速效果会明显下降。
总结
投机采样本质上是一种**用计算换时间**的策略。它承认了 LLM 推理中存在冗余计算的事实——我们不需要每次都动用整个大脑来决定下一个词是不是“的”。通过构建一套高效的“快慢协作”机制,AI 系统能够在保证输出质量完全不打折的前提下,大幅度降低推理延迟。
留言区
欢迎分享你的想法!
加载留言中…