配置
配置类是指定任务应如何完成的方式。ONNX Runtime 包支持两个任务
优化:由 ORTOptimizer 执行,此任务可以使用 OptimizationConfig 进行调整。
量化:由 ORTQuantizer 执行,可以使用 QuantizationConfig 设置量化。在某些情况下(训练后静态量化)需要校准步骤,可以使用 CalibrationConfig 指定。
OptimizationConfig
class 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
) — 是否禁用层归一化融合。 - disable_attention_fusion (
bool
, 默认为False
) — 是否禁用 Attention 融合。 - disable_skip_layer_norm_fusion (
bool
, 默认为False
) — 是否禁用 SkipLayerNormalization 融合。 - disable_bias_skip_layer_norm_fusion (
bool
, 默认为False
) — 是否禁用添加 Bias 和 SkipLayerNormalization 融合。 - disable_bias_gelu_fusion (
bool
, 默认为False
) — 是否禁用添加 Bias 和 Gelu / FastGelu 融合。 - disable_embed_layer_norm_fusion (
bool
, 默认为True
) — 是否禁用 EmbedLayerNormalization 融合。默认值设置为True
,因为此融合与 ONNX Runtime 量化不兼容。 - enable_gelu_approximation (
bool
, 默认为False
) — 是否启用 Gelu / BiasGelu 到 FastGelu 的转换。默认值设置为False
,因为此近似可能会略微影响模型的准确性。 - use_mask_index (
bool
, 默认为False
) — 是否在 attention 运算符中使用掩码索引而不是原始 attention 掩码。 - no_attention_mask (
bool
, 默认为False
) — 是否不使用 attention 掩码。仅适用于 bert 模型类型。 - disable_embed_layer_norm (
bool
, 默认为True
) — 是否禁用 EmbedLayerNormalization 融合。默认值设置为True
,因为此融合与 ONNX Runtime 量化不兼容 - 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
) — 使用原始 attention 掩码。如果您的输入不是右侧填充,请使用此选项。这可能会停用融合的 attention 并导致性能下降。 - disable_group_norm_fusion (
bool
, 默认为True
) — 不要融合 GroupNorm。仅适用于 model_type=unet。 - disable_packed_kv (
bool
, 默认值为True
) — 在交叉注意力中不使用 packed kv。仅适用于 model_type=unet。 - disable_rotary_embeddings (
bool
, 默认值为False
) — 是否禁用 Rotary Embedding 融合。
OptimizationConfig 是处理所有 ONNX Runtime 优化参数的配置类。这里有两类优化堆栈:
- ONNX Runtime 通用优化工具:它可以处理任何 ONNX 模型。
- ONNX Runtime transformers 优化工具:它仅可处理 transformers 模型的一个子集。
用于创建通用 OptimizationConfig
的工厂。
O1
< source >( for_gpu: bool = False **kwargs ) → OptimizationConfig
创建 O1 ~OptimizationConfig
。
O2
< source >( for_gpu: bool = False **kwargs ) → OptimizationConfig
创建 O2 ~OptimizationConfig
。
O3
< source >( for_gpu: bool = False **kwargs ) → OptimizationConfig
创建 O3 ~OptimizationConfig
。
O4
< source >( for_gpu: bool = True **kwargs ) → OptimizationConfig
创建 O4 ~OptimizationConfig
。
with_optimization_level
< source >( optimization_level: str for_gpu: bool = False **kwargs ) → OptimizationConfig
参数
- optimization_level (
str
) — 优化级别,允许的值如下:- O1:基本通用优化
- O2:基本和扩展通用优化,transformers-specific 融合。
- O3:与 O2 相同,但使用 Fast Gelu 近似。
- O4:与 O3 相同,但使用混合精度。
- for_gpu (
bool
, 默认值为False
) — 模型是否将在 GPU 上运行以进行优化,某些优化取决于模型将在其上运行的硬件。仅当 optimization_level > 1 时才需要。 - kwargs (
Dict[str, Any]
) — 提供给~OptimizationConfig
构造函数的参数。
返回值
OptimizationConfig
与请求的优化级别对应的 OptimizationConfig
。
使用根据优化级别预定义的参数创建 ~OptimizationConfig
。
QuantizationConfig
class optimum.onnxruntime.QuantizationConfig
< source >( 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
, defaults toFalse
) — 是否对激活函数应用对称量化。 - weights_dtype (
QuantType
, defaults toQuantType.QInt8
) — 用于权重量化的数据类型。 - weights_symmetric (
bool
, defaults toTrue
) — 是否对权重应用对称量化。 - per_channel (
bool
, defaults toFalse
) — 是否应按通道(也称为“逐行”)进行量化。 启用此功能可以提高整体准确性,同时使量化模型更重。 - reduce_range (
bool
, defaults toFalse
) — 是否使用缩减范围的 7 位整数而不是 8 位整数。 - nodes_to_quantize (
List[str]
, defaults to[]
) — 要量化的节点名称列表。 如果未指定,将量化所有节点。 如果为空,则将量化来自operators_to_quantize
的所有运算符的节点。 - nodes_to_exclude (
List[str]
, defaults to[]
) — 应用量化时要排除的节点名称列表。 模型中的节点列表可以通过加载 ONNX 模型 (使用 onnx.load) 找到,或者通过使用 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
, defaults toFalse
) — 默认情况下,浮点权重被量化并馈送到唯一插入的 DeQuantizeLinear 节点。 如果设置为 True,则浮点权重将保留,并且将同时插入 QuantizeLinear / DeQuantizeLinear 节点。 - qdq_dedicated_pair (
bool
, defaults toFalse
) — 插入 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
, defaults toFalse
) — 是否对激活函数使用对称量化。 - use_symmetric_weights (
bool
, defaults toTrue
) — 是否对权重使用对称量化。 - per_channel (
bool
, defaults toTrue
) — 是否应按通道(也称为“逐行”)进行量化。 启用此功能可以提高整体准确性,同时使量化模型更重。 - nodes_to_quantize (
Optional[List[str]]
, defaults toNone
) — 要量化的特定节点。 如果为None
,则将量化来自operators_to_quantize
的所有运算符的节点。 - nodes_to_exclude (
Optional[List[str]]
, defaults toNone
) — 要从量化中排除的特定节点。 模型中的节点列表可以通过加载 ONNX 模型 (使用 onnx.load) 找到,或者通过使用 netron 进行可视化检查找到。 - operators_to_quantize (
Optional[List[str]]
, defaults toNone
) — 要对其执行量化的节点类型。 默认情况下,将量化所有可量化的运算符。 可量化运算符可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 中找到。
创建适合 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
, defaults toFalse
) — 是否对激活函数使用对称量化。 - use_symmetric_weights (
bool
, defaults toTrue
) — 是否对权重使用对称量化。 - per_channel (
bool
, defaults toTrue
) — 是否应按通道(也称为“逐行”)进行量化。 启用此功能可以提高整体准确性,同时使量化模型更重。 - reduce_range (
bool
, 默认为False
) — 指示是否使用 8 位整数 (False) 或 缩减范围的 7 位整数 (True)。 作为基线,始终建议先使用全范围 (reduce_range = False) 进行测试,然后,如果精度下降明显,则尝试使用缩减范围 (reduce_range = True)。 当调用 VPMADDUBSW 指令时,使用 AVX512 (非 VNNI) 的 Intel CPU 可能会遇到饱和问题。 为了解决这个问题,应该使用 7 位而不是 8 位整数。 - nodes_to_quantize (
Optional[List[str]]
, 默认为None
) — 要量化的特定节点。 如果为None
,则将量化来自operators_to_quantize
的所有运算符的节点。 - nodes_to_exclude (
Optional[List[str]]
, 默认为None
) — 从量化中排除的特定节点。 模型中的节点列表可以通过加载 ONNX 模型 (使用 onnx.load) 找到,或者通过使用 netron 进行可视化检查找到。 - operators_to_quantize (
Optional[List[str]]
, 默认为None
) — 要对其执行量化的节点类型。 默认情况下,将量化所有可量化的运算符。 可量化的运算符可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 中找到。
创建一个适用于具有 AVX2 指令集的 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)。 当调用 VPMADDUBSW 指令时,使用 AVX512 (非 VNNI) 的 Intel CPU 可能会遇到饱和问题。 为了解决这个问题,应该使用 7 位而不是 8 位整数。 - nodes_to_quantize (
Optional[List[str]]
, 默认为None
) — 要量化的特定节点。 如果为None
,则将量化来自operators_to_quantize
的所有运算符的节点。 - nodes_to_exclude (
Optional[List[str]]
, 默认为None
) — 从量化中排除的特定节点。 模型中的节点列表可以通过加载 ONNX 模型 (使用 onnx.load) 找到,或者通过使用 netron 进行可视化检查找到。 - operators_to_quantize (
Optional[List[str]]
, 默认为None
) — 要对其执行量化的节点类型。 默认情况下,将量化所有可量化的运算符。 可量化的运算符可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 中找到。
创建一个适用于具有 AVX512 指令集的 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 模型 (使用 onnx.load) 找到,或者通过使用 netron 进行可视化检查找到。 - operators_to_quantize (
Optional[List[str]]
, 默认为None
) — 要对其执行量化的节点类型。 默认情况下,将量化所有可量化的运算符。 可量化的运算符可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 中找到。
创建一个适用于具有 AVX512-VNNI 指令集的 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 静态量化的 QuantizationConfig,目标是 NVIDIA GPU。
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 参数。