Skip to content

Commit aafd5a9

Browse files
gongenleiwestfish
andauthored
Add text summary application (#2971)
* add train script * add text summarization taskflow * add faster_generation and device choice * add doc and doploy for text_summarization * add BLEU4 * update readme * update train.py * fix bug in summarization taskflow * update taskflow and doc * fix inference and serving * fix serving * update default model * update taskflow doc * update doc * update doc * update taskflow example Co-authored-by: westfish <[email protected]>
1 parent 319c56e commit aafd5a9

File tree

18 files changed

+2030
-22
lines changed

18 files changed

+2030
-22
lines changed
Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
# 生成式文本摘要应用
2+
3+
**目录**
4+
- [生成式文本摘要应用](#生成式文本摘要应用)
5+
- [简介](#简介)
6+
- [基于预训练语言模型的文本摘要](#基于预训练语言模型的文本摘要)
7+
- [效果展示](#效果展示)
8+
- [开箱即用](#开箱即用)
9+
- [支持单条、批量预测](#支持单条批量预测)
10+
- [可配置参数说明](#可配置参数说明)
11+
- [训练定制](#训练定制)
12+
- [文本摘要应用定制训练全流程介绍](#文本摘要应用定制训练全流程介绍)
13+
- [环境依赖](#环境依赖)
14+
- [代码结构说明](#代码结构说明)
15+
- [数据准备](#数据准备)
16+
- [数据加载](#数据加载)
17+
- [从本地文件创建数据集](#从本地文件创建数据集)
18+
- [模型训练](#模型训练)
19+
- [模型预测](#模型预测)
20+
- [模型推理部署](#模型推理部署)
21+
- [FasterTransformer加速及模型静态图导出](#fastertransformer加速及模型静态图导出)
22+
- [模型部署](#模型部署)
23+
- [References](#references)
24+
25+
26+
## 简介
27+
文本摘要的目标是自动地将输入文本转换成简短摘要,为用户提供简明扼要的内容描述,是缓解文本信息过载的一个重要手段。
28+
文本摘要也是自然语言生成领域中的一个重要任务,有很多应用场景,如新闻摘要、论文摘要、财报摘要、传记摘要、专利摘要、对话摘要、评论摘要、观点摘要、电影摘要、文章标题生成、商品名生成、自动报告生成、搜索结果预览等。
29+
30+
本项目是基于预训练语言模型UNIMO-Text的文本摘要,具有以下优势:
31+
- 效果领先。
32+
- 开箱即用。本项目提供TaskFlow接口,无需训练,仅需几行代码便可预测。
33+
- 高性能推理。本项目基于FasterTransformer进行推理加速,能够提供更高性能的推理体验。
34+
- 训练推理全流程打通。本项目提供了全面的定制训练流程,从数据准备、模型训练预测,到模型推理部署,一应俱全。
35+
36+
### 基于预训练语言模型的文本摘要
37+
38+
基于预训练语言模型(Pretrained Language Models, PLMs)范式的自动文本摘要是目前最常用、效果最好(SOTA)的方式。
39+
预训练模型是在超大规模的语料采用无监督(unsupervised)或者弱监督(weak-supervised)的方式进行预训练,能够学习如何准确地理解自然语言并以自然语言的形式流畅表达,这两项都是完成文本摘要任务的重要能力。
40+
41+
PaddleNLP提供了方便易用的接口,可指定模型名或模型参数文件路径通过from_pretrained()方法加载不同网络结构的预训练模型,且相应预训练模型权重下载速度快速、稳定。下面以中文unimo-text-1.0-summary模型为例,演示如何加载预训练模型和分词器:
42+
```
43+
from paddlenlp.transformers import UNIMOLMHeadModel, UNIMOTokenizer
44+
model_name = "unimo-text-1.0-summary"
45+
model = UNIMOLMHeadModel.from_pretrained(model_name)
46+
tokenizer = UNIMOTokenizer.from_pretrained(model_name)
47+
```
48+
49+
## 效果展示
50+
51+
## 开箱即用
52+
PaddleNLP提供开箱即用的产业级NLP预置任务能力,无需训练,一键预测。
53+
### 支持单条、批量预测
54+
55+
```python
56+
>>> from paddlenlp import Taskflow
57+
>>> summarizer = Taskflow("text_summarization")
58+
# 单条输入
59+
>>> summarizer("雪后的景色可真美丽呀!不管是大树上,屋顶上,还是菜地上,都穿上了一件精美的、洁白的羽绒服。放眼望去,整个世界变成了银装素裹似的,世界就像是粉妆玉砌的一样。")
60+
# 输出:'雪后的景色可真美丽呀!'
61+
62+
# 多条输入
63+
>>> summarizer([
64+
"雪后的景色可真美丽呀!不管是大树上,屋顶上,还是菜地上,都穿上了一件精美的、洁白的羽绒服。放眼望去,整个世界变成了银装素裹似的,世界就像是粉妆玉砌的一样。",
65+
"根据“十个工作日”原则,下轮调价窗口为8月23日24时。卓创资讯分析,原油价格或延续震荡偏弱走势,且新周期的原油变化率仍将负值开局,消息面对国内成品油市场并无提振。受此影响,预计国内成品油批发价格或整体呈现稳中下滑走势,但“金九银十”即将到来,卖方看好后期市场,预计跌幅较为有限。"
66+
])
67+
#输出:['雪后的景色可真美丽呀!', '成品油调价窗口8月23日24时开启']
68+
```
69+
70+
### 可配置参数说明
71+
* `model`:可选模型,默认为`unimo-text-1.0-summary`
72+
* `batch_size`:批处理大小,请结合机器情况进行调整,默认为1。
73+
74+
75+
## 训练定制
76+
### 文本摘要应用定制训练全流程介绍
77+
接下来,我们将按数据准备、训练、预测、推理部署对文本摘要应用的全流程进行介绍。
78+
1. **数据准备**
79+
- 如果没有已标注的数据集,我们推荐[doccano](https://github.com/doccano/doccano)数据标注工具。
80+
如果已有标注好的本地数据集,我们需要根据将数据集整理为文档要求的格式,请参考[从本地文件创建数据集](#从本地文件创建数据集)
81+
82+
2. **模型训练**
83+
84+
- 数据准备完成后,可以开始使用我们的数据集对预训练模型进行微调训练。我们可以根据任务需求,调整可配置参数,选择使用GPU或CPU进行模型训练,脚本默认保存在开发集最佳表现模型。中文任务默认使用"unimo-text-1.0-summary"模型,unimo-text-1.0-summary还支持large模型,详见[UNIMO模型汇总](https://paddlenlp.readthedocs.io/zh/latest/model_zoo/transformers/UNIMO/contents.html),可以根据任务和设备需求进行选择。
85+
86+
87+
3. **模型预测**
88+
89+
- 训练结束后,我们可以加载保存的最佳模型进行模型测试,打印模型预测结果。
90+
91+
4. **模型推理部署**
92+
93+
- 模型部署需要将保存的最佳模型参数(动态图)导出成静态图参数,用于后续的推理部署。
94+
95+
- 文本摘要应用提供了基于Paddle Serving的本地部署predictor,并且支持在GPU设备使用Faster Generation进行加速。
96+
97+
- 文本摘要应用提供了基于Paddle Serving的服务端部署方案。
98+
99+
### 环境依赖
100+
101+
### 代码结构说明
102+
103+
以下是本项目主要代码结构及说明:
104+
105+
```text
106+
text_summarization/
107+
├── deploy # 部署
108+
│ ├── paddle_inference # PaddleInference高性能推理部署
109+
│ │ ├── inference_unimo_text.py # 推理部署脚本
110+
│ │ └── README.md # 说明文档
111+
│ └── paddle_serving
112+
│ ├── config.yml # 配置文件
113+
│ ├── pipeline_client.py # 客户端程序
114+
│ ├── pipeline_service.py # 服务器程序
115+
│ └── README.md # 说明文档
116+
├── export_model.py # 动态图参数导出静态图参数脚本
117+
├── export_model.sh # 动态图参数导出静态图参数shell脚本
118+
├── train.py # 训练评估脚本
119+
├── train.sh # 训练评估shell脚本
120+
├── utils.py # 工具函数脚本
121+
└── README.md # 说明文档
122+
```
123+
124+
### 数据准备
125+
126+
#### 数据加载
127+
#### 从本地文件创建数据集
128+
129+
在许多情况,我们需要使用本地数据集来训练我们的文本摘要模型,本项目支持使用固定格式本地数据集文件进行训练。
130+
131+
本地数据集目录结构如下:
132+
133+
```text
134+
data/
135+
├── train.json # 训练数据集文件
136+
└── test.json # 可选,待预测数据文件
137+
```
138+
本地数据集文件格式如下:
139+
- train.json/test.json 文件每行格式:
140+
```text
141+
{
142+
"title": "任志强抨击政府把土地作为投机品地产业被人为破坏",
143+
"content": "“北京的保障房市场就像一个巨大的赌场,每个人都在期待中奖。”面对中国目前现行的保障性住房政策,华远地产董事长任志强再次语出惊人。(分享自@第一财经-中国房地产金融)"
144+
}
145+
```
146+
147+
更多数据集读取格式详见[数据集加载](https://paddlenlp.readthedocs.io/zh/latest/data_prepare/dataset_load.html#)[自定义数据集](https://paddlenlp.readthedocs.io/zh/latest/data_prepare/dataset_self_defined.html)
148+
149+
150+
### 模型训练
151+
运行如下命令即可在样例训练集上进行finetune,并在样例验证集上进行验证。
152+
153+
```shell
154+
# GPU启动,参数`--gpus`指定训练所用的GPU卡号,可以是单卡,也可以多卡
155+
unset CUDA_VISIBLE_DEVICES
156+
157+
log_dir=output
158+
rm -rf ${log_dir}
159+
mkdir -p ${log_dir}
160+
161+
python -m paddle.distributed.launch --gpus "0,1,2,3" --log_dir ${log_dir} train.py \
162+
--model_name_or_path=unimo-text-1.0-summary \
163+
--train_file train.json \
164+
--eval_file test.json \
165+
--save_dir=${log_dir}/checkpoints \
166+
--logging_steps=100 \
167+
--save_steps=10000 \
168+
--epochs=10 \
169+
--batch_size=32 \
170+
--learning_rate=5e-5 \
171+
--warmup_propotion=0.02 \
172+
--weight_decay=0.01 \
173+
--max_seq_len=60 \
174+
--max_target_len=30 \
175+
--max_dec_len=20 \
176+
--min_dec_len=3 \
177+
--do_train \
178+
--do_eval \
179+
--device=gpu \
180+
```
181+
也可以直接使用`train.sh`.
182+
183+
关键参数释义如下:
184+
- `gpus` 指示了训练所用的GPU卡号。
185+
- `dataset_name` 数据集名称。
186+
- `train_file` 本地训练数据地址。
187+
- `eval_file` 本地测试数据地址。
188+
- `model_name_or_path` 指示了finetune使用的具体预训练模型,可以是PaddleNLP提供的预训练模型(详见[UNIMO模型汇总](https://paddlenlp.readthedocs.io/zh/latest/model_zoo/transformers/UNIMO/contents.html)),或者是本地的预训练模型。如果使用本地的预训练模型,可以配置本地模型的目录地址,例如: ./checkpoints/model_xx/,目录中需包含paddle预训练模型model_state.pdparams。如果使用PaddleNLP提供的预训练模型,可以选择下面其中之一。
189+
190+
| PaddleNLP提供的预训练模型 |
191+
|---------------------------------|
192+
| unimo-text-1.0-summary |
193+
| unimo-text-1.0 |
194+
| unimo-text-1.0-large |
195+
196+
- `save_dir` 表示模型的保存路径。
197+
- `logging_steps` 表示日志打印间隔。
198+
- `save_steps` 表示模型保存及评估间隔。
199+
- `seed` 表示随机数生成器的种子。
200+
- `epochs` 表示训练轮数。
201+
- `batch_size` 表示每次迭代**每张卡**上的样本数目。
202+
- `learning_rate` 表示基础学习率大小,将于learning rate scheduler产生的值相乘作为当前学习率。
203+
- `weight_decay` 表示AdamW优化器中使用的weight_decay的系数。
204+
- `warmup_propotion` 表示学习率逐渐升高到基础学习率(即上面配置的learning_rate)所需要的迭代数占总步数的比例,最早的使用可以参考[这篇论文](https://arxiv.org/pdf/1706.02677.pdf)
205+
- `max_seq_len` 模型输入序列的最大长度。
206+
- `max_target_len` 模型训练时标签的最大长度。
207+
- `min_dec_len` 模型生成序列的最小长度。
208+
- `max_dec_len` 模型生成序列的最大长度。
209+
- `do_train` 是否进行训练。
210+
- `do_eval` 是否进行预测,在验证集上会自动评估。
211+
- `device` 表示使用的设备,从gpu和cpu中选择。
212+
213+
更多参数详情和参数的默认值请参考`train.py`
214+
215+
程序运行时将会自动进行训练和验证,训练过程中会自动保存模型在指定的`save_dir`中。
216+
如:
217+
```text
218+
./checkpoints/
219+
├── model_8000
220+
│ ├── model_config.json
221+
│ ├── model_state.pdparams
222+
│ ├── special_tokens_map.json
223+
│ ├── tokenizer_config.json
224+
│ └── vocab.txt
225+
└── ...
226+
```
227+
228+
**NOTE:** 如需恢复模型训练,`model_name_or_path`配置本地模型的目录地址即可。
229+
230+
231+
### 模型预测
232+
233+
运行下方脚本可以使用训练好的模型进行预测。
234+
235+
```shell
236+
export CUDA_VISIBLE_DEVICES=0
237+
python train.py \
238+
--do_eval \
239+
--eval_file test.json \
240+
--model_name_or_path=your_model_path \
241+
--logging_steps=100 \
242+
--batch_size=16 \
243+
--max_seq_len=60 \
244+
--max_target_len=30 \
245+
--max_dec_len=20 \
246+
--min_dec_len=3 \
247+
--device=gpu
248+
```
249+
250+
程序运行结束后会将预测结果保存在`output_path`中。
251+
252+
253+
Finetuned baseline的模型在[LCSTS](https://aclanthology.org/D15-1229/)测试集上有如下结果:
254+
| model_name | Rouge-1 | Rouge-2 | Rouge-L | BLEU-4 |
255+
| :-----------------------------: | :---: | :-----------: | :-------------------: |:-------------------: |
256+
| finetuned unimo-text-1.0-summary | 39.56 | 26.24 | 36.35 | 21.48 |
257+
258+
259+
### 模型推理部署
260+
261+
#### FasterTransformer加速及模型静态图导出
262+
263+
使用动态图训练结束之后,可以通过[静态图导出脚本](export_model.py)实现基于FasterTransformer的高性能预测加速,并将动态图参数导出成静态图参数,静态图参数保存在`output_path`指定路径中。运行方式:
264+
265+
```shell
266+
python export_model.py \
267+
--model_name_or_path unimo-text-1.0-summary \
268+
--decoding_strategy beam_search \
269+
--inference_model_dir ./inference_model \
270+
--max_out_len 30 \
271+
```
272+
关键参数释义如下:
273+
274+
* `model_name_or_path`:动态图训练保存的参数路径;默认为"unimo-text-1.0-summary"。
275+
* `inference_model_dir`:静态图图保存的参数路径;默认为"./inference_model"。
276+
* `max_out_len`:最大输出长度。
277+
278+
执行命令后将会自动导出模型到指定的 `inference_model` 中,保存模型文件结构如下所示:
279+
280+
```text
281+
inference_model/
282+
├── unimo_text.pdiparams
283+
├── unimo_text.pdiparams.info
284+
└── unimo_text.pdmodel
285+
```
286+
287+
#### 模型部署
288+
文本摘要应用已打通多种场景部署方案,点击链接获取具体的使用教程。
289+
- [Paddle Inference 推理 (Python)](./deploy/paddle_inference/README.md)
290+
- [Paddle Serving 服务化部署(Python)](./deploy/paddle_serving/README.md)
291+
292+
## References
293+
Li, Wei, et al. "Unimo: Towards unified-modal understanding and generation via cross-modal contrastive learning." arXiv preprint arXiv:2012.15409 (2020).
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Paddle Inference部署
2+
本文档将介绍如何使用[Paddle Inference](https://paddle-inference.readthedocs.io/en/latest/guides/introduction/index_intro.html#paddle-inference)工具进行自动文本摘要应用高性能推理推理部署。
3+
4+
**目录**
5+
* [背景介绍](#背景介绍)
6+
* [导出预测部署模型](#导出预测部署模型)
7+
* [基于Python预测](#基于Python预测)
8+
9+
10+
## 背景介绍
11+
Paddle inference和主框架的Model.predict均可实现推理预测,Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力,主框架的Model 对象是一个具备训练、测试、推理的神经网络。相比于Model.predict,inference可使用MKLDNN、CUDNN、TensorRT进行预测加速。Model.predict适用于训练好的模型直接进行预测,paddle inference适用于对推理性能、通用性有要求的用户,针对不同平台不同的应用场景进行了深度的适配优化,保证模型在服务器端即训即用,快速部署。由于 Paddle Inference 能力直接基于飞桨的训练算子,因此它支持飞桨训练出的所有模型的推理。
12+
13+
14+
Paddle Inference Python端预测部署主要包含两个步骤:
15+
- 导出预测部署模型
16+
- 基于Python预测
17+
18+
19+
## 导出预测部署模型
20+
部署时需要使用预测格式的模型(即动态图转静态图操作)。预测格式模型相对训练格式模型而言,在拓扑上裁剪掉了预测不需要的算子,并且会做特定部署优化。具体操作详见[FasterTransformer加速及模型静态图导出](../../README.md)
21+
22+
## 基于Python预测
23+
<!-- 同上,高性能预测的默认输入和输出形式也为文件,可分别通过 test_path 和 save_path 进行指定,通过如下命令便可以基于Paddle Inference 进行高性能预测: -->
24+
25+
在终端输入以下命令可在GPU上进行预测:
26+
```shell
27+
python deploy/paddle_inference/inference_unimo_text.py --inference_model_dir ./inference_model
28+
```
29+
30+
关键参数释义如下:
31+
* `inference_model_dir`:用于高性能推理的静态图模型参数路径;默认为"./inference_model"。

0 commit comments

Comments
 (0)