int8量化结果:其中某一层得分很低

用户您好,请详细描述您所遇到的问题,这会帮助我们快速定位问题~

1.芯片型号:J5

2.天工开物开发包OpenExplorer版本:J5_OE_1.1.45

3.问题定位:模型转换

4.问题具体描述:完整的onnx编译log在附件哈。

问题1:如图1是量化过程log,除了Conv_124得分很低,其它层得分很高,请问这个怎么解决呢?(试过配置文件中calibration_type参数,都是这个op得分低)

问题2:onnx经过PTQ之后,会生成3个onnx:原始onnx、优化onnx、int8的onnx,给定相同输入(训练集随便一张图),int8-onnx的输出和原始onnx是有差异的,

这个差异大小正常吗?

------------------------------------------original_float_model.onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.916588 -15.366638 -17.404484 -17.58702 ]

[0.730986 1.8291397 2.063559 1.4221728]

[-1.0208392 -1.753322 -2.0956037 -2.6494992]

[-0.5974642 -0.5170246 0.08926105 -0.06107863]

[0.08561602 0.9835099 1.097759 0.9215045 ]

------------------------------------------optimized_float_model.onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.916588 -15.36664 -17.404484 -17.587025]

[0.7309859 1.8291404 2.0635588 1.4221723]

[-1.0208397 -1.7533228 -2.095604 -2.6494994]

[-0.5974639 -0.51702446 0.08926105 -0.06107844]

[0.08561593 0.9835099 1.0977588 0.921504 ]

------------------------------------------**quantized_model.**onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.366884 -15.190222 -17.525274 -17.44689 ]

[1.3181453 2.8303542 3.445406 3.2129016]

[-1.2678736 -1.7305528 -1.9363457 -2.4274101]

[-0.6770492 -0.57339674 0.06211798 -0.14739238]

[0.10747704 0.70888406 0.41100016 0.13467802]

hb_mapper_makertbin_20230515163337.log

感谢您使用地平线芯片算法工具链,最近我们在收集大家的满意度反馈,欢迎您填写问卷,详细情况可见:https://developer.horizon.ai/forumDetail/146177053698464782

您好,针对问题1,可以尝试int16配置一下看看,可参考用户手册:https://developer.horizon.ai/api/v1/fileData/horizon\_j5\_open\_explorer\_cn\_doc/oe\_mapper/source/ptq/ptq\_usage/quantize\_compile.html#int16

针对问题2:差异是有点大的,可以参考https://developer.horizon.ai/forumDetail/71036815603174578进行精度调优,先配置一下int16看看是否解决精度问题哈,目前精度debug工具已释放,若帖子中的建议无法解决问题,可以参考https://developer.horizon.ai/api/v1/fileData/horizon\_j5\_open\_explorer\_cn\_doc/oe\_mapper/source/ptq/ptq\_tool/accuracy\_debug.html进行精度调试~

您好,模型debug的时候,需要calibrated_data,请问生成这个数据文件,有demo参考吗?我的生成代码如下:

img = cv2.imread(str(i))-
img = cv2.resize(img, (w, h), interpolation=cv2.INTER_LINEAR)-

img = img.transpose(2, 0, 1)[None, …]-
# bgr格式,模型里面处理 mean std-
img.astype(np.float32).tofile(str(save / (i.stem + ‘.npy’)))

执行node_message = dbg.get_sensitivity_of_nodes(…)报错如下:

