專家模型不要專家並行!微軟開源MoE新路徑
新智元報道
編輯:alan
【新智元導讀】近日,來自微軟的研究人員開源了使用全新方法訓練的MoE大模型,不走尋常路,且編碼和數學表現出色。
繼Phi家族之後,微軟又開源了新的混合專家大模型——GRIN MoE。
與Phi-3.5同樣的個頭(16 * 3.8B),卻採用了截然不同的訓練方法。
這個「不走尋常路」如果寫個太長不看版,那就是兩句話:
論文地址:https://arxiv.org/abs/2409.12136
當然了,上面兩句話是小編說的,多少有點糙,文中細節,還請諸君繼續閱讀~
這年頭,新來一個LLM,當然要先刷分了——
參數要少,效果要好,所以要在左上角:
GRIN作爲MoE架構,總參數量約42B,推理時激活的參數爲6.6B,打同級別(7B)的非MoE模型是手拿把攥,甚至比14B的Phi-3還要略勝一籌。
在上面的這份成績單中,GRIN MoE表現優異,尤其是在編碼和數學測試中。
比如,在衡量數學問題解決能力的GSM-8K中,GRIN MoE得分爲90.4,而在編碼任務基準HumanEval上拿到了74.4分。
在MMLU(大規模多任務語言理解)基準測試中GRIN得分爲79.4,超過了同爲MoE架構的Mixtral(70.5分),以及自家的Phi-3.5(78.9分)。
如果對比流行的商用模型,GPT-3.5表示感受到時代的力量,默默退出羣聊。
開放權重:https://huggingface.co/microsoft/GRIN-MoE
demo:https://github.com/microsoft/GRIN-MoE
MoE全新訓練路徑
GRIN MoE由常規的Transformer塊構成,採用分組查詢注意力(GQA)和滑動窗口注意力來提高計算效率。
採用RoPE進行位置編碼,以便在預訓練後實現長上下文能力。
在MoE架構中,模型通過路由網絡爲每個輸入token挑選適合的專家模塊。對於有n個專家的網絡,一個用於推理的MoE模塊的輸出爲:
其中z = Router(x,r),本文中Router採用線性網絡,Gating是門控函數(通常爲softmax),Expert是FNN層。
MoE通過TopK函數進行專家分配,這個專家路由的過程是不可微的,所以反向傳播的時候沒法求導。
對此,傳統的MoE訓練將TopK視爲常數,僅通過Gating來反向傳播計算路由權重梯度,相當於用門控的梯度代替了路由的梯度。
這多少有點糙。
不可導怎麼辦
恰好,本文一作之前有一篇工作(SparseMixer):
論文地址:https://arxiv.org/pdf/2310.00811
受到直通梯度估計器的啓發,作者擴展了前作,提出了SparseMixer-v2。
作者首先將TopK函數替換爲模型訓練中離散變量的隨機採樣,然後應用heun’s third order method來近似專家路由梯度,並構建一個改進的反向傳播,爲專家路由給出數學上合理的梯度估計。
前作中,SparseMixer的有效性在神經機器翻譯任務和ELECTRA語言模型訓練中得到了證明。
而在GRIN MoE的開發過程中,SparseMixer-v2終於有機會大規模應用於自迴歸語言模型訓練。
作者用2.5T token訓練了兩個16×0.9B MoE。其中一個遵循GRIN MoE中使用的相同方案,另一個用傳統的GShard方法替換 SparseMixer-v2。
如上圖所示,將SparseMixer-v2的性能提升推廣到16×0.9B尺度的自迴歸語言模型訓練。
在前0.5T token上GShard表現更好,但SparseMixer-v2在訓練後期取得了更強的性能。
專家模型不要專家並行
傳統的MoE訓練採用專家並行,簡單理解就是把不同的專家分配到不同的顯卡上。
一個明顯的問題是負載不均衡,有的專家會分到更多的token,有的專家卻很閒。
之前的做法是設定一個閾值,比如1000個token分給4個專家,每人應該是250,這時候每張卡就最多隻算250個token,超過後直接丟棄(送到下一層)。
而在本文中,作者利用數據並行、pipeline並行和張量並行來訓練GRIN MoE。
此外,對於沒有專家並行性的MoE計算,作者發現Megablocks包非常有用,它的grouped_GEMM內核和包裝器的性能更好。
應用這些新的工程化方法避免了專家並行,也就不用丟棄token了。
最終,與具有相同激活參數的密集模型相比,本文的方法實現了超過80%的訓練效率提升。
上表中,作者將兩種不同大小的MoE模型與具有相同激活參數量的密集模型進行了比較,使用相同的硬件測量了它們的訓練吞吐量。
儘管MoE總的參數量是密集模型的六倍多,但在實驗中達到了超過80%的相對吞吐量,證實了使用GRIN MoE方法的模型具有顯著的計算擴展潛力。
(PS:密集模型的吞吐量是在與MoE模型相同的並行度設置下測量的,這裡的比較是爲了研究密集激活網絡(非MoE)和稀疏激活網絡(MoE)的GPU內核效率)
此外,在擴大模型大小時,密集模型和MoE模型顯示出相似的減速模式,比如6.6B密集模型的訓練吞吐量大約比1.6B密集模型的訓練吞吐量慢4.19倍(後者的參數少4倍)。同樣,42B MoE模型的訓練吞吐量比10B MoE 模型的訓練吞吐量慢約3.96倍(對應參數少4.2倍)。
並行實驗
在只使用pipeline並行的情況下,通過在GPU之間進一步劃分不同層,可以將最大專家數量從16個擴展到32個。但是,如果再增加專家數量,則會導致單個層的參數過多,一個GPU就放不下了。
所以下一個維度採用張量並行。
專家並行在前向和後向計算中有兩個all-to-all通信開銷,而張量並行在前向和後向計算中有兩個all-reduce通信開銷。
相比之下all-reduce操作的延遲更高一點,但可以通過精心排布前向和反向的計算來overlap掉一部分開銷。
如上圖所示,通過結合pipeline並行和張量並行,系統支持的最大專家數量擴展到52個(總共132B參數)。
這個數量是因爲實驗只用了64個GPU,最多能將模型劃分爲64個階段,如果有更多的GPU,那麼還能繼續向上擴展。
不過作者也表示,使用更復雜的並行通常會導致計算吞吐量降低。
負載均衡
如前所述,本文沒有采用專家並行,但是負載不均衡的事實依然存在。
作者在這裡通過調整負載均衡損失來調節全局的負載均衡。常見的負載均衡損失定義爲:
其中α是超參數,n是專家數量,fi是調度給專家的token比例。
傳統方法在本地不同的GPU上計算fi,因此負載均衡損失將調節本地專家負載均衡並緩解token丟棄。
在本文中,作者通過計算全局的fi(比如數據並行過程中組內的all-reduce)來修改負載均衡損失,調節專家負載以達到全局平衡。
儘管這種調整會產生額外的通信開銷,但類似於張量並行,這些通信也可以與計算overlap,從而在很大程度上減少額外的延遲。
最後,放一個測試結果來show一下GRIN MoE的數學推理能力:
參考資料:
https://venturebeat.com/ai/microsofts-grin-moe-ai-model-takes-on-coding-and-math-beating-competitors-in-key-benchmarks/