1
1
# 自然语言处理模型自动压缩示例
2
2
3
- 本示例将介绍如何使用PaddleNLP中Inference部署模型进行自动压缩。
4
-
5
- ## Benchmark
3
+ 目录:
4
+ - [ 1. 简介] ( #1简介 )
5
+ - [ 2. Benchmark] ( #2Benchmark )
6
+ - [ 3. 自动压缩流程] ( #自动压缩流程 )
7
+ - [ 3.1 准备环境] ( #31-准备准备 )
8
+ - [ 3.2 准备数据集] ( #32-准备数据集 )
9
+ - [ 3.3 准备预测模型] ( #33-准备预测模型 )
10
+ - [ 3.4 自动压缩并产出模型] ( #34-自动压缩并产出模型 )
11
+ - [ 4. 压缩配置介绍] ( #4压缩配置介绍 )
12
+ - [ 5. 预测部署] ( #5预测部署 )
13
+ - [ 6. FAQ] ( 6FAQ )
14
+
15
+
16
+ ## 1. 简介
17
+ 本示例将以自然语言处理模型PP-MiniLM为例,介绍如何使用PaddleNLP中Inference部署模型进行自动压缩。本示例使用的自动压缩策略为剪枝蒸馏和离线量化(Post-training quantization)。
18
+
19
+ ## 2. Benchmark
6
20
- PP-MiniLM模型
7
21
8
- PP-MiniLM是一个6层的预训练中文小模型,使用PaddleNLP中`` from_pretrained `` 导入PP-MiniLM之后,就可以在自己的数据集上进行fine-tuning,具体介绍可参考[ PP-MiniLM文档] ( https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/model_compression/pp-minilm#PP-MiniLM%E4%B8%AD%E6%96%87%E5%B0%8F%E6%A8%A1%E5%9E%8B ) 。
9
- 此自动压缩实验首先会对模型的attention head裁剪25%,同时进行蒸馏训练,然后进行离线量化(Post-training quantization)。
22
+ PP-MiniLM是一个6层的预训练中文小模型,使用PaddleNLP中``` from_pretrained ``` 导入PP-MiniLM之后,就可以在自己的数据集上进行fine-tuning,具体介绍可参考[ PP-MiniLM文档] ( https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/model_compression/pp-minilm#PP-MiniLM%E4%B8%AD%E6%96%87%E5%B0%8F%E6%A8%A1%E5%9E%8B ) 。
10
23
24
+ 模型精度对比如下:
11
25
| 模型 | 策略 | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | AVG |
12
26
| :------:| :------:| :------:| :------:| :------:| :------:| :-----------:| :------:| :------:| :------:|
13
27
| PP-MiniLM | Base模型| 74.03 | 56.66 | 60.21 | 80.98 | 76.20 | 84.21 | 77.36 | 72.81 |
14
28
| PP-MiniLM | 剪枝蒸馏+离线量化| 73.56 | 56.38 | 59.87 | 80.80 | 76.44 | 82.23 | 77.77 | 72.44 |
15
29
30
+ 模型在不同任务上平均精度以及加速对比如下:
31
+ | PP-MiniLM | Accuracy(avg) | 时延(ms) | 加速比 |
32
+ | :-------:| :----------:| :------------:| :------:|
33
+ | 压缩前 | 72.81 | 128.01 | - |
34
+ | 压缩后 | 72.44 | 17.97 | 612% |
35
+
16
36
性能测试的环境为
17
37
- 硬件:NVIDIA Tesla T4 单卡
18
38
- 软件:CUDA 11.0, cuDNN 8.0, TensorRT 8.0
19
39
- 测试配置:batch_size: 40, max_seq_len: 128
20
40
21
- ## 环境准备
22
-
23
- ### 1.准备数据
24
- 本案例默认以CLUE数据进行自动压缩实验,如数据集为非CLUE格式数据,请修改启动文本run.sh中dataset字段,PaddleNLP会自动下载对应数据集。
41
+ ## 3. 自动压缩流程
25
42
26
- ### 2.准备需要压缩的环境
43
+ #### 3.1 准备环境
27
44
- python >= 3.6
28
- - paddlepaddle >= 2.3
45
+ - PaddlePaddle >= 2.2 (可从[ Paddle官网] ( https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html ) 下载安装)
46
+ - PaddleSlim >= 2.3 或者适当develop版本
29
47
- PaddleNLP >= 2.3
30
48
31
49
安装paddlepaddle:
@@ -36,34 +54,59 @@ pip install paddlepaddle
36
54
pip install paddlepaddle-gpu
37
55
```
38
56
57
+ 安装paddleslim:
58
+ ``` shell
59
+ pip install paddleslim
60
+ ```
61
+
39
62
安装paddlenlp:
40
63
``` shell
41
64
pip install paddlenlp
42
65
```
43
66
44
- 安装paddleslim:
45
- ``` shell
46
- pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple
47
- ```
48
-
49
67
注:安装PaddleNLP的目的是为了下载PaddleNLP中的数据集和Tokenizer。
50
68
51
- ### 3.准备待压缩的部署模型
52
- 如果已经准备好部署的model.pdmodel和model.pdiparams部署模型,跳过此步。
53
- 根据[ PaddleNLP文档] ( https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples ) 导出Inference模型,本示例可参考[ PaddleNLP PP-MiniLM 中文小模型] ( https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/model_compression/pp-minilm ) 微调后保存下每个数据集下有最高准确率的模型。或直接下载以下已微调完成的Inference模型:[ afqmc] ( https://bj.bcebos.com/v1/paddle-slim-models/act/afqmc.tar ) , [ tnews] ( https://bj.bcebos.com/v1/paddle-slim-models/act/tnews.tar ) , [ iflytek] ( https://bj.bcebos.com/v1/paddle-slim-models/act/iflytek.tar ) ,[ ocnli] ( https://bj.bcebos.com/v1/paddle-slim-models/act/ocnli.tar ) , [ cmnli] ( https://bj.bcebos.com/v1/paddle-slim-models/act/cmnli.tar ) , [ cluewsc2020] ( https://bj.bcebos.com/v1/paddle-slim-models/act/cluewsc.tar ) , [ csl] ( https://bj.bcebos.com/v1/paddle-slim-models/act/csl.tar ) 。
69
+ #### 3.2 准备数据集
70
+ 本案例默认以CLUE数据进行自动压缩实验,如数据集为非CLUE格式数据,请修改启动文本run.sh中dataset字段,PaddleNLP会自动下载对应数据集。
71
+
72
+
73
+ #### 3.3 准备预测模型
74
+ 预测模型的格式为:` model.pdmodel ` 和 ` model.pdiparams ` 两个,带` pdmodel ` 的是模型文件,带` pdiparams ` 后缀的是权重文件。
75
+
76
+ 注:其他像` __model__ ` 和` __params__ ` 分别对应` model.pdmodel ` 和 ` model.pdiparams ` 文件。
77
+
78
+ 本示例可参考[ PaddleNLP PP-MiniLM 中文小模型] ( https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/model_compression/pp-minilm ) 微调后保存下每个数据集下有最高准确率的模型,也可直接下载以下已微调完成的Inference模型:[ afqmc] ( https://bj.bcebos.com/v1/paddle-slim-models/act/afqmc.tar ) , [ tnews] ( https://bj.bcebos.com/v1/paddle-slim-models/act/tnews.tar ) , [ iflytek] ( https://bj.bcebos.com/v1/paddle-slim-models/act/iflytek.tar ) ,[ ocnli] ( https://bj.bcebos.com/v1/paddle-slim-models/act/ocnli.tar ) , [ cmnli] ( https://bj.bcebos.com/v1/paddle-slim-models/act/cmnli.tar ) , [ cluewsc2020] ( https://bj.bcebos.com/v1/paddle-slim-models/act/cluewsc.tar ) , [ csl] ( https://bj.bcebos.com/v1/paddle-slim-models/act/csl.tar ) 。其他模型可根据[ PaddleNLP文档] ( https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples ) 导出Inference模型。
79
+
54
80
``` shell
55
81
wget https://bj.bcebos.com/v1/paddle-slim-models/act/afqmc.tar
56
82
tar -zxvf afqmc.tar
57
83
```
58
84
59
- ## 开始自动压缩
85
+ #### 3.4 自动压缩并产出模型
86
+
87
+ 自动压缩示例通过run.py脚本启动,会使用接口``` paddleslim.auto_compression.AutoCompression ``` 对模型进行自动压缩。配置config文件中训练部分的参数,将任务名称、模型类型、数据集名称、压缩参数传入,配置完成后便可对模型进行剪枝、蒸馏训练和离线量化。
88
+ 数据集为CLUE,不同任务名称代表CLUE上不同的任务,可选择的任务名称有:afqmc, tnews, iflytek, ocnli, cmnli, cluewsc2020, csl。具体运行命令为
89
+ :
90
+ ``` shell
91
+ python run.py \
92
+ --model_type=' ppminilm' \
93
+ --model_dir=' ./afqmc/' \
94
+ --model_filename=' inference.pdmodel' \
95
+ --params_filename=' inference.pdiparams' \
96
+ --dataset=' clue' \
97
+ --save_dir=' ./save_afqmc_pruned/' \
98
+ --batch_size=16 \
99
+ --max_seq_length=128 \
100
+ --task_name=' afqmc' \
101
+ --config_path=' ./configs/afqmc.yaml'
102
+ ```
60
103
61
- ### 压缩配置介绍
62
- 自动压缩需要准备config文件,并传入`` config_path `` 字段,configs文件夹下可查看不同任务的配置文件,以下示例以afqmc数据集为例介绍。训练参数需要自行配置。蒸馏、剪枝和离线量化的相关配置,自动压缩策略可以自动获取得到,也可以自行配置。PaddleNLP模型的自动压缩实验默认使用剪枝、蒸馏和离线量化的策略。
104
+ ## 4. 压缩配置介绍
105
+ 自动压缩需要准备config文件,并传入``` config_path ` `` 字段,configs文件夹下可查看不同任务的配置文件,以下示例以afqmc数据集为例介绍。训练参数需要自行配置。蒸馏、剪枝和离线量化的相关配置,自动压缩策略可以自动获取得到,也可以自行配置。PaddleNLP模型的自动压缩实验默认使用剪枝、蒸馏和离线量化的策略。
63
106
64
107
- 训练参数
65
108
66
- 训练参数主要设置学习率、训练轮数(epochs)和优化器等。`` origin_metric `` 是原模型精度,如设置该参数,压缩之前会先验证模型精度是否正常。
109
+ 训练参数主要设置学习率、训练轮数(epochs)和优化器等。``` origin_metric ` `` 是原模型精度,如设置该参数,压缩之前会先验证模型精度是否正常。
67
110
68
111
``` yaml
69
112
TrainConfig :
@@ -134,22 +177,11 @@ Quantization:
134
177
weight_bits : 8
135
178
` ` `
136
179
137
- ### 进行剪枝蒸馏和离线量化自动压缩
138
-
139
- 蒸馏量化自动压缩示例通过run.py脚本启动,会使用接口` ` paddleslim.auto_compression.AutoCompression` ` 对模型进行离线量化。将任务名称、模型类型、数据集名称、压缩参数传入,对模型进行剪枝、蒸馏训练和离线量化。数据集为CLUE,不同任务名称代表CLUE上不同的任务,可选择的任务名称有:afqmc, tnews, iflytek, ocnli, cmnli, cluewsc2020, csl。具体运行命令为:
140
- ` ` ` shell
141
- python run.py \
142
- --model_type='ppminilm' \
143
- --model_dir='./afqmc/' \
144
- --model_filename='inference.pdmodel' \
145
- --params_filename='inference.pdiparams' \
146
- --dataset='clue' \
147
- --save_dir='./save_afqmc_pruned/' \
148
- --batch_size=16 \
149
- --max_seq_length=128 \
150
- --task_name='afqmc' \
151
- --config_path='./configs/afqmc.yaml'
152
- ```
180
+ ## 5. 预测部署
153
181
182
+ - [Paddle Inference Python部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/inference/python_inference.md)
183
+ - [Paddle Inference C++部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/inference/cpp_inference.md)
184
+ - [Paddle Lite部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/lite/lite.md)
154
185
186
+ ## 6. FAQ
155
187
0 commit comments