DeepSeek 是如何做专家的负载均衡的?如果你在面试时被问到这个问题,应该怎么回答呢?
01.面试官心理分析
从面试官的角度来看,你至少得答到下面这两个层面:
-
第一层,为什么要做专家的负载均衡,动机是什么?
-
第二层,DeepSeek 是怎么做的,它具体有什么高明之处?
好,那接下来我们就一起来分析拆解一下这道面试题目。
02.面试题解析
首先第一点,为什么要做专家的负载均衡?
这里先给大家科普一下负载均衡的概念,它实际上是分布式服务里面的一个概念,指的是一个服务部署到多个节点。
多个用户的请求要尽量让每个节点均匀分配,而不是集中在某些节点上,造成单点过热,从而引发故障。
对于 MoE 架构,现在也是采用了分布式的训练架构,叫 MoE 并行,也就是把不同专家放在不同的机器上,那如果对 token 处理不均匀,也会造成专家之间的负载不均衡。
我们都知道啊,DeepSeek 采用了 shared MoE 架构,看这张图。
从图中可以看到,其中一部分是共享专家 Shared Expert,而另一部分是路由专家 Routed Expert。共享专家是每次固定都会激活,而路由专家是有选择的稀疏激活。
比如在 deepseek v3 中,用了 1 个共享专家+256 个路由专家组成,然后从 256 个路由专家里面选 8 个专家出来。
所以每个 token 其实只有 8 个专家激活,而其他 248 个专家都是不起作用的。
如果某一个专家能力特别强,那它激活的频率就会特别高,而有些专家比较普通,那可能激活的频率又特别低,这样就会造成负载不均衡。
好,了解了这个,我们再来看一下,DeepSeek 是怎么做到 MoE 负载均衡的?
首先,DeepSeek 在选专家的时候,对每一个专家都加了一个可调整的 bias 系数,用来控制当前专家被选中的概率。
来看公式:
可以看到,这里面的 s 就是专家被选中的概率,而 b 就是该专家的 bias 系数。
为了方便大家理解,我们来举个例子:
假设有三个专家,专家 1,专家 2,专家 3,现在要选择其中两个概率最高的专家出来,这里最后一列是专家的输出。
专家 1:0.38 100
专家 2:0.33 200
专家 3:0.29 150
如果我们不做 bias 干预,可以看到专家 1~专家 3 的得分,分别是 0.38,0.33,0.29,那按照概率最高的来选,当然是选择专家 1 和专家 2。
现在我们发现专家 1 之前被选中的次数太多了,而专家 3 之前被选中的次数又比较少,所以我们想加大专家 3 被选中的概率,而减少专家 1 的概率,所以 bias 系数分别调整为 +0.1,0,-0.1。
专家1:0.38 - 0.1 100
专家2:0.33 + 0 200
专家3:0.29 + 0.1 150
这样和原始的专家选中概率加和之后,三个专家的概率变成了 0.28,0.33,0.39,那按照最高的两个概率来选,最后就选择了专家 2 和专家 3。因此最后的输出就是这样,也就是 124.5。
200 * 0.33 + 0.39 * 150 = 124.5
至于如何去调整这个 bias,DeepSeek 的论文中是这样做的。
它是通过一个更新步长 gamma 来进行动态调整,初始 bias 设置为 0,如果某个专家 overload 了,则 bias 减去 gamma,反之,如果某个专家 underload 了,则 bias 加上 gamma。
那如何判断某个专家是否过载呢?这点论文没有细说。当然了,这个有很多方案,比较容易想到的一种实现是,维护一个长度为专家个数的向量 M,向量的每一个元素命中对应专家的次数。
可以根据这个专家最近一段历史被选中的次数除以总次数,得到专家被命中的概率,最后对所有专家做一个归一化。
然后设置一个阈值,如果高于某个阈值则判定为 overload,反之则是 unberload。
当然,这个 gamma 也不是一成不变的,论文中做了 decay,在前 14.3T 数据,gamma 设置为 0.001,最后 500B token,设置为 0。
好,那以上就是对这道 DeepSeek 大模型面试题目的一个分析和拆解,这里是丁师兄大模型,持续分享大模型面试干货!
资料下载方式