专栏算法工具链自定义算子输入如何获取量化scale

自定义算子输入如何获取量化scale

已解决
ziqi2024-08-06
118
10
1.芯片型号:J5
2.天工开物开发包OpenExplorer版本:J5_OE_1.1.74
3.问题定位:自定义算子
4.问题具体描述

自定义算子的 Forward 函数中,输入和输出都是 NDArray,没有找到类似 hbDNNTensorProperties 的获取方式

attributes 中是否有相关信息?没有看到相关文档说明如何使用

比如想实现一个类似 concat 的自定义算子,两个输入和输出的 scale 有可能不同,需要获取 scale 来做 rescale

算法工具链
征程5
+1
评论2
0/1000
  • 遥看瀑布挂前川
    Lv.2

    CPU的算子不需要做量化,所以不需要scale。如果后面接了BPU算子需要做量化,需要将CPU的输出作为模型的输入,插入Quantstub(define_node_output)做QAT训练,这个Quantstub训好的scale就是对CPU算子的量化了。

    2024-08-13
    0
    5
    • ziqi回复遥看瀑布挂前川:

      非常感谢!

      还有几个细节问题:

      1. 假设模型内部一部分的算子结构是 A => B => C,如果 A 和 C 都在 BPU 上,B 在 CPU 上,那么做量化的时候是会在 B 前后自动插入反量化和量化节点吗?对于 B 自己的实现来说,输入输出只需要按照 float 来考虑吗?

      2. 假设算子图结构是 x => A => B, y => B ;x 和 y 是模型输入,A 是 BPU 算子,B 是 CPU 算子,B 有两个输入,分别是 A 的输出和 y,这种情况下 y 会被量化吗?

      2024-08-13
      0
    • ziqi回复ziqi:

      Sorry, 第一个问题,是需要在训练代码里面手动加入 DeQuantstub 和 Quantstub 对吧?

      2024-08-13
      0
    • 遥看瀑布挂前川回复ziqi:

      第一种情况,B算子前插入dequant,B算子执行后插入quant,然后配置qconfig将该算子层配置为None

      第二个情况,y需要做反量化,因为y需要接B,B是CPU的fp32计算,BPU的输出需要插入dequant将int转为float进CPU计算。


      量化为float量化为float-->int,即后面有BPU计算,BPU只能做int计算,所以需要插入quant做量化。

      反量化为int反量化为int-->float,即后面有CPU计算,CPU计算为float计算,所以需要插入dequant做反量化。

      2024-08-13
      0
    • ziqi回复遥看瀑布挂前川:

      第二个情况里,如果 y 一开始输入就是 float 的话,是不是不用做反量化,可以直接输入到 CPU 算子?还是说模型输入只能是量化后的?

      2024-08-14
      0
    • 遥看瀑布挂前川回复ziqi:

      模型的输入和输出都必须是int。只要需要进入到BPU参与计算就必须量化,输出的也是int。y不输入到模型就不需要做量化保持float32做CPU计算

      2024-08-14
      0
  • DR_KAN
    Lv.4

    J5上自定义算子只能CPU或者DSP做

    2024-08-06
    1
    3
    • ziqi回复DR_KAN:

      确实是在开发DSP算子。但是官方给出的示例中只有 Softmax,而 Softmax 输入输出的量化 scale 是不变的,所以不用处理这个信息。但是我在尝试实现一个多输入的算子,每个输入的 scale 和 zero_point 可能是不一样的,所以想知道怎么获取这个信息。

      2024-08-08
      0
    • ziqi回复DR_KAN:

      你的意思是,如果是CPU算子,给这个算子的输入已经是反量化后的 float 了吗?

      2024-08-08
      0
    • clover回复ziqi:
      这个和Layer输入的布局有关,比如dequantize算子, enum class LayerInputs : uint8_t { kData, kScale, kZeroPoint };
      获取scale就是通过:NDArray* const scale{bottom_blobs[static_castsize_t>(LayerInputs::kScale)]};
      2024-08-08
      0