|
| 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). |
0 commit comments