vLLM 中最快的推测式解码:Arctic Inference 与 Arctic Training

774 阅读16分钟

转载

其实就是在speculative decoding的基础上,多种方式ensemble

另外,lstm都来了,死去的记忆攻击我。。

btw,要问投机解码是什么,cursor的fast apply用的就是投机解码。

image.png

图 1. 使用 vLLM 中的推测式解码,运行在 8 张 H100 GPU 上的 Llama-3.1-70B-Instruct 的生成速度。

在这篇博客中,我们展示了我们在推测式解码方面的最新工作,以及 Arctic Inference + vLLM 如何在 SWE-Bench 任务中实现 LLM agent 4 倍的平均推理速度提升,在开放式交互任务中实现高达 2.8 倍的解码速度提升(相较于未使用推测的 vLLM)。

在发布时,Arctic Inference 是 vLLM(v0.8.4)中最快的推测解码方案,显著超过了 vLLM v1 中的原生 N-gram 和 EAGLE 推测器,在多个工作负载中表现优异。

本研究成果包含在 Snowflake AI Research 开源的以下项目中:

  • Arctic Inference:一个兼容 vLLM 的插件,支持快速推测与验证
  • Arctic Training:一个支持可复现 YAML 配方的推测器训练框架
  • 预训练的推测器覆盖:Llama-3.1-8B、Llama-3.1-70B、Llama-3.3-70B、Qwen2.5-32B

接下来的博客将介绍我们构建的内容、如何快速上手、以及我们的方法论的深入讲解。如需引用我们的工作,请查看下方 BibTeX 引用。


为什么传统推测解码在真实世界中效果不佳

生成延迟仍是现代 LLM 应用的主要瓶颈——会减慢聊天助手、代码工具和多步骤智能体流程的响应速度。长时间的等待不仅降低生产力,也让用户感到沮丧,限制了智能体应用的实际可用性。

推测解码是一种解决方案,它通过并行预测和验证多个 token,大幅减少聊天机器人、编程助手和复杂智能体流程的延迟。然而,现有开源推测解码解决方案存在多个问题(见图 2):

  • 它们无法充分利用许多智能体应用中的重复生成模式(如自反性循环、多路径推理),因为即使存在大量重复 token,它们也只预测少量 token。
  • 它们缺乏一个简单且标准化的框架,来训练自定义草稿模型并无缝部署到线上。这对于预测开放式对话中非重复生成模式是必要的。同时,系统级开销也使草稿模型无法达到理论峰值加速。

image.png 图 2. 智能体代码生成中的重复模式(左)与草稿模型推测的实际加速 vs. 理论加速(右)

Arctic Inference 与 Arctic Training 的增强推测式解码

我们很高兴介绍我们为 Arctic Inference 和 Arctic Training 系统引入的增强推测式解码能力,解决了上述挑战,具体包含两类改进:

✅ 针对重复生成的后缀解码

  • 解锁了跨长 token 序列的高效推测
  • 在 CPU 上每个推测 token 解码仅需 20 微秒
  • 无需草稿模型

✅ 针对非重复生成的推测训练与推理管道

  • 提供易用的训练管道,用于训练强大且轻量的草稿模型
  • 实现了优化的推测代码路径,在 vLLM 中实现高达 91% 的理论最大加速

我们最终将这两者结合,实现了“鱼与熊掌兼得”:显著降低重复与非重复任务的生成延迟(见图 1)。例如:

  • 在像 SWE-Bench 这样的智能体任务中,Llama 3.3 70B 推理速度提升最高达 4 倍,任务完成速度提升 1.8–4.5 倍
  • 在 ShareGPT 等开放对话和 HumanEval 代码生成任务中快 2.8 倍
  • 比 vLLM 中现有最好的开源方案还快 1.8 倍

以下将介绍如何在现有 vLLM 部署中使用 Arctic Inference 的增强推测解码功能,以及如何使用 Arctic Training 自定义草稿模型。

推测解码方法深入解析

