Skip to main content

问题:自回归解码速度缓慢

大语言模型一次生成 1 个令牌。每个令牌都需要在模型中进行完整的正向传播——遍历所有权重、所有层——然后才能开始生成下一个令牌。如 推理工作原理 所述,此解码阶段是 内存带宽受限 的:GPU 从内存中读取数十亿字节的权重以生成一个令牌,然后为下一个令牌重复此过程。 计算单元大部分时间处于空闲状态,等待数据到达。您的 GPU 并未执行有用工作——它在等待内存。 推测解码利用了这些空闲容量。它不是每次正向传播只生成 1 个令牌,而是提前猜测多个令牌并一次性验证它们。

核心思想

推测解码使用 2 个模型协同工作:
  1. 草稿模型 —— 一个小型快速模型提前提出 N 个令牌(通常为 4-8 个令牌)。
  2. 目标模型 —— 您实际想要使用的大型模型在一次正向传播中验证所有 N 个提出的令牌。
If the target model agrees with K of the proposed tokens, you get K+1 tokens for the cost of 1 forward pass of the large model (plus 1 cheap forward pass of the small model). Wrong guesses are discarded and generation continues from the last accepted token. 计算很简单:在 75% 接受率和 5 草稿令牌的情况下,每次大模型前向传播平均生成约 2-3 个令牌,而非 1。这直接带来 2-3x 的生成速度提升。
推测解码不会改变输出质量。目标模型仍负责每一次接受决策,因此输出分布在数学上与常规自回归解码完全相同。

N-gram 推测解码

