专栏算法工具链如何调整qat的训练的参数更新

如何调整qat的训练的参数更新

已解决
默认603842026-02-06
47
11
我现在有一个模型,qat校准之后指标下降比较多,需要进行qat训练。但是我直接全部参数进行qat训练的时候,发现越训越飞,最后loss出现inf。所以我现在有个计划,1)固定 input / output scale 进行 QAT 训练,2)对非敏感层的量化scale进行冻结,仅训练敏感层的scale。

我现在的问题是不知道如何在训练的时候,冻结某一层的量化scale,或者冻结input/output的scale。

能否帮忙提供一个简单的例子。

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

    你好,使用qat时,校准指标下降比较多的情况下不建议直接进入QAT训练阶段。而是应该根据prepare的结果check_result_llist调整模型结构(将复用节点进行拆开)和量化参数固定,然后进行再校准再验证,直到calib阶段指标基本稳定,然后再进入QAT训练。calib阶段你可以通过 GlobalFakeQuantSwitch采用逐模块细化、特定层的物理意义、QA逐层结果和敏感度结果、锁定量化敏感层进行量化精度设置和scale固定。

    如果要冻结 某一层的量化scale,可以使用qconfg模板中的threshold进行固定,或者冻结input/output的scale。 可以再构建STUB是通过scale参数固定。具体的固定项配置参考如下:

    2026-02-06
    0
    10
    • 默认60384回复Huanghui:
      感谢回复。请问 冻结input/output的scale 应该如何设置。使用module.activation_post_process.set_fake_quantize(FakeQuantState.VaLIDATION)和 module.weight_fake_quant.set_fake_quantize(FakeQuantState.VaLIDATION) 可以不?

      我现在的问题是,增加敏感层之后,时延恶化比较厉害。所以计划在qat_default的基础上,通过冻结其他层,仅放开敏感层进行qat训练,看看能不能把指标拉回来。(虽然qat_default的指标大部分误差大于60%)。不知道你之前有没有这样的实验尝试。

      期待你的回复。
      2026-02-06
      0
    • Huanghui回复默认60384:

      1. QAT过程种有两类状态:伪量化或校准态,训练态。两种状态时分来控制的。

      2. 如果要冻结 input/output的scale ,通过 set_fake_quantize(module, FakeQuantState.CALIBRATION) 这种做法事可以的,这个修改的是量化开关和校准开关。

      3.模块的训练态的你通过eval(),required=False 等参数控制的。

      所以,你如果要冻结 scale (量化控制的变量),就用 set_fake_quantize 好了,这个可以设置整个模型,也可以设置某个模块,设置后可以通过print(vars(module))查看设置模块种的observer_swich / fakequant_switch是否符合预期。

      2026-02-06
      1
    • 默认60384回复Huanghui:
      FakeQuantState.CALIBRATION是开启观察者同时关闭伪量化。在训练的时候,我希望伪量化还在只是梯度回传的时候不更新scale,是不是应该使用 FakeQuantState.VALIDATION,这样是关闭观察者但是会开启伪量化。
      不知道我理解对不对。
      2026-02-06
      0
    • Huanghui回复默认60384:

      理解是对的,我之前说的只是方法上的示例~

      2026-02-06
      0
    • 默认60384回复Huanghui:

      明白了。谢谢

      2026-02-06
      0
    • 遥看瀑布挂前川回复Huanghui:

      冻结某一层或者某个算子可以使用自定义模版,对某一层使用get_qconfig(fix_scale=True)

      2026-02-10
      1
    • 遥看瀑布挂前川回复Huanghui:

      他说的冻结是fix scale ,某个算子qat训练不更新scale ,你这是不量化,压根两回事

      2026-02-10
      0
    • 遥看瀑布挂前川回复Huanghui:

      calib精度如果不高,应该做debug ,先调calib 后调qat训练

      2026-02-10
      0
    • Huanghui回复遥看瀑布挂前川:
      谢谢,不过模块改成VaLIDATION也是会量化的吧,这个时候observer_swich是False, fakequant_switch是True, 理解没错吧~
      2026-02-10
      0
    • 遥看瀑布挂前川回复Huanghui:
      用户要的是qat训练不更新部分scale(不更新不代表不量化!!!),而且qat训练和VALIDATION没有任何关系,VALIDATION是calib阶段要使fake_quant_enable为true的,qat阶段本身就是为true,无需配置。训练过程怎么会配置VALIDATION呢?
      qat训练实现部分scale不更新是需要通过qconfig配置实现的,和其他状态无关,可以通过model_check_result.txt,查看Each output layer的average_constant是不是0(默认为0.01更新,0为不更新)
      2026-02-11
      0