Skip to content

Commit c9c5c15

Browse files
gongenleiwj-Mcat
andauthored
Add pegasus (#3275)
* add pegasus * rm debug info * fix decode * update pegasus * add faster pegasus * refactor unimotext summary * add pegasus summary app * add requirements * add pegasus to taskflow * support inference and deploy * add FG perf and sample * update taskflow * add docs * rm ProcessInfo.json * update export model * update serving doc and shell * update unimo-text doc * docs: FasterTransformer-->FasterGeneration * update docs Co-authored-by: 骑马小猫 <[email protected]>
1 parent d57e350 commit c9c5c15

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+4639
-108
lines changed

applications/text_summarization/export_model.sh

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
# 生成式文本摘要应用
2+
3+
**目录**
4+
- [生成式文本摘要应用](#生成式文本摘要应用)
5+
- [简介](#简介)
6+
- [效果展示](#效果展示)
7+
- [开箱即用](#开箱即用)
8+
- [支持单条、批量预测](#支持单条批量预测)
9+
- [可配置参数说明](#可配置参数说明)
10+
- [训练定制](#训练定制)
11+
- [文本摘要应用定制训练全流程介绍](#文本摘要应用定制训练全流程介绍)
12+
- [环境依赖](#环境依赖)
13+
- [代码结构说明](#代码结构说明)
14+
- [数据准备](#数据准备)
15+
- [数据加载](#数据加载)
16+
- [从本地文件创建数据集](#从本地文件创建数据集)
17+
- [模型训练](#模型训练)
18+
- [模型预测](#模型预测)
19+
- [模型推理部署](#模型推理部署)
20+
- [FasterGeneration加速及模型静态图导出](#fastergeneration加速及模型静态图导出)
21+
- [模型部署](#模型部署)
22+
- [References](#references)
23+
24+
25+
## 简介
26+
文本摘要的目标是自动地将输入文本转换成简短摘要,为用户提供简明扼要的内容描述,是缓解文本信息过载的一个重要手段。
27+
文本摘要也是自然语言生成领域中的一个重要任务,有很多应用场景,如新闻摘要、论文摘要、财报摘要、传记摘要、专利摘要、对话摘要、评论摘要、观点摘要、电影摘要、文章标题生成、商品名生成、自动报告生成、搜索结果预览等。
28+
29+
本项目是基于预训练语言模型PEGASUS的中文文本摘要产业实践,具有以下优势:
30+
- 效果领先。在LCSTS上效果达到SOTA。
31+
- 开箱即用。本项目提供TaskFlow接口,无需训练,仅需几行代码便可预测。
32+
- 高性能推理。本项目基于[FasterGeneration](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/faster_generation)进行推理加速,能够提供更高性能的推理体验。
33+
- 训练推理全流程打通。本项目提供了全面的定制训练流程,从数据准备、模型训练预测,到模型推理部署,一应俱全。
34+
35+
## 效果展示
36+
37+
## 开箱即用
38+
PaddleNLP提供开箱即用的产业级NLP预置任务能力,无需训练,一键预测。
39+
### 支持单条、批量预测
40+
41+
```python
42+
>>> from paddlenlp import Taskflow
43+
>>> summarizer = Taskflow("text_summarization")
44+
# 单条输入
45+
>>> summarizer('2022年,中国房地产进入转型阵痛期,传统“高杠杆、快周转”的模式难以为继,万科甚至直接喊话,中国房地产进入“黑铁时代”')
46+
# 输出:['万科喊话中国房地产进入“黑铁时代”']
47+
48+
# 多条输入
49+
>>> summarizer([
50+
'据悉,2022年教育部将围绕“巩固提高、深化落实、创新突破”三个关键词展开工作。要进一步强化学校教育主阵地作用,继续把落实“双减”作为学校工作的重中之重,重点从提高作业设计水平、提高课后服务水平、提高课堂教学水平、提高均衡发展水平四个方面持续巩固提高学校“双减”工作水平。',
51+
'党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。'
52+
])
53+
#输出:['教育部:将从四个方面持续巩固提高学校“双减”工作水平', '党参能降低三高的危害']
54+
```
55+
56+
### 可配置参数说明
57+
* `model`:可选模型,默认为`IDEA-CCNL/Randeng-Pegasus-523M-Summary-Chinese`
58+
* `batch_size`:批处理大小,请结合机器情况进行调整,默认为1。
59+
60+
61+
## 训练定制
62+
### 文本摘要应用定制训练全流程介绍
63+
接下来,我们将按数据准备、训练、预测、推理部署对文本摘要应用的全流程进行介绍。
64+
1. **数据准备**
65+
- 如果没有已标注的数据集,我们推荐[doccano](https://github.com/doccano/doccano)数据标注工具。
66+
如果已有标注好的本地数据集,我们需要根据将数据集整理为文档要求的格式,请参考[从本地文件创建数据集](#从本地文件创建数据集)
67+
68+
2. **模型训练**
69+
70+
- 数据准备完成后,可以开始使用我们的数据集对预训练模型进行微调训练。我们可以根据任务需求,调整可配置参数,选择使用GPU或CPU进行模型训练,脚本默认保存在开发集最佳表现模型。中文任务默认使用"IDEA-CCNL/Randeng-Pegasus-238M-Summary-Chinese"模型,还支持large模型: "IDEA-CCNL/Randeng-Pegasus-523M-Summary-Chinese"。
71+
72+
73+
3. **模型预测**
74+
75+
- 训练结束后,我们可以加载保存的最佳模型进行模型测试,打印模型预测结果。
76+
77+
4. **模型推理部署**
78+
79+
- 模型部署需要将保存的最佳模型参数(动态图)导出成静态图参数,用于后续的推理部署。
80+
81+
- 文本摘要应用提供了基于Paddle Inference的本地部署predictor,并且支持在GPU设备使用FasterGeneration进行加速。
82+
83+
- 文本摘要应用提供了基于Paddle Serving的服务端部署方案。
84+
85+
### 环境依赖
86+
87+
### 代码结构说明
88+
89+
以下是本项目主要代码结构及说明:
90+
91+
```text
92+
text_summarization/
93+
├── deploy # 部署
94+
│ ├── paddle_inference # PaddleInference高性能推理部署
95+
│ │ ├── inference_pegasus.py # 推理部署脚本
96+
│ │ └── README.md # 说明文档
97+
│ └── paddle_serving
98+
│ ├── config.yml # 配置文件
99+
│ ├── pipeline_client.py # 客户端程序
100+
│ ├── pipeline_service.py # 服务器程序
101+
│ ├── export_serving.sh # serving模型导出脚本
102+
│ └── README.md # 说明文档
103+
├── export_model.py # 动态图参数导出静态图参数脚本
104+
├── export_model.sh # 动态图参数导出静态图参数shell脚本
105+
├── run_summarization.py # 训练评估脚本
106+
├── run_train.sh # 训练评估shell脚本
107+
├── run_generate.py # 预测脚本
108+
├── run_generate.sh # 预测shell脚本
109+
├── utils.py # 工具函数脚本
110+
├── requirements.txt # 依赖包
111+
└── README.md # 说明文档
112+
```
113+
114+
### 数据准备
115+
116+
#### 数据加载
117+
#### 从本地文件创建数据集
118+
119+
在许多情况,我们需要使用本地数据集来训练我们的文本摘要模型,本项目支持使用固定格式本地数据集文件进行训练。
120+
121+
本地数据集目录结构如下:
122+
123+
```text
124+
data/
125+
├── train.json # 训练数据集文件
126+
└── test.json # 可选,待预测数据文件
127+
```
128+
本地数据集文件格式如下:
129+
- train.json/test.json 文件每行格式:
130+
```text
131+
{
132+
"title": "任志强抨击政府把土地作为投机品地产业被人为破坏",
133+
"content": "“北京的保障房市场就像一个巨大的赌场,每个人都在期待中奖。”面对中国目前现行的保障性住房政策,华远地产董事长任志强再次语出惊人。(分享自@第一财经-中国房地产金融)"
134+
}
135+
```
136+
137+
更多数据集读取格式详见[数据集加载](https://paddlenlp.readthedocs.io/zh/latest/data_prepare/dataset_load.html#)[自定义数据集](https://paddlenlp.readthedocs.io/zh/latest/data_prepare/dataset_self_defined.html)
138+
139+
140+
### 模型训练
141+
运行如下命令即可在样例训练集上进行finetune,并在样例验证集上进行验证。
142+
143+
```shell
144+
# GPU启动,参数`--gpus`指定训练所用的GPU卡号,可以是单卡,也可以多卡
145+
unset CUDA_VISIBLE_DEVICES
146+
147+
python -m paddle.distributed.launch --gpus "2,3,4,5,6,7" run_summarization.py \
148+
--model_name_or_path=IDEA-CCNL/Randeng-Pegasus-238M-Summary-Chinese \
149+
--train_file train.json \
150+
--eval_file test.json \
151+
--output_dir pegesus_out \
152+
--max_source_length 128 \
153+
--max_target_length 64 \
154+
--num_train_epochs 20 \
155+
--logging_steps 1 \
156+
--save_steps 10000 \
157+
--train_batch_size 128 \
158+
--eval_batch_size 128 \
159+
--learning_rate 5e-5 \
160+
--warmup_proportion 0.02 \
161+
--weight_decay=0.01 \
162+
--device=gpu \
163+
```
164+
也可以直接使用`run_train.sh`.
165+
166+
关键参数释义如下:
167+
- `gpus` 指示了训练所用的GPU卡号。
168+
- `train_file` 本地训练数据地址。
169+
- `eval_file` 本地测试数据地址。
170+
- `model_name_or_path` 指示了finetune使用的具体预训练模型,可以是PaddleNLP提供的预训练模型,或者是本地的预训练模型。如果使用本地的预训练模型,可以配置本地模型的目录地址,例如: ./checkpoints/model_xx/,目录中需包含paddle预训练模型model_state.pdparams。如果使用PaddleNLP提供的预训练模型,可以选择下面其中之一。
171+
172+
| PaddleNLP提供的预训练模型 |
173+
|---------------------------------|
174+
| IDEA-CCNL/Randeng-Pegasus-238M-Summary-Chinese |
175+
| IDEA-CCNL/Randeng-Pegasus-523M-Summary-Chinese |
176+
177+
- `output_dir` 表示模型的保存路径。
178+
- `logging_steps` 表示日志打印间隔。
179+
- `save_steps` 表示模型保存及评估间隔。
180+
- `seed` 表示随机数生成器的种子。
181+
- `num_train_epochs` 表示训练轮数。
182+
- `train_batch_size` 表示每次巡礼哪**每张卡**上的样本数目。
183+
- `eval_batch_size` 表示每次验证**每张卡**上的样本数目。
184+
- `learning_rate` 表示基础学习率大小,将于learning rate scheduler产生的值相乘作为当前学习率。
185+
- `weight_decay` 表示AdamW优化器中使用的weight_decay的系数。
186+
- `warmup_propotion` 表示学习率逐渐升高到基础学习率(即上面配置的learning_rate)所需要的迭代数占总步数的比例,最早的使用可以参考[这篇论文](https://arxiv.org/pdf/1706.02677.pdf)
187+
- `max_source_length` 模型输入序列的最大长度。
188+
- `max_target_length` 模型训练时标签的最大长度。
189+
- `device` 表示使用的设备,从gpu和cpu中选择。
190+
191+
更多参数详情和参数的默认值请参考`run_summarization.py`
192+
193+
程序运行时将会自动进行训练和验证,训练过程中会自动保存模型在指定的`output_dir`中。
194+
如:
195+
```text
196+
./pegeaus_model/
197+
├── pegeaus_model_10000
198+
│ ├── model_config.json
199+
│ ├── model_state.pdparams
200+
│ ├── special_tokens_map.json
201+
│ ├── tokenizer_config.json
202+
│ └── vocab.txt
203+
└── ...
204+
```
205+
206+
**NOTE:** 如需恢复模型训练,`model_name_or_path`配置本地模型的目录地址即可。
207+
208+
209+
### 模型预测
210+
211+
运行下方脚本可以使用训练好的模型进行预测。
212+
213+
```shell
214+
unset CUDA_VISIBLE_DEVICES
215+
216+
python run_generate.py \
217+
--model_name_or_path=pegesus_out/pegeaus_model_10000 \
218+
--prefict_file valid.json \
219+
--max_source_length 128 \
220+
--max_target_length 64 \
221+
--batch_size 128 \
222+
--output_path generate.txt \
223+
--device=gpu \
224+
```
225+
226+
程序运行结束后会将预测结果保存在`output_path`中。
227+
228+
229+
Finetuned baseline的模型在[LCSTS](https://aclanthology.org/D15-1229/)测试集上有如下结果:
230+
| model_name | Rouge-1 | Rouge-2 | Rouge-L | BLEU-4 |
231+
| :-----------------------------: | :---: | :-----------: | :-------------------: |:-------------------: |
232+
| finetuned IDEA-CCNL/Randeng-Pegasus-238M-Summary-Chinese | 43.30 | 30.08 | 40.12 | 24.50 |
233+
| finetuned IDEA-CCNL/Randeng-Pegasus-523M-Summary-Chinese | 48.13 | 36.41 | 45.39 | 31.99 |
234+
235+
236+
### 模型推理部署
237+
238+
#### FasterGeneration加速及模型静态图导出
239+
240+
使用动态图训练结束之后,可以通过[静态图导出脚本](export_model.py)实现基于FasterGeneration的高性能预测加速,并将动态图参数导出成静态图参数,静态图参数保存在`output_path`指定路径中。运行方式:
241+
242+
```shell
243+
python export_model.py \
244+
--model_name_or_path IDEA-CCNL/Randeng-Pegasus-238M-Summary-Chinese \
245+
--decoding_strategy beam_search \
246+
--inference_model_dir ./inference_model \
247+
--max_out_len 30 \
248+
```
249+
关键参数释义如下:
250+
251+
* `model_name_or_path`:动态图训练保存的参数路径;默认为"IDEA-CCNL/Randeng-Pegasus-238M-Summary-Chinese"。
252+
* `inference_model_dir`:静态图图保存的参数路径;默认为"./inference_model"。
253+
* `max_out_len`:最大输出长度。
254+
255+
执行命令后将会自动导出模型到指定的 `inference_model` 中,保存模型文件结构如下所示:
256+
257+
```text
258+
inference_model/
259+
├── pegasus.pdiparams
260+
├── pegasus.pdiparams.info
261+
└── pegasus.pdmodel
262+
```
263+
264+
#### 模型部署
265+
文本摘要应用已打通多种场景部署方案,点击链接获取具体的使用教程。
266+
- [Paddle Inference 推理 (Python)](./deploy/paddle_inference/README.md)
267+
- [Paddle Serving 服务化部署(Python)](./deploy/paddle_serving/README.md)
268+
269+
## References
270+
- Zhang J, Zhao Y, Saleh M, et al. Pegasus: Pre-training with extracted gap-sentences for abstractive summarization[C]//International Conference on Machine Learning. PMLR, 2020: 11328-11339.
271+
- Wang J, Zhang Y, Zhang L, et al. Fengshenbang 1.0: Being the Foundation of Chinese Cognitive Intelligence[J]. arXiv preprint arXiv:2209.02970, 2022.

applications/text_summarization/deploy/paddle_inference/README.md renamed to applications/text_summarization/pegasus/deploy/paddle_inference/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ Paddle Inference Python端预测部署主要包含两个步骤:
1717

1818

1919
## 导出预测部署模型
20-
部署时需要使用预测格式的模型(即动态图转静态图操作)。预测格式模型相对训练格式模型而言,在拓扑上裁剪掉了预测不需要的算子,并且会做特定部署优化。具体操作详见[FasterTransformer加速及模型静态图导出](../../README.md)
20+
部署时需要使用预测格式的模型(即动态图转静态图操作)。预测格式模型相对训练格式模型而言,在拓扑上裁剪掉了预测不需要的算子,并且会做特定部署优化。具体操作详见[FasterGeneration加速及模型静态图导出](../../README.md)
2121

2222
## 基于Python预测
2323
<!-- 同上,高性能预测的默认输入和输出形式也为文件,可分别通过 test_path 和 save_path 进行指定,通过如下命令便可以基于Paddle Inference 进行高性能预测: -->
2424

2525
在终端输入以下命令可在GPU上进行预测:
2626
```shell
27-
python deploy/paddle_inference/inference_unimo_text.py --inference_model_dir ./inference_model
27+
python inference_pegasus.py --inference_model_dir ../../inference_model
2828
```
2929

3030
关键参数释义如下:
31-
* `inference_model_dir`:用于高性能推理的静态图模型参数路径;默认为"./inference_model"。
31+
* `inference_model_dir`:用于高性能推理的静态图模型参数路径;默认为"../../inference_model"。

0 commit comments

Comments
 (0)