专栏算法工具链模型量化后,输入size问题求助,具体代码及截图如下,请问正常还是有问题,有问题的话如何解决?

模型量化后,输入size问题求助,具体代码及截图如下,请问正常还是有问题,有问题的话如何解决?

已解决
Zhaojin2024-10-28
145
12

1. 芯片型号:J3

2. 天工开物开发包 OpenExplorer 版本:horizon_xj3_open_explorer_v1.16.4-py38_20240319

3. 问题定位:模型转换后bin文件板端部署时,输入size问题

4. 问题具体描述:

模型转换后的两个文件已在附件提供,分别是bin文件和量化后的quantized_model的onnx文件

原始onnx可视化如下图:

quantized_model的onnx文件可视化如下图:

模型转换的配置文件如下:

我们在板端部署时,通过打印其输入的字节数,发现其输入size 存在问题(模型输入是1*3*1024*512,但打印的值8388608÷1024÷512÷4=4,为啥不是通道数3?),具体代码和结果如下所示:

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

    你好,几个问题对齐一下哈:

    1. J3版本的工具链已经升级到了V1.16.6了,你用的还是V1.16.4。考虑一下版本升级哈,有的问题随版本迭代已经修复了的,在旧版本中查问题意义不大,研发也支持上也不会基于老的版本再修复。

    2. 模型输出输出更具shape信息,量化模型相对于原始模型有的是有padding存在的。你看模型的输入输出是可以借助hb_onnx_info 以及hrt_model_exec model_info来查看一下。

    3. 原始的浮点模型也请一并附加上来呢!

    2024-10-28
    0
    7
    • Zhaojin回复Huanghui:

      感谢您的指导和建议,我先回复您的三个问题:

      1. 后续我再对齐试试。

      2. hrt_model_exec model_info bin文件,输入结果如下图:其中valid shape是(1,512,1024,3,) aligned shape是(1,512,1024,4, )这是否有问题?是否会影响模型的推理结果?

      3.原始浮点模型的onnx,已经通过帖子更新上传

      期待您的回复和指导

      2024-10-28
      0
    • Huanghui回复Zhaojin:

      下面这里有问题,你最初的疑问就是padding引起的。申请推理内存时按aligned shape申请,填充数据时按valid shape填充,多出来的一个channel,不适用就OK了,其中的数值无需关心。

      另外,我看你是图像类型的输入,input_type_rt建议配置成nv12吧,NV12的带宽需求比RGB少了一半呢,部署性能更高。

      2024-10-28
      0
    • Zhaojin回复Huanghui:

      谢谢您的回复,那我明白了,打印出的那个数值是按照padding后的size申请的内存,但实际上只用valid shape的内存,多出来的不用管就可以了,推理结果是正常的,这样理解正确吗?

      另外,我们模型训练的时候是bgr,模型转换的时候直接指定输入类型是nv12,部署时推理是OK的?

      2024-10-28
      0
    • Huanghui回复Zhaojin:
      1. 对的!实际上只用valid shape的内存,多出来的不用管就可以了,推理结果是正常的,理解没问题。

      2. 模型转换的时候直接指定输入类型是nv12,模型转换时会自动插入NV12->BGR的转换节点的,推理时输入NV12的数据就可以了,而且NV12一般就是板卡的PYM等IP的处理结果。

      2024-10-28
      0
    • Zhaojin回复Huanghui:

      好的,谢谢。那我过会再转换时换成NV12的输入

      另外我想询问下,我看输出类型是tensor type:HB DNN TENSOR TYPE S64,这个字节就要占8位,那我如何在配置文件设置,可以让他的输出类型是tensor type:HB DNN TENSOR TYPE S8?(因为我看到示例模型的输出类型是tensor type:HB DNN TENSOR TYPE S8)


      2024-10-28
      0
    • Huanghui回复Zhaojin:
      先这样用吧,目前这个没法,你已经在yaml中配置了remove_node_type: cast了,最后的cast 本来就就是int64 -> int32的,你移除了就变成了int64了,你这个模型有后处理部分,其实从HzDequantize之后的节点都可以移除的,但是那样的话你就要手动写后处理逻辑了,包括resize 和 argmax的C++代码,那样更麻烦,而且很容易出错
      2024-10-28
      0
    • Zhaojin回复Huanghui:

      好的,那我就明白了,感谢您的指导!谢谢!!

      2024-10-28
      0
  • Zhaojin
    Lv.1

    打印输入字节的代码没贴全,可能是字数限制了,我再评论打全:

    2024-10-28
    0
    1
    • Zhaojin回复Zhaojin:

      打印的结果图

      2024-10-28
      0
  • Huanghui
    Lv.5

    收到,先看看!

    2024-10-28
    0
    1
    • Zhaojin回复Huanghui:

      谢谢,麻烦您了

      2024-10-28
      0