‹ 返回博客本页内容

简要说明

  • 在 DeepInfer 自有基准上持平或领先。 在 4x GB300 和 4x B300 上 prefill 吞吐最高达 1.04x,在 64x GB300 上 decode 步长最多缩短 7.4%,其余各点差距在 1% 以内。
  • DeepInfer 的优化,已在 SGLang 中。 DeepSeek 的 kernel,包括 Mega 系列、DSpark 投机解码、SWA bounded replay 以及两种 Engram 放置方式,均可在 SGLang 主分支中运行。
  • 完整的服务系统。 SGLang 是一个 API 服务器,具备 KV cache 系统、prefill/decode 分离以及跨副本负载均衡,而 DeepInfer 的 README 将这些列为未包含在其发布版本中的功能。

DeepSeek 开源了 DeepInfer——支撑其自身服务的推理引擎——以及它所运行的 kernel。它为 DeepSeek-V4.1-Flash 的运行速度设定了标杆,因此我们在相同硬件上使用 DeepInfer 自有的基准测试,将 SGLang 与其进行了对比测量。

集成了什么

自支持 V4.1 的第一天起,SGLang 就已运行 SWA bounded replay 和主机内存 Engram 表。此后,它又加入了 DeepSeek 的 Mega kernel、针对跨 GPU 拆分 Engram 表的直接对等读取,以及进一步的执行优化。

DeepSeek 的 kernel。 SGLang 集成了 FlashMLA、DeepGEMM、DeepEP、DeepSelect 和 TileLang kernel,以及 Mega 系列:MegaAttention、MegaMoE、MegaGate 和 Mega-mHC。MegaMoE 将 token 分发、专家 GEMM 和合并融合为一个 kernel。MegaAttention 是 B300 和 GB300 上的默认注意力路径,在单服务器以及 prefill 和 decode 服务器上均如此。

Kernel integration

图 1: SGLang 中集成的 kernel。

并行策略。 SGLang 在 prefill 和 decode 中均使用 DP attention 加专家并行(DEP)。以下基准测试在 64 块 GB300 GPU 上使用 DEP4 进行 prefill、DEP64 进行 decode。SGLang 还支持 EPLB,以在宽 EP 部署中平衡专家负载,详见我们的 MoE 负载均衡博客.

DSpark 投机解码。 SGLang 运行检查点中的 DSpark 草稿模型,提出一组 token,由目标模型一并验证,从而减少生成响应所需的目标模型前向传播次数。

SWA bounded replay。 解码器重放仅在最后 128 个 prompt token 上运行后段解码器层,而较早的源层仍处理完整 prompt。在前缀缓存命中时,编码器重放从最后 128 个缓存 token 重建缺失的滑动窗口 KV。

SWA bounded replay

图 2: SWA bounded replay:解码器重放与编码器重放。

Engram 放置。 DeepInfer 允许将 Engram 表保留在主机内存或设备内存中,SGLang 两者均支持。使用 SGLANG_ENABLE_DSV41_ENGRAM_HOST_TABLE=1时,每个节点在主机内存中保存一份表副本,从而为 KV cache 留出最多的 HBM。使用 SGLANG_OPT_DSV41_ENGRAM_PEER_SHARDS=1时,表跨 GPU 拆分,每个 GPU 通过 NVLink 直接从其对等节点读取所需行,查找过程中无需 all-gather 或 reduce-scatter。

Engram placement

图 3: Engram 表位于主机内存,或跨 GPU 拆分并通过直接对等读取访问。

零开销调度。 自 v0.4(2024 年 12 月)起,SGLang 的调度器在 GPU 运行第 N 步的同时在 CPU 上准备第 N+1 步,使调度与 GPU 执行重叠。DeepInfer 的文档将这一设计归功于 SGLang。

Zero-overhead scheduling

图 4: 零开销调度:CPU 准备下一步,同时 GPU 运行当前步。

