P小二 P小二
← 返回文章 AI Research 约 9 分钟

DeepSeek开源周第四天:DualPipe&EPLB深度分析

deepseek开源周第四天,你需要的项目深度分析来了

今天是deepseek 开源周的第四天,deepseek带来了三个项目,全部都是关于V3/R1训练和推理相关的并行策略优化。

今天是deepseek 开源周的第四天,deepseek带来了三个项目,全部都是

DualPipe是一种用于V3/R1训练中计算-通信重叠的双向流水线并行算法。而EPLB是用于V3/R1的专家并行负载均衡器。

最后一个profile-data主要是公开deepseek infra的训练和推理的分析数据,目前公开了训练和推理中Prefilling的分析数据,推理的Decoding分析数据还没有公开。

今天主要带来DualPipe和EPLB项目的分析,这两个都偏向于工程优化。

DualPipe

DualPipe在deepseek V3论文中有提到,是一种双向流水线并行通信的算法,主要用于优化大模型的数据交互和训练效率。

DualPipe在deepseek V3论文中有提到,是一种双向流水线并行通信的

主要的核心特点:

  • 计算与通信重叠   DualPipe的设计目标是最大化集群的计算性能,在前向传播和后向传播中实现计算与通信的完全重叠,减少传统流水线并行中的空闲等待时间。 在MoE模型的跨节点写作的专家并行(Expert Parallelism)尤其重要。

  • 双向调度  DualPipe 是双向调度策略,主要是从流水线的两端同时输入,重复利用硬件资源。还设计了一个复杂但很高效的8步调度策略。

  • 显存优化

    DualPipe 将模型的最浅层(包括嵌入层)和最深层(包括输出层)部署在同一流水线级别(PP Rank),实现参数和梯度的物理共享,进一步提升内存效率

DualPipe 将模型的最浅层(包括嵌入层)和最深层(包括输出层)部署在同一流

管道气泡和内存使用情况比较 (管道气泡,即空闲等待时间)

管道气泡和内存使用情况比较 (管道气泡,即空闲等待时间)

有兴趣可以具体去看代码,代码行数并不多,适合学习。

EPLB

EPLB (Expert Parallelism Load Balancer,专家并行负载均衡器)是主要用于优化MoE的分布式部署,方法是为保证MoE部分不同专家之间的负载均衡,会将共享专家和高负载的细粒度专家在集群的不同GPU做多个复制,让GPU把更多的热数据(发给共享专家的)跑起来。

EPLB在deepseek的论文中没有相应的介绍,它的代码也只有160行,非常的简洁。

主要的核心特点:

  • 负载均衡优化

主要是复制高负载的专家(可以称为:冗余专家策略)并对专家分配进行启发式的调整,确保不同GPU之间的负载均衡。

  • 分层负载均衡

采用三层结构:节点级→节点内专家复制→GPU分配,优先保证同一组的专家尽量分配到同一个节点,减少跨节点的数据传输,然后在每一层都保证负载均衡。这种应用在deepseek V3中的分组限制路由(Group-Limited Expert Routing)策略显著提升了分布式训练的效率。

  • 动态调度策略

根据实际情况动态选择负载均衡策,预填充阶段使用分层策略和解码阶段使用全局策略

我们分别来看代码:

冗余专家策略

def replicate_experts(weight: torch.Tensor, num_phy: int):    # 对负载较重的专家进行复制    for i in range(num_log, num_phy):        redundant_indices = (weight / logcnt).max(dim=-1).indices        phy2log[:, i] = redundant_indices        logcnt[arangen, redundant_indices] += 1


**分层负载均衡**

- -
- -
- -
- -
- - ```
def rebalance_experts_hierarchical():    # Step 1: 将专家组打包到节点    tokens_per_group = weight.unflatten(-1, (num_groups, group_size)).sum(-1)    group_pack_index, group_rank_in_pack = balanced_packing(tokens_per_group, num_nodes)    # Step 2: 在节点内构建冗余专家    tokens_per_mlog = weight.gather(-1, mlog2log).view(-1, num_logical_experts // num_nodes)    # Step 3: 将物理专家打包到GPU    tokens_per_phy = (tokens_per_mlog / mlogcnt).gather(-1, phy2mlog)

动态调度策略

def rebalance_experts():    if num_groups % num_nodes == 0:        # 使用分层策略        phy2log, phyrank, logcnt = rebalance_experts_hierarchical()    else:        # 使用全局策略        phy2log, phyrank, logcnt = replicate_experts()


有兴趣的同学可以去看具体的代码。

明天是deepseek开源周的最后一天,会不会放出一个重量级的开源项目呢,让我们拭目以待。

关注我,让我们一起猛学!

往期分析文章:

- [deepseek开源周第三天:DeepGEMM深度分析](https://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126541&idx=1&sn=61bb2095ef386c9bfa8a83780c01d430&scene=21#wechat_redirect)

- [DeepSeek开源周第二天:DeepEP深度分析](https://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126526&idx=1&sn=a65f1ebcd609553daf057a11423996f3&scene=21#wechat_redirect)

- [DeepSeek开源周第一天:FlashMLA 深度分析](https://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126513&idx=1&sn=325c82d7c75a8ceb3f7bcfd63280d72e&scene=21#wechat_redirect)

- [开源周来袭:DeepSeek有哪些神秘技术即将公开?](https://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126493&idx=1&sn=e0082b3ac23090cf9a363209f887c4e4&scene=21#wechat_redirect)

参考链接:

- https://github.com/deepseek-ai/DualPipe

- https://github.com/deepseek-ai/eplb

- https://github.com/deepseek-ai/profile-data