项目场景:
使用openvino在intel的CPU上部署模型,并使用NNCF进行Int8量化,以加快推理速度,openvino使用2024.1版本。模型采用mobilenetV3与shuffleNetV2。
问题描述
发现量化后模型在Intel i5-7400,i7-8700,i5-12500,i7-12700上的推理结果不一致,其中7,8代CPU的结果是一致的,12代上两款CPU的结果也是一致的,但是7,8代的CPU结果与12代CPU不一致。
通过在openvino的github仓库中提issue,openvino维护人员确定是因为模型中使用了某种1x1卷积工具。这种 1x1 卷积在这些平台上对 int8 模型使用了不同的硬件指令,从而导致结果的不一样,而这种差异的根源是saturation_issue:“较早的 Intel CPU 代(例如 7/8 代 CPU)对于某些 int8 模型存在一些准确性问题,而具有 Intel Deep Learning Boost 的 CPU( VNNI)技术的新款CPU不会存在这种问题。
解决方案:
在量化过程中使用nncf.OverflowFix进行修复:
quantized_model = nncf.quantize(
model,
calibration_dataset,
...,
advanced_parameters=nncf.AdvancedQuantizationParameters(overflow_fix=nncf.OverflowFi