DeepSeek 的聊天格式。 Prompt 的渲染和输出的解析均使用 DeepSeek 自有的 deepseek-recipe 包(#45315, #45907, #46219),因此 SGLang API 中的推理和工具调用遵循 DeepSeek 的格式。语法约束解码支持 JSON schema、正则表达式和 EBNF。

结果

Prefill on GB300 and B300, decode on 64x GB300

图 5: 在 4x GB300 和 4x B300 上的 prefill,在 64x GB300(EP64)上的 decode。

实测 (实线)显示我们对 SGLang 和 DeepInfer 的基准测试运行结果。 已发布 (虚线)显示 DeepInfer 最初发布的 prefill 和 decode 结果,数值读取自这些图表。正文中的 prefill 对比使用实测的 DeepInfer 曲线,在每个点取其测试过的最快配置。

设置见 附录。简而言之:

  • Prefill,4x GB300。 SGLang 的 prefill 吞吐最高达 1.04x:在每 GPU 每步 4K、32K 和 64K 新 token 时领先,在 8K 和 16K 时持平。
  • Prefill,4x B300。 prefill 吞吐最高达 1.04x:在 4K、8K 和 32K 时领先,在 16K 和 64K 时持平。
  • Decode,64x GB300(EP64)。 在每 GPU 16 到 256 个请求时,SGLang 的步长缩短 1.1% 到 7.4%,在 8 个请求时持平。

速度从何而来

Mega-mHC 直接馈入 MegaMoE,注意力为输出投影产生 MXFP8 输出,prefill 压缩器和请求窗口 KV 拷贝使用融合 kernel。这些改动减少了中间内存流量和 kernel 启动次数。

可断开的 CUDA graph 覆盖每 GPU 最多 8K token 的 prefill 步,包括长上下文和数据并行注意力。解码器重放使用按有界后缀大小单独设置的 graph,因此当大型 prefill 步的其余部分以 eager 模式运行时,这些层仍可从 CUDA graph 重放。

SGLang 增加了什么

DeepInfer 的 README 列出了完整推理服务所需的三个组件,而其发布版本并未包含。SGLang 全部提供。

SGLang serving stack

图 6: Linker 将本地 L1 GPU 缓存直接连接到共享 L3 存储。

KV cache 系统。 SGLang 的统一基数缓存可跨请求和对话轮次复用 KV,包括此类混合模型。上图所示的配置使用 Linker 将 L1 GPU 缓存直接连接到共享 L3 存储,例如 3FS 或 Mooncake。HiCache 还支持主机内存 L2 层,供使用该层的部署选用。

Prefill/decode 分离。 SGLang 在独立服务器上运行 prefill 和 decode,KV 传输后端可自选:Mooncake、NIXL 或 MORI。

跨副本负载均衡。 SGLang 的模型网关将请求分发到各个副本,并支持基于缓存前缀的路由。

在此基础上,SGLang 还是一个 API 服务器,具备推理和工具调用解析能力,支持 NVIDIA GB300、B300、B200 和 H200 以及 AMD MI355X。

致谢

感谢 DeepSeek 开源 DeepInfer、FlashMLA、DeepGEMM 和 DeepEP,并如此详尽地记录其推理系统。

附录:基准测试设置

两个引擎在同一硬件上运行 DeepInfer 自有的基准测试。SGLang 的 prefill 位于 7d996300b9 ,decode 位于 3b95120f00 ,DeepInfer 位于 774ce24。两者的启动命令和基准测试客户端都在 此 gist. 要实际部署该模型,请遵循 cookbook 页面;以下设置(例如均衡专家路由)仅用于本次对比。

Prefill

  • 工作负载与机器。 我们使用 DeepInfer 的 prefill 基准测试:每个请求具有 128K token 的上下文和 4K 个新 token,每块 GPU 每步 prefill B 个新 token,B 从 4K 到 64K。两个引擎运行在相同的 4-GPU 节点上,使用相同的权重、DP4/EP4、均衡专家路由、关闭 EPLB,以及 32 个冗余专家。对于 DeepInfer,我们在每个数据点上取其两种 Engram 放置方式(主机内存或 GPU 内存)中最快的一种,各自使用其默认设置和 64K 设置。SGLang 将 Engram 表拆分到各 GPU 上,均匀分布冗余专家,并启用了一些尚未默认开启的优化。
  • 差异。 DeepInfer 测量 GPU 0 上约 9 个批次的 prefill 耗时。我们的 SGLang 结果对 20% 到 90% 请求完成之间每块 GPU 上的每个完整批次取平均。DeepInfer 在每块 GPU 上跨请求重复相同的提示,而 SGLang 每个请求使用不同的新 token。

Decode

  • 工作负载与机器。 我们在 64 块 GB300 GPU(16 个节点,DP64/EP64)上匹配 DeepInfer 的 decode 基准测试工作负载:128K token 上下文,共享缓存前缀,每块 GPU 固定数量的请求,每步 3 个草稿 token 并采用静态验证(每个请求都验证完整的草稿块),均衡专家路由,以及 384 个路由专家加 64 个冗余专家。图表将步长时间换算为每步接受 3.25 个 token 时的 token 数。
  • 差异。 SGLang 将 Engram 表保留在设备上,而 DeepInfer 将其放在主机内存中;DeepInfer 的草稿模型带有 64 个冗余专家,而 SGLang 的草稿模型没有。