文章

Speculative Decoding 生产落地:为什么低 QPS 加速,高负载反而变慢

从生产推理角度拆解推测解码的收益边界,解释草稿模型、验证模型、接受率、请求负载与批处理之间的关系,并给出上线前的压测、回退和监控清单。

背景:大模型慢,不只是”模型太大”

大模型推理慢,通常有两个瓶颈:prefilldecode

Prefill 负责把输入 prompt 一次性编码进 KV Cache,输入越长,首 token 前的等待越明显。Decode 则是逐 token 生成,每生成一个 token,都要读一次大量权重和 KV Cache。对在线聊天、代码补全、Agent 工具调用这类交互式场景来说,用户感知最强的往往不是总吞吐,而是 TTFT(Time To First Token)和 ITL(Inter-Token Latency)。

Speculative Decoding,也常被称为 Assisted Generation,解决的是 decode 阶段的串行问题。它的核心想法很直接:先让一个更快的”草稿器”猜出后面几个 token,再让目标大模型一次性验证这些 token。如果多个 token 被接受,目标模型就相当于用一次前向计算推进了多步生成。

这不是简单的缓存,也不是量化。它更像是把”一个大模型一步一步写答案”,改成”一个小模型先写草稿,大模型批量审稿”。

核心原理:草稿、验证、接受率

一个典型的推测解码循环可以拆成四步:

  1. Draft(草稿):草稿模型或草稿算法生成 K 个候选 token。草稿器可以是小模型,也可以是 n-gram、suffix、Medusa head、EAGLE、MTP 等结构。
  2. Verify(验证):目标模型拿到这 K 个候选 token,在一次或较少次数前向计算中并行验证它们。
  3. Accept / Reject(接受/拒绝):如果候选 token 与目标模型在当前采样规则下可接受,就直接推进;一旦遇到不接受的 token,就回退到目标模型自己的输出。
  4. Repeat(重复):新的上下文继续进入下一轮草稿和验证。

这里最关键的变量不是”草稿一次猜几个”,而是 接受率。如果草稿 token 经常被目标模型接受,目标模型一次前向可以产出多个有效 token,ITL 会下降。反过来,如果草稿经常猜错,系统既付出了草稿成本,又没有减少多少目标模型调用,延迟可能反而上升。

Hugging Face 在 Assisted Generation 的介绍中把这个机制解释为:assistant 模型先逐 token 生成候选序列,target 模型再一次性验证这些候选;收益来自目标模型一次前向确认多个 token,而不是每次只生成一个 token。

关键工程判断:它不是所有流量都快

vLLM 文档对推测解码的定位很克制:它适合降低 中低 QPS、memory-bound 工作负载下的 inter-token latency。这个限定非常重要。

在低 QPS 时,单个请求的 decode 往往无法充分填满 GPU,目标模型每步生成一个 token 的串行成本很明显。推测解码让目标模型一次验证多个候选 token,可能明显改善用户看到的流式输出速度。

在高 QPS 时,情况会变化。连续批处理会把多个请求合并,GPU 利用率提高,单请求的 decode 不再完全像孤立运行。2026 年 5 月提交的论文《An Interpretable Latency Model for Speculative Decoding in LLM Serving》专门分析了这个问题:生产系统中的有效 batch size 会随请求率变化,推测解码的加速常常会随着服务负载上升而衰减。

所以,推测解码不是一个”打开就变快”的开关。它更像一个需要按流量、模型、场景和采样策略调参的延迟治理手段。

常见技术路线对比

1. N-gram / Prompt Lookup

N-gram 推测不需要额外草稿模型。它从输入 prompt 或已生成内容里寻找重复片段,把可能重复的 token 当成草稿。

TensorRT-LLM 文档指出,NGram 直接从输入 prompt 和此前输出中复制 draft tokens,适合输入和输出存在高 n-gram 重叠的场景,比如摘要、文档问答、多轮聊天、代码编辑。

优点:部署简单、额外资源少、风险低。 缺点:对开放式创作、复杂推理、低重复任务,接受率通常不稳定。

2. Draft Model

Draft Model 是最直观的方案:用一个小模型为大模型草拟 token。

它的难点在于,小模型必须足够快,也必须足够像目标模型。Hugging Face 的 Universal Assisted Generation 文章提到,传统 assisted generation 往往要求 target 和 assistant 使用相同 tokenizer;UAG 则试图扩展到不同 tokenizer 的模型组合。同时,文章也给出一个很现实的经验:assistant 通常要比 target 小很多,才更容易得到有意义的延迟收益。

适合:低 QPS、延迟敏感、目标模型很大、且可以找到合适小模型的场景。 不适合:草稿模型本身就很重,或跨 tokenizer 对齐成本过高。

3. EAGLE、MTP、MLP Speculator

vLLM 的文档列出 EAGLE、MTP、draft model、PARD、MLP、N-gram、suffix、dynamic speculative decoding 等多种方法,并给出方法选择建议:模型型方法通常有更高延迟收益,但实现和兼容成本也更高。

