专栏感知【PTQ精度debug示例】repvgg_b2_deploy精度问题分析

【PTQ精度debug示例】repvgg_b2_deploy精度问题分析

芯链情报局2023-05-05
100
3
为了帮助用户更加快速地了解精度debug分析的使用方法以及测试流程,我们在此处提供三个测试用例以供用户参考,分别为:MobileVit_s、repvgg_b2_deploy以及mnasnet_1.0_96。
其中:
针对MobileVit_s的分析流程请参考:https://developer.horizon.ai/forumDetail/146176821770229921
针对mnasnet_1.0_96的分析流程请参考:https://developer.horizon.ai/forumDetail/146176821770229925
本文主要使用精度debug工具对repvgg_b2_deploy进行量化精度问题定位。repvgg_b2_deploy模型在 imagenet数据集的50000张图片上进行分类精度测试,在默认情况下,模型精度如下:

模型名称

架构

浮点精度

量化精度

repvgg_b2_deploy

bayes

0.78788

0.71138(90.29%)

量化后定点模型的精度没有达到浮点模型的99%,因此使用精度debug工具对该模型进行精度异常定位。

1. 确认单独量化权重 / 激活 的累积误差分布情况

1.1 API使用

dbg.plot_acc_error(
save_dir='./', # 结果保存路径
calibrated_data='./calibration_data', # 校准数据
model_or_file='./calibrated_model.onnx', # 校准模型
quantize_node=['weight', 'activation'], # 量化节点列表,当设置为['weight','activation']时则分别只量化权重和激活
metric='cosine-similarity', # 计算误差的方式(度量方式)
average_mode=False # 是否采用平均累积误差作为输出

1.2 输出结果


从分析结果可知,模型的量化误差主要来自于对权重的量化。

2. 权重校准节点敏感度排序

2.1 API使用

node_message = dbg.get_sensitivity_of_nodes(
model_or_file='./calibrated_model.onnx', # 校准模型
metrics='cosine-similarity', # 计算敏感度的方式(度量方式)
calibrated_data='./calibration_data/', # 校准数据
output_node=None, # 选取模型中某个节点的输出用于计算敏感度,默认(None)则采用模型的最终输出
node_type='weight', # 节点类型
data_num=None,
verbose=True, # 是否在终端显示计算结果。True显示,反之,不显示
interested_nodes=None # 选择某些节点只计算这些节点的敏感度。默认(None)计算模型所有节点
)

2.2 输出结果


在模型所有权重校准节点中,top1节点的量化敏感度较低,小于0.99,其余节点均大于0.99。

3. 查看敏感层数据分布情况

3.1 API使用

dbg.plot_distribution(save_dir='./',
model_or_file='./calibrated_model.onnx',
calibrated_data='./calibration_data',
nodes_list=['stage2.2.rbr_reparam.weight_HzCalibration',
'stage3.2.rbr_reparam.weight_HzCalibration',
'stage3.3.rbr_reparam.weight_HzCalibration',
'stage1.3.rbr_reparam.weight_HzCalibration',
'stage3.14.rbr_reparam.weight_HzCalibration'])

3.2 输出结果

节点名称

数据分布

stage2.2.rbr_reparam.weight_HzCalibration

stage3.2.rbr_reparam.weight_HzCalibration

stage3.3.rbr_reparam.weight_HzCalibration

stage1.3.rbr_reparam.weight_HzCalibration

stage3.14.rbr_reparam.weight_HzCalibration

数据分布:数据分布的判断标准为是否满足对量化有好的正态分布,只要分布中只有一个很明显的单峰就认为满足正态分布,不需要严格满足正态分布。根据上述判断标准来看,表中节点的数据分布均满足正态分布。由于当前模型是权重量化导致的量化模型精度下降,且权重校准节点均为per-channel量化,因此不存在per-tensor量化风险,故此处不需要绘制节点数据的箱线图。

4. 部分量化性能测试

4.1 API使用

node_message = dbg.get_sensitivity_of_nodes(
model_or_file='./calibrated_model.onnx',
metrics='cosine-similarity',
calibrated_data='./calibration_data/',
output_node=None,
node_type='weight',
data_num=None,
verbose=False,
interested_nodes=None)
nodes = list(node_message.keys())
dbg.plot_acc_error(save_dir='./',
calibrated_data='./calibration_data/',
model_or_file='./calibrated_model.onnx',
non_quantize_node=[nodes[:1], nodes[:2], nodes[:3], nodes[:4],
nodes[:5], nodes[:6], nodes[:7], nodes[:8],
nodes[:9], nodes[:10], nodes[:11], nodes[:12],
nodes[:13], nodes[:14], nodes[:15], nodes[:16],
nodes[:17], nodes[:18], nodes[:19], nodes[:20]],
metric='cosine-similarity',
average_mode=False)

4.2 测试结果


通过部分量化精度测试发现,当解除top14权重校准节点后,模型精度会有较大提升,继续增加不量化节点数量精度提升较小。因此,在此基础上进行模型部分量化精度测试。

model

量化策略

浮点精度

校准方式

calibrated_model

repvgg_b2_deploy

default

0.78788

default_percentile_asy_perchannel

0.71138(90.29%)

repvgg_b2_deploy

解除top14权重校准节点量化

0.78788

default_percentile_asy_perchannel

0.78004(99.00%)

repvgg_b2_deploy

解除top15权重校准节点量化

0.78788

default_percentile_asy_perchannel

0.78252(99.32%)

5. 总结

5.1 误差原因分析

  1. 通过使用精度debug工具中的plot_acc_error分别对量化权重和量化激活的部分量化模型进行累积误差分析可知,量化权重会导致模型量化精度下降。

  2. 通过对节点量化敏感度分析发现,只有top1权重校准节点的量化敏感度小于0.99,进一步绘制其数据分布以及通道间的数据分布情况,发现数据分布符合对量化友好的正态分布,且通道间的数据分布波动不大,因此可以得出结论:导致模型量化误差的主要来源是对权重的量化,同时量化精度下降较多是由于模型各个节点的误差累积导致的。

5.2 提升精度建议

  1. 找到对量化敏感的权重校准节点对应的普通节点,并将其run on CPU。

感知
评论1
0/1000
  • Shuan
    Lv.1
    请问 import horizon_nn.debug as dbg 这个工具如何获取呢?@芯链情报局
    2023-05-16
    0
    2
    • 颜值即正义回复Shuan:

      你好,当前XJ3版本尚未释放,预计下个版本会释放,J5的话,升级到OE1.1.49对应的docker即可使用,获取链接可见:https://developer.horizon.ai/forumDetail/118363912788935318

      2023-05-17
      0
    • Shuan回复颜值即正义:

      您好,请问这里的 calibrated_model.onnx 如何获取呢?通过 hb_mapper makertbin --config model_config.yaml --model-type onnx 生成的 ONNX 文件中似乎并不包含名为 calibrated_model.onnx 的文件。

      2023-05-17
      0