一,、背景 本著求真務(wù)實(shí)的態(tài)度,我們這里詳細(xì)介紹一下 DeepSeek V3 技術(shù)報(bào)告中的關(guān)鍵技術(shù),,也補(bǔ)充了一些細(xì)節(jié),;考慮到已經(jīng)很多文章提到 DeepSeek V3 的各種評(píng)估指標(biāo),我們這里就不再贅述,,聚焦在模型結(jié)構(gòu)和 Infra 建設(shè)兩個(gè)部分,。 對(duì)應(yīng)的論文為:[2412.19437] DeepSeek-V3 Technical Report [1] 對(duì)應(yīng)的代碼庫(kù)為:GitHub - deepseek-ai/DeepSeek-V3 [2] 二、摘要DeepSeek-V3 是一個(gè) MoE(Mixture-of-Experts)語(yǔ)言模型,,總參數(shù)量 671B,,每個(gè) Token 激活的參數(shù)量為 37B。為實(shí)現(xiàn)高效訓(xùn)練與推理,,DeepSeek-V3 延續(xù)了 DeepSeek-V2 的 MLA(Multi-head Latent Attention)及 DeepSeekMoE 架構(gòu),。此外,,DeepSeek-V3 首創(chuàng)了無需輔助損失的負(fù)載均衡策略,還使用了多 Token 預(yù)測(cè)訓(xùn)練目標(biāo)以增強(qiáng)性能,。 作者在 14.8T 高質(zhì)量 Token 上對(duì) DeepSeek-V3 進(jìn)行預(yù)訓(xùn)練,,隨后通過監(jiān)督微調(diào)與強(qiáng)化學(xué)習(xí)階段充分挖掘其潛力。全面評(píng)估顯示,,DeepSeek-V3 超越了其他開源模型,,性能與領(lǐng)先的閉源模型相當(dāng)。盡管表現(xiàn)出色,,DeepSeek-V3 的完整訓(xùn)練僅需 2.788M H800 GPU 小時(shí),,且訓(xùn)練過程異常穩(wěn)定,整個(gè)過程沒有遭遇不可恢復(fù)的 Loss Spike 或進(jìn)行任何回滾操作,。 三,、模型架構(gòu)3.1 模型結(jié)構(gòu)概覽如下圖 Figure 2 所示,DeepSeek-V3 的模型結(jié)構(gòu)與 DeepSeek-V2 一致,,依然是 MLA + DeepSeekMoE,,總參數(shù) 671B,激活參數(shù) 37B,??偣?61 層,Hidden 維度為 7168:
3.2 MLA如下圖公式 1-11 列出了 MLA 中的關(guān)鍵公式,,我們?cè)谶@里標(biāo)注了相應(yīng)的 Shape 信息,,以便與上圖中相對(duì)應(yīng): 如上圖可知,對(duì)于每一個(gè) Token,,推理時(shí)在每一個(gè) Transformer Layer 需要需要緩存的 Cache 為藍(lán)色的兩個(gè)方塊,,大小為 512+64=576,。而標(biāo)準(zhǔn) MHA 需要緩存的大小為 2 * Hidden 維度 ,即 2*7168=14336,,也就是 DeepSeek V3 的 MLA 的 Cache 大小只有 MHA 的 1/25,。 3.3 MoE3.3.1 無需輔助損失的負(fù)載均衡策略具體來說,作者采用了 DeepSeek AI 論文 [2408.15664] Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts [3] 中的負(fù)載均衡策略,,具體來說,,其通過動(dòng)態(tài)更新每個(gè)專家的偏置(b)來維持專家的負(fù)載均衡,而不會(huì)引入額外的干擾梯度,。如下圖公式 16 和 Figure 1 所示: 3.3.2 補(bǔ)充的序列級(jí)輔助損失盡管 DeepSeek-V3 主要依賴于無輔助損失的策略來實(shí)現(xiàn)負(fù)載平衡,,但為了防止在任何單一序列中出現(xiàn)極端的不平衡,作者采用了一種補(bǔ)充的序列級(jí)均衡損失: 其中,,α 為平衡因子超參數(shù),,T 表示序列中 Token 個(gè)數(shù),Nr 表示專家個(gè)數(shù),,Topk 表示選擇分?jǐn)?shù)最大的 Kr 個(gè)專家,,表示一個(gè)序列中歸一化后第 t 個(gè) Token 在第 i 個(gè)專家的分?jǐn)?shù)。1(?) 表示指示函數(shù),,其值為 1 表示某條件成立,,為 0 表示不成立,比如第 t 個(gè) Token 未在專家 i 的 Topk 中,,則值為 0,。 實(shí)際上,Pi 可以理解為每個(gè)專家在所有 Token 上的平均分?jǐn)?shù),,fi 表示第 i 個(gè)專家在整個(gè)序列中的“被選中”頻率,,用來衡量它的負(fù)載相對(duì)于其他專家的分布情況。這種序列級(jí)均衡損失的目的是鼓勵(lì)每個(gè)序列中的專家負(fù)載更加均衡,,避免負(fù)載集中在少數(shù)專家上,,從而提高模型的效率和公平性。 3.3.3 節(jié)點(diǎn)約束路由與 DeepSeek-V2 所采用的設(shè)備約束路由類似,,DeepSeek-V3 同樣使用了一種約束路由機(jī)制以控制訓(xùn)練過程中的通信開銷,。簡(jiǎn)而言之,作者確保每個(gè) Token 最多被發(fā)送至 M 個(gè)節(jié)點(diǎn),,這些節(jié)點(diǎn)的選擇依據(jù)是分布在各節(jié)點(diǎn)上的專家中,,其親和度得分最高的 Kr/M 項(xiàng)之和。在此約束下,,MoE 訓(xùn)練框架幾乎能夠?qū)崿F(xiàn)計(jì)算與通信的完全重疊,。 3.3.4 無 Token 丟棄得益于高效的負(fù)載均衡策略,DeepSeek-V3 在整個(gè)訓(xùn)練過程中保持了良好的負(fù)載平衡,。因此,,DeepSeek-V3 在訓(xùn)練期間未丟棄任何 Token,。此外,作者還實(shí)施了特定的部署策略以確保推理過程中的負(fù)載均衡,,故 DeepSeek-V3 在推理階段同樣不會(huì)丟棄 Token,。 3.4 MTP3.4.1 MTP 實(shí)現(xiàn)受 Meta 的 [2404.19737] Better & Faster Large Language Models via Multi-token Prediction [4](如下圖所示,我們之前也介紹過)的啟發(fā),,作者在 DeepSeek V3 中使用了多 Token 預(yù)測(cè)(Multi Token Predicton,,MTP)目標(biāo),該目標(biāo)將預(yù)測(cè)范圍擴(kuò)展到每個(gè)位置上的多個(gè)未來 Token,。有兩個(gè)好處:
如下圖 Figure 3 展示了 MTP 的具體實(shí)現(xiàn)。與上圖 Meta 論文中采用獨(dú)立輸出 Head 并行預(yù)測(cè) D 個(gè)額外 Token 不同,,作者采用順序預(yù)測(cè)額外 Token 的方式,,并在每一預(yù)測(cè)深度保持完整的因果鏈。
3.4.2 MTP 推理MTP 策略主要用于提升 Main Model 的性能,因此在推理階段,,可以直接舍棄 MTP Module,,Main Model 仍能獨(dú)立且正常運(yùn)行。此外,,還可將這些 MTP Module 用于投機(jī)解碼,,以進(jìn)一步降低生成延遲。 四,、Infra 建設(shè)4.1 計(jì)算集群DeepSeek V3 在包含 2048 H800 GPU 的集群上訓(xùn)練,每個(gè)節(jié)點(diǎn)包含 8 個(gè) H800 GPU,,并使用 NVLink + NVSwitch 實(shí)現(xiàn)全互聯(lián)(需要說明的是,,H800 的 NVLink 帶寬為 400 GB/s,,而 H100 的 NVLink 帶寬為 900 GB/s,這也是 H800 與 H100 的主要區(qū)別),。此外,,節(jié)點(diǎn)間通過 IB 網(wǎng)絡(luò)實(shí)現(xiàn)互聯(lián)。 PS:作者在后文中提到其 NVLink 提供了 160 GB/s 的通信帶寬,,大約是 IB(50 GB/s)的 3.2x,。其 160 GB/s 與實(shí)際的 400 GB/s(雙向)不符,推測(cè)這里是單向?qū)崪y(cè)帶寬,。如下圖所示,,我們?cè)?8*H100 GPU 上實(shí)測(cè)單向的 device to device Memory 帶寬,大約為 900 GB/s * 80% / 2 = 360 GB/s,。而 160 GB/s 為 400 GB/s * 80% /2 = 160 GB/s,。 而 IB(50 GB/s)可以理解為理論或?qū)嶋H NIC 帶寬,H100/H800 上后向網(wǎng)絡(luò)通常都會(huì)采用 400 Gb/s 的 NIC,。如下圖所示(使用 ib_write_bw 和 ib_read_bw 測(cè)試),,當(dāng) Message 比較大時(shí),發(fā)送或者接收實(shí)測(cè)帶寬最大都能達(dá)到 400 Gb/s,,雙向總帶寬可以達(dá)到 800 Gb/s(這一點(diǎn)與 NVLink 口徑不同),。另外,也可以推測(cè)每個(gè)節(jié)點(diǎn)包含 8 個(gè) 400 Gb/s 的 NIC,。 4.2 訓(xùn)練框架4.2.1 概覽DeepSeek V3 使用自研的 HAI-LLM 框架訓(xùn)練(在幻方 AI 的技術(shù)博客有介紹:HAI-LLM:高效且輕量的大模型訓(xùn)練工具 [5]),,其相應(yīng)的分布式策略為:16 PP(Pipelining Parallelism),64 EP(Expert Parallelism)以及 ZeRO-1 DP(Data Parallelism),。此外,,64 EP 分布在 8 個(gè)節(jié)點(diǎn)上。 為了高效訓(xùn)練,,作者實(shí)施了精細(xì)的工程優(yōu)化:
4.2.2 DualPipe 算法對(duì)于 DeepSeek V3 而言,跨節(jié)點(diǎn) EP 引入的通信開銷導(dǎo)致計(jì)算與通信比約為 1:1,,效率很低,。為了應(yīng)對(duì)這一挑戰(zhàn),作者設(shè)計(jì)了一種創(chuàng)新的流水線并行算法 DualPipe,。 DualPipe 的核心思想在于將一對(duì)獨(dú)立的 Forward 與 Backward Chunk 內(nèi)的計(jì)算與通信進(jìn)行 Overlap,。具體而言,將每個(gè) Chunk 劃分為四個(gè)組件:Attention,、All2All Dispatching,、MLP 及 All2All Combining。 其中的 All2All Dispatching 和 All2All Combining 如下所示,,就是 MoE Block 之前和之后的兩個(gè) All2All 通信: 特別地,,對(duì)于 Backward Chunk,作者借鑒了 ZeroBubble([2401.10241] Zero Bubble Pipeline Parallelism [6]),,如下圖 Figure 1 所示,,Attention 與 MLP 均可進(jìn)一步分為兩部分:Backward for Input 及 Backward for Weight。此外,,還有一個(gè) PP 通信組件,。 如下圖 Figure 4 所示,針對(duì)一對(duì) Forward 與 Backward Chunk,,重新排列這些組件,,并手動(dòng)調(diào)整 GPU SM 在通信與計(jì)算間的分配比例。在此 Overlap 策略下,,能夠確保 All2All 和 PP 通信在執(zhí)行過程中完全隱藏,,其中:
完整的 DualPipe 調(diào)度如下圖 Figure 5 所示,其采用雙向 PP 調(diào)度,,同時(shí)從流水線兩端輸入 Micro Batch,,使得大部分通信得以完全 Overlap(PS:8PP,雙向 20 Micro Batch,,反方向 10-19 的 10 個(gè) Micro Batch 并沒有列出來,,因此我們用紅色 10-19 補(bǔ)充了部分 Micro Batch)。這種 Overlap 還確保了隨著模型進(jìn)一步擴(kuò)展,,只要保持恒定的計(jì)算與通信比,,仍可在跨節(jié)點(diǎn)部署細(xì)粒度專家的同時(shí),實(shí)現(xiàn)近乎零的 All2All 通信開銷,。 PS:正常來說是無法實(shí)現(xiàn)雙向 PP 調(diào)度的,,主要是因?yàn)?Forward 執(zhí)行順序是從前往后,比如從 Layer 0,1,2,...,14,15,,而 Backward 執(zhí)行順序是從后往前,,比如 Layer 15,14,...,2,1,0,。而常見 PP 中的 Layer 只會(huì)在某一個(gè) PP Stage,比如 8 PP,,那么:
而 DeepSeek V3 的雙向 PP 調(diào)度中,,還是 8 PP 為例:
此外,即便在通信負(fù)擔(dān)不重的更一般場(chǎng)景下,,DualPipe 仍展現(xiàn)出效率優(yōu)勢(shì),。如下圖 Table 2 所示,作者總結(jié)了不同 PP 方案下的 PP Bubble 與內(nèi)存使用情況,。與 ZB1P 相比,,DualPipe 在減少 PP Bubble 及優(yōu)化內(nèi)存占用方面表現(xiàn)更佳。其中的 Parameter x2 是正如上述所示,,存儲(chǔ)了 2 份相同的模型參數(shù),,也就需要占用更大的內(nèi)存(激活的占用也會(huì)稍微增加),相當(dāng)于用空間換時(shí)間,;然而,,因?yàn)樽髡哂?xùn)練時(shí)采用了比較大的 EP,整體來說并不會(huì)增加太多內(nèi)存占用,。此外,,DualPipe 僅要求 PP Stage 和 Micro Batch 可被 2 整除,無需 Micro Batch 可被 PP Stage 數(shù)整除,。 PS:對(duì)于一個(gè)內(nèi)部框架(HAI-LLM)而言,,完全可以針對(duì)自己的硬件環(huán)境(集群)以及模型場(chǎng)景(MLA + MoE)制定專有化的優(yōu)化方案,比如手動(dòng)調(diào)整 SM 在計(jì)算和通信中的比例,,從而獲得比開源方案更優(yōu)的性能,。 4.2.3 高效跨節(jié)點(diǎn) All2All 通信為了確保 DualPipe 具有足夠的計(jì)算性能,作者定制了高效的跨節(jié)點(diǎn) All2All 通信 Kernel(包括 Dispatching 和 Combining),,以節(jié)省專用于通信的 SM 數(shù)量,。Kernel 的實(shí)現(xiàn)與 MoE Gating 算法及集群的網(wǎng)絡(luò)拓?fù)涔餐O(shè)計(jì)。 具體來說,,在作者的集群中,,跨節(jié)點(diǎn) GPU 與 IB 完全互連,節(jié)點(diǎn)內(nèi)通信通過 NVLink 處理,。NVLink 提供 160 GB/s 帶寬,,大約是 IB(50 GB/s)的 3.2x,。
通過上述方式,,IB 和 NVLink 的通信也可以完全 Overlap,每個(gè) Token 可以有效地為每個(gè)節(jié)點(diǎn)平均選擇 3.2 個(gè)專家,,而不會(huì)產(chǎn)生 NVLink 的額外開銷,。這意味著,盡管 DeepSeek V3 在實(shí)踐中只選擇了 8 個(gè)路由專家,,但它可以將這個(gè)數(shù)字擴(kuò)展到最多 13 個(gè)專家(4 個(gè)節(jié)點(diǎn) × 3.2 個(gè)專家/節(jié)點(diǎn)),,同時(shí)保持相同的通信成本??偟膩碚f,,在這樣的通信策略下,只用 20 個(gè) SM 足以充分利用 IB 和 NVLink 的帶寬,。 具體而言,,作者采用了 warp specialization 技術(shù),,并將 20 個(gè) SM 劃分為 10 個(gè)通信通道,。
4.2.4 降低內(nèi)存開銷為降低訓(xùn)練過程中的內(nèi)存占用,作者采用了以下技術(shù)手段,。 RMSNorm 與 MLA 上投影重計(jì)算。在 Backward 階段,,對(duì)所有 RMSNorm 操作及 MLA 上投影進(jìn)行重計(jì)算,,從而無需持久化存儲(chǔ)其輸出激活值。此策略雖引入少量額外計(jì)算開銷,,卻顯著減少了存儲(chǔ)激活值所需的內(nèi)存空間,。 CPU 中的指數(shù)移動(dòng)平均(EMA)。訓(xùn)練期間,,為了在學(xué)習(xí)率衰減后盡早評(píng)估模型性能,,作者保留了模型參數(shù)的 EMA。這些 EMA 參數(shù)存儲(chǔ)于 CPU 內(nèi)存中,,并在每一步訓(xùn)練后異步更新,。該方法使作者能在不增加額外內(nèi)存或時(shí)間開銷的前提下維護(hù) EMA 參數(shù)。 MTP 的共享 Embedding 與輸出 Head,。采用 DualPipe 策略,,作者將模型的最淺層(含 Embedding)與最深層(含輸出 Head)部署于同一 PP Stage 上。這種安排使得 MTP Module 與 Main Model 之間能夠物理共享 Embedding 與輸出 Head 的參數(shù)及梯度,。這一物理共享機(jī)制進(jìn)一步提升了內(nèi)存使用效率(PS:也就是 Huggingface Transformers 中的 tie_word_embeddings),。 4.3 FP8 訓(xùn)練4.3.1 概述NVIDIA 和零一萬物等都介紹過在 Hopper GPU 上使用 FP8 訓(xùn)練來提升訓(xùn)練速度的方案(我們?cè)谥暗奈恼轮幸灿性敿?xì)的介紹)。受此啟發(fā),,作者也在訓(xùn)練 DeepSeek V3 的過程中采用了 FP8 的細(xì)粒度混合精度訓(xùn)練,。 作者通過與兩種不同規(guī)模基線模型的 BF16 訓(xùn)練進(jìn)行對(duì)比,,驗(yàn)證了提出的 FP8 混合精度框架的有效性,。
如下圖 Figure 10 展示了其訓(xùn)練曲線,,證明采用高精度累加和細(xì)粒度量化策略后,相對(duì)誤差始終保持在 0.25% 以下,。 4.3.2 混合精度框架作者的 FP8 混合精度訓(xùn)練框架中,,大多數(shù)計(jì)算密集型操作以 FP8 執(zhí)行,而少數(shù)關(guān)鍵操作則保留其原始數(shù)據(jù)格式,,以平衡訓(xùn)練效率與數(shù)值穩(wěn)定性,。整體框架如下圖 Figure 6 所示。 首先,,為加速模型訓(xùn)練,,關(guān)鍵計(jì)算 Kernel(比如,GEMM 操作)大多采用 FP8 精度實(shí)現(xiàn),。這些 GEMM 操作接受 FP8 Tensor 作為輸入,,并輸出 BF16 或 FP32 格式的結(jié)果。如下圖 Figure 6 所示,,與線性算子相關(guān)的三個(gè) GEMM 操作,,包括 Forward(Fprop)、激活 Backward(Dgrad)和權(quán)重 Backward(Wgrad),,均以 FP8 執(zhí)行,。這一設(shè)計(jì)理論上使計(jì)算速度較原 BF16 方法提升一倍。此外,,FP8 Wgrad GEMM 允許激活值以 FP8 存儲(chǔ),,供 Backward 使用,從而顯著降低內(nèi)存消耗,。 盡管 FP8 格式具有效率優(yōu)勢(shì),,但某些算子因?qū)Φ途扔?jì)算比較敏感仍需更高精度。同時(shí),,一些低成本算子也可采用更高精度,,對(duì)整體訓(xùn)練性能的影響微乎其微。因此,,作者對(duì)以下組件保持原始精度(如 BF16 或 FP32):Embedding Module,、輸出 Head、MoE 門控模塊,、歸一化算子及 Attention 算子,。這些有針對(duì)性的高精度保留確保了 DeepSeek-V3 的訓(xùn)練動(dòng)態(tài)穩(wěn)定性。為進(jìn)一步保證數(shù)值穩(wěn)定性,,作者將主權(quán)重,、權(quán)重梯度和優(yōu)化器狀態(tài)以更高精度存儲(chǔ),。盡管這些高精度組件帶來一定的內(nèi)存開銷,但通過分布式訓(xùn)練系統(tǒng)中跨多個(gè) DP Rank 的有效分片,,其影響很小,。 4.3.3 提升精度作者還引入了若干策略以提升低精度訓(xùn)練的準(zhǔn)確性,重點(diǎn)在于量化方法與乘法過程的優(yōu)化,。 細(xì)粒度量化,。由于 FP8 格式動(dòng)態(tài)范圍有限,上溢和下溢是常見的挑戰(zhàn),。標(biāo)準(zhǔn)做法是 Per Tensor 量化,,會(huì)導(dǎo)致低精度訓(xùn)練對(duì)激活異常值極為敏感,嚴(yán)重降低量化精度,。為解決此問題,,作者提出了一種細(xì)粒度量化方法。如下圖 7a 所示:
該方法的關(guān)鍵改進(jìn)是在 GEMM 操作中引入按組縮放因子,。不過,,這一功能在標(biāo)準(zhǔn)的 FP8 GEMM 中并未直接支持。然而,,結(jié)合精確的 FP32 累加策略,,它可以被高效實(shí)現(xiàn)。值得注意的是,,這里的細(xì)粒度量化策略與 Microscaling Format([2310.10537] Microscaling Data Formats for Deep Learning [7])的理念高度一致,,而 NVIDIA 下一代 GPU(Blackwell 系列)的 Tensor Core 已宣布支持具有更小量化粒度的 Microscaling Format。 提升累加精度,。低精度的 GEMM 操作常面臨下溢問題,,其準(zhǔn)確性很大程度上依賴于高精度的累加,通常采用 FP32 進(jìn)行,。然而,,作者觀察到,在 NVIDIA H800 GPU 上,,FP8 GEMM 的累加精度僅能保留約 14 位,,遠(yuǎn)低于 FP32 的累加精度,。當(dāng)內(nèi)部維度 K 較大時(shí),這一問題更加突出,,這在大規(guī)模模型訓(xùn)練中尤為常見,。以 K=4096 的兩個(gè)隨機(jī)矩陣的 GEMM 操作為例,在作者的初步測(cè)試中,,Tensor Core 受限的累加精度導(dǎo)致最大相對(duì)誤差接近 2 %,。盡管如此,有限的累加精度仍是部分 FP8 框架的默認(rèn)選項(xiàng),,嚴(yán)重制約了訓(xùn)練精度,。 為解決此問題,作者采用了 Cutlass(GitHub - NVIDIA/cutlass: CUDA Templates for Linear Algebra Subroutines [8])中的方案,,借助 CUDA Core 以獲取更高精度,。具體來說,該過程如上圖 7b 所示,,在 Tensor Core 上執(zhí)行 MMA,,中間結(jié)果以有限位寬累加。一旦達(dá)到 Nc 間隔,,這些中間結(jié)果將被復(fù)制到 CUDA Core 的 FP32 寄存器中,,進(jìn)行全精度的 FP32 累加。然后可以結(jié)合前面的細(xì)粒度量化,,沿內(nèi)部維度 K 應(yīng)用每組的縮放因子,。這些縮放因子在 CUDA Core 上高效地作為反量化過程進(jìn)行乘法運(yùn)算,額外計(jì)算成本極低,。 值得注意的是,,這一修改會(huì)降低單個(gè) WGMMA(Warpgroup Level 矩陣乘加)指令發(fā)射率。但在 H800 架構(gòu)上,,通常兩個(gè) WGMMA 會(huì)同時(shí)存在:當(dāng)一個(gè) Warpgroup 執(zhí)行 promotion 操作時(shí),,另一個(gè)可執(zhí)行 MMA 操作。此設(shè)計(jì)實(shí)現(xiàn)了兩個(gè)操作的 Overlap 執(zhí)行,,確保了 Tensor Core 的高利用率,。根據(jù)實(shí)驗(yàn)數(shù)據(jù),設(shè)定 Nc 為 128 個(gè)元素,,相當(dāng)于 4 次 WGMMA 操作構(gòu)成最小累加間隔,,這一設(shè)置能在不引入顯著開銷的前提下顯著提升計(jì)算精度。 尾數(shù)優(yōu)先于指數(shù),。與先前研究采用的混合 FP8 格式不同,,該格式在前向傳播中使用 E4M3(4 位指數(shù)和 3 位尾數(shù)),在數(shù)據(jù)梯度和權(quán)重梯度中使用 E5M2(5 位指數(shù)和 2 位尾數(shù)),作者則對(duì)所有 Tensor 采用 E4M3 格式以追求更高精度,。此方法可行主要是使用了細(xì)粒度的量化策略,,通過對(duì)更小的元素組進(jìn)行操作,可以有效地在這些分組元素間共享指數(shù)位,,從而緩解了有限動(dòng)態(tài)范圍的影響,。 在線量化。常見的 Tensor level 量化框架中采用 Delayed Scaling,,通過保留先前迭代中的 amax(最大絕對(duì)值)history 來推斷當(dāng)前值,。為了確保量化 Scale 準(zhǔn)確并簡(jiǎn)化框架,作者在線計(jì)算每個(gè) 1x128 激活 Tile 或 128x128 權(quán)重 Block 的 amax,,基于此推導(dǎo)出 scaling 因子,,隨后在線將激活或權(quán)重量化為 FP8 格式。 如下圖為 NVIDIA Transformer Engine 中的 Delayed Scaling 實(shí)現(xiàn)方案,,其 amax history 最多可以存儲(chǔ) 1024 個(gè) history,。在進(jìn)行當(dāng)前 Tensor 的 Scaling 操作時(shí),會(huì)使用當(dāng)前 Tensor 之前的 amax history 來預(yù)測(cè)當(dāng)前的 amax(比如之前 history 的最大值),,然后進(jìn)行 Scaling 操作,;Scaling 操作的同時(shí)會(huì)計(jì)算當(dāng)前的 amax,并更新 amax history,。 4.3.4 低精度存儲(chǔ)和通信作者還通過將緩存的激活值和優(yōu)化器狀態(tài)壓縮為低精度格式,,進(jìn)一步減少內(nèi)存消耗和通信開銷。 低精度優(yōu)化器狀態(tài),。采用 BF16 而非 FP32 來存儲(chǔ) AdamW 優(yōu)化器中的一階矩和二階矩,,而不會(huì)引起可觀察到的性能下降。然而,,主權(quán)重(由優(yōu)化器存儲(chǔ))和梯度仍使用 FP32 存儲(chǔ),以確保整個(gè)訓(xùn)練過程中的數(shù)值穩(wěn)定性,。 低精度激活,。如上圖 Figure 6 所示,Wgrad 操作使用 FP8 執(zhí)行,。為了減少內(nèi)存消耗,,作者將激活值以 FP8 格式緩存用于線性算子的 Backward。不過,,對(duì)于低成本高精度訓(xùn)練,,會(huì)對(duì)幾個(gè)算子特殊處理:
低精度通信。在 MoE 模型訓(xùn)練中,,通信帶寬是一個(gè)關(guān)鍵瓶頸,。為緩解這一挑戰(zhàn),作者在 MoE 上投影前將激活量化為 FP8,,隨后應(yīng)用 Dispatching,,這與 MoE 上投影中的 FP8 Forward 兼容。如同 Attention 算子后線性層的輸入,,此激活的縮放因子為 2 的整數(shù)冪,,類似策略也應(yīng)用于 MoE 下投影前的激活梯度。對(duì)于 Forward 和 Backward 的 Combining,,保持其 BF16 格式,,以確保訓(xùn)練流程關(guān)鍵部分的訓(xùn)練精度。 4.4 推理部署作者在 H800 集群上部署 DeepSeek-V3,,其中每個(gè)節(jié)點(diǎn)內(nèi)的 GPU 通過 NVLink 互連,,而集群中的所有 GPU 則通過 IB 實(shí)現(xiàn)全互聯(lián)。為了同時(shí)確保在線服務(wù)的 SLO 和高吞吐量,,作者采用了以下部署策略,,該策略將 Prefill 階段和 Decoding 階段分離。 4.4.1 PrefillPrefill 階段的最小部署單元由 4 個(gè)節(jié)點(diǎn)組成,,共 32 個(gè) H800 GPU,。
在 MoE 的 All2All 通信中,采用與訓(xùn)練階段相同的方法:首先通過 IB 在節(jié)點(diǎn)間傳輸 Token,然后通過 NVLink 在節(jié)點(diǎn)內(nèi)的 GPU 間轉(zhuǎn)發(fā),。特別地,,對(duì)于淺層密集 MLP,采用 1TP 以節(jié)省 TP 通信開銷,。 為了實(shí)現(xiàn) MoE 部分不同專家間的負(fù)載均衡,,需確保每個(gè) GPU 處理大致相同數(shù)量的 Token。作者引入了一種冗余專家部署策略,,即對(duì)高負(fù)載專家進(jìn)行復(fù)制并冗余部署,。高負(fù)載專家基于在線部署期間收集的統(tǒng)計(jì)數(shù)據(jù)檢測(cè)并定期調(diào)整(如每 10 分鐘一次)。確定冗余專家集合后,,根據(jù)觀察到的負(fù)載情況,,在節(jié)點(diǎn)內(nèi)的 GPU 間精心重新安排專家,力求在不增加跨節(jié)點(diǎn) All2All 通信開銷的前提下,,盡可能平衡各 GPU 的負(fù)載,。對(duì)于 DeepSeek-V3 的部署,作者為 Prefill 階段設(shè)置了 32 個(gè)冗余專家,。每個(gè) GPU 除了原本承載的 8 個(gè)專家外(256/32),,還將額外承載一個(gè)冗余專家。 此外,,在 Prefill 階段,,為了提高吞吐量并隱藏 All2All 和 TP 通信的開銷,作者同時(shí)處理兩個(gè)計(jì)算工作量相近的 Micro Batch,,將一個(gè) Micro Batch 的 Attention 和 MoE 計(jì)算與另一個(gè) Micro Batch的 Dispatching 和 Combining Overlap 執(zhí)行,。 最后,作者還在探索一種動(dòng)態(tài)專家冗余策略,,其中每個(gè) GPU 承載更多專家(例如,,16 個(gè)專家,每次推理步驟僅激活 9 個(gè),。在每層 All2All 操作啟動(dòng)前,,實(shí)時(shí)計(jì)算全局最優(yōu)路由方案。鑒于 Prrefill 階段涉及大量計(jì)算,,計(jì)算此路由方案的開銷幾乎可忽略不計(jì),。 4.4.2 Decoding在 Decoding 過程中,,將共享專家視為路由專家之一,。由此視角出發(fā),每個(gè) Token 在路由時(shí)會(huì)選擇 9 個(gè)專家,,其中共享專家被視為高負(fù)載專家,,始終被選中。Decoding 階段的最小部署單元由 40 個(gè)節(jié)點(diǎn)組成,共 320 H800 GPU,。
與 Prefill 階段類似,,基于在線服務(wù)的專家負(fù)載統(tǒng)計(jì)數(shù)據(jù),,在特定間隔內(nèi)定期確定冗余專家集合。然而,,由于每個(gè) GPU 僅承載一位專家,,因此無需重新安排專家。作者也在探索 Decoding 階段的動(dòng)態(tài)冗余策略,,但這需要對(duì)計(jì)算全局最優(yōu)路由方案的算法進(jìn)行更為精細(xì)的優(yōu)化,,并與 Dispatching Kernel 融合以減少開銷。 此外,,為提升吞吐量并掩蓋 All2All 通信的開銷,,作者還在探索 Decoding 階段同時(shí)處理兩個(gè)計(jì)算負(fù)載相近的 Micro Batch。與 Prefill 階段不同,,Attention 機(jī)制在 Decoding 階段占據(jù)更大比例的時(shí)間消耗,。因此,將一個(gè) Micro Batch 的 Attention 計(jì)算與另一個(gè) Micro Batch 的 Dispatching + 專家混合 + Combining Overlap,。在 Decoding 階段,,每位專家處理的 Batch 規(guī)模相對(duì)較小(通常不超過 256 個(gè) Token),,此時(shí)瓶頸在于內(nèi)存訪問而非計(jì)算本身,。鑒于專家混合部分僅需加載單一專家的參數(shù),內(nèi)存訪問開銷極低,,故減少 SM 的使用不會(huì)顯著影響整體性能,。因此,為避免對(duì) Attention 部分的計(jì)算速度造成影響,,作者僅需為 Dispatching + 專家混合 + Combining 分配少量 SM 資源,。 4.5 訓(xùn)練成本DeepSeek V3 的訓(xùn)練成本很低,,如下圖 Table 1 所示,總共訓(xùn)練 2788K H800 小時(shí),,按照每個(gè) H800 每小時(shí) 2 美元的成本,,總成本大約為 560 萬美元。 然而我們也看到很多文章中聲稱 “DeepSeek 把訓(xùn)練成本打下來 99%”,,如下圖所示,,其聲稱 “LLaMA-3.1 的訓(xùn)練成本超過 5 億美元”,Meta 真的這么拉胯嗎,? 如下圖為 LLaMA 3.1 的訓(xùn)練成本(來自 meta-llama/Llama-3.1-8B · Hugging Face [9]),,以 LLaMA 3.1 405B 為主,其總共的訓(xùn)練成本為 30.84M H100 GPU 小時(shí): H800 相比 H100 主要是閹割了 NVLink 的通信帶寬,,整體成本并不會(huì)相差太大,,比如 Pricing | Lepton AI [10] 每個(gè) H100 每小時(shí) 3 美元。自建集群或者大規(guī)模租賃通常會(huì)低于這個(gè)數(shù)值,,假設(shè)為 2.5 美元,,那么 LLaMA 3.1 405B 的訓(xùn)練成本應(yīng)該為 30.84M * 2.5 = 7710 萬美元,聲稱 LLaMA 3.1 的訓(xùn)練成本為 5 億美元確實(shí)非常不妥,。 除此之外,,LLaMA 3.1 的訓(xùn)練成本應(yīng)該還包含實(shí)驗(yàn)、以及故障等問題導(dǎo)致的成本開銷,,如果只考慮有效訓(xùn)練時(shí)長(zhǎng),,上述成本應(yīng)該會(huì)更低。 其實(shí)根據(jù)計(jì)算量也可以簡(jiǎn)單預(yù)估出成本差距應(yīng)該在 10 倍左右,,而不是 100 倍,。
4.6 訓(xùn)練 MFU 預(yù)估4.6.1 計(jì)算公式根據(jù)每個(gè) Token 計(jì)算量(6N)、總的 Token 數(shù),,以及計(jì)算資源就可以大概預(yù)估出訓(xùn)練的總時(shí)長(zhǎng),。如下所示: 訓(xùn)練天數(shù) = Token 數(shù) * Ctoken / (GPU 數(shù) * GPU FLOPs * MFU * 3600 * 24) 根據(jù)以上公式可以預(yù)估使用 8192 H100-80G GPU(BF16 FLOPs 為 989T),10T Token 數(shù)據(jù)訓(xùn)練 175B 模型的天數(shù)為 30 天,,其中假設(shè) MFU 為 50%: 10T*6*175B/(8192*989T*50%)/3600/24=30 天 4.6.2 DeepSeek V3 MFUDeepSeek V3 模型比較特殊,,包含了 MLA 和 MoE,統(tǒng)計(jì)每個(gè) Token 的詳細(xì)計(jì)算量也相對(duì)復(fù)雜,。然而,,考慮到其中最主要的計(jì)算仍是矩陣乘法,依然可以用 6N 來近似,,不過這里的 N 為每個(gè) Token 的激活參數(shù),,而不是總參數(shù)量。 根據(jù)上述公式也可以大概推出 DeepSeek V3 預(yù)訓(xùn)練的 MFU: MFU = (Token 數(shù) * Ctoken) / (訓(xùn)練天數(shù) * GPU 數(shù) * GPU FLOPs * 3600 * 24) MFU = (Token 數(shù) * Ctoken) / (訓(xùn)練 GPU 小時(shí)數(shù) * GPU FLOPs * 3600) 而 DeepSeek-V3 預(yù)訓(xùn)練 14.8T Token,,在 2048 H800 GPU 訓(xùn)練了不到 2 個(gè)月(2664K GPU 小時(shí),, 3.7*24*2048*14.8=2692K),如果上述訓(xùn)練時(shí)長(zhǎng)是純粹的有效訓(xùn)練時(shí)長(zhǎng),,則可以估算其 MFU 為(按 BF16 計(jì)算): (14.8T*37B*6) / (2664K*989T*3600) = 34.7% 除此之外,,作者也提到其采用了 FP8 混合精度訓(xùn)練,其訓(xùn)練速度通常至少是純 BF16 訓(xùn)練速度的 1.2x-1.3x,,則對(duì)應(yīng) BF16 訓(xùn)練的 MFU 很可能在 20%-30% 之間,。對(duì)于 DeepSeek V3 這種 MLA + 細(xì)粒度 MoE 的模型,也算是一個(gè)很不錯(cuò)的性能,。 4.6.3 LLaMA-3.1 MFU相應(yīng)地,,LLaMA 3.1 70B 總共訓(xùn)練了 15T Token,訓(xùn)練了 7.0M H100 小時(shí),,如果按照上述方式推導(dǎo)出的 MFU 為: (15T*70B*6) / (7000K*989T*3600)= 25.2% 同理,,推算出 LLaMA 3.1 405B 的 MFU 為: (15T*405B*6) / (30.84M*989T*3600)= 33.2% 然而,作者在技術(shù)報(bào)告 The Llama 3 Herd of Models | Research - AI at Meta [11] 中提到,,405B 模型訓(xùn)練的 MFU 也能達(dá)到 40% 左右,。此外,根據(jù)我們的經(jīng)驗(yàn),,70B Dense 模型預(yù)訓(xùn)練的 MFU 應(yīng)該在 40% 以上的水平,。而上述計(jì)算出 LLaMA 3.1 70B 的 MFU 只有 25% 左右,那么很可能的原因是上述 7.0M H100 小時(shí)包含了實(shí)驗(yàn),,容錯(cuò)等時(shí)間,。 五、參考鏈接
|
|