DingXiaoH / RepVGG

RepVGG: Making VGG-style ConvNets Great Again
MIT License
3.3k stars 433 forks source link

Some questions about quantization #85

Open Desmond-97 opened 2 years ago

Desmond-97 commented 2 years ago

您好,我在量化RepVGG到INT8时遇到一些问题: 完全按照您在README中提到的量化流程,先插入BN后QAT量化,掉点非常严重。以大模型(b3g4)为例,在ImageNet分类任务上量化后仅有20左右的accuracy。 但假如将https://github.com/DingXiaoH/RepVGG/blob/ce669bad170bf5d7c2a9eb060e90f39e7e109130/quantization/repvgg_quantized.py#L50代码修改为:torch.quantization.fuse_modules(m, ['conv'], inplace=True) 可以直接运行QAT量化,则掉点只有2.7%,调参后掉点大约1.7%。(参数为epochs=20 batch_size:与训练时bs保持一致 lr=1e-3 weight_decay=55e-6) 但对于分类任务而言量化后掉点也有点多,不知道这样做是否正确?请问您有其他量化方法的见解吗?

twmht commented 2 years ago

@Desmond-97

有任何進展嗎

Desmond-97 commented 2 years ago

@twmht 我后来尝试直接用PTQ量化效果会好很多,TensorRT实现PTQ量化,用交叉熵做校准loss,RepVGG_A0模型在ImageNet分类任务上掉点仅0.16%。 我后来思考QAT量化掉点多的原因可能是:在QAT阶段用的模型是融合后的单分支推理模型,用这个模型进行QAT的finetune会使得模型退化,类似VGG的精度。但我并没有尝试用训练阶段模型进行QAT量化。

blueardour commented 2 years ago

@Desmond-97

你这边尝试的结论是否是: 对于QAT量化,以RepVGG方式训练的全精度模型初始化,fintune融合后的单分支模型,效果非常差。但是对于这个融合后的单分支模型,直接用PTQ算法,量化精度几乎没损失?

也就是说RepVGG训练出来的模型不适合QAT的量化,只要用PTQ就行了~~

twmht commented 2 years ago

可以試試把 repvgg 的模型弄得更小一點,看做 PTQ 精度會不會掉?

Desmond-97 commented 2 years ago

@blueardour

是的 但我的实验不够完备,可以在实践的时候再尝试一下~

hobbitlzy commented 2 years ago

@Desmond-97 请问你在做PTQ的时候有再用insert_bn吗?我发现直接convert后的单路repvgg的网络参数范围比较大,导致量化误差也大。

twmht commented 2 years ago

@hobbitlzy

你 PTQ 用 TensorRT 的還是哪個 framework?

hobbitlzy commented 2 years ago

我是用的有一篇工作BRECQ里边的PTQ。用的fake quantization。

Desmond-97 commented 2 years ago

@hobbitlzy 没有用insert_bn。