EasyNLP 是一个全面且易用的 NLP 工具包
EasyNLP 中文介绍
EasyNLP 是一个基于 PyTorch 的易用 NLP 开发和应用工具包,于 2021 年首次在阿里巴巴内部发布。它采用可扩展的分布式训练策略,支持各种 NLP 应用的全面算法套件。EasyNLP 集成了知识蒸馏和少样本学习,用于落地大型预训练模型,同时包含多种流行的多模态预训练模型。它为实际应用提供了统一的模型训练、推理和部署框架。它已在阿里巴巴集团内超过 10 个业务部门和 20 多个业务场景中发挥作用。它与人工智能平台 (PAI) 产品无缝集成,包括用于开发的 PAI-DSW、用于云原生训练的 PAI-DLC、用于服务的 PAI-EAS 以及用于零代码模型训练的 PAI-Designer。
主要特性
- 易用且高度可定制: 除了提供易用且简洁的命令来调用前沿模型外,还抽象了某些自定义模块,如 AppZoo 和 ModelZoo,使构建 NLP 应用变得容易。它配备了 PAI PyTorch 分布式训练框架 TorchAccelerator 以加速分布式训练。
- 兼容开源库: EasyNLP 具有 API 支持使用 PAI 分布式框架训练来自 Huggingface/Transformers 的模型。它还支持 EasyTransfer ModelZoo 中的预训练模型。
- 注入知识的预训练: PAI 团队在知识注入预训练方面进行了大量研究,并构建了一个在 CCF 知识预训练竞赛中获得第一名的知识注入模型。EasyNLP 集成了这些前沿的知识预训练模型,包括 DKPLM 和 KGBERT。
- 落地大型预训练模型: EasyNLP 提供少样本学习功能,允许用户仅使用少量样本就能微调大型模型并取得良好效果。同时,它提供知识蒸馏功能,帮助快速将大型模型蒸馏为小型高效模型,便于在线部署。
- 多模态预训练模型: EasyNLP 不仅仅关注 NLP。它还支持各种流行的多模态预训练模型,以支持需要视觉知识的视觉-语言任务。例如,它配备了 CLIP 风格的模型用于文本-图像匹配,以及 DALLE 风格的模型用于文本到图像生成。
技术文章
我们有一系列关于 EasyNLP 功能的技术文章。
- BeautifulPrompt:PAI 推出自研 Prompt 美化器,赋能 AIGC 一键出美图
- PAI-Diffusion 中文模型全面升级,海量高清艺术大图一键生成
- EasyNLP 集成 K-Global Pointer 算法,支持中文信息抽取
- 阿里云 PAI-Diffusion 功能再升级,全链路支持模型调优,平均推理速度提升 75% 以上
- PAI-Diffusion 模型来了!阿里云机器学习团队带您徜徉中文艺术海洋
- 模型精度再被提升,统一跨任务小样本学习算法 UPT 给出解法!
- Span 抽取和元学习能碰撞出怎样的新火花,小样本实体识别来告诉你!
- 算法 KECP 被顶会 EMNLP 收录,极少训练数据就能实现机器阅读理解
- 当大火的文图生成模型遇见知识图谱,AI 画像趋近于真实世界
- EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT
- EasyNLP 带你实现中英文机器阅读理解
- 跨模态学习能力再升级,EasyNLP 电商文图检索效果刷新 SOTA
- EasyNLP 玩转文本摘要(新闻标题)生成
- 中文稀疏 GPT 大模型落地 — 通往低成本&高性能多任务通用自然语言理解的关键里程碑
- EasyNLP 集成 K-BERT 算法,借助知识图谱实现更优 Finetune
- EasyNLP 中文文图生成模型带你秒变艺术家
- 面向长代码序列的 Transformer 模型优化方法,提升长代码场景性能
- EasyNLP 带你玩转 CLIP 图文检索
- 阿里云机器学习 PAI 开源中文 NLP 算法框架 EasyNLP,助力 NLP 大模型落地
- 预训练知识度量比赛夺冠!阿里云 PAI 发布知识预训练工具
安装
您可以从源代码进行安装:
$ git clone https://github.com/alibaba/EasyNLP.git
$ cd EasyNLP
$ python setup.py install
本仓库在 Python 3.6,PyTorch >= 1.8 上测试通过。
快速开始
现在让我们展示如何仅用几行代码就构建一个基于 BERT 的文本分类模型。
from easynlp.appzoo import ClassificationDataset
from easynlp.appzoo import get_application_model, get_application_evaluator
from easynlp.core import Trainer
from easynlp.utils import initialize_easynlp, get_args
from easynlp.utils.global_vars import parse_user_defined_parameters
from easynlp.utils import get_pretrain_model_path
initialize_easynlp()
args = get_args()
user_defined_parameters = parse_user_defined_parameters(args.user_defined_parameters)
pretrained_model_name_or_path = get_pretrain_model_path(user_defined_parameters.get('pretrain_model_name_or_path', None))
train_dataset = ClassificationDataset(
pretrained_model_name_or_path=pretrained_model_name_or_path,
data_file=args.tables.split(",")[0],
max_seq_length=args.sequence_length,
input_schema=args.input_schema,
first_sequence=args.first_sequence,
second_sequence=args.second_sequence,
label_name=args.label_name,
label_enumerate_values=args.label_enumerate_values,
user_defined_parameters=user_defined_parameters,
is_training=True)
valid_dataset = ClassificationDataset(
pretrained_model_name_or_path=pretrained_model_name_or_path,
data_file=args.tables.split(",")[-1],
max_seq_length=args.sequence_length,
input_schema=args.input_schema,
first_sequence=args.first_sequence,
second_sequence=args.second_sequence,
label_name=args.label_name,
label_enumerate_values=args.label_enumerate_values,
user_defined_parameters=user_defined_parameters,
is_training=False)
model = get_application_model(app_name=args.app_name,
pretrained_model_name_or_path=pretrained_model_name_or_path,
num_labels=len(valid_dataset.label_enumerate_values),
user_defined_parameters=user_defined_parameters)
trainer = Trainer(model=model, train_dataset=train_dataset,user_defined_parameters=user_defined_parameters,
evaluator=get_application_evaluator(app_name=args.app_name, valid_dataset=valid_dataset,user_defined_parameters=user_defined_parameters,
eval_batch_size=args.micro_batch_size))
trainer.train()
完整示例可以在这里找到。
您还可以使用 AppZoo 命令行工具快速训练 App 模型。以 SST-2 数据集上的文本分类为例。首先,您可以下载 train.tsv 和 dev.tsv,然后开始训练:
$ easynlp \
--mode=train \
--worker_gpu=1 \
--tables=train.tsv,dev.tsv \
--input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
--first_sequence=sent1 \
--label_name=label \
--label_enumerate_values=0,1 \
--checkpoint_dir=./classification_model \
--epoch_num=1 \
--sequence_length=128 \
--app_name=text_classify \
--user_defined_parameters='pretrain_model_name_or_path=bert-small-uncased'
然后进行预测:
$ easynlp \
--mode=predict \
--tables=dev.tsv \
--outputs=dev.pred.tsv \
--input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
--output_schema=predictions,probabilities,logits,output \
--append_cols=label \
--first_sequence=sent1 \
--checkpoint_path=./classification_model \
--app_name=text_classify
要了解更多关于 AppZoo 的用法,请参阅我们的文档。
ModelZoo
EasyNLP 目前在 ModelZoo 中提供以下模型:
-
PAI-BERT-zh(来自阿里巴巴 PAI):使用大规模中文语料预训练的 BERT 模型。
-
DKPLM(来自阿里巴巴 PAI):发布于论文 [DKPLM: Decomposable Knowledge-enhanced Pre-trained Language
-
PET(由慕尼黑大学和Sulzer GmbH发布):随论文《利用完形填空问题进行少样本文本分类和自然语言推理》发布,作者为Timo Schick和Hinrich Schutze。我们对算法进行了一些微调,使其适用于中文。
-
P-Tuning(由清华大学、北京人工智能研究院、MIT和Recurrent AI, Ltd.发布):随论文《GPT也能理解》发布,作者为刘晓、郑亚南、杜正晓、丁铭、钱宇杰、杨植麟和唐杰。我们对算法进行了一些微调,使其适用于中文。
-
CP-Tuning(由阿里巴巴PAI发布):随论文《通过对比提示调优使预训练语言模型成为端到端少样本学习器》发布,作者为徐子云、王成玉、邱明辉、罗富力、徐润鑫、黄松芳和黄骏。
-
香草知识蒸馏(由阿里巴巴PAI发布):将大型BERT风格模型的logits蒸馏到较小的模型中。
-
Meta KD(由阿里巴巴PAI发布):随论文《Meta-KD:跨领域语言模型压缩的元知识蒸馏框架》发布,作者为潘浩杰、王成玉、邱明辉、张一畅、李亚良和黄骏。
-
数据增强(由阿里巴巴PAI发布):基于预训练语言模型的MLM头进行数据增强。
CLUE基准测试
EasyNLP提供了一个简单的工具包来对CLUE数据集进行基准测试。你可以使用以下命令来对CLUE数据集进行基准测试。
# 格式: bash run_clue.sh 设备id 训练/预测 数据集
# 例如:
bash run_clue.sh 0 train csl
我们在这些数据集上测试了中文bert和roberta模型,开发集的结果如下:
(1) bert-base-chinese:
任务 | AFQMC | CMNLI | CSL | IFLYTEK | OCNLI | TNEWS | WSC |
---|---|---|---|---|---|---|---|
P | 72.17% | 75.74% | 80.93% | 60.22% | 78.31% | 57.52% | 75.33% |
F1 | 52.96% | 75.74% | 81.71% | 60.22% | 78.30% | 57.52% | 80.82% |
(2) chinese-roberta-wwm-ext:
任务 | AFQMC | CMNLI | CSL | IFLYTEK | OCNLI | TNEWS | WSC |
---|---|---|---|---|---|---|---|
P | 73.10% | 80.75% | 80.07% | 60.98% | 80.75% | 57.93% | 86.84% |
F1 | 56.04% | 80.75% | 81.50% | 60.98% | 80.75% | 57.93% | 89.58% |
这里是详细的CLUE基准测试示例。
教程
- 自定义文本分类示例
- QuickStart-文本分类
- QuickStart-PAI DSW
- QuickStart-MaxCompute/ODPS数据
- AppZoo-文本向量化
- AppZoo-文本分类/匹配
- AppZoo-序列标注
- AppZoo-GEEP文本分类
- AppZoo-文本生成
- 基础预训练实践
- 知识预训练实践
- 知识蒸馏实践
- 跨任务知识蒸馏实践
- 小样本学习实践
- Rapidformer模型训练加速实践
- API文档: http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/easynlp/easynlp_docs/html/index.html
许可证
本项目采用Apache许可证(版本2.0)。该工具包还包含一些根据其他开源许可证修改的代码。更多信息请参见NOTICE文件。
更新日志
- EasyNLP v0.0.3于2022年4月1日发布。更多详情和历史请参考tag_v0.0.3。
联系我们
扫描以下二维码加入钉钉讨论群。群内讨论主要是中文,但也欢迎使用英语。
参考文献
- DKPLM: https://paperswithcode.com/paper/dkplm-decomposable-knowledge-enhanced-pre
- MetaKD: https://paperswithcode.com/paper/meta-kd-a-meta-knowledge-distillation
- CP-Tuning: https://paperswithcode.com/paper/making-pre-trained-language-models-end-to-end-1
- FashionBERT: https://paperswithcode.com/paper/fashionbert-text-and-image-matching-with
我们有一篇arXiv论文供你引用EasyNLP库:
@article{easynlp,
doi = {10.48550/ARXIV.2205.00258},
url = {https://arxiv.org/abs/2205.00258},
author = {Wang, Chengyu and Qiu, Minghui and Zhang, Taolin and Liu, Tingting and Li, Lei and Wang, Jianing and Wang, Ming and Huang, Jun and Lin, Wei},
title = {EasyNLP: A Comprehensive and Easy-to-use Toolkit for Natural Language Processing},
publisher = {arXiv},
year = {2022}
}