量化準確度偵錯¶
本文檔提供提高量化準確度的高階策略。 如果量化模型與原始模型相比存在誤差,我們可以將誤差分類為
資料不敏感誤差 - 由固有的模型量化誤差引起,大部分輸入資料都有較大的誤差
資料敏感誤差 - 由異常值輸入資料引起,小部分輸入資料有較大的誤差
實作誤差 - 量化核心與參考實作不符
資料不敏感誤差¶
一般提示¶
對於 PTQ,請確保您用於校準的資料能代表您的資料集。 例如,對於分類問題,一般的指導原則是每個類別中都有多個樣本,並且樣本總數應至少為 100。 使用更多資料進行校準,除了校準時間之外,沒有任何懲罰。
如果您的模型具有 Conv-BN 或 Linear-BN 模式,請考慮融合它們。 如果您使用 FX 圖模式量化,此操作會由工作流程自動完成。 如果您使用 Eager 模式量化,則可以使用
torch.ao.quantization.fuse_modules
API 手動執行此操作。提高有問題的運算的 dtype 精度。通常,fp32 將具有最高的準確度,其次是 fp16,然後是動態量化的 int8,最後是靜態量化的 int8。
注意:這是以效能換取準確度。
注意:每個運算在每個後端上可用的 kernel 數量可能不同。
注意:dtype 轉換會增加額外的效能成本。例如,
fp32_op -> quant -> int8_op -> dequant -> fp32_op -> quant -> int8_op -> dequant
與fp32_op -> fp32_op -> quant -> int8_op -> int8_op -> dequant
相比,因為需要更多 dtype 轉換,所以會有效能上的損失。
如果您正在使用 PTQ,請考慮使用 QAT 來恢復量化造成的部分準確度損失。
Int8 量化提示¶
如果您正在使用 per-tensor 權重量化,請考慮使用 per-channel 權重量化。
如果您正在 fbgemm 上進行推論,請確保在您的 CPU 是 Cooperlake 或更新的 CPU 時,將 reduce_range 參數設置為 False,否則設置為 True。
審核不同樣本的輸入 activation 分佈變化。如果這種變化很大,則該層可能適用於動態量化,但不適用於靜態量化。
資料敏感錯誤¶
如果您正在使用靜態量化,並且一小部分輸入資料導致高度量化誤差,您可以嘗試:
調整您的校準資料集,使其更能代表您的推論資料集。
手動檢查(使用 Numeric Suite)哪些層具有高度量化誤差。對於這些層,請考慮將它們保留在浮點數中,或調整 observer 設置以選擇更好的 scale 和 zero_point。
實作錯誤¶
如果您正在使用具有您自己後端的 PyTorch 量化,您可能會看到操作的參考實作(例如 dequant -> op_fp32 -> quant
)和目標硬體上該操作的量化實作(例如 op_int8)之間的差異。這可能意味著以下兩種情況之一:
由於目標 kernel 在目標硬體上的特定行為與 fp32/cpu 相比,這些差異(通常很小)是預期的。例如在整數 dtype 中累積。除非 kernel 保證與參考實作具有位元等效性,否則這是預期的。
目標硬體上的 kernel 存在準確度問題。在這種情況下,請聯繫 kernel 開發人員。
數值偵錯工具 (原型)¶
警告
數值偵錯工具是早期原型,可能會有所變動。
torch.ao.ns._numeric_suite Eager mode 數值套件
torch.ao.ns._numeric_suite_fx FX 數值套件