先猜后改:利用计算冗余换取生成时间

自回归生成的“串行枷锁”

LLM 生成文本最慢的地方在于其自回归属性:为了生成第 $N+1$ 个词,你必须先生成第 $N$ 个词。对于一个拥有千亿参数的大模型(Target Model)来说,每生成一个 Token 都要全量加载一次权重,这导致计算极度低效,硬件利用率极低。

项目 10 探索的是目前最优雅的提速方案:投机解码(Speculative Decoding)。其核心逻辑是:“大模型的计算很贵,但验证很便宜”

第一阶段:草稿模型(Draft Model)的预测

我们引入一个极其微小但速度极快的模型(例如 100M 参数的同架构模型)。

  1. 草稿模型先行一步,连续“盲猜” $K$ 个词(例如 $K=5$)。
  2. 这个过程非常快,因为它几乎不占内存带宽。
  3. 得到一个候选序列:[T1, T2, T3, T4, T5]

第二阶段:大模型的并行验证(Parallel Verification)

这是投机解码最精妙的地方。虽然大模型生成是串行的,但它在处理已知序列时是并行的。

  1. 我们将 [Prompt + T1, T2, T3, T4, T5] 一次性喂给大模型。
  2. 大模型在一次 Forward Pass 中,可以同时计算出这 5 个位置上每个位置的正确概率分布。
  3. 关键点:大模型不仅在看草稿给出的词对不对,它还在顺便计算“如果不对,正确的词应该是什么”。

第三阶段:接受与修正算法

我们使用一种特殊的拒绝采样(Rejection Sampling)变体,确保投机后的输出分布与直接使用大模型生成的分布完全一致(即无损加速)。

  • 逻辑:对于草稿给出的每一个词 $x$,如果大模型的概率 $P(x)$ 大于草稿模型的概率 $Q(x)$,我们无条件接受。如果 $P(x) < Q(x)$,我们以一定的概率接受或拒绝。
  • 截断点:一旦某个词被拒绝(例如第 3 个词错了),大模型会立即给出它认为正确的第 3 个词。此时,草稿模型后续猜的第 4、5 个词将被直接废弃。
  • 收益:如果草稿模型猜对了 3 个词,我们在一次大模型计算的时间内,实际上得到了 4 个词(3 个对的 + 1 个大模型修正的)。

工程挑战与数学边界

1. 接受率(Acceptance Rate)

加速效果取决于大模型对小模型的“认可度”。如果小模型太弱,猜一个错一个,那么投机解码反而会因为额外的计算开销而变慢。

  • 数学直觉:加速比 $\approx \frac{1 - \alpha^{K+1}}{(1-\alpha)(1+K \cdot r)}$,其中 $\alpha$ 是接受率,$r$ 是大小模型的计算耗时比。

2. 草稿模型的选择

并不是越小越好。理想的草稿模型应该与大模型共享同一个 Tokenizer,且训练数据分布一致。目前业界也在探索“无模型投机”,例如直接从前面的上下文里拷贝重复模式。

3. 硬件瓶颈

投机解码只有在**计算受限(Compute-bound)**的情况下收益才高。如果显存带宽已经是瓶颈,频繁切换模型权重可能会抵消掉算法带来的收益。

实验与产物

在本项目中,你需要复现以下实验:

  1. 加速比对比图:记录不同 $K$ 值(草稿长度)下的生成速度。
  2. 接受率热力图:分析在不同任务(如代码 vs 文学)中,投机解码的接受率差异。代码生成的接受率通常极高,因为语法结构非常固定。
  3. 延迟分布分析:观察 Speculative Decoding 是否会增加首 Token 延迟(Prefill Latency),以及它是如何缩短逐 Token 延迟(Decode Latency)的。

总结

投机解码证明了 LLM 系统工程中的一条重要准则:算法的精妙可以弥补硬件的物理限制。通过引入一个“会猜”的小助手,我们让沉重的大模型从繁琐的串行劳作中解放出来,转而扮演一个高效率的审稿人。

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:项目 10:打破串行咒语:投机解码(Speculative Decoding)

本文链接:https://www.sshipanoo.com/blog/ai/llm-roadmap/lab-10-speculative/

本文最后一次更新为 天前,文章中的某些内容可能已过时!