原生 ONNX 模型仅支持 INT8 量化和半偶数舍入。将模型从 Vitis AI 量化器转换为 ONNX 格式时,无法导出其他量化位和更多的舍入方法,如半向上舍入或向零舍入。为解决此问题,导出 ONNX 模型时,可使用 vai::QuantizeLinear 和 vai::DequantizeLinear are 替换对应的原生 ONNX 运算符。对于 DequantizeLinear,原生 ONNX 与 Vitis AI 之间的接口是相同的。但对于 QuantizeLinear,两者之间存在些许差异,总结要点如下:
- ONNX 具有输入列表(x、y_scale、y_zero_point):Vitis AI 具有输入列表(x、valmin、valmax、scale、zero_point、method),其中,valmin 和 valmax 是量化间隔,例如,valmin=-128 和 valmax=127 对应 INT8 对称量化,采用下列舍入方法:半偶数舍入、半向上舍入、半向下舍入、向零舍入、远离零舍入等。
-
在以下定义中设置 native_onnx=True 即可获取原生 Quant-Dequant ONNX 模型。如不设置此项,则会接收到 Quant-Dequant ONNX 模型,以及 Vitis AI QuantizeLinear 和 DequantizeLinear 运算符。默认值为 False。
此函数会以 ONNX 格式导出量化模型:def export_onnx_model(self, output_dir="quantize_result", verbose=False, dynamic_batch=False, opset_version=None, native_onnx=True, dump_layers=False, check_model=False, opt_graph=False):
实参 | 描述 |
---|---|
Output_dir | 量化结果和中间文件的目录。默认值为 quantize_result。 |
Verbose | 此标志用于控制日志记录的详细程度。 |
Dynamic_batch | 此标志用于设置输入形状的批次大小是否为动态。默认值为 False。 |
Opset_version | 默认 (ai.onnx) opset 版本目标。如不设置此项,将取当前 PyTorch 版本的最新稳定版本作为值。 |
Native_onnx | 导出含原生 Quant-Dequant 运算符或定制 Quant-Dequant 运算符的 ONNX 模型。如果此项设为 True,就会收到原生 Quant-Dequant ONNX 模型。否则,则生成 VAI Quant-Dequant ONNX 模型。默认值为 True。 |
Dump_layers | 在运行时期间转储 ONNX 模型中每个层的输出。默认值为 False。 |
Check_model | 检查 XMODEL 与 ONNX 模型之间输出的差异。默认值为 False。 |
Opt_graph | 最优化 ONNX 计算图。默认值为 False。 |