1
1
# 模型量化教程
2
2
3
- 模型量化是使用整数替代浮点数进行存储和计算的方法。举例而言,模型量化可以将32bit浮点数转换成8bit整数,则模型存储空间可以减少4倍,同时整数运算替换浮点数运算,可以加快模型推理速度、降低计算内存。
3
+ ## 1 概述
4
+
5
+ 模型量化是一种常见的模型压缩方法,是使用整数替代浮点数进行存储和计算。
6
+
7
+ 比如,模型量化将32bit浮点数转换成8bit整数,则模型存储空间可以减少4倍,同时整数运算替换浮点数运算,可以加快模型推理速度、降低计算内存。
4
8
5
9
PaddleSeg基于PaddleSlim,集成了量化训练(QAT)方法,特点如下:
6
- * 概述:使用大量训练数据,在训练过程中更新权重,减小量化损失。
7
- * 注意事项:训练数据需要有Ground Truth。
10
+ * 概述:使用训练数据,在训练过程中更新权重,减小量化损失。
8
11
* 优点:量化模型的精度高;使用该量化模型预测,可以减少计算量、降低计算内存、减小模型大小。
9
12
* 缺点:易用性稍差,需要一定时间产出量化模型
10
13
11
- 下面,本文以一个示例来介绍如何产出和部署量化模型。
14
+ ## 2 量化模型精度和性能
15
+
16
+ 测试环境:
17
+ * GPU: V100 32G
18
+ * CPU: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
19
+ * CUDA: 10.1
20
+ * cuDNN: 7.6
21
+ * TensorRT: 6.0.1.5
22
+ * Paddle: 2.1.1
12
23
13
- ## 1 环境准备
24
+ 测试方法:
25
+ 1 . 在GPU上使用TensorRT测试原始模型和量化模型
26
+ 2 . 使用cityspcaes的全量验证数据集(1024x2048)进行测试
27
+ 3 . 单GPU,Batchsize为1
28
+ 4 . 运行耗时为纯模型预测时间
29
+ 5 . 使用Paddle Inference的[ Python API] ( ../../depolyment/inference/python_inference.md ) 测试,通过use_trt参数设置是否使用TRT,使用precision参数设置预测类型。
30
+
31
+ | 模型 | 类型 | mIoU | 耗时(s/img) | 量化加速比 |
32
+ | - | :-: | :-: | :-: | :-: |
33
+ | ANN_ResNet50_OS8 | FP32 | 0.7909 | 0.281 | - |
34
+ | ANN_ResNet50_OS8 | INT8 | 0.7906 | 0.195 | 30.6% |
35
+ | DANet_ResNet50_OS8 | FP32 | 0.8027 | 0.330 | - |
36
+ | DANet_ResNet50_OS8 | INT8 | 0.8039 | 0.266 | 19.4% |
37
+ | DeepLabV3P_ResNet50_OS8 | FP32 | 0.8036 | 0.206 | - |
38
+ | DeepLabV3P_ResNet50_OS8 | INT8 | 0.8044 | 0.083 | 59.7% |
39
+ | DNLNet_ResNet50_OS8 | FP32 | 0.7995 | 0.360 | - |
40
+ | DNLNet_ResNet50_OS8 | INT8 | 0.7989 | 0.236 | 52.5% |
41
+ | EMANet_ResNet50_OS8 | FP32 | 0.7905 | 0.186 | - |
42
+ | EMANet_ResNet50_OS8 | INT8 | 0.7939 | 0.106 | 43.0% |
43
+ | GCNet_ResNet50_OS8 | FP32 | 0.7950 | 0.228 | - |
44
+ | GCNet_ResNet50_OS8 | INT8 | 0.7959 | 0.144 | 36.8% |
45
+ | PSPNet_ResNet50_OS8 | FP32 | 0.7883 | 0.324 | - |
46
+ | PSPNet_ResNet50_OS8 | INT8 | 0.7915 | 0.223 | 32.1% |
47
+
48
+ ## 3 示例
49
+
50
+ 我们以一个示例来介绍如何产出和部署量化模型。
51
+ ### 3.1 环境准备
14
52
15
53
请参考[ 安装文档] ( ../../install.md ) 准备好PaddleSeg的基础环境。由于量化功能要求最新的PaddlePaddle版本,所以请参考[ 文档] ( https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html ) 安装develop(Nightly build)版本。
16
54
@@ -26,15 +64,15 @@ git reset --hard 15ef0c7dcee5a622787b7445f21ad9d1dea0a933
26
64
python setup.py install
27
65
```
28
66
29
- ## 2 产出量化模型
67
+ ### 3. 2 产出量化模型
30
68
31
- ### 2.1 训练FP32模型
69
+ #### 3. 2.1 训练FP32模型
32
70
33
71
在产出量化模型之前,我们需要提前准备训练或者fintune好的FP32模型。
34
72
35
- 此处,我们选用视盘分割数据集和BiseNetV2模型,从头开始训练模型 。
73
+ 此处,我们选用视盘分割数据集和BiseNetV2模型,使用train.py从头开始训练模型。train.py输入参数的介绍,请参考 [ 文档 ] ( ../../train/train.md ) 。
36
74
37
- 在PaddleSeg目录下,执行如下脚本,会自动下载数据集进行训练。训练结束后,精度最高的权重会保存到 ` output_fp32/best_model ` 目录下。
75
+ 在PaddleSeg目录下,执行如下脚本,会自动下载数据集进行训练。
38
76
39
77
``` shell
40
78
# 设置1张可用的GPU卡
@@ -50,11 +88,33 @@ python train.py \
50
88
--save_dir output_fp32
51
89
```
52
90
53
- ### 2.2 使用量化训练方法产出量化模型
91
+ 训练结束后,精度最高的权重会保存到 ` output_fp32/best_model ` 目录下。
54
92
55
- ** 训练量化模型 **
93
+ #### 3.2.2 使用量化训练方法产出量化模型
56
94
57
- 基于2.1步骤中训练好的FP32模型权重,执行如下命令,使用` slim/quant/qat_train.py ` 脚本进行量化训练。
95
+ ** 1)产出量化模型**
96
+
97
+ 基于训练好的FP32模型权重,使用` slim/quant/qat_train.py ` 进行量化训练。
98
+
99
+ qat_train.py和train.py的输入参数基本相似(如下)。注意,量化训练的学习率需要调小,使用` model_path ` 参数指定FP32模型的权重。
100
+
101
+ | 参数名 | 用途 | 是否必选项 | 默认值 |
102
+ | ------------------- | ------------------------------------------------------------ | ---------- | ---------------- |
103
+ | config | FP32模型的配置文件 | 是 | - | - |
104
+ | model_path | FP32模型的预训练权重 | 是 | - |
105
+ | iters | 训练迭代次数 | 否 | 配置文件中指定值 |
106
+ | batch_size | 单卡batch size | 否 | 配置文件中指定值 |
107
+ | learning_rate | 初始学习率 | 否 | 配置文件中指定值 |
108
+ | save_dir | 模型和visualdl日志文件的保存根路径 | 否 | output |
109
+ | num_workers | 用于异步读取数据的进程数量, 大于等于1时开启子进程读取数据 | 否 | 0 |
110
+ | use_vdl | 是否开启visualdl记录训练数据 | 否 | 否 |
111
+ | save_interval_iters | 模型保存的间隔步数 | 否 | 1000 |
112
+ | do_eval | 是否在保存模型时启动评估, 启动时将会根据mIoU保存最佳模型至best_model | 否 | 否 |
113
+ | log_iters | 打印日志的间隔步数 | 否 | 10 |
114
+ | resume_model | 恢复训练模型路径,如:` output/iter_1000 ` | 否 | None
115
+
116
+
117
+ 执行如下命令,进行量化训练。量化训练结束后,精度最高的量化模型权重保存在` output_quant/best_model ` 目录下。
58
118
59
119
``` shell
60
120
python slim/quant/qat_train.py \
@@ -67,23 +127,29 @@ python slim/quant/qat_train.py \
67
127
--save_dir output_quant
68
128
```
69
129
70
- 上述脚本的输入参数和常规训练相似,复用2.1步骤的config文件,使用` model_path ` 参数指定FP32模型的权重,初始学习率相应调小。
71
-
72
- 训练结束后,精度最高的量化模型权重会保存到` output_quant/best_model ` 目录下。
73
-
74
- ** 测试量化模型**
130
+ ** 2)测试量化模型**
75
131
76
- 执行如下命令 ,使用` slim/quant/qat_val.py ` 脚本加载量化模型的权重,测试模型量化的精度。
132
+ 如果需要,可以执行如下命令 ,使用` slim/quant/qat_val.py ` 脚本加载量化模型的权重,测试模型量化的精度。
77
133
78
134
```
79
135
python slim/quant/qat_val.py \
80
136
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
81
137
--model_path output_quant/best_model/model.pdparams
82
138
```
83
139
84
- ** 导出量化预测模型**
140
+ ** 3) 导出量化预测模型**
85
141
86
- 基于此前训练好的量化模型权重,执行如下命令,使用` slim/quant/qat_export.py ` 导出预测量化模型,保存在` output_quant_infer ` 目录下。
142
+ 基于训练好的量化模型权重,使用` slim/quant/qat_export.py ` 导出预测量化模型,脚本输入参数如下。
143
+
144
+ | 参数名| 用途| 是否必选项| 默认值|
145
+ | -| -| -| -|
146
+ | config| 模型配置文件| 是| -|
147
+ | save_dir| 预测量化模型保存的文件夹| 否| output|
148
+ | model_path| 量化模型的权重| 否| 配置文件中指定值|
149
+ | with_softmax| 在网络末端添加softmax算子。由于PaddleSeg组网默认返回logits,如果想要部署模型获取概率值,可以置为True| 否| False|
150
+ | without_argmax| 是否不在网络末端添加argmax算子。由于PaddleSeg组网默认返回logits,为部署模型可以直接获取预测结果,我们默认在网络末端添加argmax算子| 否| False|
151
+
152
+ 执行如下命令,导出预测量化模型保存在` output_quant_infer ` 目录。
87
153
88
154
```
89
155
python slim/quant/qat_export.py \
@@ -92,35 +158,15 @@ python slim/quant/qat_export.py \
92
158
--save_dir output_quant_infer
93
159
```
94
160
95
- ## 3 部署
161
+ ### 3.3 部署量化模型
162
+
163
+ 得到量化预测模型后,我们可以进行部署应用,请参考如下教程。
96
164
97
- 得到量化预测模型后,我们可以进行部署应用。
98
165
* [ Paddle Inference Python部署] ( ../../deployment/inference/python_inference.md )
99
166
* [ Paddle Inference C++部署] ( ../../deployment/inference/cpp_inference.md )
100
- * [ PaddleLite部署] ( ../../deployment/lite/lite.md )
101
-
102
- ## 4 量化加速比
103
-
104
- 测试环境:
105
- * GPU: V100
106
- * CPU: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
107
- * CUDA: 10.2
108
- * cuDNN: 7.6
109
- * TensorRT: 6.0.1.5
110
-
111
- 测试方法:
112
- 1 . 运行耗时为纯模型预测时间,测试图片cityspcaes(1024x2048)
113
- 2 . 预测10次作为热启动,连续预测50次取平均得到预测时间
114
- 3 . 使用GPU + TensorRT测试
115
-
116
- | 模型| 未量化运行耗时(ms)| 量化运行耗时(ms)| 加速比|
117
- | -| -| -| -|
118
- | deeplabv3_resnet50_os8| 204.2| 150.1| 26.49%|
119
- | deeplabv3p_resnet50_os8| 147.2| 89.5| 39.20%|
120
- | gcnet_resnet50_os8| 201.8| 126.1| 37.51%|
121
- | pspnet_resnet50_os8| 266.8| 206.8| 22.49%|
167
+ * [ PaddleLite部署] ( ../../deployment/lite/lite.md )
122
168
123
- ## 5 参考资料
169
+ ### 3.4 参考资料
124
170
125
171
* [ PaddleSlim Github] ( https://github.com/PaddlePaddle/PaddleSlim )
126
172
* [ PaddleSlim 文档] ( https://paddleslim.readthedocs.io/zh_CN/latest/ )
0 commit comments