Optimum 文件
配置
並獲得增強的文件體驗
開始使用
配置
配置類是指定任務執行方式的方法。ONNX Runtime 包支援以下兩個任務:
最佳化:由 ORTOptimizer 執行,此任務可以透過 OptimizationConfig 進行調整。
量化:由 ORTQuantizer 執行,量化可以透過 QuantizationConfig 設定。在某些情況下(訓練後靜態量化),需要一個校準步驟,這可以透過 CalibrationConfig 指定。
OptimizationConfig
類 optimum.onnxruntime.OptimizationConfig
< 源 >( optimization_level: int = 1 optimize_for_gpu: bool = False fp16: bool = False optimize_with_onnxruntime_only: typing.Optional[bool] = None enable_transformers_specific_optimizations: bool = True disable_gelu: typing.Optional[bool] = None disable_gelu_fusion: bool = False disable_layer_norm: typing.Optional[bool] = None disable_layer_norm_fusion: bool = False disable_attention: typing.Optional[bool] = None disable_attention_fusion: bool = False disable_skip_layer_norm: typing.Optional[bool] = None disable_skip_layer_norm_fusion: bool = False disable_bias_skip_layer_norm: typing.Optional[bool] = None disable_bias_skip_layer_norm_fusion: bool = False disable_bias_gelu: typing.Optional[bool] = None disable_bias_gelu_fusion: bool = False disable_embed_layer_norm: bool = True disable_embed_layer_norm_fusion: bool = True enable_gelu_approximation: bool = False use_mask_index: bool = False no_attention_mask: bool = False disable_shape_inference: bool = False use_multi_head_attention: bool = False enable_gemm_fast_gelu_fusion: bool = False use_raw_attention_mask: bool = False disable_group_norm_fusion: bool = True disable_packed_kv: bool = True disable_rotary_embeddings: bool = False )
引數
- optimization_level (
int
, 預設為 1) — ONNX Runtime 對載入圖執行的最佳化級別。支援的最佳化級別為 0、1、2 和 99。- 0:將停用所有最佳化
- 1:將啟用基本最佳化
- 2:將啟用基本和擴充套件最佳化,包括應用於分配給 CPU 或 CUDA 執行提供程式的節點的複雜節點融合,使生成的最佳化圖與硬體相關
- 99:將啟用所有可用最佳化,包括佈局最佳化
- optimize_for_gpu (
bool
, 預設為False
) — 是否為 GPU 推理最佳化模型。當optimization_level
> 1 時,最佳化後的圖可能只包含 GPU 或 CPU 的運算子。 - fp16 (
bool
, 預設為False
) — 所有權重和節點是否應從 float32 轉換為 float16。 - enable_transformers_specific_optimizations (
bool
, 預設為True
) — 是否在 ONNX Runtime 通用最佳化之上僅使用transformers
特定最佳化。 - disable_gelu_fusion (
bool
, 預設為False
) — 是否停用 Gelu 融合。 - disable_layer_norm_fusion (
bool
, 預設為False
) — 是否停用 Layer Normalization 融合。 - disable_attention_fusion (
bool
, 預設為False
) — 是否停用 Attention 融合。 - disable_skip_layer_norm_fusion (
bool
, 預設為False
) — 是否停用 SkipLayerNormalization 融合。 - disable_bias_skip_layer_norm_fusion (
bool
, 預設為False
) — 是否停用 Add Bias 和 SkipLayerNormalization 融合。 - disable_bias_gelu_fusion (
bool
, 預設為False
) — 是否停用 Add Bias 和 Gelu / FastGelu 融合。 - disable_embed_layer_norm_fusion (
bool
, 預設為True
) — 是否停用 EmbedLayerNormalization 融合。由於此融合與 ONNX Runtime 量化不相容,因此預設值設定為True
。 - enable_gelu_approximation (
bool
, 預設為False
) — 是否啟用 Gelu / BiasGelu 到 FastGelu 的轉換。預設值設定為False
,因為此近似可能會輕微影響模型的準確性。 - use_mask_index (
bool
, 預設為False
) — 是否在 attention 運算子中使用掩碼索引而不是原始注意力掩碼。 - no_attention_mask (
bool
, 預設為False
) — 是否不使用注意力掩碼。僅適用於 bert 模型型別。 - disable_embed_layer_norm (
bool
, 預設為True
) — 是否停用 EmbedLayerNormalization 融合。由於此融合與 ONNX Runtime 量化不相容,因此預設值設定為True
。 - disable_shape_inference (
bool
, 預設為False
) — 是否停用符號形狀推理。預設值設定為False
,但符號形狀推理有時可能會導致問題。 - use_multi_head_attention (
bool
, 預設為False
) — 實驗性引數。使用 MultiHeadAttention 代替 Attention 運算子,它具有合併的 Q/K/V 投影權重,這在某些情況下可能更快,因為 3 個 MatMul 合併為一個。” “請注意,當 QKV 未打包時,MultiHeadAttention 可能比 Attention 慢。” - enable_gemm_fast_gelu_fusion (
bool
, 預設為False
) — 啟用 GemmfastGelu 融合。 - use_raw_attention_mask (
bool
, 預設為False
) — 使用原始注意力掩碼。如果您的輸入不是右側填充,請使用此選項。這可能會停用融合注意力並導致效能下降。 - disable_group_norm_fusion (
bool
, 預設為True
) — 不融合 GroupNorm。僅適用於 model_type=unet。 - disable_packed_kv (
bool
, 預設為True
) — 在交叉注意力中不使用打包的 kv。僅適用於 model_type=unet。 - disable_rotary_embeddings (
bool
, 預設為False
) — 是否停用旋轉嵌入融合。
OptimizationConfig 是處理所有 ONNX Runtime 最佳化引數的配置類。有兩種最佳化堆疊:
- ONNX Runtime 通用最佳化工具:可用於任何 ONNX 模型。
- ONNX Runtime 變換器最佳化工具:僅適用於部分變換器模型。
建立通用 OptimizationConfig
的工廠。
建立 O1 ~OptimizationConfig
。
建立 O2 ~OptimizationConfig
。
建立 O3 ~OptimizationConfig
。
建立 O4 ~OptimizationConfig
。
with_optimization_level
< 源 >( optimization_level: str for_gpu: bool = False **kwargs ) → OptimizationConfig
引數
- optimization_level (
str
) — 最佳化級別,允許以下值:- O1:基本通用最佳化
- O2:基本和擴充套件通用最佳化,變換器特定融合。
- O3:與 O2 相同,但包含 Fast Gelu 近似。
- O4:與 O3 相同,但包含混合精度。
- for_gpu (
bool
, 預設為False
) — 待最佳化模型是否將在 GPU 上執行,某些最佳化取決於模型將執行的硬體。僅當 optimization_level > 1 時需要。 - kwargs (
Dict[str, Any]
) — 提供給~OptimizationConfig
建構函式的引數。
返回
OptimizationConfig
與請求的最佳化級別對應的 OptimizationConfig
。
根據最佳化級別建立具有預定義引數的 ~OptimizationConfig
。
QuantizationConfig
類 optimum.onnxruntime.QuantizationConfig
< 源 >( is_static: bool format: QuantFormat mode: QuantizationMode = <QuantizationMode.QLinearOps: 1> activations_dtype: QuantType = <QuantType.QUInt8: 1> activations_symmetric: bool = False weights_dtype: QuantType = <QuantType.QInt8: 0> weights_symmetric: bool = True per_channel: bool = False reduce_range: bool = False nodes_to_quantize: typing.List[str] = <factory> nodes_to_exclude: typing.List[str] = <factory> operators_to_quantize: typing.List[str] = <factory> qdq_add_pair_to_weight: bool = False qdq_dedicated_pair: bool = False qdq_op_type_per_channel_support_to_axis: typing.Dict[str, int] = <factory> )
引數
- is_static (
bool
) — 是否應用靜態量化或動態量化。 - format (
QuantFormat
) — 目標 ONNX Runtime 量化表示格式。對於面向運算子 (QOperator) 格式,所有量化運算子都有自己的 ONNX 定義。對於面向張量 (QDQ) 格式,透過插入 QuantizeLinear / DeQuantizeLinear 運算子對模型進行量化。 - mode (
QuantizationMode
, 預設為QuantizationMode.QLinearOps
) — 目標 ONNX Runtime 量化模式,預設為 QLinearOps 以匹配 QDQ 格式。當目標動態量化模式時,預設值為QuantizationMode.IntegerOps
,而靜態量化模式的預設值為QuantizationMode.QLinearOps
。 - activations_dtype (
QuantType
, 預設為QuantType.QUInt8
) — 用於啟用的量化資料型別。 - activations_symmetric (
bool
, 預設為False
) — 是否對啟用應用對稱量化。 - weights_dtype (
QuantType
, 預設為QuantType.QInt8
) — 用於權重的量化資料型別。 - weights_symmetric (
bool
, 預設為True
) — 是否對權重應用對稱量化。 - per_channel (
bool
, 預設為False
) — 我們是否應該進行逐通道(也稱為“逐行”)量化。啟用此功能可以提高整體準確性,但會使量化模型更重。 - reduce_range (
bool
, 預設為False
) — 是否使用縮減範圍的 7 位整數而不是 8 位整數。 - nodes_to_quantize (
List[str]
, 預設為[]
) — 要量化的節點名稱列表。未指定時,將量化所有節點。如果為空,則量化operators_to_quantize
中的所有運算子節點。 - nodes_to_exclude (
List[str]
, 預設為[]
) — 應用量化時要排除的節點名稱列表。模型中的節點列表可以透過 onnx.load 載入 ONNX 模型或透過 netron 進行視覺化檢查來找到。 - operators_to_quantize (
List[str]
) — 要量化的運算子型別列表。預設為給定量化模式和格式的所有可量化運算子。可量化運算子可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。 - qdq_add_pair_to_weight (
bool
, 預設為False
) — 預設情況下,浮點權重被量化並僅提供給插入的 DeQuantizeLinear 節點。如果設定為 True,則浮點權重將保留,並且將插入 QuantizeLinear / DeQuantizeLinear 兩個節點。 - qdq_dedicated_pair (
bool
, 預設為False
) — 插入 QDQ 對時,多個節點可以共享一個 QDQ 對作為其輸入。如果為 True,它將為每個節點建立相同且專用的 QDQ 對。 - qdq_op_type_per_channel_support_to_axis (
Dict[str, int]
) — 設定特定運算子型別的通道軸。僅當支援逐通道量化且per_channel
設定為 True 時有效。
QuantizationConfig 是處理所有 ONNX Runtime 量化引數的配置類。
AutoQuantizationConfig
arm64
< source >( is_static: bool use_symmetric_activations: bool = False use_symmetric_weights: bool = True per_channel: bool = True nodes_to_quantize: typing.Optional[typing.List[str]] = None nodes_to_exclude: typing.Optional[typing.List[str]] = None operators_to_quantize: typing.Optional[typing.List[str]] = None )
引數
- is_static (
bool
) — 布林標誌,指示我們是目標靜態量化還是動態量化。 - use_symmetric_activations (
bool
, 預設為False
) — 是否對啟用使用對稱量化。 - use_symmetric_weights (
bool
, 預設為True
) — 是否對權重使用對稱量化。 - per_channel (
bool
, 預設為True
) — 我們是否應該進行逐通道(也稱為“逐行”)量化。啟用此功能可以提高整體準確性,但會使量化模型更重。 - nodes_to_quantize (
Optional[List[str]]
, 預設為None
) — 要量化的特定節點。如果為None
,則量化operators_to_quantize
中的所有運算子節點。 - nodes_to_exclude (
Optional[List[str]]
, 預設為None
) — 要從量化中排除的特定節點。模型中的節點列表可以透過 onnx.load 載入 ONNX 模型或透過 netron 進行視覺化檢查來找到。 - operators_to_quantize (
Optional[List[str]]
, 預設為None
) — 要執行量化的節點型別。預設情況下,將量化所有可量化運算子。可量化運算子可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。
為 ARM64 建立適用於 ARM64 的 QuantizationConfig。
avx2
< source >( is_static: bool use_symmetric_activations: bool = False use_symmetric_weights: bool = True per_channel: bool = True reduce_range: bool = False nodes_to_quantize: typing.Optional[typing.List[str]] = None nodes_to_exclude: typing.Optional[typing.List[str]] = None operators_to_quantize: typing.Optional[typing.List[str]] = None )
引數
- is_static (
bool
) — 布林標誌,指示我們是目標靜態量化還是動態量化。 - use_symmetric_activations (
bool
, 預設為False
) — 是否對啟用使用對稱量化。 - use_symmetric_weights (
bool
, 預設為True
) — 是否對權重使用對稱量化。 - per_channel (
bool
, 預設為True
) — 我們是否應該進行逐通道(也稱為“逐行”)量化。啟用此功能可以提高整體準確性,但會使量化模型更重。 - reduce_range (
bool
, 預設為False
) — 指示是使用 8 位整數(False)還是縮減範圍的 7 位整數(True)。作為基線,始終建議使用全範圍(reduce_range = False)進行測試,然後,如果準確性下降顯著,則嘗試使用縮減範圍(reduce_range = True)。使用 AVX512(非 VNNI)的 Intel CPU 在呼叫 VPMADDUBSW 指令時可能會出現飽和問題。為了解決這個問題,應該使用 7 位而不是 8 位整數。 - nodes_to_quantize (
Optional[List[str]]
, 預設為None
) — 要量化的特定節點。如果為None
,則量化operators_to_quantize
中的所有運算子節點。 - nodes_to_exclude (
Optional[List[str]]
, 預設為None
) — 要從量化中排除的特定節點。模型中的節點列表可以透過 onnx.load 載入 ONNX 模型或透過 netron 進行視覺化檢查來找到。 - operators_to_quantize (
Optional[List[str]]
, 預設為None
) — 要執行量化的節點型別。預設情況下,將量化所有可量化運算子。可量化運算子可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。
為具有 AVX2 指令集的 CPU 建立適用於 CPU 的 QuantizationConfig。
avx512
< source >( is_static: bool use_symmetric_activations: bool = False use_symmetric_weights: bool = True per_channel: bool = True reduce_range: bool = False nodes_to_quantize: typing.Optional[typing.List[str]] = None nodes_to_exclude: typing.Optional[typing.List[str]] = None operators_to_quantize: typing.Optional[typing.List[str]] = None )
引數
- is_static (
bool
) — 布林標誌,指示我們是目標靜態量化還是動態量化。 - use_symmetric_activations (
bool
, 預設為False
) — 是否對啟用使用對稱量化。 - use_symmetric_weights (
bool
, 預設為True
) — 是否對權重使用對稱量化。 - per_channel (
bool
, 預設為True
) — 我們是否應該進行逐通道(也稱為“逐行”)量化。啟用此功能可以提高整體準確性,但會使量化模型更重。 - reduce_range (
bool
, 預設為False
) — 指示是使用 8 位整數(False)還是縮減範圍的 7 位整數(True)。作為基線,始終建議使用全範圍(reduce_range = False)進行測試,然後,如果準確性下降顯著,則嘗試使用縮減範圍(reduce_range = True)。使用 AVX512(非 VNNI)的 Intel CPU 在呼叫 VPMADDUBSW 指令時可能會出現飽和問題。為了解決這個問題,應該使用 7 位而不是 8 位整數。 - nodes_to_quantize (
Optional[List[str]]
, 預設為None
) — 要量化的特定節點。如果為None
,則量化operators_to_quantize
中的所有運算子節點。 - nodes_to_exclude (
Optional[List[str]]
, 預設為None
) — 要從量化中排除的特定節點。模型中的節點列表可以透過 onnx.load 載入 ONNX 模型或透過 netron 進行視覺化檢查來找到。 - operators_to_quantize (
Optional[List[str]]
, 預設為None
) — 要執行量化的節點型別。預設情況下,將量化所有可量化運算子。可量化運算子可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。
為具有 AVX512 指令集的 CPU 建立適用於 CPU 的 QuantizationConfig。
avx512_vnni
< source >( is_static: bool use_symmetric_activations: bool = False use_symmetric_weights: bool = True per_channel: bool = True nodes_to_quantize: typing.Optional[typing.List[str]] = None nodes_to_exclude: typing.Optional[typing.List[str]] = None operators_to_quantize: typing.Optional[typing.List[str]] = None )
引數
- is_static (
bool
) — 布林標誌,指示我們是目標靜態量化還是動態量化。 - use_symmetric_activations (
bool
, 預設為False
) — 是否對啟用使用對稱量化。 - use_symmetric_weights (
bool
, 預設為True
) — 是否對權重使用對稱量化。 - per_channel (
bool
, 預設為True
) — 我們是否應該進行逐通道(也稱為“逐行”)量化。啟用此功能可以提高整體準確性,但會使量化模型更重。 - nodes_to_quantize (
Optional[List[str]]
, 預設為None
) — 要量化的特定節點。如果為None
,則量化operators_to_quantize
中的所有運算子節點。 - nodes_to_exclude (
Optional[List[str]]
, 預設為None
) — 要從量化中排除的特定節點。模型中的節點列表可以透過 onnx.load 載入 ONNX 模型或透過 netron 進行視覺化檢查來找到。 - operators_to_quantize (
Optional[List[str]]
, 預設為None
) — 要執行量化的節點型別。預設情況下,將量化所有可量化運算子。可量化運算子可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。
為具有 AVX512-VNNI 指令集的 CPU 建立適用於 CPU 的 QuantizationConfig。
當目標是 Intel AVX512-VNNI CPU 時,底層執行引擎利用 CPU 指令 VPDPBUSD 在單個指令中計算 \i32 += i8(w) * u8(x)\。
AVX512-VNNI (AVX512 向量神經網路指令) 是一種 x86 擴充套件指令集,是 AVX-512 ISA 的一部分。
AVX512 VNNI 旨在加速 INT8 推理的卷積神經網路。
tensorrt
< source >( per_channel: bool = True nodes_to_quantize: typing.Optional[typing.List[str]] = None nodes_to_exclude: typing.Optional[typing.List[str]] = None operators_to_quantize: typing.Optional[typing.List[str]] = None )
引數
- per_channel (
bool
, 預設為True
) — 我們是否應該進行逐通道(也稱為“逐行”)量化。啟用此功能可以提高整體準確性,但會使量化模型更重。 - nodes_to_quantize (
Optional[List[str]]
, 預設為None
) — 要量化的特定節點。如果為None
,則量化operators_to_quantize
中的所有運算子節點。 - nodes_to_exclude (
Optional[List[str]]
, 預設為None
) — 需要從量化中排除的特定節點。模型的節點列表可以透過 onnx.load 載入 ONNX 模型或透過 netron 視覺化檢查來找到。 - operators_to_quantize (
Optional[List[str]]
, 預設為None
) — 要執行量化的節點型別。預設情況下,所有可量化運算元都將被量化。可量化運算元可在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。
建立一個適用於 TensorRT 靜態量化,面向 NVIDIA GPU 的 QuantizationConfig。
CalibrationConfig
class optimum.onnxruntime.CalibrationConfig
< source >( dataset_name: str dataset_config_name: str dataset_split: str dataset_num_samples: int method: CalibrationMethod num_bins: typing.Optional[int] = None num_quantized_bins: typing.Optional[int] = None percentile: typing.Optional[float] = None moving_average: typing.Optional[bool] = None averaging_constant: typing.Optional[float] = None )
引數
- dataset_name (
str
) — 校準資料集的名稱。 - dataset_config_name (
str
) — 校準資料集配置的名稱。 - dataset_split (
str
) — 用於執行校準步驟的資料集拆分。 - dataset_num_samples (
int
) — 構成校準資料集的樣本數量。 - method (
CalibrationMethod
) — 使用校準資料集計算啟用量化引數的方法。 - num_bins (
Optional[int]
, 預設為None
) — 當使用 Percentile 或 Entropy 方法執行校準步驟時,用於建立直方圖的 bin 數量。 - num_quantized_bins (
Optional[int]
, 預設為None
) — 當使用 Entropy 方法執行校準步驟時,量化 bin 的數量。 - percentile (
Optional[float]
, 預設為None
) — 當使用 Percentile 方法執行校準步驟時,計算啟用量化範圍所使用的百分位數。 - moving_average (
Optional[bool]
, 預設為None
) — 在使用 MinMax 方法執行校準步驟時,是否計算最小值和最大值的移動平均值。 - averaging_constant (
Optional[float]
, 預設為None
) — 在計算最小值和最大值的移動平均值時使用的恆定平滑因子。僅當選擇 MinMax 校準方法且moving_average
設定為 True 時有效。
CalibrationConfig 是一個配置類,用於處理與靜態量化的校準步驟相關的所有 ONNX Runtime 引數。
ORTConfig
class optimum.onnxruntime.ORTConfig
< source >( opset: typing.Optional[int] = None use_external_data_format: bool = False one_external_file: bool = True optimization: typing.Optional[optimum.onnxruntime.configuration.OptimizationConfig] = None quantization: typing.Optional[optimum.onnxruntime.configuration.QuantizationConfig] = None **kwargs )
引數
- opset (
Optional[int]
, 預設為None
) — 匯出模型時使用的 ONNX opset 版本。 - use_external_data_format (
bool
, 預設為False
) — 允許匯出大於 2GB 的模型。 - one_external_file (
bool
, 預設為True
) — 當use_external_data_format=True
時,是否將所有張量儲存到一個外部檔案。如果為 False,則將每個張量儲存到以張量名稱命名的檔案中。(量化時不能設定為False
) - optimization (
Optional[OptimizationConfig]
, 預設為None
) — 指定用於最佳化 ONNX Runtime 模型的配置 - quantization (
Optional[QuantizationConfig]
, 預設為None
) — 指定用於量化 ONNX Runtime 模型的配置
ORTConfig 是一個配置類,用於處理與 ONNX IR 模型匯出、最佳化和量化引數相關的所有 ONNX Runtime 引數。