模型精度评估

基于几十或上百张校准数据实现浮点模型到定点模型转换的后量化方式,不可避免地会存在一定的精度损失。但经过大量实际生产经验验证,如果能筛选出最优的量化参数组合,地平线的转换工具在大部分情况下,都可以将精度损失保持在1%左右。

本节先介绍了如何正确地进行模型精度分析,其运行的基本流程如下图所示。如果通过评估发现不及预期,则可以参考 模型精度调优 章节的内容尝试调优,实在无法解决可寻求地平线的技术支持。

accuracy_evaluation

在进入到此部分介绍前,我们希望您已经了解如何对一个模型进行精度评测。本节介绍的内容是如何使用模型转换的产出物进行推理。

前文提到模型成功转换的产出物中包括以下模型产出物:

  • *_original_float_model.onnx

  • *_optimized_float_model.onnx

  • *_calibrated_model.onnx

  • *_ptq_model.onnx

  • *_quantized_model.bc

  • *.hbm

虽然最后的hbm模型才是将部署到计算平台的模型,考虑到方便在Ubuntu开发机上完成精度评测,我们提供了*_quantized_model.bc完成这个精度评测的过程。quantized模型已经完成了量化,与最后的hbm模型具有一致的精度效果。使用地平线开发库加载模型推理的基本流程如下所示,下方示例代码不仅适用于quantized模型(模型量化过程中无插入节点操作),对original和optimized等onnx模型同样适用(替换模型文件即可),根据模型的输入类型和layout要求准备数据即可。

提示

如您在模型量化过程中存在插入节点操作,会导致ONNX模型和HBIR模型(*.bc)的输入数据不一致,可参考 数据准备 章节进行输入数据准备,然后再按照上述方法进行模型精度评估即可。

import numpy as np
# 加载地平线依赖库
from horizon_tc_ui.hb_runtime import HBRuntime

# 准备模型运行的输入,此处`input.npy`为处理好的数据
data = np.load("input.npy")  
# 加载模型文件
sess = HBRuntime("model.bc")
# 获取模型输入&输出节点信息
input_names = sess.input_names
output_names = sess.output_names

# 假设此模型只有一个输入,开始模型推理,推理的返回值是一个list,依次与output_names指定名称一一对应
output = sess.run(output_names, {input_names[0]: data})
# 假设此模型有多个输入,开始模型推理,推理的返回值是一个list,依次与output_names指定名称一一对应
output = sess.run(output_names, {input_names[0]: data1, input_names[1]: data2})