N-gram 推测解码不使用单独的草稿模型,而是查看当前序列的最后 N 个令牌,在上下文中搜索匹配的模式,并提议该模式后跟随的令牌。它仅基于现有文本进行纯模式匹配。例如,如果最后 4 个令牌是 def calculate_total(,且较早的上下文中包含 def calculate_total(items): return sum(,引擎会提议 items、:、return、sum 作为接下来的 4 个令牌。目标模型随后对这些令牌进行验证。
最佳适用: 代码生成、结构化输出、重复性文本、模板、日志解析。最不适用: 创意写作、多样化开放式回复、无重复模式的短上下文。当输出包含重复结构(如函数签名、JSON 模式、样板代码)时,N-gram 推测表现优异。当文本过于多样化而不适合模式匹配时,它会静默失效(接受率低,回退到常规解码)。
无需额外下载模型,无需额外显存。唯一成本是 CPU 在上下文中搜索匹配所花费的时间,与 GPU 前向传播相比可忽略不计。

草稿模型推测解码

同一系列中的较小模型会生成候选令牌。例如,Llama-3.1-8B 为 Llama-3.1-70B 生成草稿。小模型运行其自身的自回归生成过程,提出 4-8 个令牌,随后大模型在 1 次前向传递中一次性验证它们。接受率 — 即目标模型同意的草稿令牌比例 — 对于匹配良好的模型对,通常介于 70% 和 85% 之间。接受率越高,加速效果越明显。
最佳适用场景: 当你拥有足够的显存余量来加载较小模型时,用于通用生成任务。内存开销: 两个模型必须同时加载。一个 8B 草稿模型在目标模型基础上额外增加约 4-5 GB 空间(采用 Q4 量化)。请据此规划你的 模型适配。Speedup: 1.5-2.5x depending on acceptance rate and draft token count. Diminishing returns past 6-8 draft tokens because acceptance drops for later tokens in the sequence.
草稿模型和目标模型应使用同一模型系列。跨系列配对(例如,使用 Mistral 为 Llama 生成草稿)的接受率显著更低,因为它们的令牌分布存在差异。

DFlash:随模型附带的草稿生成器

大多数草稿模型设置要求你自行寻找兼容的小模型并调整配对。DFlash 是 Meta 为 Muse Glimmer 30B 设计的草稿生成器,省去了这一步骤:它与目标模型在同一版本中发布,并提议 16 个令牌的块,由 Muse Glimmer 在 1 次前向传递中进行验证。 Meta reports 3.1x on an RTX 5090, 1.8x on an Apple M5 Max, and 1.5x on an Apple M4 Max. These are vendor-reported numbers with no independent reproduction yet, so benchmark your own hardware before you count on them.

模型原生推测头:MTP 和 DSpark

某些模型架构经过训练,能够从单次前向传播中同时预测多个未来令牌。模型本身会一次性生成多个候选令牌,无需单独的草稿模型,也无需模式匹配。推测令牌由模型自身的内部表示生成。这与外部推测从根本上不同:多令牌头与基础模型联合训练,因此它们共享相同的上下文理解。
最佳适用: 原生支持该特性的模型。无需配置选择——如果模型使用 MTP 头训练,则启用它们;否则,无法添加。当前 DeepSeek 示例: DeepSeek-V4-Flash-0731 在其官方检查点中捆绑了 DSpark 模块。部分 Qwen 模型使用 MTP 头。优势: 无需单独的草稿模型检查点或模型对调优。劣势: 需要特定的模型训练。无法将 MTP 应用于任意检查点。
官方 0731 示例使用存储在相同检查点中的 DSpark 头。请勿为该模型添加 --speculative-draft-model-path。
官方 0731 模型卡片记录了 DSpark 在 vLLM 和 SGLang 上的支持情况。硬件支持仍有差异,请使用匹配的运行时配方并对您的确切检查点进行基准测试。参见 DeepSeek V4 Flash 0731 本地硬件。

EAGLE(用于提升语言模型效率的外推算法)

EAGLE 在目标模型的隐藏状态之上训练一个小型“头”网络。它不加载完整的草稿模型,而是将一个轻量级神经网络附加到目标模型的中间表示上,并利用这些表示来预测未来的令牌。由于头网络读取目标模型自身的内部状态,它比朴素的草稿模型实现了更高的接受率(80-90%)。与完整模型相比,头网络非常小——通常仅为目标模型大小的 5-10%。
最佳适用: 在可用时,EAGLE 提供所有技术中最佳的加速与内存比。当前状态: 处于研究阶段,运行时支持有限。vLLM 和 SGLang 具有实验性的 EAGLE 集成,但需要预训练的 EAGLE 头检查点,而大多数模型家族尚未广泛发布这些检查点。当 EAGLE 支持成熟时,预计: 2-3x 的速度提升,且仅带来 5-10% 的内存开销 — 显著优于完整的草稿模型。
EAGLE 头检查点是特定于模型和架构的。在尝试使用此技术之前,请验证是否已为您的确切目标模型发布了 EAGLE 检查点。

比较

N-gram

Extra memory: none Speedup: 1.2-1.5x Requires training: no Runtime support: vLLM, llama.cpp Best for: repetitive content, code, structured output

草稿模型

额外内存: 20-30% 额外 加速比: 1.5-2.5x 需要训练: 否(使用同系列更小模型) 运行时支持: vLLM, llama.cpp 最佳适用场景: 具有 VRAM 余量的通用生成

多令牌预测

Extra memory: none Speedup: 1.5-2x Requires training: yes (model-specific) Runtime support: vLLM (select models only) Best for: model-native heads such as DeepSeek V4 Flash 0731 DSpark and supported Qwen MTP variants

EAGLE

额外内存: 5-10% 加速比: 2-3x 需要训练: 是(头部网络) 运行时支持: 实验性 最佳适用场景: 在可用时提供最佳的加速比与内存比

何时使用推测解码

使用场景:
  • 您的工作负载是解码密集型的 — 生成长文本,大部分时间花在生成令牌上,而非处理提示词
  • 您有足够的显存余量用于草稿模型(目标模型之外至少空闲 5-10 GB)
  • 您生成结构化或重复性输出 — 代码、模板、JSON、日志
  • 您服务于单个用户或低并发工作负载
避免使用场景:
  • 您的工作负载是预填充密集型的 — 短输出配长输入(摘要、分类)。推测解码仅加速解码阶段。
  • 您已处于显存上限。草稿模型或额外的 KV 缓存条目可能导致内存溢出。请参阅 DGX Spark 内存调优 进行容量规划。
  • 您使用连续批处理且并发度高。推测解码与大多数运行时中的高效批调度冲突 — 验证阶段假设每个请求的草稿长度固定,这会复杂化批处理组合。

实用设置指南

vLLM 中的 N-gram 推测

最简单的起点 — 无需额外下载,无需额外内存:
The --ngram-prompt-lookup-max flag sets the window size for pattern matching. Larger values find more matches in long contexts but slow the draft step slightly. Start with 5 and increase if acceptance is low.

vLLM 中的草稿模型

当显存充足时,可获得更高的加速比:
如果遇到 OOM(内存溢出),请减小 --max-model-len。两个模型共享同一块显存池,且草稿模型的 KV 缓存会增加总显存占用。
像这样获取并调整草稿模型对是常规路径。Meta 的 Muse Glimmer 30B 跳过了这一步:拉取以 -dflash 结尾的 Ollama 标签(例如 muse-glimmer:30b-q4_K_M-dflash),DFlash 草稿器加载时无需设置 --speculative-model 标志。

llama.cpp 中的 N-gram 推测

The --lookup-cache-static flag caches n-gram lookups across tokens, improving draft speed for repetitive patterns.

如何测量加速比

运行相同的提示词两次 — 一次使用推测解码,一次不使用 — 并比较每秒生成的 token 数:
停止基线服务器,启动推测服务器,发送相同的请求,然后进行比较。查找 x-tokens-per-second 标头,或从 usage.completion_tokens 除以墙钟时间进行计算。 对于系统性基准测试,请使用 vLLM 内置的基准测试工具:
经过良好调优的推测设置可在不改变输出质量或令牌数量的情况下,将平均解码延迟提升 1.5-2.5x。

深入了解

解码与预填充功耗

针对您的硬件调优预填充和解码阶段,以实现最大吞吐量。

推理工作原理

了解预填充、解码以及为何内存带宽是瓶颈。

DGX Spark 上的 vLLM

配置 vLLM 并使用最佳设置,包括支持推测解码。

模型适配

计算目标模型与草稿模型是否适配于 VRAM。

基准测试你的部署

本地大语言模型部署的系统化基准测试方法