这类方案的共同目标是减少草稿阶段的串行成本。例如 Speculators 项目把 speculator 定义为可训练、可部署到 vLLM 的草稿模型体系,让小型草稿器提前预测多个 token,再由基础模型一次验证。

适合:有模型训练能力、有明确推理成本目标、并且愿意做压测和灰度发布的团队。

4. Medusa / Tree-based Speculation

Medusa 的思路是在模型上增加多个预测未来 token 的 head,形成多候选路径。TensorRT-LLM 文档强调,Medusa 的潜力来自多路径验证,但树的宽度和深度需要剪枝,否则额外计算会抵消收益。

SpecInfer 论文进一步把候选 token 组织成 token tree,用目标 LLM 作为 verifier 并行验证树中候选序列,目标是降低端到端延迟和计算成本。

树形推测的收益空间更大,但工程复杂度也更高。它需要处理候选路径、稀疏 attention mask、接受路径选择、显存开销和调度策略。

方案额外模型部署复杂度适用场景收益天花板
N-gram / Prompt Lookup摘要、文档问答、代码编辑
Draft Model需要小模型低 QPS、大模型服务
EAGLE / MTP / MLP需要训练中高有训练能力的团队
Medusa / Tree-based需要修改模型深度优化场景最高

为什么高负载下收益会消失

很多团队第一次测试推测解码时,会得到一个看起来矛盾的结果:单请求测试很快,小流量也快,一旦压到线上目标 QPS,收益明显下降,甚至比普通 decode 更慢。

原因通常有四个:

第一,草稿成本不是免费的。 草稿模型也要占 GPU、CPU、内存、KV Cache 和调度资源。低负载下这些成本可能被更少的目标模型步数抵消;高负载下,它会进入排队系统,变成真实开销。

第二,连续批处理改变了基线。 不开推测解码时,高 QPS 可能已经通过 batching 提高了目标模型吞吐。推测解码引入的 draft / verify 分阶段流程,可能破坏原本简单稳定的批处理节奏。

第三,接受率随任务变化。 代码补全、文档问答、摘要通常有较高局部可预测性;开放式聊天、长链路推理、强采样、多工具调用,接受率会下降。接受率下降后,推测深度越大,浪费越多。

第四,采样参数会改变收益。 temperature、top_p、top_k 等参数会影响目标模型分布,也会影响草稿 token 被接受的概率。只在 greedy decoding 下验证出来的收益,不能直接迁移到生产采样配置。

一个更稳的落地路径

第一步:先建立普通 decode 基线

不要一开始就比较”开”和”不开”。先把普通 decode 的基线测清楚。

至少记录这些指标:

  • TTFT p50 / p95 / p99
  • ITL p50 / p95 / p99
  • 输出 token 吞吐
  • 请求队列等待时间
  • GPU SM 利用率与显存占用
  • 平均输入长度与输出长度
  • 按任务类型拆分的延迟分布

推测解码主要改善的是 decode 阶段,不要把 prefill 很重的长上下文请求误判为推测解码失败。长上下文服务往往还需要 prefix cache、KV cache 管理、P/D 解耦等手段配合。

第二步:从低风险方法开始

如果业务包含 RAG、文档问答、代码编辑、多轮上下文复用,可以先试 n-gram 或 suffix。它们不需要额外训练草稿模型,比较适合做第一轮线上灰度。

vLLM 的 n-gram 配置可以从保守参数开始:

vllm serve Qwen/Qwen3-32B \
  --speculative-config '{
    "method": "ngram",
    "num_speculative_tokens": 4,
    "prompt_lookup_min": 2,
    "prompt_lookup_max": 5
  }'

这类配置的目标不是追求极限加速,而是验证三个问题:任务是否有足够重复片段、接受率是否稳定、尾延迟是否变差。

第三步:再评估模型型 speculator

如果 n-gram 收益有限,但业务仍然 decode-heavy,可以评估 draft model、EAGLE、MTP 或 MLP speculator。

一个典型的 draft model 配置形态如下:

vllm serve large-target-model \
  --speculative-config '{
    "method": "draft_model",
    "model": "small-draft-model",
    "num_speculative_tokens": 5,
    "draft_tensor_parallel_size": 1
  }'

这里不要只看平均速度。更重要的是观察:草稿模型本身是否成为瓶颈、draft 和 target 是否争抢同一资源、接受率是否随 prompt 类型显著波动。

第四步:做负载分层,而不是全局开关

生产系统不应该只有一个布尔开关。更合理的是按流量和请求类型启用不同策略。

# simplified routing logic
def choose_decode_policy(request, metrics):
    if metrics.qps_high or metrics.queue_wait_p95_ms > 200:
        return "baseline_decode"
    if request.task in ["document_qa", "summarization", "code_edit"]:
        return "ngram_speculation"
    if request.output_len_estimate > 256 and metrics.acceptance_rate_p50 > 0.65:
        return "draft_model_speculation"
    return "baseline_decode"

这个逻辑的核心是:当系统进入高负载,先保护稳定吞吐和尾延迟;当任务高度可预测,再启用更激进的推测深度。

适用场景