node_message = dbg.get_sensitivity_of_nodes(

File “/usr/local/lib/python3.8/dist-packages/horizon_nn/debug/__init__.py”, line 91, in get_sensitivity_of_nodes

model_debugger = NodeSensitivity(model_or_file, calibrated_data)

File “/usr/local/lib/python3.8/dist-packages/horizon_nn/debug/node_sensitivity.py”, line 25, in __init__

self.calibrated_data.set_data_set(cali_data_dict)

File “/usr/local/lib/python3.8/dist-packages/horizon_nn/data/calibration_data_set.py”, line 80, in set_data_set

_set_data_dict_(name, data)

File “/usr/local/lib/python3.8/dist-packages/horizon_nn/data/calibration_data_set.py”, line 51, in _set_data_dict_

self.data_dict[name] = [

File “/usr/local/lib/python3.8/dist-packages/horizon_nn/data/calibration_data_set.py”, line 52, in

np.load(os.path.join(data, path))

File “/usr/local/lib/python3.8/dist-packages/numpy/lib/npyio.py”, line 444, in load

raise ValueError("Cannot load file containing pickled data "

ValueError: Cannot load file containing pickled data when allow_pickle=False

用于debug工具的校准数据是在模型转换时自动生成的哈,示例可参考这三篇文章:

您好,根据参考资料,生成debug的校准数据,需要在yaml文件中增加如下参数:

debug_mode: “dump_calibration_data”

增加之后,build模型报错误信息如下。

2023-05-16 09:43:06,642 INFO Start Model Convert…

2023-05-16 09:43:06,648 ERROR yaml file parse failed. Please double check your config file inputs

2023-05-16 09:43:06,649 ERROR Key ‘compiler_parameters’ error:

Wrong key ‘debug_mode’ in {‘compile_mode’: ‘latency’, ‘debug’: True, ‘debug_mode’: ‘dump_calibration_data’, ‘core_num’: 1, ‘optimize_level’: ‘O2’}

我的yaml文件内容如下:

# 模型转化相关的参数

# ------------------------------------

# model conversion related parameters

model_parameters:

# Onnx浮点网络数据模型文件

# -----------------------------------------------------------

# the model file of floating-point ONNX neural network data

#onnx_model: ‘/root/workspace/ptq_bev_lane_det/bev_lane_det.onnx’

onnx_model: ‘/root/workspace/ptq_bev_lane_det/bev_lane_det_v1.onnx’

# 适用BPU架构

march: “bayes”

# 指定模型转换过程中是否输出各层的中间结果,如果为True,则输出所有层的中间输出结果,

layer_out_dump: False

# 模型转换输出的结果的存放目录

working_dir: ‘model_output’

# 模型转换输出的用于上板执行的模型文件的名称前缀

output_model_file_prefix: ‘bev_lane_det’

# remove_node_type: “Dequantize”

#配置指定Conv16节点的输出数据类型为int16。

#set_node_data_type: “Conv_124:int16”

#set_node_data_type: “Conv_124:int32”

# 模型输入相关参数, 若输入多个节点, 则应使用’;'进行分隔, 使用默认缺省设置则写None

input_parameters:

# (选填) 模型输入的节点名称, 此名称应与模型文件中的名称一致, 否则会报错, 不填则会使用模型文件中的节点名称

input_name: “img”

# 网络实际执行时,输入给网络的数据格式,包括 nv12/rgb/bgr/yuv444/gray/featuremap,

input_type_rt: ‘bgr’

# 网络实际执行时输入的数据排布, 可选值为 NHWC/NCHW

# 若input_type_rt配置为nv12,则此处参数不需要配置

input_layout_rt: “NHWC”

# 网络训练时输入的数据格式,可选的值为rgb/bgr/gray/featuremap/yuv444

#input_type_train: ‘rgb’

input_type_train: ‘bgr’

# 网络训练时输入的数据排布, 可选值为 NHWC/NCHW

# ------------------------------------------------------------------

# the data layout in network training, available options: NHWC/NCHW

input_layout_train: ‘NCHW’

# (选填) 模型网络的输入大小, 以’x’分隔, 不填则会使用模型文件中的网络输入大小,否则会覆盖模型文件中输入大小

input_shape: ‘1x3x576x1024’

# 网络实际执行时,输入给网络的batch_size, 默认值为1

input_batch: 1

# 网络输入的预处理方法,主要有以下几种:

# no_preprocess 不做任何操作

# data_mean 减去通道均值mean_value

# data_scale 对图像像素乘以data_scale系数

# data_mean_and_scale 减去通道均值后再乘以scale系数

norm_type: ‘data_mean_and_scale’

mean_value: 123.675 116.28 103.53

scale_value: 0.01712475 0.017507 0.01742919

# 模型量化相关参数

# -----------------------------

# model calibration parameters

calibration_parameters:

# 模型量化的参考图像的存放目录,图片格式支持Jpeg、Bmp等格式,输入的图片

# 应该是使用的典型场景,一般是从测试集中选择20~100张图片,另外输入

# 的图片要覆盖典型场景,不要是偏僻场景,如过曝光、饱和、模糊、纯黑、纯白等图片

# 若有多个输入节点, 则应使用’;'进行分隔

cal_data_dir: ‘/root/workspace/ptq_bev_lane_det/calib_640_f32’

# 校准数据二进制文件的数据存储类型,可选值为:float32, uint8

cal_data_type: ‘float32’

# 如果输入的图片文件尺寸和模型训练的尺寸不一致时,并且preprocess_on为true,

# 则将采用默认预处理方法(skimage resize),

# 将输入图片缩放或者裁减到指定尺寸,否则,需要用户提前把图片处理为训练时的尺寸

# preprocess_on: False

# 模型量化的算法类型,支持default、mix、kl、max、load,通常采用default即可满足要求

# 如不符合预期可先尝试修改为mix 仍不符合预期再尝试kl或max

# 当使用QAT导出模型时,此参数则应设置为load

# 相关参数的技术原理及说明请您参考用户手册中的PTQ原理及步骤中参数组详细介绍部分

calibration_type: ‘default’

#calibration_type: ‘kl’

#使模型以int16低精度输出

#optimization: “set_model_output_int16”

# 编译器相关参数

# ----------------------------

# compiler related parameters

compiler_parameters:

# 编译策略,支持bandwidth和latency两种优化模式;

# bandwidth以优化ddr的访问带宽为目标;

# latency以优化推理时间为目标

compile_mode: ‘latency’

# 设置debug为True将打开编译器的debug模式,能够输出性能仿真的相关信息,如帧率、DDR带宽占用等

debug: False

#debug_mode: “dump_calibration_data”

# 编译模型指定核数,不指定默认编译单核模型, 若编译双核模型,将下边注释打开即可

core_num: 1

# 优化等级可选范围为O0~O3

# O0不做任何优化, 编译速度最快,优化程度最低,

# O1-O3随着优化等级提高,预期编译后的模型的执行速度会更快,但是所需编译时间也会变长。

# 推荐用O2做最快验证

optimize_level: ‘O2’

你好,麻烦用一下OE1.1.49b对应的docker,获取链接如下:https://developer.horizon.ai/forumDetail/118363912788935318,如果只是PTQ模型转换的话,用CPU docker即可

您好,我已经安装了OE1.1.49b,在yaml中添加了如下关键字:debug_mode: ‘dump_calibration_data’-

build onnx的时候,还是报错:

你好,根据上面提供的yaml参数看,应该是debug_mode参数的位置放错了,它应该在模型参数组,你放到编译参数组里去了

您好,在最新OE1.1.49环境下,对model_original_float_model.onnx,使用api:dbg.plot_acc_error()查找到了5个敏感node:

  • Conv_113
  • MatMul_109_transpose_0
  • Relu_111
  • Relu_111_reshape
  • MatMul_109

通过在yaml文件中设置:run_on_cpu: ‘Conv_113;MatMul_109’,上面5个敏感node运行在CPU上,如下图:

可是Conv_124的余弦相似度得分还是很低,如下图只有0.6:

您那边能帮忙看看嘛?原始onnx模型、预处理数据、yaml文件在腾讯微云:

https://share.weiyun.com/yEb559jA

嗯嗯好的呀,我们看一下。

问一下哈,您这边在使用这个debug工具的时候,有什么建议吗?比如结果呈现形式方面、文档方面。

在易用性方面,您这边是更喜欢当前这种API的形式,还是感觉将这些API封装成命令行形式会更好些嘞?

追问一下哈,现在精度损失是多少呀?余弦相似度只是一个间接指标,具体损失还是需要看实测看一下。

个人更喜欢api哈,

建议:1、比如在线文档中,debug模型的案例api参数和OE1.1.49(docker)中实际略有出入,可能是发版了,文档没有貌似及时更新

2、可视化的时候,不同数据,可以画实线、虚线、圆点等等,全部画实线导致遮挡了,有点影响判断哈

3、再多来点典型案例

debug做得很好

您好,没这边没有做完整的val,只是给定相同输入对比float和int8模型输出差异,如下:

------------------------------------------original_float_model.onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.916588 -15.366638 -17.404484 -17.58702 ]

[0.730986 1.8291397 2.063559 1.4221728]

[-1.0208392 -1.753322 -2.0956037 -2.6494992]

[-0.5974642 -0.5170246 0.08926105 -0.06107863]

[0.08561602 0.9835099 1.097759 0.9215045 ]

------------------------------------------**quantized_model.**onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.366884 -15.190222 -17.525274 -17.44689 ]

[1.3181453 2.8303542 3.445406 3.2129016]

[-1.2678736 -1.7305528 -1.9363457 -2.4274101]

[-0.6770492 -0.57339674 0.06211798 -0.14739238]

[0.10747704 0.70888406 0.41100016 0.13467802]

嗯嗯好滴,感谢反馈。

从这个输出看,run_on_cpu对结果并没有产生任何影响呀,和帖子最上方的输出完全一样?

对的,int8和float模型,二者输出结果,每个元素差异绝对值差不多在0.1左右,run_on_cpu之后也是这个差异

你好,麻烦提供一下推理脚本和输入数据哈

比如,以下是run_on_cpu之后的结果:

------------------------------------------original_float_model.onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.916588 -15.366638 -17.404484 -17.58702 ]

