首先我们介绍一下Paddle支持的模型量化方法,让大家有一个整体的认识。
Paddle模型量化包含三种量化方法,分别是动态离线量化方法、静态离线量化方法和量化训练方法。
下图展示了如何选择模型量化方法。
下图综合对比了模型量化方法的使用条件、易用性、精度损失和预期收益。
大家可以根据不同情况选用不同的量化方法,有几点着重注意:
本章节主要介绍使用PaddleSlim量化训练方法产出的量化模型,使用PaddleLite加载量化模型进行推理部署,
量化训练是使用较多训练数据,对训练好的预测模型进行量化。该方法使用模拟量化的思想,在训练阶段更新权重,实现减小量化误差。
使用条件:
使用步骤:
优点:
缺点:
建议首先使用“静态离线量化”方法对模型进行量化,然后使用使用量化模型进行预测。如果该量化模型的精度达不到要求,再使用“量化训练”方法。
目前,PaddleSlim的量化训练主要针对卷积层和全连接层,对应算子是conv2d、depthwise_conv2d、conv2d_tranpose和mul。PaddleLite支持运行PaddleSlim量化训练产出的模型,可以进一步加快模型在移动端的执行速度。
使用PaddleSlim模型压缩工具训练量化模型,请参考文档:
首先,使用PaddleLite提供的模型转换工具(model_optimize_tool)将量化模型转换成移动端预测的模型,然后加载转换后的模型进行预测部署。
问题:CompiledwithWITH_GPU,butnoGPUfoundinruntime
解答:检查本机是否支持GPU训练,如果不支持请使用CPU训练。如果在docker进行GPU训练,请使用nvidia_docker启动容器。
问题:InufficientGPUmemorytoallocation.at[/paddle/paddle/fluid/platform/gpu_info.cc:262]
解答:正确设置run.sh脚本中CUDA_VISIBLE_DEVICES,确保显卡剩余内存大于需要内存。
本部分首先简单介绍动态离线量化,然后说明产出量化模型,最后阐述量化模型预测。
动态离线量化,将模型中特定OP的权重从FP32类型量化成INT8/16类型。
该量化模型有两种预测方式:
注意:目前PaddleLite仅支持第一种反量化预测方式。
和静态离线量化相比,目前PaddleLite只支持反量化预测方式,对于预测过程的加速有限;但是动态离线量化不需要训练数据即可完成量化,达到减小模型大小的目的。
PaddleLiteOPT工具和PaddleSlim都提供了动态离线量化功能,两者原理相似,都可以产出动态离线量化的模型。
PaddleLiteOPT工具将动态离线量化功能集成到模型转换中,使用简便,只需要设置对应参数,就可以产出优化后的量化模型。
准备已经训练好的FP32预测模型,即save_inference_model()保存的模型。
大家可以使用PaddleSlim调用动态离线量化接口,得到量化模型。
对于调用动态离线量化,首先给出一个例子。
目前,对于动态离线量化产出的量化模型,只能使用PaddleLite进行预测部署。
很简单,首先使用PaddleLite提供的模型转换工具(OPT)将量化模型转换成移动端预测的模型,然后加载转换后的模型进行预测部署。
注意,PaddleLite2.3版本才支持动态离线量化产出的量化,所以转换工具和预测库必须是2.3及之后的版本。
静态离线量化,使用少量校准数据计算量化因子,可以快速得到量化模型。使用该量化模型进行预测,可以减少计算量、降低计算内存、减小模型大小。
静态离线量化中,有两种计算量化因子的方法,非饱和量化方法和饱和量化方法。非饱和量化方法计算整个Tensor的绝对值最大值abs_max,将其映射为127。饱和量化方法使用KL散度计算一个合适的阈值T(0 大家可以使用PaddleSlim调用静态离线量化接口,得到量化模型。 准备已经训练好的FP32预测模型,即save_inference_model()保存的模型。准备校准数据集,校准数据集应该是测试集/训练集中随机挑选的一部分,量化因子才会更加准确。对常见的视觉模型,建议校准数据的数量为100~500张图片。 对于调用静态离线量化,首先给出一个例子,让大家有个直观了解。