diff --git a/demo/auto_compression/nlp/README.md b/demo/auto_compression/nlp/README.md index 46a21b430cd524c231ad5344bede0b4f743f106d..69480df98ec35fcd078c7cde7f67098f56745f00 100644 --- a/demo/auto_compression/nlp/README.md +++ b/demo/auto_compression/nlp/README.md @@ -1,31 +1,49 @@ # 自然语言处理模型自动压缩示例 -本示例将介绍如何使用PaddleNLP中Inference部署模型进行自动压缩。 - -## Benchmark +目录: +- [1. 简介](#1简介) +- [2. Benchmark](#2Benchmark) +- [3. 自动压缩流程](#自动压缩流程) + - [3.1 准备环境](#31-准备准备) + - [3.2 准备数据集](#32-准备数据集) + - [3.3 准备预测模型](#33-准备预测模型) + - [3.4 自动压缩并产出模型](#34-自动压缩并产出模型) +- [4. 压缩配置介绍](#4压缩配置介绍) +- [5. 预测部署](#5预测部署) +- [6. FAQ](6FAQ) + + +## 1. 简介 +本示例将以自然语言处理模型PP-MiniLM为例,介绍如何使用PaddleNLP中Inference部署模型进行自动压缩。本示例使用的自动压缩策略为剪枝蒸馏和离线量化(Post-training quantization)。 + +## 2. Benchmark - PP-MiniLM模型 -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)。 -此自动压缩实验首先会对模型的attention head裁剪25%,同时进行蒸馏训练,然后进行离线量化(Post-training quantization)。 +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)。 +模型精度对比如下: | 模型 | 策略 | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | AVG | |:------:|:------:|:------:|:------:|:------:|:------:|:-----------:|:------:|:------:|:------:| | PP-MiniLM | Base模型| 74.03 | 56.66 | 60.21 | 80.98 | 76.20 | 84.21 | 77.36 | 72.81 | | PP-MiniLM |剪枝蒸馏+离线量化| 73.56 | 56.38 | 59.87 | 80.80 | 76.44 | 82.23 | 77.77 | 72.44 | +模型在不同任务上平均精度以及加速对比如下: +| PP-MiniLM | Accuracy(avg) | 时延(ms) | 加速比 | +|:-------:|:----------:|:------------:| :------:| +| 压缩前 | 72.81 | 128.01 | - | +| 压缩后 | 72.44 | 17.97 | 612% | + 性能测试的环境为 - 硬件:NVIDIA Tesla T4 单卡 - 软件:CUDA 11.0, cuDNN 8.0, TensorRT 8.0 - 测试配置:batch_size: 40, max_seq_len: 128 -## 环境准备 - -### 1.准备数据 -本案例默认以CLUE数据进行自动压缩实验,如数据集为非CLUE格式数据,请修改启动文本run.sh中dataset字段,PaddleNLP会自动下载对应数据集。 +## 3. 自动压缩流程 -### 2.准备需要压缩的环境 +#### 3.1 准备环境 - python >= 3.6 -- paddlepaddle >= 2.3 +- PaddlePaddle >= 2.2 (可从[Paddle官网](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html)下载安装) +- PaddleSlim >= 2.3 或者适当develop版本 - PaddleNLP >= 2.3 安装paddlepaddle: @@ -36,34 +54,59 @@ pip install paddlepaddle pip install paddlepaddle-gpu ``` +安装paddleslim: +```shell +pip install paddleslim +``` + 安装paddlenlp: ```shell pip install paddlenlp ``` -安装paddleslim: -```shell -pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple -``` - 注:安装PaddleNLP的目的是为了下载PaddleNLP中的数据集和Tokenizer。 -### 3.准备待压缩的部署模型 -如果已经准备好部署的model.pdmodel和model.pdiparams部署模型,跳过此步。 -根据[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)。 +#### 3.2 准备数据集 +本案例默认以CLUE数据进行自动压缩实验,如数据集为非CLUE格式数据,请修改启动文本run.sh中dataset字段,PaddleNLP会自动下载对应数据集。 + + +#### 3.3 准备预测模型 +预测模型的格式为:`model.pdmodel` 和 `model.pdiparams`两个,带`pdmodel`的是模型文件,带`pdiparams`后缀的是权重文件。 + +注:其他像`__model__`和`__params__`分别对应`model.pdmodel` 和 `model.pdiparams`文件。 + +本示例可参考[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模型。 + ```shell wget https://bj.bcebos.com/v1/paddle-slim-models/act/afqmc.tar tar -zxvf afqmc.tar ``` -## 开始自动压缩 +#### 3.4 自动压缩并产出模型 + +自动压缩示例通过run.py脚本启动,会使用接口```paddleslim.auto_compression.AutoCompression```对模型进行自动压缩。配置config文件中训练部分的参数,将任务名称、模型类型、数据集名称、压缩参数传入,配置完成后便可对模型进行剪枝、蒸馏训练和离线量化。 +数据集为CLUE,不同任务名称代表CLUE上不同的任务,可选择的任务名称有:afqmc, tnews, iflytek, ocnli, cmnli, cluewsc2020, csl。具体运行命令为 +: +```shell +python run.py \ + --model_type='ppminilm' \ + --model_dir='./afqmc/' \ + --model_filename='inference.pdmodel' \ + --params_filename='inference.pdiparams' \ + --dataset='clue' \ + --save_dir='./save_afqmc_pruned/' \ + --batch_size=16 \ + --max_seq_length=128 \ + --task_name='afqmc' \ + --config_path='./configs/afqmc.yaml' +``` -### 压缩配置介绍 -自动压缩需要准备config文件,并传入``config_path``字段,configs文件夹下可查看不同任务的配置文件,以下示例以afqmc数据集为例介绍。训练参数需要自行配置。蒸馏、剪枝和离线量化的相关配置,自动压缩策略可以自动获取得到,也可以自行配置。PaddleNLP模型的自动压缩实验默认使用剪枝、蒸馏和离线量化的策略。 +## 4. 压缩配置介绍 +自动压缩需要准备config文件,并传入```config_path```字段,configs文件夹下可查看不同任务的配置文件,以下示例以afqmc数据集为例介绍。训练参数需要自行配置。蒸馏、剪枝和离线量化的相关配置,自动压缩策略可以自动获取得到,也可以自行配置。PaddleNLP模型的自动压缩实验默认使用剪枝、蒸馏和离线量化的策略。 - 训练参数 -训练参数主要设置学习率、训练轮数(epochs)和优化器等。``origin_metric``是原模型精度,如设置该参数,压缩之前会先验证模型精度是否正常。 +训练参数主要设置学习率、训练轮数(epochs)和优化器等。```origin_metric```是原模型精度,如设置该参数,压缩之前会先验证模型精度是否正常。 ```yaml TrainConfig: @@ -134,22 +177,11 @@ Quantization: weight_bits: 8 ``` -### 进行剪枝蒸馏和离线量化自动压缩 - -蒸馏量化自动压缩示例通过run.py脚本启动,会使用接口``paddleslim.auto_compression.AutoCompression``对模型进行离线量化。将任务名称、模型类型、数据集名称、压缩参数传入,对模型进行剪枝、蒸馏训练和离线量化。数据集为CLUE,不同任务名称代表CLUE上不同的任务,可选择的任务名称有:afqmc, tnews, iflytek, ocnli, cmnli, cluewsc2020, csl。具体运行命令为: -```shell -python run.py \ - --model_type='ppminilm' \ - --model_dir='./afqmc/' \ - --model_filename='inference.pdmodel' \ - --params_filename='inference.pdiparams' \ - --dataset='clue' \ - --save_dir='./save_afqmc_pruned/' \ - --batch_size=16 \ - --max_seq_length=128 \ - --task_name='afqmc' \ - --config_path='./configs/afqmc.yaml' -``` +## 5. 预测部署 +- [Paddle Inference Python部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/inference/python_inference.md) +- [Paddle Inference C++部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/inference/cpp_inference.md) +- [Paddle Lite部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/lite/lite.md) +## 6. FAQ