Hybrid-EP: An Efficient MoE Communication Implementation

郁凡, 刘童, NVIDIA GPU加速计算专家团队, 高级工程师 | NVIDIA AI Open Day, Nov. 7th, 2025

议程 (Agenda)

Hybrid-EP 简介

Hybrid-EP 设计目标

Hybrid-EP 功能性

Hybrid-EP 库被设计为一个专家并行(EP)通信库,其中包含两个通信算子:dispatchcombine。这两个通信算子通常用于混合专家(MoE)模型架构中。

Image of Hybrid-EP Functionality diagram from Page 5
Image of Hybrid-EP Functionality diagram from Page 5

上图展示了 Hybrid-EP 在 Transformer 层中的前向传播和后向传播过程。
- 前向传播:
1. Router 生成本地路由图(Local routing map)。
2. 通过 Allgather 操作汇聚生成全局路由图(Global routing map)。
3. 元数据预处理(Metadata preprocessing)后,dispatch 算子根据路由信息将 Tokens 分发给相应的 Expert MLP
4. combine 算子将处理后的 Tokens 聚合起来,送入下一个 Attention 层。

Hybrid-EP 路由图 (Routing Map)

Image of Hybrid-EP Routing Map diagram from Page 6
Image of Hybrid-EP Routing Map diagram from Page 6

Hybrid-EP Dispatch 演示

下图演示了 Dispatch 操作,它通过 Multicast 将数据分发,然后进行 permute(置换)操作,将 token 发送到目标专家所在的设备。

Image of Hybrid-EP Dispatch Demo from Page 7
Image of Hybrid-EP Dispatch Demo from Page 7

Hybrid-EP Combine 演示

下图演示了 Combine 操作,它是 Dispatch 的逆过程。它首先进行 unpermute(逆置换),然后通过 Reduce add 操作将来自不同设备的数据聚合起来。

Image of Hybrid-EP Combine Demo from Page 8
Image of Hybrid-EP Combine Demo from Page 8

Hybrid-EP 支持的数据格式

详细实现

Hybrid-EP 通信核函数设计

Image of Hybrid-EP Communication Kernel Design diagram from Page 11
Image of Hybrid-EP Communication Kernel Design diagram from Page 11

Hybrid-EP Dispatch 数据流水线设计

Image of Hybrid-EP Dispatch Data Pipeline Design from Page 12
Image of Hybrid-EP Dispatch Data Pipeline Design from Page 12

Hybrid-EP Combine 数据流水线设计

Image of Hybrid-EP Combine Data Pipeline Design from Page 13
Image of Hybrid-EP Combine Data Pipeline Design from Page 13

基准测试结果

Hybrid-EP 性能测试配置和条件

Hybrid-EP 性能

在单节点 DGX Hopper 上的性能

Page 16
Page 16

该图表展示了在单节点 DGX Hopper 上的性能测试结果。

在由 400Gbps 网络连接的 4x DGX Hopper 上的性能

Page 17
Page 17

该图表展示了在4台通过400Gbps网络连接的 DGX Hopper 上的性能测试结果。图中比较了网卡总线带宽(nic bus bandwidth)和算法带宽(algorithm bandwidth)。
- 左图 (TOPK = 4): 算法带宽显著高于网卡总线带宽。在8个CUDA块时,合并算法的带宽达到了83.2 GB/s。
- 右图 (TOPK = 8): 同样地,算法带宽优于网卡总线带宽。在8个CUDA块时,合并算法的带宽达到了123.4 GB/s。
在跨节点场景下,合并算法的性能仍然略微优于调度算法。

在 Grace Blackwell NVL36x1 上的性能

Page 18
Page 18

该图表展示了在 Grace Blackwell NVL36x1 上的性能测试结果。
- 左图 (TOPK = 4): 性能随 CUDA 块数量的增加而显著提升。在32个CUDA块时,调度算法带宽达到693.02 GB/s,合并算法带宽达到625.54 GB/s。
- 右图 (TOPK = 8): 性能同样表现出强劲的增长。在32个CUDA块时,调度算法带宽达到714.66 GB/s,合并算法带宽达到657.72 GB/s。
注:仅供技术讨论和参考,性能可能因产品组合不同而异。

在 Megatron-Core 中的应用

Page 19
Page 19

方法论

Page 20
Page 20

原始的 Hybrid-EP 内核是 C++ 风格的、基于模板的实现。所有的输入和输出都应该是指针。为了使其成为一个可用的基于 Python 的算子,还需要几个步骤:

  1. 通过 Hybrid-EP 计算所有类型缓冲区所需的缓冲区大小并分配足够的内存。

    • (1) 当前,Hybrid-EP 假设最坏情况来计算大小。
  2. 预处理相关的寄存器/固定(pin)操作以准备相应的缓冲区。

  3. 交换内存句柄。
  4. 使用适当的值初始化元数据。
  5. 使用 JIT (Just-In-Time compilation) 来避免模板问题。

我们已经发布了 Hybrid-EP 作为 DeepEP 的一个分支,并且 Hybrid-EP 已经集成到 Megatron-Core 的 dev 分支中。

缓冲区管理

Page 21
Page 21

