答:这是因为量化后保存的参数是虽然是int8范围,但是类型是float。这是因为Paddle训练前向默认的Kernel不支持INT8 Kernel实现,只有Paddle Inference TensorRT的推理才支持量化推理加速。为了方便量化后验证量化精度,使用Paddle训练前向能加载此模型,默认保存的Float32类型权重,体积没有发生变换。
答:这是因为量化后保存的参数是虽然是Int8范围,但是类型是Float32。Paddle训练前向默认的Kernel并不具备加速量化模型的能力。量化模型必须配合使用支持Int8计算的的预测库才能加速。
如果量化模型在ARM上线,则需要使用Paddle Lite.
Paddle Lite会对量化模型进行模型转化和优化,转化方法见链接。
转化之后可以像非量化模型一样使用Paddle Lite API进行加载预测。
如果量化模型在GPU上线,则需要使用Paddle-TensorRT 预测接口.
config->EnableTensorRtEngine(1 << 20 /* workspace_size*/,
batch_size /* max_batch_size*/,
3 /* min_subgraph_size*/,
AnalysisConfig::Precision::kInt8 /* precision*/,
false /* use_static*/,
false /* use_calib_mode*/);
如果量化模型在x86上线,需要使用INT8 MKL-DNN
首先需要考虑量化模型上线的平台
平台 | 支持weight量化方式 | 支持activation量化方式 | 支持量化的OP |
---|---|---|---|
ARM(Paddle Lite) | channel_wise_abs_max, abs_max | moving_average_abs_max,range_abs_max | conv2d, depthwise_conv2d, mul |
x86(MKL-DNN) | abs_max | moving_average_abs_max,range_abs_max | conv2d, depthwise_conv2d, mul, matmul |
GPU(TensorRT) | channel_wise_abs_max | moving_average_abs_max,range_abs_max | mul, conv2d, pool2d, depthwise_conv2d, elementwise_add, leaky_relu |
部分层跳过量化
如果量化后精度损失较大,可以考虑跳过部分对量化敏感的计算不量化,比如最后一层或者attention计算。
答: 一般是reader没写对,导致离线量化是前向一次没跑,没有收集到中间的激活值。
答:因为离线量化或者量化训练并没有涉及到对cuda或者cudnn做修改, 因此这个错误一般是机器上的cuda或者cudnn版本和Paddle所需的cuda或者cudnn版本不一致。
答:需要适当调小学习率。如果小学习率依然不能解决问题,则需要考虑是否某些层对量化敏感,需要跳过量化,比如attention.
答:可查看使用的paddle版本是否包含pr, 该pr修复了在对几乎是0的tensor进行量化时的bug。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。