DeepSeek開源三箭齊發(fā),梁文峰親自上陣!雙向并行LLM訓(xùn)練飆升
開源周第4天,DeepSeek放出的是——優(yōu)化并行策略,一共三個(gè)項(xiàng)目。
- DualPipe:一種用于V3/R1模型訓(xùn)練中實(shí)現(xiàn)計(jì)算與通信重疊的雙向流水線并行算法
- EPLB:一個(gè)針對V3/R1的專家并行負(fù)載均衡工具
- 深入分析V3/R1模型中的計(jì)算與通信重疊機(jī)制
值得一提的是,DualPipe是由三個(gè)人——Jiashi Li、Chengqi Deng和梁文峰共同研發(fā)。
有網(wǎng)友對此表示,這是一個(gè)顛覆性的突破。
「DualPipe和EPLB讓大模型的訓(xùn)練更快、更便宜、更可持續(xù),同時(shí)保持頂尖性能」。
開源僅剩最后一天,評論區(qū)網(wǎng)友紛紛許愿:明天一定要來個(gè)大的。
DualPipe
DualPipe是DeepSeek-V3技術(shù)報(bào)告中提出的一種創(chuàng)新雙向流水線并行算法。
它能夠?qū)崿F(xiàn)前向與后向計(jì)算和通信階段的完全重疊,同時(shí)有效減少流水線氣泡(空閑時(shí)間)。
調(diào)度方案
上圖展示了在8個(gè)流水線并行階段和20個(gè)micro-batches情況下,DualPipe在兩個(gè)方向上的調(diào)度示例。
由于反向方向的微批次與前向方向?qū)ΨQ,為了簡化圖示,這里省略了反向方向的batch ID。圖中由同一個(gè)黑色邊框包圍的兩個(gè)單元格表示同時(shí)進(jìn)行的計(jì)算和通信操作,它們實(shí)現(xiàn)了相互重疊。
流水線氣泡與內(nèi)存使用比較
圖中,??代表前向塊(forward chunk)的執(zhí)行時(shí)間,??代表完整后向塊(full backward chunk)的執(zhí)行時(shí)間,??代表「權(quán)重后向」(backward for weights)塊的執(zhí)行時(shí)間,而??&??則表示同時(shí)執(zhí)行且相互重疊的前向和后向塊的執(zhí)行時(shí)間。
快速入門
使用示例如下:
python example.py
注意:在實(shí)際生產(chǎn)環(huán)境中,需要根據(jù)模塊特點(diǎn)來實(shí)現(xiàn)一個(gè)定制化的overlapped_forward_backward方法。
專家并行負(fù)載均衡器(EPLB)
在使用專家并行(EP)時(shí),不同的專家模塊會(huì)被分配到不同的GPU上。由于各個(gè)專家的計(jì)算負(fù)載會(huì)隨當(dāng)前任務(wù)而變化,因此保持各GPU間負(fù)載均衡至關(guān)重要。
如DeepSeek-V3論文所述,研究人員采用了冗余專家(redundant experts)策略,對高負(fù)載專家進(jìn)行復(fù)制。
隨后,通過啟發(fā)式算法將這些復(fù)制的專家合理分配到各GPU上,確保計(jì)算資源的平衡利用。
此外,由于DeepSeek-V3采用了組內(nèi)限制專家路由(group-limited expert routing)機(jī)制,研究團(tuán)隊(duì)盡可能將同一組的專家放置在同一節(jié)點(diǎn)上,以減少節(jié)點(diǎn)間的數(shù)據(jù)傳輸開銷。
為了便于復(fù)現(xiàn)和部署,DeepSeek在eplb.py文件中開源了EP負(fù)載均衡算法。該算法能夠根據(jù)估計(jì)的專家負(fù)載,計(jì)算出均衡的專家復(fù)制和放置方案。
需要說明的是,專家負(fù)載的具體預(yù)測方法不在此代碼庫的討論范圍內(nèi),一種常用的方法是采用歷史統(tǒng)計(jì)數(shù)據(jù)的滑動(dòng)平均值。
算法原理
負(fù)載均衡算法提供了兩種策略,適用于不同場景:
· 層次負(fù)載均衡(Hierarchical Load Balancing)
當(dāng)服務(wù)器節(jié)點(diǎn)數(shù)量能夠整除專家組數(shù)量時(shí),研究人員采用層次負(fù)載均衡策略,來充分利用組內(nèi)限制專家路由機(jī)制。
首先,他們將專家組均勻分配到各節(jié)點(diǎn),確保節(jié)點(diǎn)間負(fù)載平衡;然后,在每個(gè)節(jié)點(diǎn)內(nèi)部復(fù)制專家模型;最后,將復(fù)制后的專家打包分配到各個(gè)GPU上,實(shí)現(xiàn)GPU間的負(fù)載均衡。
這種層次化策略特別適用于預(yù)填充階段(prefilling stage),此時(shí)專家并行規(guī)模較小。
· 全局負(fù)載均衡(Global Load Balancing)
在其他情況下,研究人員采用全局負(fù)載均衡策略,不考慮專家組的限制,直接在全局范圍內(nèi)復(fù)制專家并分配到各個(gè)GPU上。這種策略更適合解碼階段使用,此時(shí)專家并行規(guī)模較大。
接口示例
負(fù)載均衡器的核心函數(shù)是eplb.rebalance_experts。
下面的代碼展示了一個(gè)雙層混合專家模型(MoE)的示例,每層包含12個(gè)專家。
DeepSeek為每層引入了4個(gè)冗余專家,總計(jì)16個(gè)專家副本被分配到2個(gè)計(jì)算節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)配有4個(gè)GPU。
import torch
import eplb
weight = torch.tensor([[ 90, 132, 40, 61, 104, 165, 39, 4, 73, 56, 183, 86],
[ 20, 107, 104, 64, 19, 197, 187, 157, 172, 86, 16, 27]])
num_replicas = 16
num_groups = 4
num_nodes = 2
num_gpus = 8
phy2log, log2phy, logcnt = eplb.rebalance_experts(weight, num_replicas, num_groups, num_nodes, num_gpus)
print(phy2log)
# Output:
# tensor([[ 5, 6, 5, 7, 8, 4, 3, 4, 10, 9, 10, 2, 0, 1, 11, 1],
# [ 7, 10, 6, 8, 6, 11, 8, 9, 2, 4, 5, 1, 5, 0, 3, 1]])
該層次負(fù)載均衡策略產(chǎn)生的結(jié)果,展示了如下專家復(fù)制與分配方案。
DeepSeek基礎(chǔ)設(shè)施中的性能剖析數(shù)據(jù)
在這里,DeepSeek公開分享來自訓(xùn)練和推理框架的性能剖析數(shù)據(jù),旨在幫助社區(qū)更深入地理解通信與計(jì)算重疊策略以及相關(guān)底層實(shí)現(xiàn)細(xì)節(jié)。
這些剖析數(shù)據(jù)是通過PyTorch Profiler工具獲取的。
你可以下載后在Chrome瀏覽器中訪問chrome://tracing(或在Edge瀏覽器中訪問edge://tracing)直接進(jìn)行可視化查看。
需要說明的是,為了便于剖析,研究人員模擬了一個(gè)完全均衡的MoE路由策略。
訓(xùn)練過程
訓(xùn)練剖析數(shù)據(jù)展示了,研究人員在DualPipe中如何實(shí)現(xiàn)單對前向和后向計(jì)算塊的重疊策略。每個(gè)計(jì)算塊包含4個(gè)MoE層。
并行配置與DeepSeek-V3預(yù)訓(xùn)練設(shè)置保持一致:采用EP64、TP1,序列長度為4K。
為簡化剖析過程,未包含流水線并行(PP)通信部分。
推理過程
· 預(yù)填充
在預(yù)填充階段,剖析配置采用EP32和TP1的配置(與DeepSeek V3/R1實(shí)際在線部署一致),提示長度設(shè)為4K,每GPU批處理量為16K個(gè)token。
研究人員在預(yù)填充階段使用兩個(gè)micro-batches來實(shí)現(xiàn)計(jì)算與all-to-all通信的重疊,同時(shí)確保注意力機(jī)制的計(jì)算負(fù)載在兩個(gè)micro-batches間保持平衡——這意味著同一條提示信息可能會(huì)被分割到不同micro-batches中處理。
· 解碼
解碼階段的剖析配置采用EP128、TP1,提示長度4K(與實(shí)際在線部署配置非常接近),每GPU批處理量為128個(gè)請求。
與預(yù)填充類似,解碼階段也利用兩個(gè)micro-batches來重疊計(jì)算和all-to-all通信。
然而不同的是,解碼過程中的全聯(lián)通通信不占用GPU流處理器(SM):RDMA消息發(fā)出后,所有GPU流處理器立即被釋放,系統(tǒng)在完成計(jì)算后等待全聯(lián)通通信完成。
關(guān)于all-to-all通信實(shí)現(xiàn)的更多技術(shù)細(xì)節(jié),請參考DeepEP文檔。