Background

公元2025年2月27号,DeepSeek公司开源周第四天,开源了DualPipe和EPLB两项技术。两者的分别是"流水双向并行算法"和"专家并行负载均衡器",两者的目标其实只有一个,就是提升大模型跨GPU训练的效率。

“不是是什么而是为什么”,为什么模型训练需要跨GPU,显而易见有以下两点原因:

  1. 大模型过大,一个GPU的显存放不下(Deepseek模型本地部署的显存就需要536GB, 而英伟达的A100的显存也只有80GB)
  2. 训练数据过多,单线计算效率太低

所以跨GPU训练就成为必然的趋势,为了充分利用硬件资源,自然会想到并行。从问题出发自然会想到可以将数据集/模型进行拆分之后给到不同的GPU训练,这就自然引入了两种常用的并行方式——数据并行,流水并行。除此之外,基于深度神经网络中基本计算都是可拆解的矩阵乘法的性质,还有模型并行

  1. 数据并行(Data Parallelism, DP): 在不同的GPU上运行同一批数据的不同子集
  2. 流水并行(Pipeline Parallelism, PP): 在不同的GPU上运行模型的不同层
  3. 模型/张量并行(Tensor Parallelism, TP): 包含张量并行,将单个数学运算(如矩阵乘法)拆分到不同的GPU上运行
  4. 专家并行(Expert Parallelism, EP): 基于Moe的特殊策略
  5. 混合并行: 结合上述两个及以上,实际运用中最多也最有效

而Deepseek采用的正是一种混合并行的策略,DualPipe与EPLB则分别是对其中的 数据+流水并行 和 专家并行 做了优化,从而提高了模型的训练效率。

DualPipe

流水并行优化

  1. 无并行 Naive

    • 如前所述,流水并行涉及到将模型的层次(这其实得益于Transformer结构层与层之间相对独立)拆解开,分到多个GPU上进行训练。最简单的版本,就像这样,三个GPU分别负责一个三层模型的每一层,前向传播算完了就交给下一层,然后得到Loss之后在逐层反向传播回来

    在这里插入图片描述

    但显而易见,同一时间中只有一个GPu在干活,大量的计算资源都浪费了(灰色部分),GPU等待的这部分也被称为气泡或死区

  2. Gpipe

    • 看到这个阶梯图,不难想到CPU的取址-译码-计算-访存-写回,自然就会将一次传入的数据进行划分,变成流水线执行

    在这里插入图片描述

    能明显地看到,气泡的占比小了很多

  3. 1F1B

    • 它的全称即One Forward One Backward,这也是相对于之前的F-then-B来的,即在前向传播没有完的时候便开始一些块的反向传播,具体是算好一个反向一个

在这里插入图片描述

相比于Gpipe,其实气泡并没有减少,但是核心在于GPU需要存储的中间量变少了,因为F-then-B的过程中,每个GPU都需要保留之前所有前向传播的中间量,但是1F1B则可以在反向传播之后就可以把之前的结果释放掉了
  1. PipeDream

    • 与Gpipe的F-then-B + 同步后向更新相比,PipeDream采用了异步后向更新 + 1F1B的策略,同时在反向的气泡中同样继续填充了正向过程
      在这里插入图片描述
  2. DualPipe

    • DualPipe的双向,来自于神经网络与CPU过程中的本质不同,因为Transformer各层结构相同,也就是说将模型倒过来也是一样的运行,所以两端可以同时正反向。简单来说,之前是一个W模型,而现在则在M的基础上叠加了W,从而进一步降低了气泡率

    在这里插入图片描述

    基于Deepseek的结果,相比于1F1B,DualPipe的气泡占比下降了50%

数据并行优化

数据并行,一种经典的方式,是有一个统一的数据派发/收集方,向各个GPU派发数据,然后收集反向传播结果实现更新;而这种方式通讯开销过大,所以更多的模型采用的是All-to-All的数据收发,也就是每个GPU前向反向一轮之后,将更新结果传递给同层的所有GPU。在此基础上,异步的接收和合并也是这里Deepseek采用的方式

所以,这里计算单元就要负责计算和通信两件事,而Deepseek采用了一种比较精妙的结构实现了两者的并行

在这里插入图片描述

注:对于MLP和ATTN两个块的反向计算更新,他拆分成输入更新(绿)和权重更新(蓝)两个部分;DISPATCH和COMBINE是层内通行,PP则是跨层通信(流水并行部分)

EPLB (Expert Parallelism Load Balancer)

专家并行优化

  1. 核心问题:Moe策略中每次会从256个专家中选出8个(许多个token通过矩阵运算同时进行),但是不同专家的热度不同,如果平均分配的话,会出现忙的忙死,闲的闲死的状态,使得计算资源没能得到充分应用
  2. 解决方法:
    • 最主要的一点,即是根据专家的热度(权重由向专家dispatch的量来决定),weight高的专家复制多份,相反的则之拷贝一份
    • 除此之外,EPLB还对专家进行了分组,然后分配到具体的GPU硬件设备上,使得每个GPU对应的专家权重基本相同,保证均很效率

TODO

  1. PP 中的异步后向更新
  2. DP 中的分发和合并机制
  3. EP 中的分层结构与weight计算

To be continue…

Thanks

  1. 一次性说清:数据并行、流水并行、模型并行
  2. DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略
  3. DeepSeek V3 精读(2)-DualPipe
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