推测解码¶
本文档展示了如何使用 vLLM 中的 推测解码 (Speculative Decoding),以降低中低 QPS(每秒查询数)及受内存限制工作负载下的 token 间延迟。
若要训练自己的草稿模型以优化推测解码,请参阅 vllm-project/speculators,获取与 vLLM 无缝集成和训练的指南。
vLLM 推测方法¶
vLLM 支持多种推测解码方法。基于模型的方法(如 EAGLE、MTP、草稿模型、PARD 和 MLP)可提供最佳的延迟降低效果;而更简单的方法(如 n-gram 和后缀解码)则能在不增加高峰流量期间工作负载的前提下提供适度的速度提升。
方法选择速查¶
请将此定性表格作为选择方法的起点。实际收益取决于您的模型系列、流量模式、硬件以及采样设置。
| 方法 | 低 QPS(侧重延迟) | 高 QPS(侧重吞吐量) | 注意事项 |
|---|---|---|---|
| EAGLE | 高收益 | 中高收益 | 强大的通用型基于模型的方法。 |
| MTP | 高收益 | 中高收益 | 当目标模型具有原生 MTP 支持时效果最佳。 |
| 草稿模型 | 高收益 | 中等收益 | 需要单独的草稿模型。 |
| 并行草稿模型 | 高收益 | 中高收益 | 较低的草稿模型延迟。 |
| MLP 推测器 | 中高收益 | 中等收益 | 当有兼容的 MLP 推测器可用时效果良好。 |
| N-gram | 低至中等收益 | 中等收益 | 轻量且易于启用。 |
| 后缀解码 | 低至中等收益 | 中等收益 | 无需额外的草稿模型;动态推测深度。 |
如需在您的环境中进行可复现的测量,请使用 examples/offline_inference/spec_decode.py 或 基准测试 CLI 指南。
推测解码的无损保证¶
在 vLLM 中,推测解码旨在提高推理效率的同时保持准确性。本节讨论推测解码的无损保证,将其细分为三个关键领域:
-
理论无损性 - 在硬件数值的精度限制范围内,推测解码采样在理论上是无损的。如 《利用推测采样加速大语言模型解码》 所述,浮点运算误差可能会导致输出分布产生微小差异。
-
算法无损性 - vLLM 的推测解码实现已在算法层面验证为无损。关键验证测试包括:
- 拒绝采样收敛 (Rejection Sampler Convergence):确保来自 vLLM 拒绝采样器的采样与目标分布一致。查看测试代码
- 贪婪采样一致性 (Greedy Sampling Equality):确认使用推测解码的贪婪采样与不使用时的结果匹配。这验证了 vLLM 的推测解码框架在与 vLLM 前向传播及 vLLM 拒绝采样器集成时提供了无损保证。tests/spec_decode/e2e 中的几乎所有测试都使用此断言实现验证了该属性。
-
vLLM Logprob 稳定性 - vLLM 目前不保证 token 对数概率 (logprobs) 的稳定性。这可能导致同一请求在不同运行中产生不同的输出。有关更多详细信息,请参阅 FAQ 中标题为 “vLLM 中提示词的输出在不同运行中会改变吗?” 的部分。
尽管 vLLM 致力于确保推测解码的无损性,但由于以下因素,使用和不使用推测解码生成的输出仍可能存在差异:
- 浮点精度:硬件数值精度的差异可能导致输出分布出现微小偏差。
- 批处理大小 (Batch Size) 和数值稳定性:批处理大小的变化可能会导致 logprobs 和输出概率的变化,这可能是由于批处理操作中的非确定性行为或数值不稳定性造成的。
关于缓解策略,请参考 FAQ 中的条目 “vLLM 中提示词的输出在不同运行中会改变吗?”。
已知的功能不兼容性¶
- 截至
vllm<=0.15.0,流水线并行 (Pipeline parallelism) 无法与推测解码组合使用。 - 在
vllm<=0.10.0中不支持使用草稿模型的推测解码。