我对投机采样 (Speculative Decoding) 进行了基准测试 —— a = 3.5 还远远不够
投机采样 (Speculative Decoding, SD) 依赖于一个简单的数学规则: a > 1 + α + β
接受长度 (a) 必须大于 1 加上计算比率 (α) 和验证开销 (β)。如果满足,SD 就能获胜;否则,它就会失败。
我在真实机器上测试了这个理论。我使用的是配备 64GB RAM 的第 12 代 Intel CPU。我将一个小型的 Qwen2.5-0.5B 草稿模型 (draft model) 与一个较大的 Qwen2.5-1.5B 目标模型 (target model) 相结合。
结果令人惊讶。SD 比原始生成速度慢了 49% 到 62%。
以下是接受长度 (a) 随任务类型的变化情况:
• JSON (结构化): a = 3.50。草稿模型很好地预测了格式。 • 代码 (半结构化): a = 3.00。表现不错,但命名模式各异。 • 故事 (创意): a = 2.11。草稿模型在词汇选择上表现挣扎。
即使在 "a" 很高的情况下,SD 在 CPU 上依然失败了。为什么?
最大的问题在于“零接受率”。在 15% 到 30% 的轮次中,接受的 token 数量为零。
在这些轮次中,草稿模型进行了计算,目标模型进行了验证,但你没有得到任何新内容。你付出了两次运行的代价,却只得到了一个 token。这使得在相同输出量的情况下,SD 的成本增加了 2 倍。
这凸显了为什么 SD 是一种针对 GPU 的优化。
在 GPU 上,草稿模型的成本几乎可以忽略不计,计算比率 (α) 非常小。而在 CPU 上,草稿模型会与目标模型竞争内存带宽。它并不是免费的。这个不等式在 CPU 上失效了。
如果你想在 CPU 上使用 SD,请不要这样做。数据证明这行不通。
部署时的关键启示:
- 测量你自己的 "a" 值。不要盲目相信厂商的说法。
- 按任务类型拆分你的数据。代码和对话的接受率是不同的。
- 关注零接受率。高方差会破坏你的 p99 延迟。
- 在草稿模型成本极低的 GPU 上使用 SD。
最好的优化是知道何时关闭它。
Source: https://dev.to/zxpmail/i-benchmarked-speculative-decoding-a-35-wasnt-enough-1geb
Optional learning community: https://t.me/GyaanSetuAi