对于想要深入了解技术细节的读者,以下内容将介绍推测解码的背景、我们为重复与非重复任务构建的架构、以及在 SWE-Bench、ShareGPT 和 HumanEval 数据集上的真实基准测试。

什么是推测解码?

推测解码的核心思想是使用一个更小、更快的模型来“预判”可能的未来 token,然后由主模型对这些 token 进行并行验证。

我们可以将推测解码流程分为三部分:

  • Proposer(提议器) :通常是一个较小且成本较低的语言模型(称为草稿模型),快速生成一组候选 token(例如 3 到 5 个)。它也可以是无模型的,例如从提示中提取 n-gram。
  • Scorer(评分器) :这是我们要保持输出质量的大型 LLM。它不再只生成一个 token,而是接收提议器生成的一整段草稿 token,在一次前向传播中并行评分。
  • Verifier(验证器) :用于决定哪些 token 被接受的步骤,通常采用拒绝采样(rejection sampling)机制。

接受率及其意义

“接受率”是评估推测解码效果的关键指标,表示在每个解码步骤中,提议器提出的 token 有多少最终被验证器接受。

高接受率意味着草稿模型能准确预测主模型的输出,因此每次验证能生成更多 token,整体速度更快。
而低接受率说明预测经常出错,导致解码效率下降。


平衡接受率与草稿开销

在推测解码中,存在一个基本的权衡:

  • 高接受率意味着草稿质量好,可以获得更高加速;
  • 但也要控制草稿模型本身的计算开销,否则得不偿失。

因此,要根据模型和工作负载特征,设计一个能平衡“接受率”与“计算资源”的优秀推测器。


一个简单示例

image.png

图 3:一次推测解码步骤示意图

图中展示了一个典型的推测解码过程:

  1. 在初始预填阶段生成状态。
  2. 提议器生成 3 个候选 token:13、578、7301。
  3. 评分器(主模型)并行评分这些 token,并将它们与最后一个验证通过的 token(如 16)一起输入。
  4. 验证器采用采样策略,决定接受其中的 13 和 578,之后生成 token 21747。

本例中,推测解码步骤中接受了 2 个 token(共 3 个),接受率为 66.7%。


后缀解码:适用于重复(智能体)生成

许多智能体工作流涉及自我反思循环、多路径推理等,包含大量可预测且重复的 token 序列。但大多数推测解码方法一次只预测几个 token,未能充分加速这些场景。

我们提出了一种轻量级的新型推测方法 —— 后缀解码(Suffix Decoding) ,针对该类问题设计:

  • 它利用文本结构的重复性,从历史输出和当前输入中动态构建候选序列;
  • 不再预测固定数量的 token,而是自适应地识别最可能出现的长序列。

核心机制如下:

  • 构建一个紧凑的 后缀树(suffix tree),索引历史生成和当前提示中的重复 token;
  • 使用此结构可快速查找并匹配重复模式,实现快速推测;
  • 每个候选 token 的优先级基于频率评分(经验概率);
  • 主模型一次 forward pass 即可验证整个推测序列。

image.png 图 4:使用两个后缀树(提示 + 历史输出)进行后缀解码,匹配最近生成的 token 并根据频率生成候选 token。


后缀解码实际效果

后缀解码显著优于现有推测方法,尤其适用于涉及重复 LLM 查询的智能体任务。

在 SWE-Bench 中(结合生成 + 执行动作),后缀解码实现了 1.8x–4.5x 的加速。

提升非重复任务的推测性能

易用的推测器训练配方

草稿模型(draft model)在推测解码中是一个成熟的方法,尤其适用于开放式对话这类重复性较低的场景。但由于缺乏标准化的训练工具,其应用仍受限制。

我们提出 Arctic Training 框架 来解决这个问题,提供可访问、标准化的训练配方:

  • 每个配方包含数据集、超参数、模型架构,统一定义在一个 YAML 文件中,易于复现和分享。
  • 框架支持任意草稿模型架构,但我们重点优化了类似 MLP-Speculator 的设计,因其在接受率与推理延迟之间表现良好。

