一、PTQ 模型量化問題
1.1、模型問題
基于公版模型訓練,沒有對模型做范圍做約束,weight_decay=1e-6, 訓練出的 float 模型數值分布很大,如圖 2,可以看到模型的后面幾層數據分布范圍很廣,最大閾值超過了 8000,對我們量化來說并不友好。
1.2、算子問題
如圖 2,基于全 int16 算子配置量化,當前版本 resize 算子有約束(請查閱工具鏈算子支持情況),只能支持 int8 量化,即使配置了 int16,但算子依舊退化到 int8,因此算子的 cosine 相似度也比較低,基于此閾值,max_qscale=6653/127=52.385,此 scale 過于大,并不能精細化量化模型,所以全 BPU 算子的整體精度都不高。
二、精度優化
2.1、cpu 高精度定位
resize 算子有限制,但對于回退 cpu 算子,就能實現 float 精度推理,配置如圖 2,
配置了算子后,精度提升了,如圖 3,可視化效果對比如圖 4,整體量化精度可對齊,定位到了具體問題就是 resize 算子限制導致。
2.2、添加 bn,加大 weight_decay
在最后的 conv 層后加上 bn 算子限制特征數據分布,同時 weight_decay 從 1e-6 調整到 1e-3,整體數據范圍如圖 5、圖 6,模型的數據分布變小了,最后的 cosine 相似度精度也很高,非常利于 int8 量化,后期配置了 int8 量化,模型也可實現高精度量化。