DeepSeek-专家并行(二)
大规模跨节点专家并行:Expert Parallelism / EP
EP 使得 batch size 大大增加,从而提高 GPU 矩阵乘法的效率,提高吞吐。其次 EP 使得专家分散在不同的 GPU 上,每个 GPU 只需要计算很少的专家(因此更少的访存需求),从而降低延迟。
DeepSeek-V3使用64路的专家并行,16路的流水线并行,以及数据并行(ZeRO1)。
1. DualPipe优化,解决通信开销导致计算与通信比没有隐藏的问题
跨节点专家并行引入的通信开销导致计算与通信比率约为 1:1,效率低下。为了应对这一挑战,我们设计了一种创新的流水线并行算法 DualPipe,它不仅通过有效重叠前向和后向计算通信阶段来加速模型训练,而且还减少了流水线气泡。
专家并行会引入all2all通信,由于每个token会激活8个专家,这导致跨节点的all2all通信开销成为主要的系统瓶颈。
在算法层面,DeepSeek-V3使用分组路由的方式,限制每个token只会激活4个节点上的专家,从而减半跨节点的通信流量。在系统层面,将节点间通信和节点内通信进行流水,最大化使用网络带宽和NVLink带宽。
多机多卡的专家并行,会带来通信开销,所以采取双batch隐藏通信开销。
黄色的前向计算,绿色的后向计算。
ATTN 和MLP是主要的计算过程。
前向过程:
ATTN-> Combine(经过MOE专家计算,通信过程)-> Dispatch(分发到不同的GPU,通信过程) -> MLP
前向分为4个部分:
ATTN、Conbine、Dispatch、MLP
对于后向:
ATTN和MLP进一步分为两个部分:后向用于输入、后向用于权重
完整的 DualPipe 调度如图 5 所示。它采用双向流水线调度,可同时从流水线的两端提供微批次,并且很大一部分通信可以完全重叠:
DualPipe 显著减少了流水线气泡,同时仅将峰值激活内存增加了 1 倍。虽然 DualPipe 需要保留两份模型参数,但由于我们在训练期间使用了较大的 EP 大小,因此这不会显著增加内存消耗。
2. 高效实现跨节点全连接通信
定制了高效的跨节点全对全通信内核(包括调度和组合),以节省专用于通信的 SM 数量。
集群中,跨节点 GPU 与 IB 完全互连,节点内通信通过 NVLink 处理。NVLink 提供的带宽为 160 GB/s,大约是 IB(50 GB/s)的 3.2 倍。为了有效利用 IB 和 NVLink 的不同带宽,我们将每个token限制为最多 4 个节点专家,从而减少 IB 流量。
在做出路由决策时,它将首先通过 IB 传输到其目标节点上具有相同节点内索引的 GPU。一旦到达目标节点,努力确保它通过 NVLink 立即转发到承载目标专家的特定 GPU,而不会被随后到达的令牌阻塞。这样,通过 IB 和 NVLink 的通信完全重叠,每个令牌可以有效地为每个节点平均选择 3.2 位专家,而不会产生 NVLink 的额外开销。
尽管 DeepSeek-V3 13 在实践中只选择了 8 位路由专家,但它可以将这个数字扩展到最多 13 位专家(4 个节点 × 3.2 位专家/节点),同时保持相同的通信成本。总的来说,在这样的通信策略下,只有 20 个 SM 足以充分利用 IB 和 NVLink 的带宽。
采用了 warp 专门化技术 ,将 20 个 SM 划分为 10 个通信通道。在调度过程中,(1) IB 发送、(2) IB 到 NVLink 的转发和 (3) NVLink 接收由各自的 warp 处理。分配给每个通信任务的 warp 数量根据所有 SM 的实际工作量动态调整。同样,在组合过程中,(1) NVLink 发送、(2) NVLink 到 IB 的转发和累积和 (3) IB 接收和累积也由动态调整的 warp 处理。此外,调度和组合内核都与计算流重叠,因此我们还考虑它们对其他 SM 计算内核的影响。具体而言,我们采用了定制的 PTX (并行线程执行) 指令并自动调整通信块大小,这显著减少了 L2 缓存的使用和对其他 SM 的干扰。
3. 以最小的开销节省大量内存
重新计算 RMSNorm 和 MLA 上投影:我们在反向传播期间重新计算所有 RMSNorm 操作和 MLA 上投影,从而无需持久存储它们的输出激活。此策略的开销很小,但可显著降低存储激活的内存要求。