推测解码更适合下面几类任务:

  • 代码补全与代码编辑:代码有强结构、强局部模式和大量重复符号,草稿 token 更容易被接受。
  • 文档问答和摘要:输出经常复述输入材料中的实体、短语和结构,n-gram / prompt lookup 可能带来低成本收益。
  • 低 QPS、高交互要求的聊天服务:当 GPU 没有被充分打满时,decode 串行性更明显,推测解码可能改善用户感知速度。
  • 固定模型族内部的大模型服务:如果能找到同族小模型、MTP checkpoint 或训练好的 speculator,工程集成成本会低一些。

不太适合的场景包括:高 QPS 满负载服务、强随机采样、超低接受率任务、草稿模型与目标模型差异过大、以及主要瓶颈在 prefill 而不是 decode 的长上下文请求。

常见误区

误区一:只看 tokens/s。 吞吐提高不等于用户体验改善。在线服务更应该看 TTFT、ITL、尾延迟和失败率。如果 tokens/s 提高,但 p99 ITL 变差,用户感知可能更差。

误区二:草稿越长越好。 num_speculative_tokens 不是越大越好。推测深度变大后,草稿成本、验证成本、KV 管理和拒绝浪费都会增加。合理做法是根据接受率和负载动态调整。

误区三:小模型越小越好。 草稿模型太小会快,但猜不准;太大能猜准,但不够快。好的草稿器应该在”足够快”和”足够像目标模型”之间取得平衡。

误区四:离线 benchmark 可以直接代表线上。 离线固定 batch、固定输入长度、固定输出长度的测试,无法覆盖真实线上流量。线上请求长度、任务类型、采样参数、排队状态都会变化。

误区五:忽略回退机制。 推测解码必须能快速回退到普通 decode。没有回退策略,就很难处理接受率突降、草稿模型异常、显存压力上升或队列等待变长。

上线检查清单

模型与算法

  • 确认目标模型、草稿模型、tokenizer、采样参数兼容。
  • 确认严格验证路径不会改变输出质量。
  • 对 greedy、temperature、top_p 等采样配置分别测试。
  • 对不同任务类型分别记录接受率。

性能与容量

  • 比较普通 decode、n-gram、draft model、EAGLE / MTP 等方案。
  • 分别测试低 QPS、中 QPS、高 QPS。
  • 记录 TTFT、ITL、输出吞吐、GPU 利用率、显存、队列等待。
  • 单独观察 p95 / p99,而不是只看平均值。

灰度与回退

  • 按任务类型灰度,不要全量开启。
  • 设置接受率下限,低于阈值自动回退。
  • 设置队列等待阈值,高负载时自动回退。
  • 保留普通 decode 路由。
  • 监控草稿模型错误、OOM、超时和验证失败。

成本核算

  • 计算草稿模型额外 GPU 成本。
  • 计算目标模型减少的 forward step。
  • 计算整体请求成本,而不是只看单请求速度。
  • 如果使用远程 drafter,额外计算网络延迟和跨服务调度开销。

总结

推测解码不是一个”打开就变快”的魔法开关。它是一套需要仔细评估流量特征、任务类型、接受率和资源约束的延迟优化手段。低 QPS 下它可能显著改善 ITL,高 QPS 下收益衰减甚至反噬。务实路线是从 n-gram 等低风险方法起步,建立基线,分层路由,始终保留回退路径——让你的生产系统在”快”和”稳”之间找到真正的平衡点。

参考资料

  1. vLLM Documentation: Speculative Decoding(访问日期 2026-06-29)
  2. NVIDIA TensorRT-LLM Documentation: Speculative Sampling / NGram / Medusa(访问日期 2026-06-29)
  3. Hugging Face Blog: Universal Assisted Generation: Faster Decoding with Any Assistant Model(2024-10-29)
  4. Hugging Face Blog: Faster Assisted Generation with Dynamic Speculation(2024-10-08)
  5. vLLM Project: Speculators GitHub Repository(访问日期 2026-06-29)
  6. SpecInfer: Accelerating Generative Large Language Model Serving with Tree-based Speculative Inference and Verification(arXiv:2305.09781,v4 2024-04-01)
  7. An Interpretable Latency Model for Speculative Decoding in LLM Serving(arXiv:2605.15051,提交日期 2026-05-14)
  8. SPECTRE: Hybrid Ordinary-Parallel Speculative Serving for Resource-Efficient LLM Inference(arXiv:2605.08151,修订日期 2026-05-12)

常见问题

推测解码会改变大模型输出质量吗?
在严格验证和正确采样实现下,推测解码的目标是保持与目标模型自回归解码一致;工程上仍需验证采样参数、框架实现和模型兼容性。
为什么压测时低 QPS 很快,高 QPS 反而收益下降?
低 QPS 下解码更容易受单步内存访问和串行生成限制;高 QPS 下连续批处理和队列负载改变了有效批大小,草稿和验证额外成本可能抵消收益。
生产环境应该先试哪种推测解码方案?
RAG、文档问答、代码编辑等高重复场景可先试 n-gram 或 suffix;通用聊天再评估 draft model、EAGLE、MTP 等模型型方案。