混合精準訓練
混合精度訓練透過以 16 位元浮點而不是 32 位元執行大部分數學運算來加速神經網路訓練並減少記憶體使用。
概述
It lets the same GPU train bigger models faster with almost no loss in accuracy.
深入探討
傳統訓練以 32 位元浮點 (FP32) 儲存權重並運行數學。混合精度使用較低精度的 16 位元格式(FP16 或 bfloat16)進行大量矩陣乘法,同時保留權重的 32 位元「主副本」以實現穩定更新。由於 16 位數的大小只有一半,因此更適合 GPU 內存,並且 Tensor Core 處理它們的速度大約快 2-8 倍。問題是 FP16 的範圍很窄:微小的梯度可能會下溢到零。標準的修復方法是損失縮放,它在反向傳播之前將損失乘以一個大因子,以便小梯度保持可表示性,然後在權重更新之前將其除掉。 NVIDIA 的 Apex 以及 PyTorch 和 TensorFlow 中的內建 AMP(自動混合精度)可自動執行此操作。
技術洞察
FP16 只有 5 個指數位,動態範圍較小,會導致梯度下溢。 Bfloat16 保留 8 個指數位(與 FP32 的範圍匹配),但尾數位較少,因此它很少需要損失縮放 - 這是 Google TPU 和現代 GPU 青睞它的關鍵原因。 Tensor Core 透過將 16 位元運算元相乘但在 FP32 中累積部分和來加速工作,從而在求和誤差會復合的情況下保持精度。
戰略影響
成本與預算
多年來,架構決策決定著效能和營運成本。
更明確的決策
技術教育幫助團隊選擇正確的堆疊,而不僅僅是最新的堆疊。
品質管控
更好的工程選擇可以減少生產中的可靠性事故。
混合精準度訓練的未來
精度不斷下降。 NVIDIA Hopper 和 Blackwell GPU 支援的 FP8 訓練正在成為前沿模型的標準,並且對 FP4 和微縮放格式 (MXFP) 的研究也在進一步推進。期望框架能夠自動選擇每層精度,硬體能夠原生處理更窄的格式,量化感知訓練能夠模糊低精度訓練和推理之間的界限,從而降低訓練萬億參數模型的成本。
現實世界的實施
PyTorch 的 torch.cuda.amp.autocast 包裝了一個訓練循環,將單個 GPU 上的記憶體大致減半並將吞吐量加倍
在 TPU 上訓練大型語言模型,例如 bfloat16 中的 GPT 式轉換器,以避免損失縮放調整
透過將 ResNet 影像訓練從 FP32 切換到 FP16,在消費級 RTX GPU 上安裝更大的批次大小
NVIDIA H100 GPU 上的 FP8 混合精度可降低預訓練前緣規模模型的成本
風險與防護欄
優化一項基準測試可以隱藏更廣泛的系統弱點。
基礎設施和維護成本常常被低估。
隨著系統變得更加複雜,安全性和可觀察性差距可能會擴大。
實施路線圖
在實施之前定義延遲、品質和成本目標。
在實際負載和資料條件下進行基準測試。
儀器監控錯誤、漂移和使用者影響。
在擴展之前準備回滾和事件回應路徑。
不斷探索
Free newsletter
Get the daily AI briefing
Three verified AI stories every weekday morning, written in plain English. Free forever, no ads.
One email each weekday. Unsubscribe in one click. We never sell or share your address.
Test yourself
Take the Mixed Precision Training quiz
Instant feedback on every answer, and a shareable certificate with a verifiable ID once you pass a course.
Support free AI education. AI Understanding is a 501(c)(3) nonprofit — no ads, no paywall, ever. Make a donation
常見問題
What is Mixed Precision Training?
混合精度訓練透過以 16 位元浮點而不是 32 位元執行大部分數學運算來加速神經網路訓練並減少記憶體使用。它可以讓相同的 GPU 更快地訓練更大的模型,而幾乎不會失去準確性。
為什麼混合精準度訓練要保留重量的 32 位元「主副本」?
權重更新通常很小;以 16 位元累積它們會損失精度,因此全精度主副本可以保持更新的準確性。
FP16 訓練中損失縮放解決了什麼問題?
FP16 的動態範圍有限,因此小梯度可以捨入為零;在反向傳播之前乘以損失可以使它們具有可表示性。
bfloat16相對於FP16有什麼優勢?
Bfloat16 與 FP32 一樣保留了 8 個指數位,因此其動態範圍較大,梯度下溢很少見。
Tensor Core 如何在使用 16 位元輸入時保持精確度?
Tensor Core 將 16 位元運算元相乘,但以 32 位元進行累加,從而防止複合求和錯誤。
在訓練期間使用 16 位元值而不是 32 位元值的主要好處是什麼?
半角數字可以在 GPU 記憶體中容納更多數據,讓專用硬體處理矩陣數學的速度提高數倍。