FP32、FP16、BF16、INT8 的差異:位元構成、範圍、精度、用途比較
FP32 是 32 位元的單精度浮點數,作為計算的基準使用。FP16 與 BF16 都是 16 位元,但位元的分配不同。FP16 在尾數上使用較多位元以取得精度,可表示的範圍較窄,最大值為 65504。BF16 將指數部設為與 FP32 相同的 8 位元,保持與 FP32 相當的範圍,相對地降低了精度。INT8 是 8 位元整數,用於乘上比例因子來近似實數的量化,在 AI 推論中能大幅減少記憶體與功耗。
| 項目 | FP32 | FP16 | BF16 | INT8 |
|---|---|---|---|---|
| 位元數 | 32 位元 | 16 位元 | 16 位元 | 8 位元 |
| 符號、指數、尾數的位元數 | 1、8、23 | 1、5、10 | 1、8、7 | 沒有指數與尾數。2 的補數整數,範圍為 −128 至 127 |
| 可表示的最大值 | 約 3.4 × 10³⁸ | 65504 | 約 3.4 × 10³⁸(與 FP32 幾乎相同) | 127(實數以乘上比例因子表示) |
| 最小正規化數 | 約 1.2 × 10⁻³⁸ | 約 6.1 × 10⁻⁵(2⁻¹⁴) | 約 1.2 × 10⁻³⁸ | 無(可表示值的間隔由比例因子決定) |
| 精度的大致範圍 | 十進位約 7 位數(1 與下一個數的差為 2⁻²³ ≈ 1.2 × 10⁻⁷) | 十進位約 3 位數(2⁻¹⁰ ≈ 9.8 × 10⁻⁴) | 十進位 2 至 3 位數(2⁻⁷ ≈ 7.8 × 10⁻³) | 256 個刻度 |
| 由 FP32 轉換 | 無(基準) | 範圍窄,大的值可能溢位,小的值可能變成 0 | 只需取出高位 16 位元並捨入,範圍不會溢位 | 決定比例因子(與零點)進行量化。需要調查數值範圍的校準 |
| 1 個值的記憶體 | 4 位元組 | 2 位元組 | 2 位元組 | 1 位元組 |
| 運算器的效率 | 乘法器大,相同面積下的乘積累加數量少 | 以比 FP32 小的運算器,可排列較多的乘積累加單元 | 與 FP16 相當。尾數較短,乘法器更小 | 乘法器最小且省電。乘積多以 32 位元整數累加 |
| 在訓練中的用法 | 主權重、最佳化器的狀態、乘積的累加 | 混合精度訓練。以損失縮放防止小梯度變成 0 | 廣泛用於混合精度訓練。多數情況不需要損失縮放 | 一般不使用(量化感知訓練中會模擬量化的影響) |
| 在推論中的用法 | 精度的基準。比起效能更重視正確性時 | 在 GPU 等上進行推論 | 在 GPU 或 AI 加速器上進行推論 | 量化模型的推論。特別是邊緣裝置的 NPU 等 |
數值為具代表性的大致參考值,會因世代或產品而異。