Prhub

#29778 [Feature] Add DWDP (Distributed Weight Data Parallelism) for MoE prefill

原始 PR 作者 yhyang201 合并时间 2026-07-21 14:59 文件变更 20 提交数 4 评论 10 代码增减 +2147 / -24

执行摘要

新增 DWDP 并行策略,消除 MoE prefill 跨 rank 同步

当前 MoE prefill 使用 expert parallelism(EP)需要 all-to-all token 分发和 allgather 同步,带来显著通信开销。DWDP 通过预取 remote expert 权重并在本地计算,避免跨 rank 同步,从而提升 prefill 吞吐。PR 基于 DWDP 论文(arXiv 2604.01621)实现。

此 PR 实现了一个重要的分布式并行策略,设计精巧(CUDA VMM 复合 VA、double-buffered prefetch),性能收益突出。建议精读 vmm.pylayout.pyweight_manager.py 的设计。但需注意非 CUDA 平台的兼容性问题,建议在后续 PR 中优先修复 import 延迟。综合评分:重要度 8(重大变更),洞察价值 7。

讨论亮点

核心讨论集中在 vmm.pyfrom cuda.bindings import driver as cuda 会破坏非 CUDA 设备(如 ROCm、NPU)的服务启动。Reviewer silencejade 建议仅在功能启用时才导入该模块。另一位 reviewer OrangeRedeng 表示已准备修复 PR 解决此问题。当前状态:评论已记录,但 PR 合并时未包含该修复,后续需跟进。

实现拆解

  1. CUDA VMM 基础层vmm.py):封装 CUDA VMM API,提供 shareable handle 创建(自动探测 FABRIC/POSIX)、VA 保留/映射、DLPack 张量视图,实现零拷贝跨 rank 内存共享。
  2. 布局与所有权layout.py):定义 DwdpExpertLayout 计算每个 rank 负责的本地 expert 区间和 peer 预取范围;WeightSpec 描述每层权重形状;PageAlignedLayout 计算页对齐复合 VA 的三段式布局(预填充 + fabric handle + 后填充)。
  3. 传输层transport.py):DWDPTransportcreate 方法在初始化时执行 Phase 1:将本地 expert 权重复制到 fabric handle 中,释放原始存储;Phase 2:通过 pidfd(x86_64)或 fabric(aarch64)交换 handle,导入 peer 视图。
  4. 权重缓冲与管理weight_buffer.py + weight_manager.py):WeightBuffer 为每层权重构建复合 VA,组合本地 pool 页面和 fabric handle;DWDPWeightManager 实现 double-buffered 预取:在 layer l 计算时异步预取 layer l+1 的 remote expert 权重,利用 CUDA stream 和 event 同步。
  5. 编排与模型适配dwdp_manager.py + FusedMoE 等):DwdpManager.setup 收集 MoE 层,验证 expert 数可被 dwdp_size 整除,创建传输和缓冲,并替换原始 expert 权重为复合 VA 张量。同时修改 fused_moe_triton/layer.py 提供 replace_expert_tensor 等接口,修改 mimo_v2.pygpt_oss.py 添加 forward_dwdp 路径。自动启用 dp_attentiondp_lm_headSCHEDULER_SKIP_ALL_GATHER
  6. 测试与集成:添加两个端到端测试 test_disaggregation_dwdp_mimo.pytest_disaggregation_dwdp_gpt_oss.py,在 PD disaggregation 模式下验证 GSM8K 精度。提供 --dwdp-size 命令行参数。
文件 模块 状态 重要度
python/sglang/srt/layers/moe/dwdp/vmm.py VMM 层 added 9.08
python/sglang/srt/layers/moe/dwdp/layout.py 布局 added 8.89
python/sglang/srt/layers/moe/dwdp/transport.py 传输层 added 8.88
python/sglang/srt/layers/moe/dwdp/weight_buffer.py 权重缓冲 added 8.85
python/sglang/srt/layers/moe/dwdp/weight_manager.py 权重管理 added 8.7
python/sglang/srt/layers/moe/dwdp/dwdp_manager.py 编排器 added 8.84
python/sglang/srt/layers/moe/fused_moe_triton/layer.py MoE 层 modified 7.96
test/registered/disaggregation/test_disaggregation_dwdp_mimo.py 测试 added 7.22

关键符号

shareable_handle_types _copy_local_weights_to_handles DWDPTransport.create WeightBuffer.create DwdpManager.setup DWDPWeightManager.prefetch_layer DwdpExpertLayout.__init__ PageAlignedLayout.compute FusedMoE.replace_expert_tensor

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

cuda.bindings import 在非 CUDA 平台导致崩溃 other

silencejade 指出 `vmm.py` 中 `from cuda.bindings import driver as cuda` 会破坏非 CUDA 设备(如 ROCm, NPU)的 sglang 服务启动。建议仅在功能启用时才导入。

结论:OrangeRedeng 表示已准备修复 PR。但当前 PR 未包含该修复。 · unresolved

风险与影响

此变更存在以下风险:1)非 CUDA 设备兼容性风险:vmm.py 直接导入 cuda.bindings,在 AMD ROCm、Intel XPU、NPU 等平台会立即失败,需按 review 建议做延迟导入。2)CUDA VMM 平台依赖:shareable_handle_types 自动探测依赖 GPU 驱动和 NVLink fabric,在虚拟化环境或旧驱动上可能回退到 POSIX fd,但 fabric 不可用时可能导致异常。3)MoE 模型适配局限:目前仅显式适配 mimo_v2.pygpt_oss.py,其他 MoE 模型(如 DeepSeek、LLaDA)需额外修改。4)内存占用增加:double-buffered 预取需要额外 GPU 内存保存两层权重,可能在高并发时加剧 OOM。

1) 用户影响:需要指定 --dwdp-size 启用,无默认值,需配合 --tp 使用。PD disaggregation 模式推荐使用。性能提升显著(1.3x-1.9x)。
2) 系统影响:引入了复杂的 CUDA VMM 层,增加了维护成本和故障排查难度。
3) 团队影响:核心代码由一人提交,需要更多 reviewer 理解 VMM 细节。
4) 兼容性:非 CUDA 平台(AMD/NPU/XPU)将因 import 错误无法运行 sglang,需紧急修复。

非 CUDA 平台兼容性 CUDA VMM 系统级依赖 MoE 模型适配有限 double-buffered 内存压力

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论