English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

符號、指數、尾數

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 的次方之間更細粒度的表示。


三種格式


格式總位元數符號指數尾數動態範圍精度
FP32321823~10^-38 到 ~10^38~7 位數字
FP16161510~10^-5 到 ~10^5~3 位數字
FP8 E4M38143~2^-9 到 ~448~2 位數字

FP8 E4M3 讀作「4 個指數位元,3 個尾數位元」。另一種 FP8 E5M2 則以精度換取範圍;ANDREA 實驗使用 E4M3,因為 Transformer 激活值停留在狹窄的幅度範圍內,此時額外的精度勝過額外的範圍。

每參數位元組數

ANDREA-120M 持有約 120,000,000 個參數。計算僅權重矩陣在 (a) FP32、(b) FP16、(c) FP8 的儲存佔用空間。以 MB 顯示你的算術。然後計算 (d) 權重 + Adam 第一時刻 + Adam 第二時刻(權重數量的 3 倍)在 FP16 的儲存佔用空間。

為什麼較低精度執行得更快

記憶體頻寬主導訓練速度

現代 GPU 花費在等待記憶體上的時間多於計算。RTX 4090 擁有 1008 GB/s 記憶體頻寬與 165 TFLOPS 的 FP16 計算能力。一個典型的層會從 VRAM 讀取權重、乘以激活值、寫回結果。頻寬而非計算決定了吞吐量。


將精度減半,每個參數的位元組數減半,因此讀取相同權重只需一半的記憶體頻寬。吞吐量大致加倍。


Tensor Cores:硬體加速矩陣乘法

RTX 4090 搭載專用的張量核心單元,能直接以 FP16 或 FP8 計算矩陣乘法。單一張量核心運算可在一個週期內乘法一個小區塊(例如 16x16),比純量 FP32 乘法快得多。


來自 ANDREA-120M 的實證數據:


精度步驟/分鐘備註
FP32~3基準;無張量核心加速
FP16~6cuBLAS 張量核心;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 事件在沒有複雜縮放技巧的情況下保持罕見。


Precision Comparison: FP32 vs FP16 vs FP8

為新運行選擇精度

你正在 RTX 4090 上啟動一個新的 ANDREA 風格訓練運行。你有兩個衝突的優先事項:(1) 最大化 steps/min,(2) 避免訓練中途除錯 NaN 崩潰。ANDREA-120M v3 儘管 FP8 E4M3 也以 ~6 steps/min 運行,但選擇了 FP16 cuBLAS 而非 FP8。推理為何 FP16 贏得此決定。在你的答案中參考動態範圍和 tensor core 支援。

在單一 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 評估預算規模

ANDREA-480M(家族的第三個成員)擁有約 4.8 億個參數。估計 (a) 僅 FP16 權重(MB),(b) FP16 權重 + m + v(MB,假設 m 和 v 也為 FP16 以簡化),以及 (c) 根據 6-8 倍的經驗法則,FP16 下的總訓練時佔用空間。ANDREA-480M 能否放入單一 RTX 4090(24 GB)?

實務中的精度

假設你在訓練中途發現 ANDREA-120M 在 FP16 下每約 5000 步會產生偶爾的 NaN 損失,且每個 NaN 都需要從檢查點重新啟動。你會首先嘗試哪一個改變來減少 NaN 頻率,而不離開 FP16?用一句機制來證明。

相關活動

三個相關活動連結到精度:


- 活動 1:簡介 / VRAM 預算。 精度會將記憶體預算算術中的每個項乘以倍數。6-8x 倍數的經驗法則是無單位的;每參數位元組數給它單位。

- 活動 10:AdamW。 優化器狀態(m 和 v)通常即使前向/反向計算以 FP16 運行,也保持在 FP32。原因:優化器的長尾累加器精度比運行時速度更重要。

- 活動 12:梯度裁剪。 裁剪在優化器狀態更新前限制梯度幅度。使用 FP16 前向/反向及 FP32 優化器時,裁剪發生在精度變化的邊界,以及溢出風險集中的地方。


精度是一個免費的旋鈕:改變它,模型訓練更快且使用更少記憶體。代價是數值處理:NaN 處理、損失縮放、混合精度紀律。ANDREA-120M v3 展示了回報:120M 參數在消費級硬體上 23 天內訓練完成,因為 FP16 將一切減半。