DeepSeek為何要做MoE負載均衡?
?DeepSeek 是如何做專家的負載均衡的?如果你在面試時被問到這個問題,應該怎么回答呢?
1.面試官心理分析
從面試官的角度來看,你至少得答到下面這兩個層面:
- 第一層,為什么要做專家的負載均衡,動機是什么?
- 第二層,DeepSeek 是怎么做的,它具體有什么高明之處?
好,那接下來我們就一起來分析拆解一下這道面試題目。
2.面試題解析
首先第一點,為什么要做專家的負載均衡?
這里先給大家科普一下負載均衡的概念,它實際上是分布式服務里面的一個概念,指的是一個服務部署到多個節點。
多個用戶的請求要盡量讓每個節點均勻分配,而不是集中在某些節點上,造成單點過熱,從而引發故障。
對于 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。
本文轉載自???丁師兄大模型??,作者: 丁師兄
