使用較低精度的數字格式(16 位元而非 32 位元)進行大部分計算來訓練神經網路,同時保持關鍵運算使用全精度。這使 GPU 的有效記憶體容量和計算速度翻倍,對模型品質的影響極小。BF16(bfloat16)是 LLM 訓練的標準;FP16 用於推論。
混合精度是我們能訓練如此大模型的原因。一個 70B 參數模型在 FP32 中僅權重就需要 280 GB — 在任何單一 GPU 上都不可能。在 BF16 中,它需要 140 GB,可以分布在幾個 GPU 上。混合精度有效地將 AI 產業的計算能力免費翻倍,僅僅通過使用更智慧的數字格式。
關鍵洞察:大多數神經網路計算不需要 32 位元精度。權重、啟動值和梯度可以用 16 位元表示而不會有明顯的品質損失。但某些運算(損失計算、權重更新)需要更高精度以避免數值不穩定。混合精度為更新保留一份 FP32 的權重主副本,同時在前向和反向傳遞中使用 FP16/BF16。
FP16(IEEE 半精度)有 5 個指數位元和 10 個尾數位元。BF16(Brain Float 16)有 8 個指數位元和 7 個尾數位元。BF16 更寬的指數範圍意味著它可以表示與 FP32 相同範圍的值(避免溢出/下溢),而 FP16 較窄的範圍需要損失縮放以防止梯度下溢到零。對於訓練,BF16 更簡單更穩定。對於推論,FP16 有時在相同記憶體成本下提供稍好的精度。
最新的 GPU(NVIDIA H100、H200)支援 FP8(8 位元浮點數)以獲得更快的計算。FP8 與 FP16 相比將記憶體減半並使吞吐量翻倍,但需要小心處理以避免品質下降。目前的做法:在 BF16 中訓練,在 FP16 或 FP8 中服務,並量化為 INT4/INT8 用於邊緣部署。每下降一個精度等級都是用微小的品質損失換取顯著的速度和記憶體增益。