- 量化训练或者离线量化后的模型体积为什么没有变小?
- 量化训练或者离线量化后的模型使用paddle加载为什么没有加速?怎样才能加速?
- 该怎么设置适合的量化配置?
- 离线量化出现'KeyError: '报错
- 离线量化或者量化训练时出现CUDNN或者CUDA错误
- 量化训练时loss是nan
- cpu上跑量化后的模型出nan
答:这是因为量化后保存的参数是虽然是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。