跳到正文
vLLM Blog· Inferact and the vLLM Team·· 11 天前精选AI 评分62

vLLM 优化 DeepSeek-V4.1-Flash:智能体吞吐提升 5 倍

DeepSeek-V4.1-Flash on vLLM: 5x Agentic Throughput Since Day 0

AI 导读

vLLM 团队与 Inferact 在 DeepSeek-V4.1-Flash 发布后三周内完成优化,在 SemiAnalysis AgentX 智能体服务基准上低并发提速 1.9 倍、150 TPS 约束下吞吐提升 5.3 倍。

推荐理由

原文逐项列出 vLLM 侧的系统优化与对应加速比,可据此判断长上下文智能体推理的部署成本走向。

正文 · AI 翻译

图 1:从模型发布当天到 10 月 2 日,vLLM 的 SemiAnalysis AgentX 结果(来源)。

TL;DR:在 DeepSeek-V4.1-Flash 发布后的三周内,Inferact 和 vLLM 社区对该模型进行了优化,在低并发下实现了 1.9 倍加速,在 150 TPS 约束下实现了 5.3 倍吞吐提升。性能提升来自:

  • 我们实现了带 CUDA graphs 的 SWA 有界重放,将 TTFT 降低了约 30%。

  • 我们集成了 DeepSeek 新发布的 kernel,包括 MegaAttention、Mega-mHC、Mega-Gate 和 DeepSelect。

  • 我们激进地融合并并行化了剩余的 kernel,包括 mHC 侧流,并将 all-reduce 与其前后算子融合为单个 kernel。

DeepSeek V4.1 为长时程 agentic 服务任务引入了一种高效架构:凭借其因果编码器-解码器(CED)架构,模型在 decode 期间每个 token 激活 16B 参数,但在 prefill 期间仅激活 8B 参数。该模型在内存方面也极为高效。它结合了多种技术来缩小 KV cache 大小:Compressed Sparse Attention 2(CSA2)、FP4 KV cache 以及层间 KV cache 共享,将全局 KV 占用压缩至每 token 890 字节。本文展示了我们如何将 DeepSeek 的这些模型级优化与 vLLM 侧的系统优化相结合,在 SemiAnalysis AgentX agentic 服务基准上实现 5 倍吞吐。我们重点介绍两类优化:SWA 有界重放和 kernel 相关优化。

SWA 有界重放

DeepSeek-V4.1-Flash 保留两种 KV cache。全局 KV 经过压缩、跨层共享并以 FP4 存储,约为每 token 890 字节(V4.1 报告)。滑动窗口(SWA)KV 未压缩,采用 FP8,覆盖 40 层中每层最后 128 个位置。

SWA KV 带来两项成本:

  1. 前缀缓存必须在每个可能的命中边界存储它,存储成本超过全局 KV 的 10 倍。

  2. Prefill 对每个 prompt token 都运行第 21–39 层,尽管 decode 只读取它们的最后 128 个位置。

一种直接的方法是重新计算 SWA KV 而不是缓存它。然而,精确重计算代价高昂,因为每一层的 128-token 窗口依赖于下一层中更早的位置,因此跨 L 层重建它意味着重放大约 L × 128 个 token。

DeepSeek V4.1 引入了 SWA 有界重放,以精确性换取效率。它仅重新运行最后 128 个 token,并在重放起点处裁剪 SWA 窗口。结果并非逐位精确,但 DeepSeek 报告质量损失可忽略不计(详见下文)。vLLM 在两处应用它,分别对应一项成本。

图 2:精确重建会逐层级联一个窗口。有界重放仅重新计算最后一个窗口,并在重放起点 s 处裁剪。逐步查看,或全屏打开。

编码器侧:在缓存命中时重建窗口

通过编码器侧重放,vLLM 仅缓存全局 KV 并跳过 SWA KV。在长度为 H 的前缀命中时,它重新运行 token [H − 128, H) 以重建 SWA KV,窗口在 s = H − 128 处裁剪。

解码器侧:跳过大部分 prompt prefill

在 DeepSeek V4.1 的 CED 架构中,第 20 层计算解码器的全局 KV,第 21–39 层复用它。因此,vLLM 对每个 token 都运行第 20 层以生成该全局 KV,而仅对每个请求的最后 128 个 token 运行第 21–39 层。对于长 prompt,这跳过了近一半的模型。

图 3:在解码器中,每个 token 只需要第 20 层的全局 KV。第 21–39 层仅对最后 128 个 token 运行。逐步查看,或全屏打开。

裁剪层的 CUDA graphs

