捷徑

量化準確性除錯

本文檔提供了用於提高量化準確性的高階策略。如果量化模型與原始模型相比存在誤差,我們可以將誤差歸類為:

  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 -> dequantfp32_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. 手動檢查(使用數值套件)哪些層具有較高的量化誤差。對於這些層,請考慮將它們保留為浮點數,或調整觀察器設定以選擇更好的比例和零點。

實現誤差

如果您將 PyTorch 量化與您自己的後端一起使用,您可能會發現運算的參考實現(例如 dequant -> op_fp32 -> quant)與目標硬體上運算元的量化實現(例如 op_int8)之間存在差異。這可能意味著以下兩件事之一:

  1. 差異(通常很小)是由於目標硬體上目標核心的特定行為與 fp32/cpu 相比而預期的。以整數 dtype 累加就是一個例子。除非核心保證與參考實現的位元等效性,否則這是預期的。

  2. 目標硬體上的核心存在準確性問題。在這種情況下,請聯繫核心開發人員。

數值除錯工具(原型)

警告

數值除錯工具尚處於早期原型階段,可能會有所變更。

文件

取得 PyTorch 的完整開發人員文件

查看文件

教學課程

取得適合初學者和進階開發人員的深入教學課程

查看教學課程

資源

尋找開發資源並獲得問題解答

查看資源