我现在的问题是不知道如何在训练的时候,冻结某一层的量化scale,或者冻结input/output的scale。
能否帮忙提供一个简单的例子。
我现在的问题是不知道如何在训练的时候,冻结某一层的量化scale,或者冻结input/output的scale。
能否帮忙提供一个简单的例子。


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


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是否符合预期。
