快捷方式

量化精度除錯

本文提供了提高量化精度的高階策略。如果量化模型與原始模型相比存在誤差,我們可以將誤差分為

  1. 資料不敏感誤差 - 由固有的模型量化誤差引起,大部分輸入資料誤差較大

  2. 資料敏感誤差 - 由異常輸入資料引起,小部分輸入資料誤差較大

  3. 實現誤差 - 量化核心與參考實現不匹配

資料不敏感誤差

一般提示

  1. 對於 PTQ,請確保用於校準的資料能夠代表您的資料集。例如,對於分類問題,一般指導原則是每個類別都有多個樣本,並且樣本總數應至少為 100 個。使用更多資料進行校準除了增加校準時間外沒有其他代價。

  2. 如果您的模型包含 Conv-BN 或 Linear-BN 模式,請考慮融合它們。如果您使用的是 FX 圖模式量化,這會由工作流程自動完成。如果您使用的是 Eager 模式量化,您可以使用 torch.ao.quantization.fuse_modules API 手動執行此操作。

  3. 增加問題運算元的 dtype 精度。通常,fp32 精度最高,其次是 fp16,然後是動態量化的 int8,最後是靜態量化的 int8。

    1. 注意:這是一種權衡效能以換取精度的方式。

    2. 注意:不同後端支援的每種 dtype 和每種運算元的核心可用性可能有所不同。

    3. 注意:dtype 轉換會增加額外的效能開銷。例如,fp32_op -> quant -> int8_op -> dequant -> fp32_op -> quant -> int8_op -> dequant 的效能開銷會比 fp32_op -> fp32_op -> quant -> int8_op -> int8_op -> dequant 高,因為需要更多的 dtype 轉換次數。

  4. 如果您使用的是 PTQ,請考慮使用 QAT 來恢復部分量化導致的精度損失。

Int8 量化提示

  1. 如果您使用的是逐張量權重量化,請考慮使用逐通道權重量化。

  2. 如果您在 fbgemm 上進行推理,請確保如果您的 CPU 是 Cooperlake 或更新型號,則將 reduce_range 引數設定為 False;否則設定為 True

  3. 檢查輸入啟用在不同樣本之間的分佈差異。如果差異較大,該層可能適合動態量化,但不適合靜態量化。

資料敏感誤差

如果您使用靜態量化,並且一小部分輸入資料導致高量化誤差,您可以嘗試

  1. 調整您的校準資料集,使其更能代表您的推理資料集。

  2. 手動檢查(使用 Numeric Suite)哪些層具有高量化誤差。對於這些層,考慮將其保留為浮點格式,或調整觀察器設定以選擇更好的 scale 和 zero_point。

實現誤差

如果您將 PyTorch 量化與自己的後端一起使用,您可能會看到某個操作的參考實現(例如 dequant -> op_fp32 -> quant)與目標硬體上該操作的量化實現(例如 op_int8)之間的差異。這可能意味著以下兩種情況之一:

  1. 這些差異(通常很小)是預期的,因為目標硬體上的目標核心與 fp32/cpu 相比有特定的行為。一個例子是在整數 dtype 中進行累積。除非核心保證與參考實現的位級等效性,否則這是正常的。

  2. 目標硬體上的核心存在精度問題。在這種情況下,請聯絡核心開發者。

數值除錯工具 (原型)

警告

數值除錯工具是早期原型,可能會發生變化。

文件

查閱 PyTorch 全面的開發者文件

檢視文件

教程

獲取面向初學者和高階開發者的深度教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源