专栏算法工具链int8量化结果:其中某一层得分很低

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

已解决
iiiiiiiiiiiiiii2023-05-15
52
21

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

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]

附件:
算法工具链
征程5
评论2
0/1000
  • 颜值即正义
    Lv.2

    您好,针对问题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进行精度调试~

    2023-05-15
    0
    19
    • iiiiiiiiiiiiiii回复颜值即正义:
      您好,模型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)[NULL, ...]
      # 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

      2023-05-15
      0
    • 颜值即正义回复iiiiiiiiiiiiiii:

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

      2023-05-15
      0
    • iiiiiiiiiiiiiii回复颜值即正义:

      您好,根据参考资料,生成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"

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

      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'

      2023-05-16
      0
    • 颜值即正义回复iiiiiiiiiiiiiii:

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

      2023-05-16
      0
    • iiiiiiiiiiiiiii回复颜值即正义:
      您好,我已经安装了OE1.1.49b,在yaml中添加了如下关键字:debug_mode: 'dump_calibration_data'

      build onnx的时候,还是报错:

      2023-05-16
      0
    • 颜值即正义回复iiiiiiiiiiiiiii:

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

      2023-05-16
      0
    • iiiiiiiiiiiiiii回复颜值即正义:

      您好,在最新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

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

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

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

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

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

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

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

      个人更喜欢api哈,

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

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

      3、再多来点典型案例

      debug做得很好

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

      您好,没这边没有做完整的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]

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

      嗯嗯好滴,感谢反馈。

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

      2023-05-17
      0
    • iiiiiiiiiiiiiii回复颜值即正义:
      对的,int8和float模型,二者输出结果,每个元素差异绝对值差不多在0.1左右,run_on_cpu之后也是这个差异
      2023-05-17
      0
    • 颜值即正义回复颜值即正义:

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

      2023-05-17
      0
    • iiiiiiiiiiiiiii回复iiiiiiiiiiiiiii:
      比如,以下是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]

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

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

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

      你好,分析后的建议如下:

      首先需要更新horizon_nn版本,新版本在链接中:https://pan.horizon.ai/index.php/s/jgSc84RqRYgADaX,然后做出如下尝试:

      1. 将全激活节点进行int16量化,配置方式可见链接中的txt文件。同时校准方式采用max-percentile:0.99999。

      2. 若上述校准方式不满足需求,可尝试mix校准。(可能比较耗时)

      3. 若仍然不满足需求则可将部分节点run on CPU。(推荐将top5节点做run on CPU处理)

      2023-05-18
      0
    • 颜值即正义回复iiiiiiiiiiiiiii:

      你好,关于这个精度问题有什么进展嘛?依旧无法解决精度问题?看您好像在学QAT了~

      2023-05-28
      0
  • 颜值即正义
    Lv.2
    2023-05-18
    0
    0