來源於阿里雲的PAI平台使用的技術
1)激活檢查點(Activation Checkpoint)
在神經網絡中間設置若干個檢查點(checkpoint),檢查點以外的中間結果全部舍棄,反向傳播求導數的時間,需要某個中間結果就從最近的檢查點開始計算,這樣既節省了顯存,又避免了從頭計算的繁瑣過程。
2)梯度累積 (Gradient Accumulation)
以batch_size=16為例,可以每次算16個樣本的平均梯度,然后緩存累加起來,算夠了4次之后,然后把總梯度除以4,然后才執行參數更新,這個效果等價於batch_size=64。這是一種有效的增加Batch Size的方法。通過該策略可以將每個step的batch size擴充到很大,結合LAMB優化器會提升收斂速度。
3)混合精度訓練(Mixed Precision Training)
采用混合精度訓練的好處主要有以下兩點:
減少顯存占用,由於FP16的內存占用只有FP32的一半,自然地就可以幫助訓練過程節省一半的顯存空間。
加快訓練和推斷的計算,FP16除了能節約內存,還能同時節省模型的訓練時間。具體原理如下圖所示,核心是在反向傳播參數更新的時候需要維護一個FP32的備份來避免舍入誤差,另外會通過Loss Scaling來緩解溢出錯誤。
4)即時編譯JIT
當PyTorch在執行一系列element-wise的Tensor操作時,底層Kernel的實現需要反復地讀寫訪存,但是只執行少量的計算,其中大部分時間開銷並不在計算上,而在訪存讀寫上。比如,實現一個帶有N個元素的Tensor的乘/加法Kernel,需要N次加計算,2N次讀和N次寫訪存操作。我們稱計算少, 訪存次數多的Kernel為訪存Bound。為了避免這種反復的讀寫,以及降低Kernel Launch的開銷,可以采用Kernel Fusion。訪存Bound的Kernel Fusion的核心原理是通過訪存的局部性原理,將多個element-wise的Kernel自動合並成一個Kernel,避免中間結果寫到內存上,來提高訪存的利用率;同時由於多個Kernel合並成一個Kernel,Kernel launch開銷也減少到了1次。
5)3D並行
3D並行策略指的是:數據並行,模型並行,流水並行三種策略的混合運用,以達到快速訓練百億/千億量級模型的目的。該項技術最早由DeepSpeed團隊研發,可以加速大模型的訓練。
6)CPU Offload
反向傳播不在GPU上計算,而是在CPU上算,其中用到的中間變量全部存儲在內存中,這樣可以節省下GPU的顯存占用,用時間換空間,以便能放到更大尺寸的模型。
7)Zero顯存優化器
ZeRO(The Zero Redundancy Optimizer)是一種用於大規模分布式深度學習的新型內存優化技術。ZeRO具有三個主要的優化階段:
優化器狀態分區(Pos) :減少了4倍的內存,通信容量與數據並行性相同;
增加梯度分區(Pos+g) :8x內存減少,通信容量與數據並行性相同;
增加參數分區(Pos+g+p) :內存減少與數據並行度和復雜度成線性關系。