揭秘DeepSeek:为何选择MoE负载均衡技术?

0 阅读1分钟

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 大模型面试题目的一个分析和拆解,这里是丁师兄大模型,持续分享大模型面试干货!

资料下载方式

点击下载