[0.730986 1.8291397 2.063559 1.4221728]

[-1.0208392 -1.753322 -2.0956037 -2.6494992]

[-0.5974642 -0.5170246 0.08926105 -0.06107863]

[0.08561602 0.9835099 1.097759 0.9215045 ]

------------------------------------------optimized_float_model.onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-18.916588 -15.36664 -17.404484 -17.587025]

[0.7309859 1.8291404 2.0635588 1.4221723]

[-1.0208397 -1.7533228 -2.095604 -2.6494994]

[-0.5974639 -0.51702446 0.08926105 -0.06107844]

[0.08561593 0.9835099 1.0977588 0.921504 ]

------------------------------------------quantized_model.onnx------------------------------------------

WARNING:root:input_layout not provided. Using NCHW

[-19.2615 -15.549819 -17.544643 -17.627142]

[0.9781444 2.9538393 3.454998 2.7767997]

[-1.0383472 -1.2963103 -1.3259255 -1.9922653]

[-0.6318502 -0.53529704 0.16168556 -0.08411577]

[0.3236592 1.4141139 1.4963932 1.1422077]

你好,麻烦提供一下python推理脚本和输入数据哈,我们这边也进行一些尝试

您好,推理和输入图片在链接:https://share.weiyun.com/5hmsajiS