Skip to content

Latest commit

 

History

History
218 lines (170 loc) · 12.5 KB

PaddleNLP使用指南.md

File metadata and controls

218 lines (170 loc) · 12.5 KB

通用

  1. PaddleNLP常见问题汇总(持续更新)
  2. 待学习 PaddleNLP教程文档 | PaddleNLP教程文档
  3. 待实践 PaddleNLP一键预测功能:Taskflow API | PaddleNLP 一键预测功能 Taskflow API 使用教程
  4. Github PaddleNLP

环境安装

pip install paddlepaddle paddlepaddle-gpu
pip install paddlenlp

预训练模型

  1. PaddleNLP Transformer预训练模型

样本需求

很难定义具体需要多少条样本,取决于具体的任务以及数据的质量。如果数据质量没问题的话,分类、文本匹配任务所需数据量级在百级别,翻译则需要百万级能够训练出一个比较鲁棒的模型。如果样本量较少,可以考虑数据增强,或小样本学习。

数据集

加载本地数据集

通过使用PaddleNLP提供的 load_dataset, MapDataset 和 IterDataset ,可以方便的自定义属于自己的数据集。

from paddlenlp.datasets import load_dataset

def read(data_path):
    with open(data_path, 'r', encoding='utf-8') as f:
        # 跳过列名
        next(f)
        for line in f:
            words, labels = line.strip('\n').split('\t')
            words = words.split('\002')
            labels = labels.split('\002')
            yield {'tokens': words, 'labels': labels}

# data_path为read()方法的参数
map_ds = load_dataset(read, data_path='train.txt', lazy=False)
iter_ds = load_dataset(read, data_path='train.txt', lazy=True)

加载预定义数据集

import paddlenlp as ppnlp
from paddlenlp.datasets import load_dataset

train_ds, dev_ds, test_ds = load_dataset(
    "chnsenticorp", splits=["train", "dev", "test"])

print(train_ds.label_list)

for data in train_ds.data[:5]:
    print(data)

数据处理

  1. 基于预训练模型的数据处理
  2. 基于非预训练模型的数据处理

tokenizer

其他

数据增强

PaddleNLP提供了Data Augmentation数据增强API,可用于训练数据数据增强

其他:

模型导入保存

PaddleNLP预训练模型

保存

model.save_pretrained('./checkpoint')
tokenizer.save_pretrained('./checkpoint')

加载

