跳至主要内容

量化

在您使用 load_model() 將訓練好的模型導入 LoadedNet 之後,使用 LoadedNet.quantize 進行量化(請參閱 API Reference)。 SiMa.ai 矽晶片在機器學習加速器 (MLA) 上執行 INT8 和 BF16,並在應用處理單元 (APU) 和電腦視覺單元 (CVU) 上執行浮點運算。

預處理和後處理函數在 APU 和 CVU 上執行。模型層(例如卷積和池化)在 MLA 上執行。量化器會自動將圖劃分到不同的運算單元。只有在 MLA 上執行的部分才會進行量化。

考量量化的訓練 (QAT)

訓練後量化 (PTQ) 請依照下方的預設量化章節操作。如果可以重新訓練 PyTorch 模型,請使用量化感知訓練在微調期間模擬 INT8 效果,並匯出標準 QDQ ONNX 模型。接著依照從 QAT ONNX 到編譯後的模型操作。

預設量化​

在建立自訂設定之前,請將 default_quantization 作為基準 INT8 設定使用。

from afe.apis.defines import default_quantization

quant_model = loaded_net.quantize(
calibration_data=calib_data,
quantization_config=default_quantization,
model_name="my_model",
)

通道均等化是一種可選的預處理步驟,用於使不同通道上的權重分佈保持一致。請透過以下方式啟用: QuantizationParams.with_channel_equalization.

QAT 匯出​

以一般方式載入 QDQ ONNX 模型,接著使用上方的 LoadedNet.quantize,以及編譯中說明的 Model.compile。AFE 會讀取匯出的 QDQ 縮放因子和零點;不要設定內部旗標 is_quantized=True。

仍須提供 calibration_data,但 QDQ 涵蓋的範圍不會根據樣本重新估計,因此使用隨機佔位輸入即可。請符合輸入名稱、資料型別、有效值及 SDK 佈局(4D 影像使用 NHWC)。沒有 QDQ 提示而需要量化的區域仍須使用具代表性的校準資料;準確度檢查則須使用真實評估資料。

量化方案​

使用 quantization_scheme(...) 來定義一個量化方案。對於權重,僅支援對稱量化。對於激活值,僅支援逐張量量化。

from afe.apis.defines import quantization_scheme, default_quantization
import dataclasses

symmetric_per_tensor_8_bits = quantization_scheme(asymmetric=False, per_channel=False, bits=8)
symmetric_per_channel_8_bits = quantization_scheme(asymmetric=False, per_channel=True, bits=8)
asymmetric_per_tensor_8_bits = quantization_scheme(asymmetric=True, per_channel=False, bits=8)

quant_configs = default_quantization
quant_configs = dataclasses.replace(quant_configs, weight_quantization_scheme=symmetric_per_channel_8_bits)
quant_configs = dataclasses.replace(quant_configs, activation_quantization_scheme=symmetric_per_tensor_8_bits)

quant_model = loaded_net.quantize(
calibration_data=calib_data,
quantization_config=quant_configs,
model_name="my_model",
)

BF16​

BFloat16 量化功能已在 Modalix 上推出(開發者預覽版)。使用 bfloat16_scheme() 建立 BF16 方案。將其應用於激活值和/或權重,方法是使用 QuantizationParams.with_activation_quantization / with_weight_quantization。請參閱 模型相容性,以了解每個運算子的 BF16 支援情況。

校準方法​

校準會決定每一層的量化範圍。均方誤差 (MSE) 方法是預設方法。可用的方法如下:

方法建構函式
直方圖均方誤差(預設值)HistogramMSEMethod()
最小值/最大值MinMaxMethod()
移動平均線之最小值/最大值MovingAverageMinMaxMethod()
直方圖熵HistogramEntropyMethod()
直方圖百分位數HistogramPercentileMethod(percentile, num_bins)

將 CalibrationMethod.from_str(...) 作為建構函式使用:

quant_configs = default_quantization.with_calibration(CalibrationMethod.from_str('mse'))

# Or a percentile method with custom percentile and bin count:
quant_configs = default_quantization.with_calibration(HistogramPercentileMethod(91.0, 2048))

覆寫設定參數​

使用 QuantizationParams 和 with_* 輔助函式來覆寫個別設定: with_activation_quantization、with_weight_quantization、 with_unquantized_nodes、with_requantization_mode、with_bias_correction、 with_calibration、with_channel_equalization,以及 with_custom_quantization_configs。請參閱 API 參考文檔,以了解完整的量化 (quantization) 設定。