☯️ Deepseek EPLB Note

type
status
date
slug
summary
tags
category
icon
password
AI summary
个人理解EPLB的一些笔记。

参考文献

问题描述

专家并行时,如何决定将那个专家放到哪张卡上。 考虑DeepSeek的EP,总共256个路由专家,1个共享专家. prefill时,EP32, 256/32 = 8, 每张卡放8个路由专家, 共享专家在所有卡上都复制一份,单卡总共9个专家。 decode时,EP144, 每张卡只放2个路由专家和一个共享专家,总共有 144 * 2-256 = 32个来放冗余路由专家。
需要解决的问题:
  1. 怎么决定对哪些专家进行冗余?
  1. 冗余多少份?
  1. 对于任意一个专家,应该放在哪张卡上?
EPLB 就是在解决上述问题。

Expert Parallelism Load Balancer

假定我们依据历史数据,得到了各个专家的历史负载情况, 表示专家i,总共承载的token数。 逻辑专家:指模型中的256路由专家 + 1共享专家 物理专家:指经过冗余后实际部署到GPU上的专家, 数量大于 256 + 1

Decode

notion image
v3 report中,Decode时,每张卡都只放一个专家,且卡间直接通过IB通信,这里应该对应了DeepEPLow-latency kernels with pure RDMA. 总共320张卡,其中64张卡用来放冗余专家和共享专家。 在DeepSeek-V3 / R1 推理系统概览中的版本为:
Decode:路由专家 EP144、MLA 和共享专家 DP144,一个部署单元是 18 节点,32 个冗余路由专家,每张卡 2 个路由专家和 1 个共享专家
简单起见, 下面还是按照每张卡只放一个专家来讲。 假设总共n个专家,m张卡(m>n),每张卡只放一个专家。 代表第i张卡上面放的物理专家需要承载的token数, 有: 选择专家i,冗余x份, 总共(x+1)个物理专家, 则一个物理专家的权重为: 最终目标就是找到一个方案,使得: 最小,即负载最高的那张卡,负载尽量小。

算法流程

对应的函数为:replicate_experts 维护logcnt[i]表示专家i经过冗余后总共的份数。 则W[i] / logcnt[i] 代表了这个专家冗余部署到卡上后,卡上物理专家实际的负载。
  1. 前n张卡直接一一对应放一个专家。
  1. 剩下的m-n张卡,每次选择 选择 W[i] / logcnt[i] 最大的那个专家进行冗余 这里共享专家看作是权重非常大的路由专家,可以预见,前几轮迭代 W[i]/logcnt[i] 最大的都是共享专家。
这看上去只是个贪心算法,不保证全局最优?

Prefill

DeepSeek部署是PD分离的,Prefill是4个node,每个node 8卡,共32卡, EP32。node内部的8卡,是NVLINK连接,node间是IB连接。这里我猜应该对应了DeepEP了的Normal kernels with NVLink and RDMA forwarding 考虑到Prefill层次化的拓扑结构,EPLB也进行了层次化的考虑,并且也考虑了v3 report中提到的group-limited routing, EPLB会让同一个group的专家,一定部署到同一个node。

算法流程

  1. 首先需要决定各个组放在哪个node上,这里对应的函数为:balanced_packing, 使得node间的负载尽量均衡, 这一步不进行冗余。
  1. 确定每个node会部署哪些专家组后,在单个node内,对专家进行冗余部署,对应调用函数:replicate_experts,这一步会将node内部署的专家数量冗余到参数指定的数量。
  1. 确定每个node内总共会部署哪些专家,以及对每个专家冗余多少份后,调用balanced_packing,将每个物理专家,具体指定到一张GPU上去,使得node内的GPU之间,也尽量负责均衡。
balanced_packing: 这个函数负责将n个加权对象,均匀分配到m个容器中,保证每个容器刚好n/m个对象,并且所有容器的总权重尽可能平衡。对于步骤1, 加权对象为专家组,容器为node。对于步骤3,加权对象为一个需要部署的物理专家,容器为一张GPU。
balanced_packing的算法流程:
  1. 权重降序排序
  1. 每次选择当前负载最小的并且可用的那个容器,将当前权重最大的对象部署到该容器。

更新后的Decode

Decode:路由专家 EP144、MLA 和共享专家 DP144,一个部署单元是 18 节点,32 个冗余路由专家,每张卡 2 个路由专家和 1 个共享专家
可能的步骤是:
  1. replicate_experts, 进行冗余,得到144 * 2 = 288个物理路由专家
  1. balanced_packing 把288个路由专家部署144个GPU上。

总结

EPLB在进行负载均衡的时候,针对Prefill和Decoding的不同拓扑结构,也有不同的策略,和v3 report Infra部分,DeepEP的两种kernel都能对应上。
Prev
TPU 脉动阵列 笔记
Next
DeepSeek-v3 Infra笔记
Loading...