大規模訓練

零冗餘優化器(ZeRO)

在單純的資料平行裡,每個裝置都保留一份完整的模型權重、梯度與優化器狀態(以 Adam 為例,是動量與變異數的滑動平均——以 fp32 計就是參數量的兩倍)。這極為浪費:橫跨一百個裝置就等於把所有東西複製了一百份一模一樣的副本。ZeRO 的洞見是這些副本本身是冗餘的。它不再複製整份優化器狀態,而是把它切分,讓每個 rank 只持有自己那一片,再透過通訊在需要的瞬間重建出當下用得到的部分。

ZeRO 有三個累進的階段。第一階段把優化器狀態切分到各資料平行 rank;第二階段再切分梯度;第三階段連參數本身也切分,在每一層的前向與反向之前用 all-gather 把該層權重蒐集起來、用完即釋放。如此每裝置的記憶體大致以「模型狀態除以資料平行度」下降,代價是多出的 all-gather 與 reduce-scatter 流量。ZeRO 保留了資料平行單純的程式設計模型——不必動模型結構——卻能觸及複製式擺放永遠塞不下的參數規模。

ZeRO 以記憶體換通訊量,因此效率取決於快速互連,以及把蒐集動作和計算重疊起來。尤其第三階段每層都發出一次 all-gather,在較慢的網路上可能卡住。它能與卸載(把分片移到 CPU 或 NVMe)以及模型平行群組內部的張量/管線平行組合使用,也是 FSDP 的概念核心。

M_{\text{per device}} \approx \frac{(2+2+K)\,\Psi}{N_d}

第三階段下,Ψ 個參數分到 N_d 個資料平行 rank 時的每裝置記憶體;K≈12 位元組涵蓋 fp32 主權重與 Adam 動量。

ZeRO 消除的是冗餘,而非切分任一運算子的數學——和張量平行不同,每個裝置仍跑整個模型,只是處理不同資料、持有切分後的狀態。

又称
ZeRO零冗餘優化器ZeRO-1/2/3