配置
配置类是指定任务应如何执行的方法。ONNX 运行时包支持两种任务
优化:由<差异有统计学意义>ORTOptimizer执行,此任务可以使用优化配置进行调整。
量化配置
类 optimum.onnxruntime.量化配置
< source >( 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 融合。 - enable_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
) — 是否禁用加偏置和SkipLayerNormalization融合。 - disable_bias_gelu_fusion (
bool
,默认为False
) — 是否禁用加偏置和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
) — 是否使用mask索引而不是注意力操作符中的原始掩码。 - no_attention_mask (
bool
, 默认为False
) — 是否不使用注意力掩码。仅适用于bert模型类型。 - disable_embed_layer_norm (
bool
, 默认为True
) — 是否禁用嵌入层归一化融合。默认值设置为True
,因为此融合与 ONNX Runtime 量化不兼容 - disable_shape_inference (
bool
, 默认为False
) — 是否禁用符号形状推断。默认值设置为False
,但符号形状推断有时可能引起问题。 - use_multi_head_attention (
bool
, 默认为False
) — 实验性参数。使用 MultiHeadAttention 而不是 Attention 运算符,因为其对 Q/K/V 投影的权重已合并,在某些情况下可能更快,因为 3 个矩阵乘法已被合并为一个。“请注意,当 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 Transformers 优化工具:只能用于 Transformes 模型子集。
创建常见 OptimizationConfig
的工厂。
O1
< source >( for_gpu: bool = False **kwargs ) → OptimizationConfig
创建一个 O1 ~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 ) → export const metadata = 'undefined';OptimizationConfig
参数
- optimization_level (
str
) — 优化级别,以下值允许:- O1: 基本通用优化
- O2: 基本和扩展通用优化,针对transformers的特定融合。
- O3: 与O2相同,具有Fast Gelu近似。
- O4: 与O3相同,具有混合精度。
- for_gpu (
bool
, 默认为False
) — 是否优化后的模型将运行在GPU上,某些优化取决于模型运行的硬件。仅在优化级别 > 1 时需要。 - kwargs (
Dict[str, Any]
) — 传递给~OptimizationConfig
构造函数的参数。
返回值
OptimizationConfig
对应于请求优化级别的 OptimizationConfig
。
根据优化级别创建具有预定义参数的 ~OptimizationConfig
。
量化配置
类 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位整数的reduce-range代替8位整数。 - nodes_to_quantize (
List[str]
,默认为[]
) - 要量化的节点名称列表。当未指定时,所有节点都将被量化。如果为空,则将从operators_to_quantize
中获取所有节点的操作员执行量化。 - nodes_to_exclude (
字符串列表
, 默认为[]
) — 量化时需要排除的节点名称列表。模型中的节点列表可以通过使用 onnx.load 加载 ONNX 模型或通过 netron 进行可视检查来找到。 - operators_to_quantize (
字符串列表
) — 要量化的算子类型列表。默认为给定量化和格式下的所有可量化算子。可量化算子可以在 https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/quantization/registry.py 找到。 - qdq_add_pair_to_weight (
布尔类型
, 默认为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]
) — 设置特定运算符类型的通道轴。仅在支持每通道量化并且设置为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 (布尔值,默认为
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的QuantizationConfig
。
avx2
< 来源 >( 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处理器在调用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 的 量化配置。
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 (
布尔值
,默认为False
) — 是否使用对称量化对激活项进行量化。 - use_symmetric_weights (
布尔值
,默认为True
) — 是否使用对称量化对权重进行量化。 - per_channel (
布尔值
,默认为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创建一个合适的 量化配置。
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的QuantizationConfig。
针对目标内核为Intel AVX512-VNNI CPU的底层执行引擎,利用CPU指令VPDPBUSD在一条指令中计算 \i32 += i8(w) * u8(x)\。
AVX512-VNNI(AVX512 Vector Neural Network Instruction)是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
类 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 方法进行校准时,创建直方图时使用的桶数。 - num_quantized_bins (
Optional[int]
, 默认为None
) — 当使用 Entropy 方法进行校准时,使用的量化桶数。 - 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
< 来源 >( 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
,这对于量化) - optimization (
Optional[OptimizationConfig]
, 默认None
) — 指定用于优化 ONNX Runtime 模型的配置 - quantization (
Optional[QuantizationConfig]
, 默认None
) — 指定用于量化 ONNX Runtime 模型的配置
ORTConfig 是一个配置类,用于处理与 ONNX IR 模型导出、优化和量化参数相关的所有 ONNX Runtime 参数。