筆者做過目標檢測模型、超分模型以及擴散生成模型。其中最常使用的是單精度FP32、半精度FP16、BF16。
雙精度"FP64"就不說了,不太會用到。
#1. 單精度、半精度和混合精度
單精度(FP32)、半精度(FP16)和混合精度(FP32+FP16) 是常見的浮點數計算格式,在深度學習模型的訓練與推理中都有涉及。
它們在計算效率、顯存占用和數值穩定性上有顯著差異。以下是它們的核心區別對比:
精度類型 | 位數 | 顯存占用&生成效果 | 生成速度 | 用途 |
---|---|---|---|---|
FP32 | 32-bit | 🌟🌟🌟🌟最高 | 🌟最慢 | 預訓練 |
FP16 | 16-bit | 🌟🌟 | 🌟🌟🌟 | 微調訓練、推理 |
BF16 | 16-bit | 🌟🌟 | 🌟🌟🌟 | 微調訓練、推理 |
混合精度 | FP16+FP32 | 🌟🌟🌟 | 🌟🌟 | 微調訓練、推理 |
FP8 (E4M3) | 8-bit | 🌟最低 | 🌟🌟🌟🌟最快 | 邊緣設備推理 |
FP8 (E5M2) | 8-bit | 🌟最低 | 🌟🌟🌟🌟最快 | 邊緣設備推理 |
注:推理即圖像生成。
#2. BF16(Brain Float16)是什么?
簡單的說,「BF16」的顯存占用與「FP16」相近,但穩定性與訓練效果更好。所以在訓練時建議用「BF16」替代「FP16」。
「BF16」由 Google Brain 提出,保留與 FP32 相同的指數位數(8 位指數),僅降低小數位數(從FP32的23 位縮減到7位)。雖然BF16點小數部分精度低于 FP16的10位,但這部分對深度學習影響較小,可以暫時忽略。
#3. 混合精度(FP16 + FP32)是什么?
混合精度會同時使用 FP16 和 FP32,關鍵部分(如梯度更新)保留 FP32。
筆者一般會直接使用自動混合精度(AMP),即讓程序自己選擇精度,一般來講模型權重會保存為FP32,前向與反向傳播用FP16。
#4. FP8的簡單了解
實際中很少使用FP8,因為它們的生成效果幾乎是最差的(不管INT8),基本只會用于邊緣設備(如RV1126等)。所以只需簡單了解:
- E5M2(5 位指數,2 位小數):動態范圍大,適合梯度計算(訓練)。
- E4M3(4 位指數,3 位小數):精度稍高,適合前向傳播(生成)。