我们提供了两种草稿模型的完整训练流程,包括数据生成:

  • MLP-Speculator(图 5a) :简单的前馈模型,使用 LLM 最后隐藏状态和上一个 token 的 ID,结构类似 RNN。
  • LSTM-Speculator(图 5b) :MLP 的扩展版本,引入标准的 LSTM 门(遗忘、输入、输出、状态门),展示训练框架的灵活性。

image.png

图 5. (a)MLP-Speculator 与(b)LSTM-Speculator 架构示意图。

模型参数量 (B)接受率
MLP-Speculator(公开)2.113.7%
MLP-Speculator(Arctic)2.142.7%
LSTM-Speculator(Arctic)1.844.5%

表 1. 在 Llama 3.1-70B-Instruct 上对比三种推测器,数据集:ShareGPT。

我们训练的 speculator 明显强于现有开源基线。训练策略如下:

  • 与常见的“两阶段训练”(真实数据预训练 + LLM 生成数据微调)不同,
  • 我们只使用 LLM 生成的合成数据(基于 UltraChat 与 MagiCoder prompt),
  • 并延长训练周期,达到 3.1x 更高的接受率

我们还用更少参数的 LSTM 模型进一步提升效率。所有训练管道都可以通过 YAML 配方完全复现。


推测推理管道优化

推测解码由 Proposer(推测器)、Scorer(大模型)和 Verifier(验证器)组成。我们对整个推理路径进行了系统优化:

推测器优化:

  • FP8 量化:压缩线性层带宽瓶颈,降低推测器延迟。

  • 张量并行(TP) :将计算分散至多个 GPU,减轻单卡负担,提高吞吐。

  • 通信优化

    • 原始路径:Logits(分片) → AllGather → Logits(全局)→ TopK(全局)
    • 优化路径:Logits(分片) → TopK(分片) → AllGather → TopK(全局)
  • CUDA Graphs:将整个推测模型和推理循环封装进一个 CUDA 图,减少 kernel 启动开销。

通过上述改进,MLP 推测器延迟从 ~1.47ms/token 降至 ~0.47ms/token,加速约 3.1x


验证器优化:

  • 拒绝采样 改为 贪婪验证(只有与贪婪解码一致的 token 被接受),在不影响准确率的前提下简化操作。
  • 自定义轻量 CUDA 内核将验证器延迟从 ~1.34ms 降至 ~0.38ms,加速约 3.5x

整体系统优化:

  • 精简推测逻辑(例如将采样替换为 TopK,移除无用元数据和数据结构),降低 CPU 和 GPU 的整体开销。

综合来看,在使用相同草稿模型的情况下,我们在 vLLM V0 上实现了 高达 1.42x 的端到端加速,达到了推测解码理论上限的 91% 性能,即使在 vLLM 高度优化的基线上也是如此。


联合使用后缀解码与草稿模型推测

前文我们分别介绍了后缀解码擅长处理重复性任务,草稿模型适用于开放式对话等非重复任务。但在真实世界中,LLM 往往同时面对这两类任务。

幸运的是,我们可以将这两者结合起来:

  • 后缀解码已有的 scoring 函数可用于选择候选 token。
  • 其评分是根据历史生成模式对 token 是否被接受的经验估计。

因此,我们可以用一个简单规则来二选一:

  1. 使用后缀解码生成候选 token。
  2. 如果评分低于 draft 模型最多能推测的 token 数,则丢弃后缀候选,改用 draft 模型;
  3. 否则,直接使用后缀候选。

性能评估

我们首先展示:借助后缀解码(Suffix Decoding),在智能体工作负载(例如来自 OpenHands 的 CodeAct 编码代理)中实现了最先进的生成性能,端到端加速高达 1.8x–4.5x(涵盖生成与动作执行任务)。

