专栏算法工具链QAT的compile流程中为什么要去掉模型的量化反量化节点?

QAT的compile流程中为什么要去掉模型的量化反量化节点?

已解决
溺水小坦克2024-12-24
88
6

在j6的3.0.22版本的OE包中运行QAT的demo,在参照 手把手教你利用算法工具链训练、量化、编译、可视化J6参考算法BEVFormer - 地平线开发者社区 中的流程完成BEVfoemer算法的QAT流程中,在第6.7步量化模型编译时,发现运行compile_perf_hbir.py脚本时,会有删除模型的量化反量化节点这一步(见下图),使得生成的compile_hbir.bc和model.hbm中都不包含量化反量化节点,输入输出都为uint8类型,请问

1. 为什么要这么做?这样做以后需要在板端推理时加入量化输入和反量化输出的流程,岂不是把流程复杂化了?

2. 能否保留量化反量化节点,在板端推理时直接使用float类型的输入并得到float类型的输出?

3. 若能保留量化反量化节点,则在板端运行时,与删除量化反量化节点并手动进行量化尺度计算的方案对比,会在精度和耗时上有何不同?
compile_perf_hbir.py中的操作
算法工具链
征程6技术深度解析
评论3
0/1000
  • Huanghui
    Lv.5

    量化反量化过程是在CPU进行的,为了提高每次遍历数据的利用率,尽量少遍历数据,移除后你可以把量化反量化过程融入到业务处理当中。

    2024-12-24
    0
    1
    • 溺水小坦克回复Huanghui:

      意思是将量化反量化流程放到CPU计算的前后处理中能够提高数据的利用率吗?请问这个逻辑是怎么来的呢?是说将量化流程与其他业务逻辑合并运算可能提高处理效率吗?若放到模型推理的头尾部分会增加总体耗时吗?

      2024-12-24
      0
  • Huanghui
    Lv.5

    理解方面可以参考https://developer.horizon.auto/blog/10424

    2024-12-24
    0
    1
    • 溺水小坦克回复Huanghui:
      了解了,感谢zhongguozan_org.svg
      2024-12-24
      0
  • Huanghui
    Lv.5

    量化反量化做的事情和手动量化反量化做的事情是一样的, 所以精度方面是一样的,主要考虑的性能:如果 量化反量化在模型中,模型执行需要遍历一次数据,而且是串行的,并且在 量化反量化 期间,对于用户业务线程来讲,并没有释放BPU的资源。如果把 量化反量化 写到模型外部来,一方面对于用户业务线程来讲,一次推理就结束了,可以进行下一次的推理,增大了BPU的利用率,另一方面,对output进行业务处理迟早是要遍历数据的,在遍历的时候顺带着做量化反量化就可以节省一次遍历数据带来的性能损耗,额外的后处理线程和推理线程也可以跑到不同的线程中,利用多线程增强并行能力。

    2024-12-24
    0
    1
    • XR回复Huanghui:

      为什么在模型中进行量化和反量化操作是串行的?elementwise运算应该是可以并行的呀?

      2025-08-28
      0