model.from_pretrained("./checkpoint')
tokenizer.from_pretrained("./checkpoint')

自定义预训练模型

# 加载
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# 调用save_pretrained()生成 model_config.json、 tokenizer_config.json、model_state.pdparams、 vocab.txt 文件,保存到./checkpoint
tokenizer.save_pretrained("./checkpoint")
model.save_pretrained("./checkpoint")
# 修改model_config.json,tokenizer_config.json这两个配置文件,指定为自己的模型,之后通过from_pretrained()加载模型
tokenizer = BertTokenizer.from_pretrained("./checkpoint")
model = BertModel.from_pretrained("./checkpoint")

模型训练

  1. PaddleNLP Trainer API

继续热启动训练

先将lr、 optimizer、model的参数保存下来

paddle.save(lr_scheduler.state_dict(), "xxx_lr")
paddle.save(optimizer.state_dict(), "xxx_opt")
paddle.save(model.state_dict(), "xxx_para")

加载lr、 optimizer、model参数即可恢复训练

lr_scheduler.set_state_dict(paddle.load("xxxx_lr"))
optimizer.set_state_dict(paddle.load("xxx_opt"))
model.set_state_dict(paddle.load("xxx_para"))

冻结模型梯度

冻结训练其实也是迁移学习的思想,在目标检测任务中用得十分广泛。因为目标检测模型里,主干特征提取部分所提取到的特征是通用的,把backbone冻结起来训练可以加快训练效率,也可以防止权值被破坏。在冻结阶段,模型的主干被冻结了,特征提取网络不发生改变,占用的显存较小,仅对网络进行微调。在解冻阶段,模型的主干不被冻结了,特征提取网络会发生改变,占用的显存较大,网络所有的参数都会发生改变。

参考:

  1. Pytorch在训练时冻结某些层使其不参与训练
  2. 如何冻结模型梯度

小样本

增加训练样本带来的效果是最直接的。此外,可以基于我们开源的预训练模型进行热启,再用少量数据集fine-tune模型。此外,针对分类、匹配等场景,小样本学习也能够带来不错的效果。

并行

  1. 关于生成式语言大模型的一些工程思考 paddlenlp & chatglm

其他

  1. 如何在eval阶段打印评价指标,在各epoch保存模型参数?

模型输出

推理服务部署

预测部署

在动态图模式下开发,静态图模式部署。

动转静

动转静,即将动态图的模型转为可用于部署的静态图模型。 动态图接口更加易用,python 风格的交互式编程体验,对于模型开发更为友好,而静态图相比于动态图在性能方面有更绝对的优势。因此动转静提供了这样的桥梁,同时兼顾开发成本和性能。 可以参考官方文档 动态图转静态图文档,使用 paddle.jit.to_static 完成动转静。 另外,在 PaddleNLP 我们也提供了导出静态图模型的例子,可以参考 waybill_ie 模型导出

借助Paddle Inference部署

动转静之后保存下来的模型可以借助Paddle Inference完成高性能推理部署。Paddle Inference内置高性能的CPU/GPU Kernel,结合细粒度OP横向纵向融合等策略,并集成 TensorRT 实现模型推理的性能提升。具体可以参考文档 Paddle Inference 简介。 为便于初次上手的用户更易理解 NLP 模型如何使用Paddle Inference,PaddleNLP 也提供了对应的例子以供参考,可以参考 /PaddleNLP/examples 下的deploy目录,如基于ERNIE的命名实体识别模型部署

提升QPS

从工程角度,对于服务器端部署可以使用 Paddle Inference 高性能预测引擎进行预测部署。对于Transformer类模型的GPU预测还可以使用PaddleNLP中提供的FastGeneration功能来进行快速预测,其集成了NV FasterTransformer并进行了功能增强。

从模型策略角度,可以使用一些模型小型化技术来进行模型压缩,如模型蒸馏和裁剪,通过小模型来实现加速。PaddleNLP中集成了ERNIE-Tiny这样一些通用小模型供下游任务微调使用。另外PaddleNLP提供了模型压缩示例,实现了DynaBERT、TinyBERT、MiniLM等方法策略,可以参考对自己的模型进行蒸馏压缩。

参考:

  1. 文本生成高性能加速

案例

文本分类

  1. 中文新闻文本标题分类
  2. PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(单标签)】

实体抽取

  1. 医疗领域实体抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏等教学,助力工业应用场景快速落地
  2. 军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏等教学,助力工业应用场景快速落地
  3. 【Paddle打比赛】基于PaddleNLP的面向低资源和增量类型的命名实体识别

信息抽取

  1. PDF 基于ERNIELayout&pdfplumber-UIE的多方案学术论文信息抽取
  2. 重要 文本抽取任务UIE Taskflow使用指南
  3. 产业实践分享:基于UIE-X的医疗文档信息提取,少样本微调大幅提升抽取效果
  4. 简历信息提取(七):用ERNIE-Layout实现文档智能问答信息筛选

文本生成

  1. 文本生成任务实战:如何使用PaddleNLP实现各种解码策略

垂直领域

  1. 算法框架-预训练-增量/全量自定义垂直领域预训练模型

增量学习

  1. 增量学习-学习总结(上)
  2. 增量学习(Incremental Learning)小综述

UIE

信息抽取应用 |

  1. 论文:Unified Structure Generation for Universal Information Extraction
  2. PaddleNLP之UIE信息抽取小样本进阶(二)[含doccano详解]
  3. 信息抽取UIE(二)--小样本快速提升性能(含doccona标注
  4. 通用信息抽取技术UIE产业案例解析,Prompt范式落地经验分享!
  5. 基于Label studio实现UIE信息抽取智能标注方案,提升标注效率!
  6. UIE与ERNIE-Layout:智能视频问答任务初探
  7. 跨模态文档通用信息抽取模型UIE-X来了

ERNIE

杂项

pipreqs 生成依赖

# 生成requirements.txt
pipreqs ./ --encoding=utf8 --proxy http://${host}:${port}

# 自动安装所有依赖
pip install -r requriements.txt

参考:

partial

stream

tqdm / pbar

其他

# 多行if
if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something