模型算子精度和敏感度分析主要过程如下。
1、精度debug工具
模型转换工具链会基于您提供的校准样本对模型进行校准量化并保障模型高效的部署在地平线计算平台上。 而在模型转换的过程中,难免会因为浮点到定点的量化过程而引入精度损失,通常情况下造成精度损失的主要原因可能有以下几点。
模型中的一部分节点对量化比较敏感会引入较大误差,即敏感节点量化问题。
模型中各个节点的误差累积导致模型整体出现较大的校准误差,主要包含:权重量化导致的误差累积、激活量化导致的误差累积以及全量量化导致的误差累积。
使用精度debug工具主要有以下几个步骤:
在yaml中的模型参数组(model_parameters) 配置参数 debug_mode: "dump_calibration_data" ,保存校准数据。
导入debug模块,加载校准模型和数据。
通过精度debug工具提供的API或命令行,对精度损失明显的模型进行分析。
2、校准模型与数据的保存
在进行模型转化的时候,在yaml文件中配置 debug_mode: "dump_calibration_data" ,以开启精度debug功能, 并保存校准数据(calibration_data),对应的校准模型(calibrated_model.onnx)为常态化保存。其中在校准阶段,模型通过对校准数据(calibration_data) 进行前向推理来获取每个被量化节点的量化参数,包括:缩放因子(scale)和阈值(threshold)。在校准阶段计算得到的每个被量化节点的量化参数保存在校准节点中,从而得到校准模型(calibrated_model.onnx)。
3、校准模型(calibrated_model.onnx)解读。
校准模型是模型转换工具链将浮点模型经过结构优化后,通过校准数据计算得到的每个节点对应的量化参数并将其保存在校准节点中得到的中间产物。 校准模型的主要特点是模型中包含校准节点,校准节点的节点类型为HzCalibration。 这些校准节点主要分为两类: 激活(activation)校准节点 和 权重(weight)校准节点 。
激活校准节点 的输入是当前节点的上一个节点的输出,并基于当前激活校准节点中保存的量化参数(scales和thresholds)对输入数据进行量化及反量化后输出。
权重校准节点 的输入为模型的原始浮点权重,基于当前权重校准节点中保存的量化参数(scales和thresholds)对输入的原始浮点权重进行量化及反量化后输出。
除却上述的校准节点,校准模型中的其他节点,精度debug工具将其称为普通节点(node) 。 普通节点 的类型包括:Conv、Mul、Add等。
4、模型在进行精度和算子敏感度分析过程实践
首先,我们的ONNX模型就是在之前yaml文件转化生成量化bin模型是附带生成的中间模型,
原始命令:
hmct-debugger get-sensitivity-of-nodes ./model_bpu_0417_calibrated_model.onnx calibration_data -m ['cosine-similarity','mse'] -v True -n 'activation'
verbose=True且node_type=’activation’时,打印结果如下:
root@OE:/open_explorer/samples/ai_toolchain/horizon_model_convert_sample/04_detection/plr# hmct-debugger get-sensitivity-of-nodes ./model_bpu_0417_calibrated_model.onnx calibration_data -m ['cosine-similarity','mse'] -v True -n 'activation'
INFO:root:There are 100 samples in the calibration data set.
INFO:root:Start calculating activation sensitivity...
INFO:root:There are 100 samples in the calibration data set.
Progress: 100%|███████████████████████████████████████████████████████████████████████████████████████████| 128/128 [01:36
INFO:root:The converted model node information:
======================================================node sensitivity======================================================
activation node threshold bit cosine-similarity mse
688_HzCalibration Transpose_188 2.21469 16 0.99946 8.46457
703_HzCalibration Exp_203 2.21469 16 0.99946 8.46457
665_HzCalibration Concat_168 2.21469 16 0.99963 5.74302
669_HzCalibration Reshape_182 2.21469 16 0.99963 5.74302
683_HzCalibration Concat_187 2.21469 16 0.99963 5.74302
671_HzCalibration Concat_174 2.21469 16 0.99982 2.72156
675_HzCalibration Reshape_184 2.21469 16 0.99982 2.72156
685_HzCalibration Concat_187 2.21469 16 0.99982 2.72156
657_HzCalibration Conv_170;Conv_171 9.616 8 0.99999 0.08394
651_HzCalibration Conv_164;Conv_165 9.05768 8 1.0 0.04491
580_HzCalibration Conv_106;Conv_112 6.6652 8 1.0 0.01732
...
其中:
activation:激活校准节点名。
node:在模型结构中在激活校准节点后的普通节点,即激活校准节点的输出为其输入。
threshold:校准阈值,若有多个阈值则取最大值。
bit:量化比特。
cosine-similarity、mse:各个节点的量化敏感度数值。
结果显示大部分节点算子的余弦相似度 在0.99-1范围内,说明算子精度良好。mse是敏感度方差,对大部分也是极小值,说明算子精度良好。