其次,我们展示:在开放式对话(ShareGPT)与通用编码任务(HumanEval)上,使用 Llama 3.1 70B 模型,相较于优化后的非推测实现(如 vLLM V1 FP8 + TP=8)可实现高达 2.45x 的加速;相较于 vLLM 中最优推测方案(如 EAGLE+vLLM V1)快 1.82x


使用后缀解码加速编码智能体

我们设计后缀解码是为了解决智能体任务中大量可重复 token 的问题。例如,OpenHands 的 CodeAct 2.1 智能体在 SWE-Bench 上达到 SOTA 性能(解决真实 GitHub 问题)。

一个 CodeAct 智能体会执行以下流程:

  • 接收用户的指令与反馈;
  • 生成代码并在沙箱环境中执行;
  • 观察执行结果;
  • 向用户响应新的建议。

其背后由一个定制训练的 LLM(如 all-hands/openhands-lm-32b-v0.1-ep3)驱动,在每一步反复调用 LLM 进行推理和规划。这些 LLM 查询在总耗时中占据了主导。

为加速 CodeAct,我们在这些核心推理步骤中使用后缀解码,并与 vLLM 中其他方法对比:

  • prompt-lookup 解码(如 N-gram 推测)
  • vanilla 解码(不使用推测)

由于该 LLM 没有可用的 EAGLE-3 草稿模型,因此未进行对比。结果见下图。

image.png 图 6. Arctic Inference 中使用后缀解码进行 SWE-Bench 性能评估。

结果显示,后缀解码相较于原始解码将解码时间缩短了 2.3x–6.3x,对应整体完成时间减少 1.8x–4.5x

目前,在 vLLM 中运行 SWE-Bench 时,Arctic Inference 的后缀解码是最快的实现,较 prompt-lookup 解码(如 vLLM 中的 N-gram)还快 1.4x–3.9x,同时仍保持与原始智能体相当甚至更高的解决率(>37%)。

这些加速来源于推理查询中出现的重复

  • 代码修复:因执行反馈修复生成代码,新生成的代码与之前高度重复;
  • 多路径推理:每个步骤多次查询 LLM 提高鲁棒性,但这些路径之间重复度高。

加速开放式对话与代码生成任务

我们也评估了在开放式对话(ShareGPT)与代码生成(HumanEval)中的推测性能。方法:

  • 使用 Arctic Training 训练的 MLP/LSTM 推测器;
  • 基于 Arctic Inference 实现,运行于 vLLM V1;
  • 使用 Llama 3.1 70B;
  • 请求速率设为 0.5 req/sec。

对比基线:

  1. 非推测(vLLM V1,FP8,TP=8)
  2. 推测(使用公开 MLP-Speculator 或 EAGLE/EAGLE-3 草稿)
  3. FlashAttention 使用性能最好的版本(V2 或 V3)

我们注意到:EAGLE/EAGLE-3 的理论加速并未在 vLLM 中实际体现,原因可能包括草稿未在相似数据集微调、vLLM 缺少 tree-decoding 支持、或推测推理路径中存在额外开销。


结果展示

image.png 图 7. 左图:相较非推测解码,我们的改进带来 2.05x–2.45x 的加速;右图:相较于 EAGLE 推测方案快 1.69x–1.84x。

推测器ShareGPTHumanEval
公共 MLP(vLLM V0)77.9 tok/s66.7 tok/s
Arctic MLP(vLLM V0)120.5 tok/s144.7 tok/s
提升幅度+54.7%+116.9%

表 2. Arctic MLP/LSTM 推测器 vs 公开 speculator 对比


框架ShareGPTHumanEval
vLLM V0120.5 tok/s144.7 tok/s
Arctic + vLLM V0153.1 tok/s186.6 tok/s
Arctic + vLLM V1171.2 tok/s205.8 tok/s
提升幅度+42.1%+42.2%

表 3. 加入系统优化的推测解码管道性能提升


联合使用后缀解码 + 草稿推测:终极效果

我们还评估了联合使用后缀解码与草稿推测的表现,基准测试覆盖 ShareGPT、HumanEval、SWE-Bench 及其混合负载。指标为平均输出 token/s。

