メインコンテンツまでスキップ

量子化

学習済みのモデルを LoadedNet に load_model() を使用してインポートした後、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​

Modalix(開発者向けプレビュー版)では、BFloat16量子化が利用可能です。bfloat16_scheme()を使用してBF16スキームを構築し、QuantizationParams.with_activation_quantizationおよび/with_weight_quantizationを使用して、活性化関数および/または重みに適用します。演算子ごとのBF16サポートについては、モデル互換性を参照してください。

校正方法​

キャリブレーションによって、各レイヤーの量子化範囲が決定されます。デフォルトの方法はMSEです。利用可能な方法は以下のとおりです。

方法コンストラクタ
ヒストグラム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 referenceを参照してください。