上图展示了缓冲区管理的流程:
1. 初始化: HybridEPBuffer 接收 hidden_dim, num_of_tokens_per_rank, num_local_experts, use_fp8 等参数来创建 HybridEPBuffer-CPP 实例。
2. 管理: HybridEPBuffer-CPP 负责管理缓冲区,包括:尺寸计算、内存分配(Malloc)、缓冲区注册、句柄交换。主要管理的有输入/输出缓冲区等。
3. 运行: 当接收到 Torch::Tensor 类型的 token, probs, routing_map 后,HybridEPBuffer 会生成一个 Instance Config
4. JIT编译与执行: Instance Config 用于 JIT 编译内核,然后进行预处理(Preprocess)和调度(Dispatch)。
5. 输出: 调度结果的句柄(Handle)用于反向传播或合并(backward/combine)过程。

缓冲区管理(续)

Page 22
Page 22

为了使缓冲区能被其他 rank 访问,需要进行特殊的注册,并且缓冲区句柄必须在 EP (Expert Parallelism) 组内进行交换。
流程如下:当前 rank 的普通 GPU 内存 -> 注册/获取句柄 -> 通信 -> 在其他 rank 打开句柄 -> 可访问。

因此,输入缓冲区和输出缓冲区应在不同场景下进行注册:
- 节点内(intra-node)使用普通缓冲区。
- 通过 RDMA (Remote Direct Memory Access) 通信时使用注册缓冲区。

Memcpy 优化

Page 23
Page 23

朴素的 D2D (Device-to-Device) 拷贝实现存在以下问题:
- 注册的缓冲区不能由 torch 的分配器管理。
- 注册过程耗时,不能在每次迭代中执行。
- 结果或输入有时需要存储在注册缓冲区中。在某些情况下,需要进行 D2D 拷贝以将数据传输到 PyTorch 张量中。

上图展示了朴素的实现流程,其中包含了两次 D2D 拷贝。D2D 拷贝引入的开销:
- 仅在 RDMA 上,与通信核相比,会增加约 5% 的额外延迟。
- 从输入到专家以及从专家到输出的整个过程,与通信核相比,会增加约 20% 的额外延迟(在 Hopper GPU 上基于 DeepSeek V3 模型测量)。

Memcpy 优化(续)

Page 24
Page 24

为了避免 D2D 拷贝,我们将 permuteunpermute 操作添加到了 Hybrid-EP 中以隐藏延迟。这也为未来将 permutation 融合到 Hybrid-EP 内核中提供了便利。
优化后的流程中不再需要 D2D 拷贝。

另一种方案是在 Python 级别暴露注册缓冲区的指针。这种方法不被接受,因为它不符合 PyTorch 的风格,并且需要在框架层面进行更多修改。

Memcpy 优化(续)

Page 25
Page 25

对于 FP8 训练,cuBLAS FP8 GEMM 要求在 M 维度上对齐。这种填充(padding)行为实际上是一次 D2D 拷贝,可以被融合到 permute 内核中以提高效率。

如上图所示,在优化前,Dispatch, Permute, Padding 是独立的步骤,耗时分别为 600us, 150us, 180us。优化后,Padding 被融合,Dispatch 耗时 600us,新的 Permute 耗时 170us。此测量基于 Grace Blackwell GPU 上的 DeepSeek V3 模型 (TP1PP8EP32)。

无同步(Sync Free)

Page 26
Page 26

上图展示了 GPU 和 CPU 之间的交互。torch.empty() 需要在主机端(host)知道大小值,这导致了两次同步。这里存在一个依赖关系:permute 预处理步骤需要 buffer-size 作为输入,并产生 token-per-expert 数据。

无同步(续)

Page 27
Page 27

Hybrid-EP 模型可以将所有输入和输出数据都放在设备端,这可以消除所有的同步。如果用户能为缓冲区大小提供一个合适的上界,就可以实现这一点。

设置输出张量大小的可能方法:
- 使用最坏情况来计算上界。
- Token drop。

我们目前正在开发一种新策略,以在 Megatron 中启用全层 CUDA Graph,其中 hybrid-ep 有望成为一个关键组件。

在 Megatron-Core 中的应用总结

Page 28
Page 28

当前 Hybrid-EP 的特性:
- 与 NVL72 兼容。
- 融合了预处理、permute 和 pad 操作。
- 与 CUDA-Graph 兼容。
- 支持 JIT。
- 支持节点内和节点间场景。
- 注意: 当前的 RMDA 通信要求用户为每个 GPU 手动分配最近的 NIC;尚不支持自动检测。

Hybrid-EP 在 LLM 训练上的收益:
测试平台:Grace Blackwell GPU,DeepSeek V3 模型(无 MTP)。
- 强制均衡 (Force balance)
- Hybrid-EP
- 融合 FP8 填充 (Fuse FP8 padding)

性能数据:

Model Precision Dispatcher Feature List TFLOPS/GPU
DeepSeek-V3 MXFP8 DeepEP Baseline 829.53
DeepSeek-V3 MXFP8 Hybrid-EP Hybrid-EP 898.47
DeepSeek-V3 MXFP8 Hybrid-EP Fuse FP8 Padding 943.56

注:仅供技术讨论和参考,性能可能因产品组合不同而异。

未来路线图

Page 29
Page 29
Page 30
Page 30

路线图

结束

Page 31
Page 31

演示文稿以NVIDIA品牌标志页结束。