Skip to content

Commit 50f71b3

Browse files
authored
update readme, csl and uer wsc tinybert wsc (#1487)
update update
1 parent b3b0558 commit 50f71b3

File tree

3 files changed

+38
-32
lines changed

3 files changed

+38
-32
lines changed

examples/model_compression/pp-minilm/README.md

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,35 +27,36 @@
2727
<a name="PP-MiniLM中文小模型"></a>
2828

2929
# PP-MiniLM 中文小模型
30-
[PaddleNLP](https://github.com/PaddlePaddle/PaddleNLP) 联合 [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 通过模型蒸馏、剪裁、量化等级联模型压缩技术发布中文特色小模型 PP-MiniLM(6L768H) 及压缩方案,保证模型精度的同时模型推理速度达 BERT(12L768H) 的 4.2 倍,参数量相比减少 52%,模型精度在中文语言理解评测基准 CLUE 高 0.32
30+
[PaddleNLP](https://github.com/PaddlePaddle/PaddleNLP) 联合 [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 通过模型蒸馏、剪裁、量化等级联模型压缩技术发布中文特色小模型 PP-MiniLM(6L768H) 及压缩方案,保证模型精度的同时模型推理速度达 BERT(12L768H) 的 4.2 倍,参数量相比减少 52%,模型精度在中文语言理解评测基准 CLUE 高 0.62
3131

3232
PP-MiniLM 压缩方案以面向预训练模型的任务无关知识蒸馏(Task-agnostic Distillation)技术、裁剪(Pruning)技术、量化(Quantization)技术为核心,使得 PP-MiniLM **又快****又准****又小**
3333

3434
1. **推理速度快**: 依托 PaddleSlim 的裁剪、量化技术对 PP-MiniLM 小模型进行压缩、加速, 使得 PP-MiniLM 量化后模型 GPU 推理速度相比 BERT base 加速比高达 4.2;
3535

36-
2. **精度高**: 我们以 [MiniLMv2](https://arxiv.org/abs/2012.15828) 提出的 Multi-Head Self-Attention Relation Distillation 技术为基础,通过引入样本间关系知识蒸馏做了进一步算法优化,6 层 PP-MiniLM 模型在 CLUE 数据集上比 12 层 `bert-base-chinese` 高 0.32%,比同等规模的 TinyBERT、UER-py RoBERTa 分别高 2.09%、1.91%;
36+
2. **精度高**: 我们以 [MiniLMv2](https://arxiv.org/abs/2012.15828) 提出的 Multi-Head Self-Attention Relation Distillation 技术为基础,通过引入样本间关系知识蒸馏做了进一步算法优化,6 层 PP-MiniLM 模型在 CLUE 数据集上比 12 层 `bert-base-chinese` 高 0.62%,比同等规模的 TinyBERT、UER-py RoBERTa 分别高 2.57%、2.24%;
3737

3838
3. **参数规模小**:依托 Task-agnostic Distillation 技术和 PaddleSlim 裁剪技术,模型参数量相比 BERT 减少 52%。
3939

4040
**整体效果**
4141

42-
| Model | #Params | #FLOPs | Speedup | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | WSC | CSL | CLUE 平均值 |
43-
| ----------------------- | ------- | ------ | ------- | ----- | ----- | ------- | ----- | ----- | ----- | ----- | ---------- |
44-
| Bert<sub>base</sub> | 102.3M | 10.87B | 1.00x | 74.14 | 56.81 | 61.10 | 81.19 | 74.85 | 79.93 | 81.47 | 72.78 |
45-
| TinyBERT<sub>6</sub> | 59.7M | 5.44B | 1.66x | 72.59 | 55.70 | 57.64 | 79.57 | 73.97 | 77.63 | 80.00 | 71.01 |
46-
| UER-py RoBERTa L6- H768 | 59.7M | 5.44B | 1.66x | 69.74 | 66.36 | 59.95 | 77.00 | 71.39 | 71.05 | 82.83 | 71.19 |
47-
| RBT6, Chinese | 59.7M | 5.44B | 1.66x | 73.93 | 56.63 | 59.79 | 79.28 | 73.12 | 77.30 | 80.80 | 71.55 |
48-
| ERNIE-Tiny | 90.7M | 4.83B | 1.89x | 70.67 | 55.60 | 59.91 | 75.74 | 71.36 | 67.11 | 76.70 | 68.16 |
49-
| PP-MiniLM 6L-768H | 59.7M | 5.44B | 1.66x | 74.14 | 57.43 | 61.75 | 81.01 | 76.17 | 86.18 | 77.47 | 73.45 |
50-
| PP-MiniLM裁剪后 | 49.1M | 4.08B | 2.00x | 73.91 | 57.44 | 61.64 | 81.10 | 75.59 | 85.86 | 77.97 | 73.36 |
51-
| PP-MiniLM量化后 | 49.2M | 4.08B | 4.15x | 74.00 | 57.37 | 61.33 | 81.09 | 75.56 | 85.85 | 76.53 | 73.10 |
42+
| Model | #Params | #FLOPs | Speedup | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | CLUE 平均值 |
43+
| ----------------------- | ------- | ------ | ------- | ----- | ----- | ------- | ----- | ----- | ----------- | ----- | ----------- |
44+
| BERT<sub>base</sub> | 102.3M | 10.87B | 1.00x | 74.14 | 56.81 | 61.10 | 81.19 | 74.85 | 79.93 | 81.47 | 72.78 |
45+
| TinyBERT<sub>6</sub> | 59.7M | 5.44B | 1.66x | 72.59 | 55.70 | 57.64 | 79.57 | 73.97 | 76.32 | 80.00 | 70.83 |
46+
| UER-py RoBERTa L6- H768 | 59.7M | 5.44B | 1.66x | 69.62 | 66.45 | 59.91 | 76.89 | 71.36 | 71.05 | 82.87 | 71.16 |
47+
| RBT6, Chinese | 59.7M | 5.44B | 1.66x | 73.93 | 56.63 | 59.79 | 79.28 | 73.12 | 77.30 | 80.80 | 71.55 |
48+
| ERNIE-Tiny | 90.7M | 4.83B | 1.89x | 70.67 | 55.60 | 59.91 | 75.74 | 71.36 | 67.11 | 76.70 | 68.16 |
49+
| PP-MiniLM 6L-768H | 59.7M | 5.44B | 1.66x | 74.14 | 57.43 | 61.75 | 81.01 | 76.17 | 86.18 | 79.17 | 73.69 |
50+
| PP-MiniLM 裁剪后 | 49.1M | 4.08B | 2.00x | 73.91 | 57.44 | 61.64 | 81.10 | 75.59 | 85.86 | 78.53 | 73.44 |
51+
| PP-MiniLM 量化后 | 49.2M | - | 4.15x | 74.00 | 57.37 | 61.33 | 81.09 | 75.56 | 85.85 | 78.57 | 73.40 |
5252

5353

54-
**NOTE:** 说明:
54+
**NOTE:**
5555

5656
1.上表所有模型的精度测试均是基于下方超参数范围进行的 Grid Search 超参寻优。在每个配置下训练时,每隔 100 个 steps 在验证集上评估一次,取验证集上最佳准确率作为当前超参数配置下的准确率;
5757
- batch sizes: 16, 32, 64;
5858
- learning rates: 3e-5, 5e-5, 1e-4
59+
5960
2.量化后比量化前模型参数量多了 0.1M 是因为保存了 scale 值。
6061

6162
**方案流程**
@@ -123,9 +124,9 @@ PP-MiniLM 是一个 6 层的预训练模型,使用 `from_pretrained`导入 PP-
123124

124125
## 在下游任务上使用 PP-MiniLM
125126

126-
PP-MiniLM 预训练小模型在 CLUE 中的 7 个分类数据集的平均精度上比 12 层 `bert-base-chinese` 高 0.32%,比同等规模的 TinyBERT、UER-py RoBERTa 分别高 2.09%、1.91%,因此我们推荐将 PP-MiniLM 运用在中文下游任务上。当然,如果想对已有模型进一步压缩,也可以参考这里的压缩方案,因为压缩方案是通用的。
127+
PP-MiniLM 预训练小模型在 CLUE 中的 7 个分类数据集的平均精度上比 12 层 `bert-base-chinese` 高 0.62%,比同等规模的 TinyBERT、UER-py RoBERTa 分别高 2.57%、2.24%,因此我们推荐将 PP-MiniLM 运用在中文下游任务上。当然,如果想对已有模型进一步压缩,也可以参考这里的压缩方案,因为压缩方案是通用的。
127128

128-
本案例中会以 CLUE 中 7 个分类数据集为例介绍如何在下游任务上使用 PP-MiniLM。首先用 CLUE 中的数据集对预训练小模型 PP-MiniLM 进行微调,然后提供了一套压缩方案,即借助 [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 进行裁剪和量化,进一步对模型规模进行压缩,最终使用基于 TensorRT 的 [Paddle Inference](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/05_inference_deployment/inference/inference_cn.html) 预测库对量化后的模型进行预测部署。裁剪、量化前,6 层 PP-MiniLM 的推理速度达`bert-base-chinese`的 1.7 倍,在下游任务上压缩完成后,模型推理速度高达`bert-base-chinese`的 4.2 倍。
129+
本案例中会以 CLUE 中 7 个分类数据集为例介绍如何在下游任务上使用 PP-MiniLM。首先用 CLUE 中的数据集对预训练小模型 PP-MiniLM 进行微调,然后提供了一套压缩方案,即借助 [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 进行裁剪和量化,进一步对模型规模进行压缩,最终使用基于 TensorRT 的 [Paddle Inference](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/05_inference_deployment/inference/inference_cn.html) 预测库对量化后的模型进行预测部署。裁剪、量化前,6 层 PP-MiniLM 的推理速度达 `bert-base-chinese` 的 1.7 倍,在下游任务上压缩完成后,模型推理速度高达`bert-base-chinese`的 4.2 倍。
129130

130131
<a name="数据介绍"></a>
131132

@@ -202,7 +203,7 @@ cd ..
202203

203204
这一步主要使用 PaddleSlim 对下游任务上的模型宽度进行裁剪,进一步压缩模型的大小。
204205

205-
该过程会以上一步的模型(即 fine-tuning 后得到的最好模型)当作教师模型,蒸馏宽度为 3/4 的学生模型。经过我们的实验,在 6L768H 条件下,模型宽度压缩为原来的 3/4,精度几乎无损(-0.09)
206+
该过程会以上一步的模型(即 fine-tuning 后得到的最好模型)当作教师模型,蒸馏宽度为 3/4 的学生模型。经过我们的实验,在 6L768H 条件下,模型宽度压缩为原来的 3/4,平均精度下降 0.25
206207

207208
<a name="原理简介"></a>
208209

@@ -220,19 +221,19 @@ cd ..
220221
cd pruning
221222
export FT_MODELS=../finetuning/ppminilm-6l-768h/models/CLUEWSC2020/1e-4_32
222223

223-
sh prune.sh CLUEWSC2020 5e-5 16 50 128 4 ${FT_MODELS} 0.75
224+
sh prune.sh CLUEWSC2020 5e-5 16 50 128 0 ${FT_MODELS} 0.75
224225
```
225-
其中每个参数依次表示:CLUE 中的任务名称、学习率、batch size、epoch 数、最大序列长度、gpu id、学生模型的地址、裁剪后宽度比例列表。执行完成后,模型保存的路径位于 `pruned_models/CLUEWSC2020/0.75/best_model/`
226+
其中每个参数依次表示:CLUE 中的任务名称、学习率、batch size、epoch 数、最大序列长度、gpu id、学生模型的地址、裁剪后宽度比例列表。执行完成后,模型保存的路径位于 `pruned_models/CLUEWSC2020/0.75/`
226227

227228
<a name="裁剪后模型精度"></a>
228229

229230
#### 裁剪后模型精度
230231

231-
经过裁剪后,CLUE 上各个任务上的精度如下表所示。相比起裁剪前,CLUE 数据集上平均值下降 0.09。模型的参数量由 59.7M 下降到 49.1M。
232+
经过裁剪后,CLUE 上各个任务上的精度如下表所示。相比起裁剪前,CLUE 数据集上平均值下降 0.25。模型的参数量由 59.7M 下降到 49.1M。
232233

233-
| AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | WSC | CSL | CLUE 平均值 |
234-
| ----- | ----- | ------- | ----- | ----- | ----- | ----- | ----------- |
235-
| 73.91 | 57.44 | 61.64 | 81.10 | 75.59 | 85.86 | 77.97 | 73.36 |
234+
| Model | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | CLUE 平均值 |
235+
| ---------------- | ----- | ----- | ------- | ----- | ----- | ----------- | ----- | ----------- |
236+
| PP-MiniLM 裁剪后 | 73.91 | 57.44 | 61.64 | 81.10 | 75.59 | 85.86 | 78.53 | 73.44 |
236237

237238

238239
<a name="导出裁剪后的模型"></a>
@@ -258,7 +259,9 @@ sh export_all.sh
258259
cd ..
259260
```
260261

261-
导出后的模型位于 `${MODEL_PATH}/${TASK_NAME}/0.75/sub_static/float`
262+
导出的静态图模型、参数等文件位于 `${MODEL_PATH}/${TASK_NAME}/0.75/sub_static/` 目录下,有 `float.pdmodel``float.pdiparams``float.pdiparams.info` 三个文件。
263+
264+
导出的动态图参数等文件位于 `${MODEL_PATH}/${TASK_NAME}/0.75/sub/model_width_0.75000/` 目录下,有 `model_state.pdparams``model_config.json` 两个文件。需要注意的是,此动态图模型不能通过原始 Transformer API 将参数正确载入,因为裁剪后模型不再符合 Transformer 的组网,例如 q、k、v 的 weight 的 shape 是 `[hidden_size, hidden_size * width_mul]` ,不再是 `[hidden_size, hidden_size]`
262265

263266
<a name="量化"></a>
264267

@@ -274,7 +277,7 @@ cd quantization
274277

275278
这里的量化采用的是静态离线量化方法,即不需要训练,只使用少量校准数据计算量化因子,就可快速得到量化模型。这一步需要有训练好的预测(静态图)模型。因此,需要对前序步骤产出的模型进行导出(参考上方导出模型的运行方式)。
276279

277-
量化我们可以借助 PaddleSlim 提供的离线量化 API `paddleslim.quant.quant_post_static` 实现,我们这一步使用了 `mse``avg``abs_max``hist` 四种策略,并使用 4、8 两种校准集数量,对 `matmul/matmul_v2` 算子进行`channel_wise_abs_max` 类型的量化。
280+
量化我们可以借助 PaddleSlim 提供的离线量化 API `paddleslim.quant.quant_post_static` 实现,我们这一步使用了 `mse``avg``abs_max``hist` 四种策略,并使用 4、8 两种校准集数量,对 `matmul``matmul_v2` 算子进行`channel_wise_abs_max` 类型的量化。
278281

279282
<a name="运行方式"></a>
280283

@@ -298,11 +301,12 @@ cd ..
298301

299302
#### 量化后模型精度
300303

301-
经过量化后,CLUE 上各个任务上的精度如下表,比上一步(裁剪后)平均精度下降了 0.26:
304+
经过量化后,CLUE 上各个任务上的精度如下表,比上一步(裁剪后)精度几乎无损(-0.04):
305+
306+
| Model | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | CLUE 平均值 |
307+
| ---------------- | ----- | ----- | ------- | ----- | ----- | ----------- | ----- | ----------- |
308+
| PP-MiniLM 量化后 | 74.00 | 57.37 | 61.33 | 81.09 | 75.56 | 85.85 | 78.57 | 73.40 |
302309

303-
| AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | WSC | CSL | CLUE 平均值 |
304-
| ----- | ----- | ------- | ----- | ----- | ----- | ----- | ----------- |
305-
| 74.00 | 57.37 | 61.33 | 81.09 | 75.56 | 85.85 | 76.53 | 73.10 |
306310

307311
最后,值得注意的是,PP-MiniLM 是基于 `roberta-wwm-ext-large` 做教师模型蒸馏得到的学生模型,如果你有更好的 24 层中文预训练模型,可以基于[任务无关蒸馏文档](general_distill/README.md)中介绍的蒸馏过程,训练出一个比 PP-MiniLM 精度更高,在下游任务上表现更好的 6 层小模型。
308312

@@ -318,7 +322,7 @@ cd ..
318322

319323
这一步依赖安装有预测库的 PaddlePaddle 2.2.1。可以在 [PaddlePaddle 官网](https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#python) 根据机器环境选择合适的 Python 预测库进行安装。
320324

321-
想要得到更明显的加速效果,推荐在 NVIDA Tensor Core GPU(如 T4、A10、A100)上进行测试,本案例基于 T4 测试。若在V系列GPU卡上测试,由于其不支持 Int8 Tensor Core,加速效果将达不到本文档表格中的效果。
325+
想要得到更明显的加速效果,推荐在 NVIDA Tensor Core GPU(如 T4、A10、A100)上进行测试,本案例基于 T4 测试。若在 V 系列 GPU 卡上测试,由于其不支持 Int8 Tensor Core,加速效果将达不到本文档表格中的效果。
322326

323327
本案例是在 NVIDIA Tesla T4 单卡上,使用 cuda 11.1、cudnn 8.1、TensorRT 7.2 进行预测。
324328

@@ -356,7 +360,7 @@ python infer.py --task_name ${task} --model_path $MODEL_PATH --use_trt
356360

357361
#### 性能测试
358362

359-
测试性能环境同上。本案例测试采用的是 CLUE TNEWS 数据集下量化方法为 `mse`、校准集数量为 4 得到的量化模型,在 TNEWS 的验证集上统计 5 次端到端预测的总耗时(前 20 个 steps 作为 warmup steps 跳过)并求平均。下表后三行分别是微调后的模型、裁剪后的模型、量化后模型的总耗时情况,加速倍数列是较 `bert-base-chinese` 的推理加速倍数
363+
测试性能环境同上。本案例测试采用的是 CLUE TNEWS 数据集下量化方法为 `mse`、校准集数量为 4 得到的量化模型,在 TNEWS 的验证集上统计 5 次端到端预测的总耗时(前 20 个 steps 作为 warmup steps 跳过)并求平均。其中 `batch_size` 为 32,`max_seq_len` 为 128
360364

361365
启动性能测试需要对 `infer.py` 脚本传入参数 `--perf`,运行性能测试脚本可以得到 PP-MiniLM、PP-MiniLM 裁剪后、PP-MiniLM 量化后模型预测的耗时:
362366

@@ -366,9 +370,10 @@ sh infer_perf.sh
366370
cd ..
367371
```
368372

373+
下表后三行分别是微调后的模型、裁剪后的模型、量化后模型的总耗时情况。
369374
取 5 个非 `--collect_shape` 阶段打印出的时长取平均,可以发现借助 PaddleSlim 裁剪、量化后的模型是原 BERT<sub>base</sub>模型推理速度的 4.2 倍,其中裁剪后的模型是 BERT<sub>base</sub>推理速度的 2.0 倍。
370375

371-
| | 平均耗时(s) | 加速比 |
376+
| | 平均耗时 (s) | 加速比 |
372377
| ------------------- | ----------- | ------ |
373378
| BERT<sub>base</sub> | 21.04 | - |
374379
| PP-MiniLM | 12.64 | 1.66x |

examples/model_compression/pp-minilm/pruning/prune.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ def do_train(args):
427427
tokenizer.save_pretrained(output_dir)
428428
best_res = res
429429
if global_step >= num_training_steps:
430+
print("best_res: ", best_res)
430431
return
431432
print("best_res: ", best_res)
432433

examples/model_compression/pp-minilm/pruning/prune.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ python -u ./prune.py --model_type ernie \
2929
--num_train_epochs ${PRE_EPOCHS} \
3030
--logging_steps 100 \
3131
--save_steps 100 \
32-
--output_dir ./pruned_models/$TASK_NAME/0.75/best_model/ \
32+
--output_dir ./pruned_models/$TASK_NAME/0.75/ \
3333
--device gpu \
3434
--width_mult_list ${WIDTH_LIST}
3535

0 commit comments

Comments
 (0)