工作负载无推测N-gram(vLLM)EAGLE(vLLM)LSTM(Arctic)后缀解码(Arctic)LSTM + 后缀(Arctic)
ShareGPT76.091.2102172113179
HumanEval77.2100112204148217
SWE-Bench75.8175123286302
混合82.9112154155209

表 4. Arctic Inference 中联合使用 LSTM + 后缀解码的性能评估

可见:

  • LSTM 在 ShareGPT/HumanEval 上表现最好;
  • 后缀解码在 SWE-Bench 上领先;
  • 二者联合后,在所有工作负载上都至少持平甚至超越单一方案;
  • 在混合负载中比单独方案多出 55 tokens/s 的吞吐。

这说明:无需在后缀与模型推测之间二选一,两者结合即可兼顾所有任务类型。


使用 Arctic Inference 部署推测解码

后缀解码、MLP/LSTM 草稿推测器以及本博客中描述的系统优化全部都集成在开源项目 Arctic Inference 中。

Arctic Inference 是由 Snowflake AI Research 开发的开源库,包含当前与未来的 LLM 推理优化功能。它通过 vLLM 的自定义插件机制集成在 vLLM v0.8.4 中,使我们可以快速开发、集成优化,并将其开放给社区使用。

一旦安装完成,Arctic Inference 会自动补丁 vLLM,将本文中的推测式解码功能集成进去,用户仍可继续使用熟悉的 vLLM API 与 CLI。


安装 Arctic Inference

pip install "git+https://github.com/snowflakedb/ArcticInference.git#egg=arctic-inference[vllm]"

安装后,Arctic Inference 会向 vLLM 的 --speculative-config 参数添加多个可选配置。

例如,以下命令会启用 MLP/LSTM 草稿推测器 + 后缀解码:

vllm serve \
    meta-llama/Llama-3.1-70B-Instruct \
    --quantization "fp8" \
    --tensor-parallel-size 2 \
    --speculative-config '{
        "method": "arctic",
        "model":"Snowflake/Arctic-LSTM-Speculator-Llama-3.1-70B-Instruct",
        "num_speculative_tokens": 3,
        "enable_suffix_decoding": true
    }'

解释:

  • "method": "arctic":启用 Arctic 的推测器与优化路径;
  • "model":使用指定的 Arctic 训练草稿模型;
  • "enable_suffix_decoding": true:开启后缀解码功能。

使用 Arctic Training 训练自定义草稿模型

Arctic Training 让你可以轻松训练适配不同 LLM 与工作负载的草稿模型,并直接用于 Arctic Inference 中部署。

安装 Arctic Training:

pip install arctic-training

在 Arctic Training 中,每个训练配方完全通过单个 YAML 文件定义,便于复用与复现。

示例 YAML 文件:

model:
  name: LSTM-Speculator
  hidden_dim: 2048
  num_layers: 2

training:
  batch_size: 64
  learning_rate: 1e-4
  epochs: 10
  data:
    type: synthetic
    prompts: [UltraChat, MagiCoder]
    target_model: meta-llama/Llama-3.1-70B-Instruct

output_dir: ./output/lstm-speculator-70b

保存为 config.yaml 后,仅需执行:

arctic_training config.yaml

训练完成后,你就可以将模型路径填入前述 --speculative-config"model" 字段,直接部署上线使用。


引用方式

如果你希望在研究或博客中引用本项目,请使用以下 BibTeX 格式:

@misc{arctic-speculator,
  author       = {Wang, Ye and Oliaro, Gabriele and Lee, Jaeseong and He, Yuxiong and Qiao, Aurick and Rajbhandari Samyam},
  title        = {Fastest Speculative Decoding in vLLM with {Arctic Inference} and {Arctic Training}},
  year         = {2025},
  month        = {May},
  day          = {1},
  howpublished = {\url{https://www.snowflake.com/en/engineering-blog/fast-speculative-decoding-vllm-arctic}}
}