meituan / YOLOv6

YOLOv6: a single-stage object detection framework dedicated to industrial applications.
GNU General Public License v3.0
5.72k stars 1.03k forks source link

QAT issue: weights exceed int8 range #724

Open liamsun2019 opened 1 year ago

liamsun2019 commented 1 year ago

Before Asking

Search before asking

Question

Hi authors,

问题由来: 基于yolov6n.py训练了一版模型,看起来在PC上运行推理正常,但由于PTQ结果很差,所以尝试QAT

  1. 按照https://github.com/meituan/YOLOv6/blob/main/docs/Tutorial%20of%20Quantization.md的说明,训练了scale和相应的repopt模型
  2. 产生较准模型后,基于configs/repopt/yolov6n_opt_qat.py进行QAT训练。训练后导出onnx,PC上推理正常
  3. 检查onnx的权重,发现个别conv,有不少超过int8范围的权重系数

请问以上问题,有什么建议吗?谢谢!!

Additional

No response

xingyueye commented 1 year ago

量化版本,建议参考QARep系列,训练完成后直接PTQ使用 https://github.com/meituan/YOLOv6/tree/main/configs/qarepvgg QAT的模型权重参数超出int8范围,有可能是融合BN时导致的数据异常,在量化中它们会被clip,应该不影响实际精度。

liamsun2019 commented 1 year ago

感谢迅速的回复。再请教一下:

  1. 使用qarepvgg版本,意思是使用它的config档即可,例如使用yolov6n_qa.py进行训练,然后直接做PTQ?
  2. 如果是融合BN导致数据异常,这个现象是正常的吗?我导出的qat onnx模型,用onnxruntime推理确实能得到正确结果,但里面有不少权重都远超int8的范围,比较担心clip后会影响结果。

希望得到指点,谢谢!!

mtjhl commented 1 year ago
  1. 是的,使用 QARep 版本,PTQ 量化损失比较小。
  2. 您可以测试一下,看 clip 之后的精度是否会下降。
liamsun2019 commented 1 year ago

好的,我先试试看,有问题再请教

liamsun2019 commented 1 year ago

使用qarepvgg做训练,pytorch模型跟onnx模型在float上推理正常。但做PTQ后(尝试过KL和EMA,int8和u8量化),对普通image做推理,得到的置信度,会超过1。例如,置信度在float下是0.9,但量化模型得到1.59这样的置信度。检查weight的分布,看起来熵值普遍较大,这个和之前采用普通repvgg的模型类似。因此量化版本难以在实际系统上部署。请问有什么建议吗?

liamsun2019 commented 1 year ago

这个问题,还有什么建议吗?比如针对可能的融合BN时导致的数据异常,有什么解法或者workaround吗?