在量化感知训练过程中模型比常规的浮点模型训练多了prepare,calibration的过程,但是在迭代训练内部有个set_fake_quantize()的函数, set_fake_quantize(qat_model, FakeQuantState.QAT) ,其作用是什么?


你好,这个是是用于控制量化训练过程 校准开关和训练开关的, 校准开关决定是是否更新量化参数,scale, min, max等; 训练开关决定了是否启用伪量化功能让模型感知量化带来的变化; 从代码可以看出,目前 FakeQuantState 的状态有4种:
QAT该模式下,observer启用 ,scales(缩放因子)会被更新。伪量化启用推理结果会后量化带来的影响,其必须与 model.train() 方法一起使用,才能更新模型的weight;
CALIBRATION模式下,伪量化关闭,observer打开,只更新 scales,与 model.eval() 方法一起使用来收集信息(如激活的范围)来确定 scales,而不进行训练。
VALIDATION是验证模式。此时伪量化启用,但observer禁用,scale不会更新。与 model.eval() 方法一起使用,评估使用 scales 进行量化对模型的影响。
_FLOAT是浮点数模式,不更新任何信息,通常仅供开发人员使用。