专栏算法工具链J6E 输入量化计算方法

J6E 输入量化计算方法

已解决
eyehorus2024-11-22
100
8
  1. 芯片型号:J6E

  2. 天工开物开发包 OpenExplorer 版本:J6_OE_3.0.22

  3. 问题定位:模型量化

  4. 问题具体描述:我们模型的输入是featuremap,数据类型是float,因为编译完后的模型量化节点会跑在cpu,增加耗时,所以想remove量化节点,在前处理阶段进行量化,但是经过自己设计的量化计算之后,模型输出不对,有两个问题请帮忙解答:

    1. 官方文档给出的量化公式需要遍历整个图像,耗时太久,我们采用opencv的float_mat.convertTo(int_mat, CV_8S, 1 / scale, zero_point)的方法进行实现,请问这种方法是否可行?
    2. intput hbDNNTensor的tensorType由HB_DNN_TENSOR_TYPE_F32变成HB_DNN_TENSOR_TYPE_S8之后会增加padding,padding部分的数据会对模型计算有影响吗?

算法工具链
征程6
评论3
0/1000
  • Huanghui
    Lv.5

    收到!

    2024-11-22
    0
    0
  • Huanghui
    Lv.5

    你好:

    1.float_mat.convertTo这个我没有用来做过量化,如果是per_tensor的量化,scale值只有一个,你可以试试,但如果是 per_channel的量化,需要考虑不同channel有不同scale。如果支持从量化速度出发,可以考虑使/open_explorer/samples/ucp_tutorial/custom_operator/dsp_sample/dsp_code/quantize,采用DSP量化加速。

    2.padding部分的数据之前在解析是主要每个维度的stride然后进行合理的offset,不会对业务造成影响。

    2024-11-22
    0
    5
    • eyehorus回复Huanghui:
      2024-11-25
      0
    • eyehorus:
      这是我的量化节点,只有一个scale,是不是代表per tensor量化?
      但是我用convertTo、cv::max、cv::min转换之后,打印了前100个点的计算结果,看起来都根据scale正确量化到了-128~127之间,结果输入给模型之后输出是不对的,这可能是因为什么?
      2024-11-25
      0
    • Huanghui回复eyehorus:

      我的想法是:1)先不考虑速度问题使用CPU方式的量化,待结果正确了,再进行量化速度优化,这样你有一个真确的结果作为前提好验证一些。2)数据的量化过程可以参考:

      2024-11-25
      0
    • eyehorus回复Huanghui:

      好的, 谢谢,我先看下这里的代码

      2024-11-25
      0
    • eyehorus回复Huanghui:

      我按照示例代码做了实现,但是计算结果还是不对,请问有从image加载到量化推理反量化的完整示例吗?我再对一下看哪里还有可能出问题

      2024-11-26
      0
  • Huanghui
    Lv.5

    客户您好,长时间未收到你的答复,相信问题已解。如对此尚存疑问欢迎新帖讨论,感谢您的参与!

    2025-02-05
    0
    0