
演講嘉賓|鄭加利
編輯 |Kitty
策劃 |QCon 全球軟件開發大會
大模型的訓練過程極其復雜,不僅涵蓋了眾多技術層面,同時也面臨著巨大的挑戰。面對巨大規模的模型參數量與計算量,單靠一張計算卡難以滿足需求,必須依賴多張計算卡進行并行計算。然而大規模集群計算帶來的復雜性顯著增加,在一定程度上拖慢了模型訓練的速度。
在 2025 年 InfoQ 舉辦的 QCon 全球軟件開發大會 上,華為工程師鄭加利分享了《昇騰 MindSpeed:分布式訓練加速庫的創新實踐與突破》,他介紹了昇騰 MindSpeed 分布式訓練加速庫通過在計算、通信以及顯存等多個維度上的優化措施,來加速模型的訓練過程,有效提升了訓練效率,為大模型的訓練提供了強有力支持的實踐案例。
預告:將于 2026 年 4 月 16 - 18 召開的 QCon 北京站策劃了「AI 原生基礎設施」專題,重點交流探討如何構建 AI 原生基礎設施,包括業界容器 / Serverless 等云原生基礎設施如何朝 AI 演進,以及如何利用一些新興分布式技術構建 AI 原生基礎設施等等。如果你也有相關方向案例想要分享,歡迎提交至 https://jinshuju.com/f/Cu32l5。
以下是演講實錄(經 InfoQ 進行不改變原意的編輯整理)。
大模型訓練的趨勢與挑戰
從 ChatGPT 開始,模型的規模越來越大,從千億參數的稠密模型一直到萬億參數的稀疏模型,越來越大的參數量對算力的需求也是越來越大的。以 GPT-3 為例,訓練 300B 的 tokens,3000 張卡差不多要 10 天左右;到了 GPT-4,13000B 的數據量,3000 張卡就差不多要兩年時間,這是非常夸張的。業界為了應對這些挑戰也推出了很多并行方式去解決這些問題,包括 DP、TP、PP 等等。
![]()
MindSpeed 也是支持這些最基礎加速并行技術。
除了之前我們做的傳統的技術摸高,另一個方向是 DeepSeek 的發布開創了新的范式,我們叫做工程創新。之前我們做模型訓練加速時一般都是算法優先,就是說我不能改變模型訓練的效果,它是第一優先級的,我只能在對等的情況下去做各種修改。而 DeepSeek 開創了一個新的路線,它通過一些精度上的可接受的損失極快降低模型訓練的成本,這也是未來業界需要挖掘的新方向。
業界加速庫
當前業界比較有名的加速庫最主要的就是這兩個,一個是英偉達的 Megatron,另一個就是微軟的 DeepSpeed,這兩個是最基礎的。下面也有一些像國內潞晨科技的 Colossal-AI 以及最基礎的 Pytorch。
![]()
在訓練領域,這些并行加速庫主要做的都是各種并行算法、算子優化、融合算子,還有內存和通信的優化。在推理領域它們會支持各種并行推理、融合算子以及量化壓縮。以經典的 Megatron 為例,它支持了各種經典的并行技術,也支持各種主流的大模型。另外它的模型架構非常合理,社區也挺活躍,非常易于改造成自己自有的框架,相信各位公司里肯定也有一部分代碼是從 Megatron 里薅過來的。
MindSpeed 架構設計
![]()
MindSpeed 分布式訓練加速庫架構主要有三個模塊組成,上面兩個是語言模塊,一個是大語言,另一個是多模態。這里我們兩個套件會對主流的模型,包括千問、LLama、DeepSeek,多模態這邊類 Sora、LLaVA 這些系列全都會做支持。另外 MindSpeed 也提供了一套端到端的訓練方案,從最開始的數據處理、流程訓練,到后面的后訓練、偏好對齊,以及各種評價體系,這些我們都有支持。
本次分享要講的重點就是 MindSpeed Core 親和加速模塊。我們會通過在不同維度上對模型去做優化,來提升模型訓練的效率。MindSpeed Core 除了對上面兩個模型倉庫做使能外,它也支持單獨用在客戶自有的框架上。它使用時非常簡單,只用下載、安裝,然后一鍵代碼就能使能了。
![]()
我們這里是通過各種裝飾器替換接口,就能做到和用戶的框架解耦,可以非侵入式地修改用戶框架,使用我們這些加速特性。
MindSpeed 優化策略
接下來的重點講講通信、顯存、計算、并行幾個維度上我們分別做了哪些優化。
首先是通信優化,第一個是計算通信掩蓋技術。
![]()
我們知道在 TP、SP 的場景下我們會多兩個通信,一個是 Allgather+Matmul,另一個是 Matmul+Reduce-scatter。在傳統的并行上它們是串行執行的,就是我先做一個計算,然后再做一個通信,或者反過來我先做一個通信,再做一個計算。這樣我們就想到這個任務其實我可以把一個大任務拆成多個小任務,可以先做一個計算任務 0,然后再做通信任務 0,然后在做通信任務 0 的時候,可以并行執行計算任務 1,這樣就能實現計算和通信并行起來的效果,從而減少通信耗時,提升模型訓練的效率。我們實測下來,在大部分的模型上它性能的收益都有百分之七八,是非常不錯的一個優化點。
![]()
下一個思路上是類似的,是對 DualPipe 的一個改進。幻方開源了 DualPipe,我們知道它是利用不同 microbatch 之間做掩蓋,然后在 1F1B 上做掩蓋。但它會有兩個階段,分別是 Warmup 和 Cooldown 階段,它們是沒法通過 microbatch 之間去做通信掩蓋的。
這樣我們就提出,我發現計算流上我的共享專家的計算和我 A2A 的通信其實是沒有依賴關系的,這樣我們就可以把共享專家的計算和 A2A 的通信并起來,就像上圖下面畫的這樣。我在做共享專家前向的時候同時去做 A2A 的通信,反向的時候也是一樣,我做通信的時候同時去做共享專家的兩個反向。以及 MLP 里對權重梯度的計算也是可以同時并行的,這樣做完之后就可以在 1F1B 的基礎上再額外掩蓋 50% 的異步通信,也有不錯的收益。
接下來是從顯存上做優化。
當前在模型訓練時我們用的大部分都是混合精度。之前用的是 fp16,現在幾乎所有人都會用 bf16 做訓練。混合精度訓練有一個問題,會導致我的權重有兩份,因為模型更新的時候要求更高的精度,所以在優化器里我的權重是 fp32 的。到了模型前反向訓練時我沒有那么高的精度要求,我可以把它換成 bf16 做計算,反向算完后我再把梯度轉回 fp32,再做優化器的更新,這樣就會多出兩份權重。
![]()
我們看到 bf16 和 fp32 的數據格式很像,最開始都有一個 1 位的符號位,然后 8 位的指數位,唯一不同就是后面的尾數 fp32 是 23 位的尾數位,bf16 是 7 位。這樣我們想到可以申請一塊顯存,讓它同時表示 fp32 和 bf16。我會申請兩個 tensor,其中 bf16 tensor 的指針也是指向 fp32 的內存地址上,這樣我就可以用同一塊內存地址同時表達兩個數據格式。
而在實際訓練場景下,由于四舍五入的問題,它會多引入一個殘差。具體邏輯就會變成在梯度累積前反向計算的時候,我會把殘差值給它加上,然后變成 bf16,去做前反向的計算。前反向做完了之后我再把這個剪掉,變回 fp32 的數據,再做優化器的更新,這樣我們就可以把 bf16 的這一份權重節省掉了。以 70B 的模型為例,在 TP 開到 8 的時候,每張卡大約可以節省 17G 的顯存,收益非常不錯。
下一個也是顯存上的優化,剛講的是對靜態顯存的優化,這里是對動態顯存的優化。我們做了一個分析,激活函數的輸出是非常大的,但它的計算又非常小,非常快,天然適合重計算的技術。傳統的重計算有個問題,它沒法把我的輸出釋放掉,我的輸出必須是要在的。如果想要做的話,我必須把下面的 Matmul 給它合在一起去做重計算,這樣又會導致我需要多做一份 Matmul 的計算,又會拖累模型的訓練時間。
![]()
這里我們就想到可以在我的輸出 B 給 Matmul 計算完后釋放它的顯存,但我保留它的邏輯視圖,通過 storage resize 等于 0,這樣就能把它的顯存占用釋放掉,但邏輯視圖還是在的。然后再掛一個 hook,在它做反向的時候觸發它的前向計算,然后重新得到 B,再這樣去做激活函數的反向,這樣就能省掉這一塊顯存。由于激活函數的計算是非常快的,所以對整個模型訓練的影響可以說是微乎其微。省的顯存也非常大,是一個性價比非常高的優化特性。
接下來是一個虛擬顯存的技術,在這里我們做了一個接口,支持對顯存上做一個轉發。我們知道 Host 內存要比 Device 顯存要大很多,便宜很多,我們就想到可以在這里做一個內存轉發。對算子來說它訪問的就是 Device 顯存,但這塊顯存會轉發到 Host 側,這樣就可以減少我們顯存的占用。
![]()
大家肯定就會說這不就是傳統的 offload?但我們對比 offload 有兩個優勢。一個是非常簡單,因為我是對申請的顯存做更改,它不需要我自己手動幫助搬回 Device 側,然后再搬回 Host 側,因為對算子來說它訪問的就是一個 Device 的顯存。還有一個優點是算子本身會做數據的搬運和計算的流水。由于它認為自己訪問的就是一塊 Device 顯存,這一塊搬運天然支持 H2D、D2H 的并行,能減少搬運耗時。我們在 DeepSeek V3 上做了實驗,在梯度累積比較大的情況下,測試下來端到端的性能損耗大概在 1% 左右,但能節省的顯存卻有十幾 G,也是非常好用的一個特性。
接下來是計算優化,我們也提供各種融合算子,還有一些激活函數的融合,這些我們都是支持的。打開一個參數開關就能使能上了。
![]()
另外一種優化是等價改寫。我們發現這邊有一個對 Mask 賦值的操作,這個操作其實是可以等價改寫成我對 Mask 取反,變成一個純計算操作,這樣我就可以把一個賦值操作變成一個純計算操作,對性能的提升也是挺大的。
下一個計算優化是矩陣和向量的優化。我們的矩陣計算單元和向量計算單元是分開的,這樣我們就想到我可以同時去做矩陣計算以及向量計算。
舉一個例子,這個是 DualPipe 里 1F1B 階段的流水排布,和幻方開源的會有一點差別,因為我們是根據自己硬件的特點重新排了一下。
![]()
這里我們發現它最開始有一個 Unpermute 的反向,接著馬上是一個 Attention 的計算。Attention 計算里首先是一個矩陣計算,再接 FA 的計算。這里我們可以把 Permute 的計算再開一條向量的流,原來的這條流就留給矩陣計算,下面這一塊就只給向量的計算,這樣我們就可以做到矩陣計算和向量計算并在一起。后面的這些 Permute 和 Unpermute 也是一樣,可以和共享專家的前反向并在一起,也能大大減少時間消耗。
但這個優化點有一個比較大的局限性,就是在同時做矩陣和向量計算時對訪存的壓力是比較大的。這會導致在比較大的計算量的情況下會導致算子劣化,所以這塊優化點適合比較小點的,對訪存沒什么壓力的計算,就能得到非常不錯的收益。
下面是并行優化。
![]()
首先上面這個是原始的 VPP 虛擬流水并行,我們知道它會有一個 Warmup 階段和一個 1F1B 階段, Warmup 的數量等于設備的數量。以這邊的圖為例,這邊我有 4 個設備,就必須要做 4 次前向。接下來進入 1F1B 階段,做一次前向做一次反向。這樣會有一個問題就是這個反向必須要依賴前向,前向做完之后才能做反向,造成了它們之間的通信等待,都不能做掩蓋。這里我們提出了一個非常巧妙的思路,就是只要多做一個 Warmup,就可以把前向和反向之間的依賴關系拆開來。
在下面我做了 5 個 Warmup,到第六個的時候,我的前向是 2,反向是 1,這樣它們之間就沒有依賴關系,我就可以像幻方的 Dualpipe 一樣去使能 1F1B 的掩蓋了。
對比 DualPipe 它有兩個優勢,一個是簡單,就是你自己開發一個 DualPipe 肯定要改一大堆代碼,但我這邊只用對 Warmup 的數量加 1 就能實現這樣的流水排布。另外一個,DualPipe 是雙向并行的,使用的卡要多一倍才能使能 1F1B 的流水。
接下來是一個 MoE 里的并行優化。我們做了一些實驗,發現 MoE 速度緩慢的主要原因就是負載不均,不管是在 EP 之間還是 Layer 之間還是 Stage 之間,它都會存在不同的負載不均,這樣就會造成不均衡的 A2A 通信,會拖慢 EP 通信。不均衡的計算會導致計算快的卡要等慢的卡,計算效率會劣化。Layer 之間的不均衡又會導致整個 PP Stage 之間都在互相等待,等待又會傳導到 PP 的空泡,向后傳導下去,這樣就會拖慢整個模型的訓練。
![]()
在這里幻方做了一個二級路由,在一定程度上掩蓋 MoE 負載不均的情況。而 MindSpeed 作為一個底層的加速庫,我們會面對很多客戶,有些客戶就會說我不想用二級路由,覺得我二級路由會對模型的效果有影響,他只想用一級路由,怎么辦?
我們提出了數參互尋特性,它有兩個思路,一個是傳統的數據找計算,我的 tokens 要分發給對應專家所在的那張卡,然后這里去做通信。另外一個,負載不均肯定是有一些熱門專家和一些冷門專家,冷門專家算得比較少,熱門專家算得比較多,我其實可以不通信 tokens,而是通信專家,這樣就一定程度上緩解負載不均的現象。
這里還利用了一個我們昇騰超節點的優勢,就是超節點可以把幾百張卡當做是同一個節點內,節點間性能劣化的劣勢我們是沒有的。這樣我們就可以做到拿冷門專家的計算去掩蓋熱門專家的通信,通信完了之后馬上接著就是熱門專家的計算,相當于沒有額外的通信開銷,只有計算的耗時。
我們做了實驗,在當前訓練前期大概能拿到 7% 的收益,也是非常不錯。
接下來有更多的并行技術。
![]()
首先是 Swap Attention 技術。我在 Attention 做完后,這些激活在反向之前其實是用不到了,我就可以把這些激活 swap 到 Host 側再反向。反向的時候,在 MLP 開始的時候,我同時去做取回來的動作,這樣就可以把 D2H 和 H2D 的計算和 MLP 的計算給并行起來。這樣就能對模型訓練的效率幾乎沒有影響,然后也能節省 Attention 的這部分激活。對比重計算,沒有額外的計算,也不會對模型的效率有影響,所以這一塊是比較優的減少動態顯存的一塊技術點。
左邊這個是 Ulysses 融合 RingAttention 的技術,我們把這兩個長序列的并行做了融合。我們知道在 Ulysses 里它是通過 A2A 去做通信的,節點內的通信比較快,節點間的通信就比較慢了。比如說我一個機器只有 8 張卡,Ulysses 最多就只能開到 8。另一個是 RingAttention,它的通信是 P2P 通信,比較適合在節點間做通信。我們就想到把這兩個做融合,節點內通過 A2A 做通信,節點間通過 P2P 做,這樣就可以把兩個并行的優勢全都合在一起,訓練一個非常長的長序列模型。
下面重計算獨立調度是說我在 PP 流水之間還開了重計算的情況下,我知道 PP 的流水其實是有很多空泡的,我可以把這些重計算的部分拿出來去填 PP 流水的空泡,這樣就能壓縮 PP 的空泡,也能提升模型訓練的效率。
最后一個是 MoE 的 EDP 模式。就是說我在開了 TP 的情況下,原本它是會對專家的權重也做切分,特別是在小專家的情況下,做了切分之后會影響 Matmul 的計算效率。這會導致整個模型到了這里之后計算就慢下來了。
這樣我就想到我其實是可以把 TP 的并行只在 Attention 的部分去做,然后 MLP 的這部分不去做 TP 通信,把 TP 通信的域分給 EP。這樣由于 EP 擴大了,每個專家分的數量還是一樣的,也就是說我的顯存并沒有增多,還是同樣的顯存,但我的專家并沒有被切分,Matmul 的計算效率并沒有降低。這也是一個比較優的特性,是小專家場景必開的。
以上就是本次的分享,謝謝各位。
嘉賓介紹
鄭加利,華為高級工程師,主導 MindSpeed 框架基礎架構設計構建,推動大模型訓練效率的顯著提升。主導微軟大模型訓練框架 DeepSpeed 原生支持華為昇騰軟件棧,進一步拓展昇騰生態的兼容性。深度參與了華為昇騰的重點模型開發和客戶項目攻關,多次獲得昇騰領域總裁嘉獎令。
2026,AI 正在以更工程化的方式深度融入軟件生產,Agentic AI 的探索也將從局部試點邁向體系化工程建設!
QCon 北京 2026 已正式啟動,本屆大會以“Agentic AI 時代的軟件工程重塑”為核心主線,推動技術探索從「AI For What」真正落地到可持續的「Value From AI」。從前沿技術雷達、架構設計與數據底座、效能與成本、產品與交互、可信落地、研發組織進化六大維度,系統性展開深度探索。QCon 北京 2026,邀你一起,站在拐點之上。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
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.