DeepEP 源码解读:从 NVSHMEM 双路径到 NCCL Gin
本书把 DeepEP V1 与 EPv2 放在一条演进线上解释:V1 如何用 NVLink IPC、NVSHMEM 和两种通信模式完成专家分发与回收;V2 如何围绕 NCCL Gin、DeepJIT 和统一的
EPBuffer重组执行路径。分析范围覆盖 V1v1.2.1与当前仓库main的 V2.5 快照,两代实现始终分开追踪。
版本快照
| 字段 | V1 | V2.5 |
|---|---|---|
| 仓库 | deepseek-ai/DeepEP | deepseek-ai/DeepEP |
| 版本锚点 | v1.2.1 | main |
| commit | 9af0e0d0e74f3577af1979c9b9e1ac2cad0104ee | 93eb6eb238127e96c6d7a4a625a6dad158348509 |
| 提交时间 | 2025-09-15 | 2026-09-30 |
| 核对日期 | 2026-10-13 | 2026-10-13 |
| 分析范围 | Python Buffer、C++ runtime、CUDA kernels 与测试 | EPBuffer、NCCL/Gin context、DeepJIT kernels、相关测试与模块生命周期 |
V2.5 的 README 声明 V1 已完整移除,包括旧 API 与 NVSHMEM 后端。因此本书不从 V2.5 源码倒推 V1 行为:凡涉及旧路径,均明确使用
v1.2.1快照;凡涉及当前 API,均使用 V2.5 快照。
主要源码锚点
- V1:
deep_ep/buffer.py、csrc/deep_ep.cpp、csrc/kernels/intranode.cu。 - V2:
deep_ep/buffers/ep.py、csrc/buffers/ep.hpp、csrc/kernels/comm/context.cpp、csrc/kernels/ep/dispatch.hpp。 - V2 初次公开提交:
b306af06afd412c88e51e71802951606e40b7358;V2.5 发布提交:def865146e95aa9ea223e277c0a8a4c6b81e5ac7。
全书要回答的问题
- 一份 token 的 top-k 路由结果如何变成跨 rank 的发送计划、专家输入与反向 combine?
- V1 的 normal / low-latency 双 API 与 V2 的统一 EP API,分别把哪些工作交给调用者和运行时?
- NVLink、RDMA、同步计数、布局元数据和异步事件由哪些层共同管理?
- V2 通过 NCCL Gin 与 DeepJIT 重构后,哪些机制变简单,哪些部署条件与生命周期约束仍由调用方承担?
目录
第一部分:把两代实现放在同一张图上
第二部分:V2 的执行模型
- 05 V2:Python API、C++ 扩展与 DeepJIT
- 06 V2:NCCL Gin 与对称内存
- 07 V2:dispatch 如何构造专家输入
- 08 V2:combine、句柄与异步重叠
- 09 V2:容量、布局与通信资源
- 10 V2:EP 之外的 Buffer 与扩展能力
- 11 构建、测试与运行边界
附录
阅读主线
flowchart LR
A[MoE 路由结果] --> B[V1 layout 与 rank 分组]
B --> C[V1 dispatch / expert compute / combine]
C --> D[版本边界:V1 被移除]
D --> E[V2 EPBuffer 与 DeepJIT]
E --> F[NCCL Gin 通信与对称窗口]
F --> G[dispatch / 扩展布局 / expert compute]
G --> H[combine / EventOverlap]V1 与 V2 的链路在章节中分别展开。图中的连接表达的是主题演进,不表示跨版本共享同一运行时或数据结构。