裁剪后,第 21–39 层的 GPU 工作量非常小,以 eager 模式运行时,kernel 启动开销占主导,GPU 处于空闲状态。它们的输入形状也与第 0–20 层不同,因此这两部分无法捕获到同一个 CUDA graph 中。vLLM 的可中断 PIECEWISE graph 已经在模型中间断开,这提供了一个自然的切分点:第 0–20 层在完整 batch 上捕获,第 21–39 层在裁剪后的 batch 上单独捕获。这使得 CUDA graphs 可用于裁剪后的 prefill,并让第 21–39 层使用自己的捕获尺寸以获得更好的 graph 覆盖。

SWA bounded replay 在 DeepSeek-V4.1 上默认开启,由 --[no-]swa-bounded-replay 控制。

准确性与性能结果

尽管 SWA bounded replay 并非精确计算,但 DeepSeek 报告称质量损失可忽略不计。我们在 vLLM 上通过 GSM8K 和 GPQA 等基准测试确认了这一点,未观察到有意义的准确率差异(差距在约 1.5 个标准误以内)。

在性能方面,编码器侧每次命中会用一个 prefill 窗口换取缓存空间,因此加速来自解码器侧。我们测量了三种设置下的单请求 prefill TTFT:replay 关闭;replay 开启但无解码器 CUDA graphs(第 21–39 层以 eager 模式运行,仅裁剪 eager 步骤);以及 replay 开启且有解码器 CUDA graphs。

图 4:DeepSeek-V4.1-Flash 在 SWA bounded replay 关闭和开启、有和无解码器 CUDA graphs 情况下的单请求 prefill TTFT(ms)。在 NVIDIA GB200 上 3 次运行的中位数,前缀缓存关闭。百分比相对于 replay 关闭(越低越好)。悬停柱状图查看绝对 TTFT,或全屏打开。

带 CUDA graphs 的解码器 replay 将 prefill 计算时间缩短了 30–40%。 CUDA graphs 对短提示词最为重要,此时 kernel 启动是瓶颈:没有它们,启动开销超过 GPU 节省的时间,replay 比基线更慢(在 DEP2 上 1K 时最高 +12%)。对于长提示词,GPU 工作量足够大,可以隐藏启动开销,因此 eager replay 已经获得了大部分收益,CUDA graphs 再增加几个百分点。

Kernels

DeepSeek 在发布 DeepSeek-V4.1-Flash 的同时,在其三个仓库中发布了新的 kernels。DeepSelect 是用于 DeepSeek Sparse Attention 的新 top-k 库。DeepGEMM 增加了稀疏 indexer kernels 和几个 GEMM 相关的融合 kernels。FlashMLA 增加了 NVFP4 KV 缓存支持和融合注意力 kernel MegaAttention。我们已将其中几个开源 kernels 集成到 vLLM 中,并在 #57448 中跟踪进展。

图 5:DeepSeek-V4.1 的单层前向传播。金色轮廓标记了 kernel 融合及其关联的 vLLM PR。逐步查看低延迟和高吞吐路径,点击 FULL LAYER 查看整个层,或全屏打开。

