一、背景
DeepSeek 是一个备受赞誉的开源大型语言模型 (LLM),以其强大的性能而闻名。然而,其庞大的规模和独特的架构给高效部署带来了挑战。本文详细介绍了 LMSYS 团队如何通过创新的并行策略和优化技术,在 96 个 NVIDIA H100 GPU 上成功部署 DeepSeek 模型,实现了每节点每秒 52.3k 输入词元和 22.3k 输出词元的高吞吐量。
"SGLang 现已支持预填充 - 解码 (PD) 分解和大规模专家并行,包括 DeepEP、DeepGEMM 和 EPLB 的全部功能。"
DeepSeek-V3 模型采用了混合专家 (MoE) 架构,这种设计虽然能够提高模型能力,但也带来了工作负载不平衡和内存使用效率等问题,尤其是在大规模部署环境中。本研究通过一系列创新技术解决了这些挑战。
二、方法 2.1 并行设计策略
DeepSeek 的高效部署需要精心设计的并行策略来管理计算复杂性和内存需求。研究团队针对模型的四个关键组件采用了不同的并行方法:
注意力层
DeepSeek 使用多头潜在注意力 (MLA) 来有效建模输入序列中的复杂依赖关系。为优化这一机制,团队实现了 DP 注意力,这是一种数据并行策略,能够消除设备间 KV 缓存的重复,显著减少内存开销。
"DP 注意力是一种数据并行策略,能够消除设备间 KV 缓存的重复,显著减少内存开销。"密集前馈网络 (Dense FFNs)
尽管 DeepSeek-V3 仅使用三个密集 FFN 层,但其计算量仍可能显著增加峰值内存使用,如果不小心管理,可能导致系统崩溃。为解决这一问题,团队采用了数据并行 (DP) 而非张量并行 (TP),主要基于以下优势:
增强可扩展性:DeepSeek-V3 的中间维度为 18,432,高 TP 度数(如 TP32)会导致低效的小单元分段,不利于现代 GPU 的内存对齐。
优化内存效率:在 DP 注意力下,较低的 TP 度数可以最小化每个设备的内存使用。
最小化通信开销:纯 TP 中,每个 FFN 需要两次全归约操作,而 DP 可以将通信成本降低 50%。
在 DeepSeek-V3 的混合专家 (MoE) 架构中,稀疏 FFN 需要大量专家权重,造成显著的内存瓶颈。为此,团队实现了专家并行 (EP),将专家权重分布在多个设备上,有效扩展内存容量同时保持高性能。
并行设计示意图:左侧显示 DP 注意力和 DP 密集 FFN 的集成,右侧展示了基于 DeepEP 框架的 EP 实现
语言模型头 (LM Head)
LM 头计算大型词汇表上的输出概率,这是一个资源密集型操作。团队采用了数据并行 (DP) 策略,与密集 FFN 策略相似,减少了内存开销并简化了设备间通信。
2.2 预填充和解码分解 (PD Disaggregation)
LLM 推理包含两个截然不同的阶段:预填充 (Prefill) 和解码 (Decode)。预填充阶段计算密集,处理整个输入序列;而解码阶段内存密集,管理词元生成的 KV 缓存。传统上,这两个阶段在统一引擎中处理,但这种方法存在三个主要问题:
预填充中断:传入的预填充批次经常中断正在进行的解码批次,导致词元生成显著延迟。
DP 注意力不平衡:在 DP 注意力中,一个 DP 工作器可能同时处理预填充批次,而另一个处理解码批次,导致解码延迟增加。
与 DeepEP 不兼容:DeepEP 为预填充和解码执行不同的调度模式,使统一调度与 DeepEP 不兼容。
PD 分解设计图:展示了预填充服务器和解码服务器之间的交互流程
为解决这些问题,团队引入了 PD 分解,将两个阶段分离,实现针对每个阶段的定制优化。实现细节包括:
非阻塞传输:数据发送和接收操作在后台线程中运行,保持调度器的事件循环不中断。
基于 RDMA 的传输:远程直接内存访问 (RDMA) 利用队列对进行连接,使用分散 - 聚集元素 (SGE) 高效传输非连续内存块。
灵活的 API 集成:SGLang 提供适应性 API,集成高性能 RDMA 库如 Mooncake 和 NIXL,简化数据传输。
DeepEP[1]是 DeepSeek 团队实现的通信库,旨在简化 MoE 模型中的 EP。它提供两种专门的调度模式:
普通调度:针对处理长输入序列(如预填充阶段)优化,优先考虑最大计算吞吐量。
低延迟调度:为解码阶段生成输出词元定制,优先考虑最小延迟以确保实时性能。
DeepGEMM[2]是另一个高效库,专为优化 MoE 模型中的计算而设计,提供两种专门函数:
分组 GEMM(连续布局):为动态输入形状设计,适用于 MoE 推理的预填充阶段。
分组 GEMM(掩码布局):假设固定输入形状,使用掩码张量仅计算输入的有效部分,兼容 CUDA Graph。
在多节点环境中,有限的通信带宽可能显著增加整体延迟。为解决这一挑战,团队实现了两批次重叠 (TBO),将单个批次分为两个微批次,允许计算和通信重叠,同时通过将有效批次大小减半来降低峰值内存使用。
预填充阶段的 TBO 实现:通过优化启动顺序避免 CPU 阻塞
实现 TBO 面临两个主要挑战:
代码复杂性:直接编码 TBO 可能导致管理多个微批次的逻辑重复。
预填充阶段的同步问题:DeepEP 中的普通调度会阻塞 CPU,可能使 GPU 闲置。
为创建更易维护和可重用的代码库,团队使用了由操作和产出点组成的抽象层,简化了开发过程。
专家并行负载均衡器 (EPLB)
在 MoE 模型中,EP 经常导致 GPU 间工作负载分布不均。这种不平衡迫使系统等待最慢的 GPU 计算或通信,浪费计算周期并增加内存使用。随着 GPU 数量(EP 大小)增加,不平衡问题变得更加严重。
模拟显示了规模和 EPLB 算法对不平衡问题的影响
为解决这一问题,DeepSeek 开发了专家并行负载均衡器 (EPLB)[3]。EPLB 接收专家分布统计作为输入,计算专家的最佳排列以最小化不平衡。用户可以分配冗余专家,这些专家与原始专家一起创建一个专家池,允许 EPLB 战略性地放置或复制专家。
三、实验与结果 3.1 端到端性能
团队在由 12 个节点组成的集群上评估了 SGLang 使用 DeepSeek-V3 的端到端性能,每个节点配备 8 个 H100 GPU,通过 InfiniBand 连接。评估比较了四种设置:
SGLang 与 TP16 x 6
SGLang 与 PD 分解
SGLang 与 PD 分解和模拟 MTP
DeepSeek 官方配置文件结果
预填充和解码阶段的端到端性能:左图显示预填充阶段在 4 个节点上的性能,右图显示解码阶段在 9 个节点上的性能
预填充阶段的内核执行时间细分:包括默认 EPLB、模拟完美 EPLB 和单元测试结果的比较
3.2 详细性能分析
团队将 SGLang 的性能与 DeepSeek 的推理系统进行了比较,尽可能使实验设置与 DeepSeek 的生产环境保持一致。
解码阶段的内核执行时间细分:显示了 SGLang 与 DeepSeek 在解码阶段的内核性能比较
TBO 在不同场景下的性能影响:左图显示预填充阶段,右图显示解码阶段
关键观察包括:
默认 EPLB:通信内核相比 DeepSeek 的配置文件表现出更长的执行时间和更高的方差,可能是由于更大的专家不平衡。
模拟完美 EPLB:这种设置与 DeepSeek 的配置文件更为接近,尽管仍存在差异,表明潜在的优化领域。
与单元测试的比较:DeepSeek 和 SGLang 的通信时间都比单元测试结果慢,而后者在禁用 TBO 时可实现,揭示了通信是瓶颈时的潜在优化方向。
TBO 在预填充阶段提供两个显著优势:
支持更大的批次大小:在普通配置中,每个设备最多处理 8,192 个词元,而 TBO 通过优化内存使用,使推理批次大小高达 16,384 个词元。
增强吞吐量:通过重叠计算和通信,TBO 实现了 27% 至 35% 的吞吐量增加。
预填充阶段 TBO 性能细分:比较了不同配置下各个内核的执行时间
解码阶段 TBO 性能细分:分析了三种不同配置下的性能表现
3.4 消融研究:EPLB
EPLB 对系统性能的影响通过总体吞吐量分析和详细案例研究进行了评估。
EPLB 对大规模设置吞吐量的影响:EPLB 提供了 1.49 倍 (预填充) 和 2.54 倍 (解码) 的显著加速
工作负载不平衡与总体吞吐量的关系案例研究:显示了平衡度与吞吐量之间的强相关性
结果显示平衡度与吞吐量之间存在强相关性,强调维持高平衡度对最佳性能的重要性。
四、讨论与应用 4.1 工具包
SGLang 还包括两个重要工具,以支持高效的大规模部署:
一次性张量 (Disposable Tensor)
PyTorch 中的内存管理可能因持久对象引用而变得具有挑战性,尤其是在 GPU 密集型工作流中,CUDA 内存是稀缺资源。SGLang 通过 DisposableTensor 类解决了这一问题,该类引入了 dispose() 方法来显式且立即释放张量的内存,绕过了 Python 的引用计数限制。
def ffn(hidden_state: torch.Tensor, linear1: nn.Linear, linear2: nn.Linear): intermediate_state = linear1(hidden_state) hidden_state.dispose() # 立即释放 CUDA 内存 return linear2(nn.ReLU(intermediate_state)) # 将张量包装在 DisposableTensor 中 hidden_state = DisposableTensor(hidden_state) hidden_state = ffn(hidden_state, linear1, linear2)专家工作负载提取和模拟SGLang 还包括用于分析和模拟 MoE 模型中专家工作负载分布的工具集。此功能使用户能够:
转储专家工作负载统计:提取累积统计数据或每批次工作负载数据。
模拟专家利用率:在不需要昂贵硬件或重复试验的情况下,模拟各种配置下的专家平衡。
虽然 SGLang 在 DeepSeek-V3 推理方面取得了显著的吞吐量改进,但仍存在几个局限性和未来增强领域:
延迟优化:当前对吞吐量的关注使首词延迟 (TTFT) 保持在 2-5 秒,词元间延迟 (ITL) 约为 100 毫秒,需要进一步优化以用于实时应用场景。
序列长度限制:由于使用 96 个 GPU,限制了处理较短序列。扩展 GPU 资源将支持更长序列,这对特定应用至关重要。
多词元预测 (MTP) 集成:SGLang 支持 MTP 但缺乏与 DP 注意力的完全集成,降低了混合并行配置中的效率。
EPLB 分布:本研究中的实验利用了分布内数据进行专家并行负载均衡,可能无法反映真实世界的变异性。
灵活的张量并行 (TP) 大小:对于 DeepSeek-V3,密集 FFN 的内存最优 TP 大小较小但大于 1。目前,SGLang 仅支持纯 TP 或 DP,导致次优的内存使用。
Blackwell 支持:目前,实现仅支持 NVIDIA Hopper 架构,团队正积极扩展对下一代 Blackwell 架构的兼容性。
通过利用 PD 分解、EP 和精心设计的并行策略,研究团队在 SGLang 中成功复制了 DeepSeek 的推理框架,并取得了卓越的性能。这项开源工作——实现每节点每秒 52.3k 输入词元和 22.3k 输出词元的吞吐量——展示了 SGLang 在大规模 LLM 推理方面的强大能力。
"通过利用 PD 分解、EP 和精心设计的并行策略,我们在 SGLang 中以卓越的性能复制了 DeepSeek 的推理框架。"
这些创新技术不仅提高了 DeepSeek 模型的部署效率,还为其他大型语言模型的高效部署提供了宝贵经验。研究团队邀请社区探索、复制和扩展这项工作,以推动高效 AI 部署的边界。
参考资料
[0] 原文:https://lmsys.org/blog/2025-05-05-large-scale-ep/
DeepEP: https://github.com/deepseek-ai/DeepEP
DeepGEMM: https://github.com/deepseek-ai/DeepGEMM
专家并行负载均衡器 (EPLB): https://github.com/deepseek-ai/EPLB

