作者:Lin Zhang(港科大 CS博士)
首先,訓練超大號的MoE模型,僅使用兩千張H800加兩個月的時間,就能達到如此好的效果,這點實在是太強了。只能說實踐出先知,從DeepSeek過往的技術報告來看,明顯可以感覺到團隊的算法能力和系統能力都在持續升級。
模型結構
遵循system-algorithm co-design原則,DeepSeek-V3繼續沿用V2中的MLA和MoE結構,其中前者是為了降低kv cache/token開銷,后者是為了降低flops/param開銷。
1)MLA技術我之前就有介紹[1],簡單來說就是通過類似LoRA的方式對kv進行降維壓縮,同時將升維操作轉移到Q和O上,避免反復解壓縮。遺憾的是,MLA并沒有收獲太多關注。一個可能的原因是,它跟MQA相比似乎沒有表現出什么優勢[2],反而增加了系統復雜度。
2)MoE結構,不同于Mixtral中大專家的設計(將稠密模型中的MLP結構復制8份),DeepSeek-V3采用大量“小專家”的設計,能夠顯著提升模型的稀疏程度(總參數量除以激活參數量)。相比V2的236B總參數(21B激活參數),V3更加激進地引入256個專家,總參數量達到驚人的671B,而激活參數量僅僅增加到37B。
根據技術報告里的數據,得益于更加稀疏的MoE設計,以及系統上的一系列優化,訓練V3每trillion數據的GPU小時數僅僅為180K(而V2對應的GPU小時數為172.8K),可謂是將V2技術報告標題中的Economical(性價比)貫徹到底。
3)除了繼承V2的模型設計,V3中使用先前發布的auxiliary-loss-free策略[3]來緩解專家之間的負載不均衡(學術探索的技術能夠如此迅速地上線到自家大模型,可見DeepSeek對于創新的重視程度)。另外,V3引入了multi-token prediction(MTP),不僅可以在訓練時提供更多監督信息,還可以在推理時結合投機采樣加速模型解碼。從論文匯報的效果來看,MTP會是一個不錯的訓練技巧。
訓練優化
對于訓練而言,最引人注目的自然是FP8的使用。DeepSeek-V3據我所知,是第一個(至少在開源社區內)成功使用FP8混合精度訓練得到的大號MoE模型。
眾所周知,FP8伴隨著數值溢出的風險,而MoE的訓練又非常不穩定,這導致實際大模型訓練中BF16仍舊是主流選擇?,F有FP8方案[4]的訓練困難主要來自兩個方面,一個是粗粒度的per-tensor E4M3量化會因為個別異常值增加量化誤差,另一個則是反向過程中使用的E5M2格式會帶來較大的舍入誤差。
為了解決以上問題,DeepSeek-V3在訓練過程中統一使用E4M3格式,并通過細粒度的per-tile(1x128)和per-group(128x128)量化來降低誤差。這種設計更加接近micro-scaling格式[5],然而,當前硬件架構并不支持這種格式的運算,這給FP8矩陣乘法的實現帶來了挑戰(需要通過partial sum的方式來實現)。
盡管DeepSeek-V3展示了per-tile和per-group量化對于模型收斂的重要性,論文中并沒有給出對應的FP8矩陣乘法的算子效率。另外,論文中缺乏per-token加per-channel量化的討論,不清楚這種實現上更加友好的量化方法對于訓練穩定性的影響會有多大。
當然,FP8的好處還體現在節省顯存上(尤其是激活值)。此外,DeepSeek-V3使用BF16來保存優化器狀態,以及對部分操作進行選擇性重計算(例如RMSNorm, MLA Up-Proj, SwiGLU)。顯存的優化有助于設計更好的并行策略,例如可以減少甚至消除張量并行的使用。
在并行策略上,DeepSeek-V3使用64路的專家并行,16路的流水線并行,以及數據并行(ZeRO1)。其中,專家并行會引入all2all通信,由于每個token會激活8個專家,這導致跨節點的all2all通信開銷成為主要的系統瓶頸。
為了降低通信開銷,在算法層面,DeepSeek-V3使用分組路由的方式,限制每個token只會激活4個節點上的專家,從而減半跨節點的通信流量。在系統層面,將節點間通信和節點內通信進行流水,最大化使用網絡帶寬和NVLink帶寬。
通過以上優化,DeepSeek-V3可以將通信計算比例控制在大約1:1,這為后面的通信隱藏帶來了機會。具體來說,我們可以將不同micro-batches里前向和反向的計算通信任務做并發調度,使得計算和通信盡可能相互掩蓋。
對于流水線并行,DeepSeek-V3設計了類似于Chimera[6] 中的雙向流水來降低bubble,而沒有采用更加常見的interleaved 1F1B(盡管interleaved 1F1B中的steady階段同樣可以將前向和反向的計算通信相互進行隱藏)。
推理優化
最后,DeepSeek-V3模型的部署同樣十分挑戰。
對于MoE模型來說,開源框架大多沿用稠密模型的推理方案,例如Mixtral模型仍舊采用張量并行的方式部署。然而,這種處理方式使得MoE模型相比稠密模型在推理上失去優勢。這是因為,MoE節省flops的好處主要體現在計算密集的prefill階段,而在訪存密集的decode階段,MoE巨大的參數量然而會帶來更加昂貴的數據搬移開銷。哪怕能解決訪存密集的問題,MoE參數消耗如此多昂貴的HBM空間,這可能也不是一個相當劃算的決定。
可見,要發揮出MoE架構在推理側的價值,必須改變并行策略,回到訓練時DP+EP的方式。這意味著我們需要使用更大的機器單元來部署MoE模型,并盡可能避免專家層的冗余存儲,從而降低每個設備上的模型參數量,緩解HBM容量和帶寬的壓力。
在這種部署方案下,負載均衡和all2all通信成為了核心挑戰。了解以上背景之后,讓我們回到DeepSeek-V3的推理方案。
首先,DeepSeek-V3采取PD分離的方式,分別應對prefill和decode兩階段的挑戰。
在prefill階段,attention模塊采用4路張量并行+8路數據并行,moe模塊采用32路專家并行。這樣并行的目的是在滿足首token時延的要求下,最大化系統吞吐(和訓練任務類似)。
在decode階段,DeepSeek-V3采取320路專家并行(256個小專家+64個熱點專家),有效降低解碼時延,并緩解負載不均衡的問題。
最后,為了填充all2all通信階段的設備空閑時間,DeepSeek-V3采用NanoFlow[7]中的雙流推理策略,將不同micro-batch中的計算和通信任務并發執行,從而提高設備資源利用率。
參考
如何看待 DeepSeek 發布的 MoE 大模型 DeepSeek-V2?https://zhihu.com/question/655172528/answer/3504750755
MLA通過增加attention head數量來彌補精度損失,同樣的技巧也可以應用到MQA。目前缺少二者的公平對比
Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts, https://arxiv.org/abs/2408.15664
Using FP8 with Transformer Engine, https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html
Microscaling Data Formats for Deep Learning, https://arxiv.org/abs/2310.10537
Chimera: Efficiently Training Large-Scale Neural Networks with Bidirectional Pipelines, https://arxiv.org/abs/2107.06925
NanoFlow: Towards Optimal Large Language Model Serving Throughput, https://arxiv.org/html/2408.12757v1
歡迎大家掃碼進群學習交流
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.