FP32、FP16、BF16、INT8 的差異:位元構成、範圍、精度、用途比較

FP32 是 32 位元的單精度浮點數,作為計算的基準使用。FP16 與 BF16 都是 16 位元,但位元的分配不同。FP16 在尾數上使用較多位元以取得精度,可表示的範圍較窄,最大值為 65504。BF16 將指數部設為與 FP32 相同的 8 位元,保持與 FP32 相當的範圍,相對地降低了精度。INT8 是 8 位元整數,用於乘上比例因子來近似實數的量化,在 AI 推論中能大幅減少記憶體與功耗。

項目FP32FP16BF16INT8
位元數32 位元16 位元16 位元8 位元
符號、指數、尾數的位元數1、8、231、5、101、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 等

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

FP32
需要精度的計算、訓練中的主權重與乘積累加,以及確認低精度結果的基準。
FP16、BF16
在 AI 訓練與推論中,想將記憶體與計算量減半時。重視範圍的訓練用 BF16;若數值落在範圍內且重視精度,則用 FP16。
INT8
想將訓練好的模型量化,使推論更快、更省電時。在記憶體與電力有限的邊緣裝置上進行推論。

常見問題

為什麼 AI 訓練常偏好 BF16 而非 FP16?

BF16 的指數部與 FP32 相同為 8 位元,可表示的範圍與 FP32 幾乎相同。FP16 為了防止小梯度變成 0 或大的值溢位,需要損失縮放,而 BF16 多數情況下不需要,由 FP32 轉換也很簡單。精度雖然較低,但在神經網路的訓練中不太會造成問題。

為什麼 FP16 的最大值是 65504?

FP16 的指數部為 5 位元(偏移值 15),全為 1 的值用於表示無限大與 NaN,因此指數的最大值為 2 的 15 次方。將尾數的 10 位元全部設為 1 時,(2 − 2⁻¹⁰) × 2¹⁵ 是最大的有限值,即為 65504。

INT8 如何表示含小數的值?

以 實數 ≈ 比例因子 × (整數 − 零點) 的形式近似。以 0 為中心對稱量化時,零點設為 0,比例因子則設為「數值的最大絕對值 ÷ 127」等。比例因子可依張量或依通道分別設定。

INT8 也能用於訓練嗎?

一般而言,訓練使用浮點數格式。因為訓練中梯度值的範圍很廣,也需要處理對權重的微小更新。INT8 主要用於將訓練好的模型量化後的推論,即使在量化感知訓練中,權重的更新也以浮點數進行。

理解度檢測

在IEEE 754的單精度(32位元)浮點數中,分配給符號、指數部分、尾數的位元數組合為下列何者?

  1. A1・11・20
  2. B1・8・23
  3. C1・5・26
查看答案與解析

正確答案:B. 1・8・23

單精度(FP32)由符號1位元、指數部分8位元、尾數23位元,共32位元構成。在正規化數中會省略尾數開頭的1,因此精度相當於24位元,換算成十進位約為7位數。雙精度(FP64)為符號1、指數部分11、尾數52位元,指數範圍較廣,精度也較高。1・11・20是與雙精度的指數部分寬度混淆的組合,1・5・26則是與半精度的指數部分寬度混淆。

FP16(符號1・指數部分5位元(偏移值15)・尾數10位元)所能表示的最大有限值是多少?

  1. A32768
  2. B65536
  3. C65504
查看答案與解析

正確答案:C. 65504

指數部分全為1(31)是用於無限大與NaN,因此最大的指數部分為30,實際指數為 30 − 15 = 15。當尾數全為1時,值為 (1 + 1 − 2⁻¹⁰) × 2¹⁵ = (2 − 2⁻¹⁰) × 32768 = 65536 − 32 = 65504。超過此值的結果會成為無限大,因此在以FP16訓練時也須留意溢位。32768是尾數為0時的 2¹⁵,65536是 2¹⁶,兩者都不是最大值。

bfloat16主要被用於AI訓練的理由為下列何者?

  1. A因為指數部分與FP32相同為8位元,可表示的數值範圍廣
  2. B因為尾數部分比FP32長,精度高
  3. C因為可以用整數運算來計算
查看答案與解析

正確答案:A. 因為指數部分與FP32相同為8位元,可表示的數值範圍廣

bfloat16是由符號1位元、指數部分8位元、尾數部分7位元構成的16位元格式。由於指數部分與FP32相同,可表示的範圍幾乎一樣,即使是訓練中梯度這類非常小或非常大的值,也不易發生溢位或下溢,從FP32模型轉換過來也很簡單。精度雖然較低,但訓練對些許誤差有一定的容忍度,因此不易成為問題,並且能將資料量與運算單元的面積減半。尾數部分比FP32短,而且是以浮點數而非整數的運算來計算。

  1. 以FP16(半精度:符號1・指數部分5・尾數10位元)訓練類神經網路時容易發生問題,而以將損失值放大數倍後再計算的方法(損失縮放,loss scaling)來因應的是下列何者?
  2. 在AI推論中,將權重從FP32轉換(量化)為INT8的主要優點為下列何者?
  3. 在AI的混合精度訓練中,大部分計算以FP16或bfloat16進行,同時以FP32保存權重的原始值(主權重,master weights),其主要理由為下列何者?

前往電腦算術的練習題

相關名詞的解說

IEEE 754
規定浮點數表示方式與運算規則的國際標準。規定單精度(32位元)、雙精度(64位元)等格式、捨入方法,以及無限大與NaN等特殊值,使計算結果不因電腦而異。
bfloat16
符號1位元、指數8位元、有效數7位元的16位元浮點格式。因指數與FP32相同,可表示的範圍廣,精度雖低但用於AI訓練。FP16為指數5位元、有效數10位元,精度高但範圍窄。
INT8
8位元的有號整數(−128〜127)。在AI推論中,將權重或激活值乘上縮放係數轉換(量化)為INT8,可大幅減少計算與記憶體,並以整數的小型電路高速處理。
混合精度(Mixed precision)
針對運算的各個部分使用不同精度的數值。以 FP16 等進行乘法,以 FP32 進行累加,兼顧速度與精度。
訓練後量化(Post-training quantization)
針對訓練完成的模型,以具代表性的資料調查權重與激活值的數值範圍後,轉換為低精度的方法。PTQ。

相關的比較