专栏算法工具链QAT量化过程calibration部分报错

QAT量化过程calibration部分报错

已解决
默认328322024-07-26
259
15

J5 J5_OE_1.1.74

在插入了quant与dequant以后,模型还是可以正常训练的,对num_nodes变量print出来也是具体的数值data value: 207,这里一切正常。

但是在进行calibration的时候,引入calib_model = prepare_qat_fx以后,各个变量的值都发生了改变
报错截图如下:(num_nodes的值发生了变化,报错显示的num_nodes的值为"Proxy(getattr_1)" ,说明num_nodes 并没有直接的具体数值,而是一个代理对象或者一个特殊的属性访问方法。

请问为什么会出现这种错误?类似这样的原始数据在插入了calib_model = prepare_qat_fx以后发生改变的错误该如何解决?

算法工具链
技术深度解析征程5
评论2
0/1000
  • Huanghui
    Lv.5

    你好,从错误看是torch.empty fx后的问题,以下两个方法你可以尝试:

    1. 根据目前的错误进行调整,empty 需要tuple类型,你可以用()包装一下:torch.empty((data.num nodes, 2, 2), ....)

    2. 该报错可能是trace的时候不支持这种attr的用法,尝试直接将empty wrap起来,参考如下print封装方式:

    2024-07-30
    0
    12
    • 默认32832回复Huanghui:

      2024-08-01
      0
    • kotei左文亮回复默认32832:

      这样用:torch.empty( (data.num nodes, 2, 2), device=self.device)。

      2024-08-05
      0
    • 默认32832回复kotei左文亮:

      1、你说的这个方法我们是试过的,还是报相同的错误,上面的回复方法一截图截错了,你可以看我们方法二的截图里面是有一行你给的这个方法,我们试过已经注释掉了。

      2024-08-05
      0
    • kotei左文亮回复默认32832:

      这个可以参考一下OE包里fx_wrap()的用法

      2024-08-06
      0
    • 默认32832回复kotei左文亮:
      1、如下图我们的torch.empty是torch库里面的函数,无法包装怎么办?

      2、我们尝试了将empty函数复制出来放在自己算法文件里,但是不包装的时候也无法启动训练

      2024-08-06
      0
    • kotei左文亮回复默认32832:

      您上面的这个图片看不清啊;empty()函数问题具体可以查一下其用法。

      2024-08-07
      0
    • 默认32832回复kotei左文亮:

      如下图是empty函数的定义

      2024-08-07
      0
    • 默认32832回复默认32832:

      一、

      我们参考了QAT快速入门文档,在MobileNetV2的demo以及我们自己的算法进行debug时,发现data进入quant()前后是一样的,那么这个函数的功能或作用是什么呢

      file:///home/ch/OE/OE1.1.74/horizon_j5_open_explorer_v1.1.74_py38cn_doc/plugin/source/quick_start/quick_start.html#%E8%8E%B7%E5%8F%96%E6%B5%AE%E7%82%B9%E6%A8%A1%E5%9E%8B

      二、

      在mobileNetV2的demo中data在float_model下是torch.Tensor类型,

      但我们的算法中的data是torch_geometric中的batch类型,如下图

      而在经过了calib_model之后都变成了Proxy(如下图),demo中可以顺利calibration,但在我们的算法中会报如上文提问的empty()函数的接受类型的错误。


      2024-08-07
      0
    • kotei左文亮回复默认32832:

      quant()指的是哪一步?您发的链接尝试了几次都打不开啊。

      文档里说的是:在模型输入前插入 QuantStub;在模型输出后插入 DequantStub。

      2024-08-12
      0
    • 默认32832回复kotei左文亮:

      1、你好,上面那个回复有两个问题,你只回复了一个问题,麻烦能回复一下第二个问题吗?

      2、链接就是算法工具链文档的链接,我们的问题是QuantStub的作用是什么?

      2024-08-12
      0
    • Huanghui回复默认32832:
      1. QuantStub的作用是显式指定开始对input的激活数据进行量化,在创建时有默认的scale,zp。 QAT训练阶段, 该module不对数据进行任何操作, 在被转化为int模型是,它被转换为torch.nn.quantized.Quantize, 在int模型推理时根据scale,zp, dtype对输入数据进行量化。
      2. 根据交流,重新对报错算子empty进行warp操作后可以解决prepare_qat_fx后empty报错的问题。
      3. 请注意:问题帖用于对开发过程遇到的特定问题进行跟踪和交流,请配合注意以下两点

      4. 帖子的标题以及分类可以基本反馈所遇到的问题。

      5. 具体问题具体跟踪,不在同一问题帖中跟踪不同的问题。感谢理解支持。


      2024-08-12
      0
    • 遥看瀑布挂前川回复默认32832:
      QuantStub是插入伪量化节点的位置,作用为将输入做量化。量化后的数值为int,只有在qat状态才生效,类型从tensor转变为qtensor。

      可以尝试这样wrap看看:

      2024-08-13
      0
  • kotei左文亮
    Lv.3
    问题已经关注,关于num_nodes部分,可否提供更详细的代码啊?
    2024-07-29
    0
    1
    • 默认32832回复kotei左文亮:
      下面为num_nodes部分的详细代码
      2024-07-30
      0