Mega-mHC(#56962)。 Mega-mHC 将 mHC 链融合为一个 kernel:post 步骤、delayed-pre 步骤和 RMSNorm。它取代了现有的 TileLang 融合路径,DeepGEMM 的实现现在性能更优。该 kernel 在 NVIDIA GB200 上比 TileLang 版本快 1.14–1.51 倍。

Mega-Gate(#56266)。 Mega-Gate 将 MoE 路由器(gate GEMM、专家打分、偏置和 top-k 选择)融合为一个 kernel。此前,这些操作以一个 GEMM 加上一个单独的 top-k kernel 运行,额外增加一次启动以及分数在内存中的往返。这种融合在中等 batch size 下带来 1.18–1.31× 的 kernel 加速。

mHC 多流重叠(#57603)。 在 V4.1 中,mHC 系数偏移了一个子层,因此下一个接缝的系数 GEMM 只读取在 attention 或 FFN 运行之前就已存在的残差流。在下一个 post/pre 步骤将它们合并之前,双方都不需要对方的输出。在小 batch size 下,vLLM 现在在一条侧 CUDA 流上计算下一个 mHC 块的系数,与 attention 和 FFN 并行。这隐藏了原本会处于延迟受限解码关键路径上的工作。在 TP4 低延迟场景下,这将延迟降低约 4%。

稀疏 MQA logits(#56254)。 在 V4.1 中,较后的 indexer 层从固定的 16K 个候选位置中选取其 top-k。此前的实现会计算整个上下文的分数,并在打分前屏蔽所有非候选块。DeepGEMM 的稀疏 kernel 只对候选位置打分,因此开销不再随上下文增长。在 NVIDIA GB300 上,每层在 8K token 时快 1.2×,在 512K 时快 14–23×。在 4× NVIDIA GB300 上端到端,解码提升 3–6%。Prefill 在 512K 时快 1.43×,在 1M 上下文时快 2×。

带 NVFP4 压缩 KV 的 MegaAttention(#56935)。 FlashMLA 的 MegaAttention kernel 在单次启动中完成 query RoPE、稀疏 attention、对输出做逆 RoPE 以及 FP8 转换,直接写入输出投影所读取的缓冲区。这消除了 attention 与下一层之间单独的 kernel 和内存往返。它还读取一种新的 NVFP4 压缩 KV 格式,比此前的 FP8 KV cache 小 45%。MegaAttention 还通过激进的融合消除了操作之间的 HBM 写入,将 kernel 效率提升 1.45×。

低延迟融合 WO-A kernel(#58634)。 对于 Blackwell 上的小解码 batch,我们将逆 RoPE、FP8 量化、WO-A batch GEMM 和 MXFP8 重新量化融合为单个 CuTe-DSL kernel,将 WO-B 之前的链路从三个 kernel 减少为一个。关键思路是将中间激活保留在片上,并让数据移动与计算流水化,避免在小 batch size 下占主导的额外 kernel 启动和全局内存往返。这将融合 WO-A 路径提升最多约 2.1×,并在低并发下将 token 间延迟降低最多约 6–7%。

Engram。V4.1 的 Engram 层根据哈希后的 token n-gram 从两个大型 FP8 表中查找行。每一步只读取少量行,因此表的放置位置和查找延迟比计算更重要。我们异步预取 CPU 卸载的 Engram 查找,将主机内存访问与解码器计算重叠,以加速低批量解码(#56512)。Engram 头通过统一的 TP/DP 方案进行分片,同址的 DP 副本共享相同的主机表,避免冗余副本以及查找路径上的任何 DP 通信(#57651)。对于这些大型主机驻留表,我们还支持透明大页(THP)以减少缺页开销,为预填充提供最高 10 倍的查找内核加速(#56926)。我们还针对可用大页不足的情况添加了优化(#59327)。

Agentic 性能

我们使用 SemiAnalysis AgentX 基准测试作为代表性的 agentic 服务负载来衡量性能(详见我们之前的文章)。这些优化共同为 vLLM 带来了相比 day-0 实现的显著性能提升。如图 6 所示,我们的低延迟结果相比 day-0 结果提升了 1.9 倍,高吞吐结果提升了约 5 倍。

图 6:从 day-0 模型发布到 10 月 2 日 vLLM 的 SemiAnalysis AgentX 结果(来源)。

对于低延迟服务,我们使用 TP4 配合 FlashInfer 注意力。小批量解码主要受内存带宽限制,因此将模型权重分片到四块 GPU 上非常合适。我们也尝试了 MegaAttention,但其主要优势在于更高吞吐的设置,此时融合有更多发挥空间。在 TP4 下,这一收益要小得多,而在我们的运行中 FlashInfer 最终更快。

对于高吞吐,我们切换到 DEP2,使用 DP 注意力并将专家分散到各 GPU 上。由于 V4.1 在所有头上使用共享的 KV 潜在表示,TP 会在各 GPU 上重复 KV 缓存。DP 避免了这种重复:每块 GPU 只为其服务的请求存储 KV,会话亲和性在多轮之间保持前缀缓存局部性。MegaAttention 通过 NVFP4 进一步削减每请求的 KV 占用,相比 FP8 几乎减半,并提高每 GPU 并发度。

值得注意的是,V4.1 内存效率极高,在整个基准测试中不需要 KV 缓存卸载。我们预计 KV 缓存卸载将在更高并发配合 P/D 分离时开始发挥作用。

SWA 有界重放,连同预填充侧内核优化,也大幅改善了 TTFT。

图 7:优化后的 TTFT 与吞吐量关系(来源)。

图 7 展示了优化后的 TTFT–吞吐量权衡。在约 100K 吞吐量下,通过三项优化相结合,TTFT 下降了近 70%:

  • SWA 有界重放让模型上半部分只处理最后 128 个 token,将预填充计算大致减半。

  • CUDA graphs 让裁剪后的小型重放在 GPU 上保持快速,而不是受限于 CPU 内核启动,从而充分实现加速。

  • 内核改进加速了模型计算。

致谢

我们感谢 DeepSeek 开源 DeepSeek-V4.1-Flash 及相关内核,感谢 Inferact 团队最初的模型启动和优化,感谢 NVIDIA 的合作与支持,以及感谢 SemiAnalysis 的 AgentX 基准测试。

来源:vLLM Blog · vllm.ai