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 参数。