本示例介绍如何对动态图模型进行量化训练,示例以常用的MobileNetV1和MobileNetV3模型为例,介绍如何对其进行量化训练。
在当前目录下创建data
文件夹,将ImageNet
数据集解压在data
文件夹下,解压后data/ILSVRC2012
文件夹下应包含以下文件:
'train'
文件夹,训练图片'train_list.txt'
文件'val'
文件夹,验证图片'val_list.txt'
文件
- 对于paddle vision支持的模型:
[lenet, mobilenetv1, mobilenetv2, resnet, vgg]
可以直接使用vision内置的模型定义和ImageNet预训练权重 - 对于paddle vision暂未支持的模型,例如mobilenetv3,需要自行定义好模型结构以及准备相应的预训练权重
- 本示例使用的是经过蒸馏的mobilenetv3模型,在ImageNet数据集上Top1精度达到78.96: 预训练权重下载
quant_config = {
'weight_preprocess_type': None,
'activation_preprocess_type': None,
'weight_quantize_type': 'channel_wise_abs_max',
'activation_quantize_type': 'moving_average_abs_max',
'weight_bits': 8,
'activation_bits': 8,
'dtype': 'int8',
'window_size': 10000,
'moving_rate': 0.9,
'quantizable_layer_type': ['Conv2D', 'Linear'],
}
-
'weight_preprocess_type'
:代表对量化模型权重参数预处理的方法,目前支持PACT方法,如需使用可以改为'PACT';默认为None,代表不对权重进行任何预处理。 -
'activation_preprocess_type'
:代表对量化模型激活值预处理的方法,目前支持PACT方法,如需使用可以改为'PACT';默认为None,代表不对激活值进行任何预处理。 -
weight_quantize_type
:代表模型权重的量化方式,可选的有['abs_max', 'channel_wise_abs_max'],默认为channel_wise_abs_max -
activation_quantize_type
:代表模型激活值的量化方式,可选的有['moving_average_abs_max'],默认为moving_average_abs_max -
quantizable_layer_type
:代表量化OP的类型,目前支持Conv2D和Linear
quanter = QAT(config=quant_config)
quanter.quantize(net)
quanter.save_quantized_model(net, 'save_dir', input_spec=[paddle.static.InputSpec(shape=[None, 3, 224, 224], dtype='float32')])
-
MobileNetV1
我们使用普通的量化训练方法即可,启动命令如下:
# 单卡训练 python train.py --model=mobilenet_v1 # 多卡训练,以0到3号卡为例 python -m paddle.distributed.launch --gpus="0,1,2,3" train.py --model=mobilenet_v1
-
MobileNetV3
对于MobileNetV3,直接使用普通的量化损失较大,为降低量化损失,可以使用PACT的量化方法,启动命令如下:
# 单卡训练 python train.py --lr=0.001 --use_pact=True --num_epochs=30 --l2_decay=2e-5 --ls_epsilon=0.1 # 多卡训练,以0到3号卡为例 python -m paddle.distributed.launch --gpus="0,1,2,3" train.py --lr=0.001 --use_pact=True --num_epochs=30 --l2_decay=2e-5 --ls_epsilon=0.1
模型 | FP32模型准确率(Top1/Top5) | 量化方法 | 量化模型准确率(Top1/Top5) |
---|---|---|---|
MobileNetV1 | 70.99/89.65 | 普通在线量化 | 70.63/89.65 |
MobileNetV3 | 78.96/94.48 | PACT在线量化 | 77.52/93.77 |
注:在batch_size=256时能达到上表中理想的量化精度,但显存需求较大,因此在train.py中batch_size设置为128。