对 float32 模型进行预处理即对该模型进行变换,使其做好量化准备。其中包含以下 3 个可选步骤:
- 符号形状推断:此步骤最适合 Transformer 模型。
- 模型最优化:此步骤使用 ONNX Runtime 原生库来重写计算图,包括合并计算节点和消除冗余以改善运行时效率。
- ONNX 形状推断。
这些步骤的主对象是增强量化质量。张量形状已知时,ONNX Runtime 量化工具执行性能最佳。符号形状推断和 ONNX 形状推断对于明确张量形状都同样至关重要。符号形状推断对于基于 Transformer 的模型特别有效,而 ONNX 形状推断则适合其他模型。
模型最优化会执行某些运算符融合,以简化量化工具的工作。例如,在最优化期间,Convolution 运算符后接 BatchNormalization 可融合为一,从而实现有效量化。
ONNX Runtime 存在如下已知问题:模型最优化无法输出大小超过 2 GB 的模型。因此,对于大型模型,必须跳过最优化。
预处理 API 可在 quant_pre_process() 函数的 onnxruntime.quantization.shape_inference Python 模块中找到:
from onnxruntime.quantization import shape_inference
shape_inference.quant_pre_process(
input_model_path: str,
output_model_path: str,
skip_optimization: bool = False,
skip_onnx_shape: bool = False,
skip_symbolic_shape: bool = False,
auto_merge: bool = False,
int_max: int = 2**31 - 1,
guess_output_rank: bool = False,
verbose: int = 0,
save_as_external_data: bool = False,
all_tensors_to_one_file: bool = False,
external_data_location: str = "./",
external_data_size_threshold: int = 1024,)
- input_model_path
- 输入模型文件的路径。
- output_model_path
- 输出模型文件的路径。
- skip_optimization
- 如果此项设为 true,则跳过模型最优化步骤。对于某些模型,这可能导致 ONNX 形状推断失败。
- skip_onnx_shape
- 跳过 ONNX 形状推断。符号形状推断对于基于 Transformer 的模型最有效。跳过所有形状推断可能降低量化有效性,因为含有未知形状的张量无法进行量化。
- skip_symbolic_shape
- 跳过符号形状推断。符号形状推断对于基于 Transformer 的模型最有效。跳过所有形状推断可能降低量化有效性,因为含有未知形状的张量无法进行量化。
- auto_merge
- 适用于符号形状推断。发生冲突时会自动合并符号维度。
- int_max
- 对于符号形状推断,指定最大值,这样对于诸如 slice 等运算符,即可将整数作为无边界来处理。
- guess_output_rank
- 对于未知运算符,猜测输出等级与输入 0 相同。
- verbose
- 记录推断的详细信息。选项包括 0:关闭,1:警告,3:详细。
- save_as_external_data
- 将 ONNX 模型保存到外部数据。
- all_tensors_to_one_file
- 将所有外部数据都保存到单个文件。
- external_data_location
- 用于保存外部文件的文件位置。
- external_data_size_threshold
- 外部数据的大小阈值。