符號、指數、尾數
IEEE 754 浮點數格式
每個浮點數儲存三個欄位:
- 符號位元 (1 bit): 正或負
- 指數 (E 位元): 幅度尺度,2 的整數次方
- 尾數 (M 位元): 分數精度,介於 1.0 到 ~2.0 之間的數字
總位元數 = 1 + E + M。值大致等於 (-1)^sign (1 + mantissa) 2^(exponent - bias)。
訓練中兩個屬性很重要:
動態範圍 = 2^(2^E) (大致)。更多的指數位元意味著能表示更小與更大的數字而不會溢位。
精度 = 2^M 個在每個 2 的次方下的不同值。更多的尾數位元意味著在連續的 2 的次方之間更細粒度的表示。
三種格式
| 格式 | 總位元數 | 符號 | 指數 | 尾數 | 動態範圍 | 精度 |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 到 ~10^38 | ~7 位數字 |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 到 ~10^5 | ~3 位數字 |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 到 ~448 | ~2 位數字 |
FP8 E4M3 讀作「4 個指數位元,3 個尾數位元」。另一種 FP8 E5M2 則以精度換取範圍;ANDREA 實驗使用 E4M3,因為 Transformer 激活值停留在狹窄的幅度範圍內,此時額外的精度勝過額外的範圍。
每參數位元組數
為什麼較低精度執行得更快
記憶體頻寬主導訓練速度
現代 GPU 花費在等待記憶體上的時間多於計算。RTX 4090 擁有 1008 GB/s 記憶體頻寬與 165 TFLOPS 的 FP16 計算能力。一個典型的層會從 VRAM 讀取權重、乘以激活值、寫回結果。頻寬而非計算決定了吞吐量。
將精度減半,每個參數的位元組數減半,因此讀取相同權重只需一半的記憶體頻寬。吞吐量大致加倍。
Tensor Cores:硬體加速矩陣乘法
RTX 4090 搭載專用的張量核心單元,能直接以 FP16 或 FP8 計算矩陣乘法。單一張量核心運算可在一個週期內乘法一個小區塊(例如 16x16),比純量 FP32 乘法快得多。
來自 ANDREA-120M 的實證數據:
| 精度 | 步驟/分鐘 | 備註 |
|---|---|---|
| FP32 | ~3 | 基準;無張量核心加速 |
| FP16 | ~6 | cuBLAS 張量核心;2x 加速 |
| FP8 E4M3 | ~6 | 張量核心;與 FP16 相當 |
FP8 在此工作負載中未能在吞吐量上超越 FP16,因為計算吞吐量不再是瓶頸;記憶體頻寬與啟動開銷成為限制因素。ANDREA-120M v3 以 FP16 cuBLAS 在 6 步/分鐘運作,提供舒適的安全邊際而不損失吞吐量。
FP8 的 NaN 風險
FP8 E4M3 表示從 ~2^-9 到 ~448 的數字。超出此範圍的激活值或梯度會溢位為 NaN(不是數字)或下溢為零。一個 NaN 會毒化所有下游計算:包含 NaN 的矩陣乘法返回全 NaN;全 NaN 梯度會損壞 AdamW 狀態;帶有 NaN m 與 v 的 AdamW 輸出 NaN 更新;權重變成 NaN;整個訓練過程崩潰。
ANDREA 的 FP8 實驗產生偶爾的 NaN 懸崖,需要損失縮放、排程精度切換或後備路徑。FP16 動態範圍(~10^-5 到 ~10^5)足夠寬廣,使得 NaN 事件在沒有複雜縮放技巧的情況下保持罕見。
為新運行選擇精度
在單一 4090 上適配 120M
來自入門課程的 6-8 倍乘數
回想 grow_a_language_model_intro,訓練記憶體大致等於原始權重數的 6-8 倍,考慮到:
- 權重 (1x)
- Adam 第一矩 m (1x)
- Adam 第二矩 v (1x)
- 梯度緩衝區 (1x)
- 激活值與臨時變數 (~2-4x,取決於批次與上下文)
ANDREA-120M 在 FP16 精度下,batch_size=8,context=1024:
| 組件 | FP16 大小 |
|---|---|
| 權重 | 240 MB |
| m (第一矩) | 240 MB |
| v (第二矩) | 240 MB |
| 梯度 | 240 MB |
| 激活值 | ~2-4 GB (批次, 上下文) |
| 總計 | ~3.5 GB |
RTX 4090 擁有 24 GB VRAM。ANDREA-120M 在 FP16 下使用 ~14%。有充足空間用於更大的批次大小或更長的上下文窗口。ANDREA-12M 總計僅使用 1.4 GB。
混合精度所在的位置
ANDREA 不會將所有東西保持在單一精度。混合精度訓練儲存:
- 主權重: FP32(保留訓練穩定性)
- 前向與反向計算: FP16(使用 tensor cores)
- AdamW 優化器狀態: FP32(m 與 v 需要精度來處理長尾更新)
- 梯度緩衝區: FP16(計算端)
最終記憶體預算混合兩者。ANDREA 的實際佔用空間介於純 FP16(720 MB 優化器狀態)與純 FP32(1.44 GB 優化器狀態)之間,更接近 FP32,因為 m 和 v 保持在 FP32。
為 ANDREA-480M 評估預算規模
實務中的精度
相關活動
三個相關活動連結到精度:
- 活動 1:簡介 / VRAM 預算。 精度會將記憶體預算算術中的每個項乘以倍數。6-8x 倍數的經驗法則是無單位的;每參數位元組數給它單位。
- 活動 10:AdamW。 優化器狀態(m 和 v)通常即使前向/反向計算以 FP16 運行,也保持在 FP32。原因:優化器的長尾累加器精度比運行時速度更重要。
- 活動 12:梯度裁剪。 裁剪在優化器狀態更新前限制梯度幅度。使用 FP16 前向/反向及 FP32 優化器時,裁剪發生在精度變化的邊界,以及溢出風險集中的地方。
精度是一個免費的旋鈕:改變它,模型訓練更快且使用更少記憶體。代價是數值處理:NaN 處理、損失縮放、混合精度紀律。ANDREA-120M v3 展示了回報:120M 參數在消費級硬體上 23 天內訓練完成,因為 FP16 將一切減半。