随着 BERT、Megatron、GPT-3 等预训练模型在NLP领域取得瞩目的成果,越来越多团队投身到超大规模训练中,这使得训练模型的规模从亿级别发展到了千亿甚至万亿的规模。然而,这类超大规模的模型运用于实际场景中仍然有一些挑战。首先,模型参数量过大使得训练和推理速度过慢且部署成本极高;其次在很多实际场景中数据量不足的问题仍然制约着大模型在小样本场景中的应用,提高预训练模型在小样本场景的泛化性依然存在挑战。为了应对以上问题,阿里云机器学习PAI 团队推出了 EasyNLP 中文 NLP 算法框架,助力大模型快速且高效的落地。
$ git clone https://github.com/alibaba/EasyNLP.git
$ pip install -r requirements.txt
$ cd EasyNLP
$ python setup.py install
环境要求:Python 3.6, PyTorch >= 1.8.
下面提供一个BERT文本分类的例子,只需要几行代码就可以训练BERT模型:
首先,通过load_dataset接口加载数据,其次构建一个分类模型,然后调用Trainer即可训练.
from easynlp.core import Trainer from easynlp.appzoo import GeneralDataset, SequenceClassification, load_dataset from easynlp.utils import initialize_easynlp args = initialize_easynlp() row_data = load_dataset('glue', 'qnli')["train"] train_dataset = GeneralDataset(row_data, args.pretrained_model_name_or_path, args.sequence_length) model = SequenceClassification(pretrained_model_name_or_path=args.pretrained_model_name_or_path) Trainer(model=model, train_dataset=train_dataset).train()
For more datasets, please check it out in DataHub.
也可以使用自定义数据接口:
from easynlp.core import Trainer from easynlp.appzoo import ClassificationDataset, SequenceClassification from easynlp.utils import initialize_easynlp args = initialize_easynlp() train_dataset = ClassificationDataset( pretrained_model_name_or_path=args.pretrained_model_name_or_path, data_file=args.tables, max_seq_length=args.sequence_length, input_schema=args.input_schema, first_sequence=args.first_sequence, label_name=args.label_name, label_enumerate_values=args.label_enumerate_values, is_training=True) model = SequenceClassification(pretrained_model_name_or_path=args.pretrained_model_name_or_path) Trainer(model=model, train_dataset=train_dataset).train()
测试代码:
python main.py \
--mode train \
--tables=train_toy.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=./tmp/ \
--epoch_num=1 \
--app_name=text_classify \
--user_defined_parameters='pretrain_model_name_or_path=bert-tiny-uncased'
我们也提供了AppZoo的命令行来训练模型,只需要通过简单的参数配置就可以开启训练:
$ 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更多示例,详见:AppZoo文档.
EasyNLP的ModelZoo目前支持如下预训练模型。
详细列表参见 readme。
EasyNLP提供小样本学习和知识蒸馏,方便用户落地超大预训练模型。
EasyNLP提供 CLUE评测代码,方便用户快速评测CLUE数据上的模型效果。
# Format: bash run_clue.sh device_id train/predict dataset # e.g.: bash run_clue.sh 0 train csl
根据我们的脚本,可以获得BERT,RoBERTa等模型的评测效果(dev数据):
(1) bert-base-chinese
Task | 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:
Task | 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评测示例.
This project is licensed under the Apache License (Version 2.0). This toolkit also contains some code modified from other repos under other open-source licenses. See the NOTICE file for more information.
扫描下面二维码加入dingidng群,有任何问题欢迎在群里反馈。
更加详细的解读可以参考我们的 arxiv 文章。
@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}
}
EasyNLP中文NLP算法框架 作者:PAI(阿里云人工智能平台)算法团队 平台:基于PyTorch 优势:中文预训练模型 提供:AppZoo和预训练ModelZoo,ModelZoo有很多预训练模型,EasyNLP可以无缝接入huggingface/transformers的模型;AppZoo支持文本分类,文本匹配,序列标注等任务。 工具: 支持小样本训练:Contrastive Prompt
pip install -r EasyNLP/requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ 1.从文档安装依赖包 2.一次性换阿里源:-i
7.20 一面 40分钟 1.自我介绍 项目部分: 2.常见模型的结构:bert,TextCNN,transformer,ERNIE 3.怎么比较用哪个模型更好 4.模型输入的长度限制是多少 5.怎么解决多标签问题的 6.attention的时间复杂度是多少 7.有没有做过知识图谱和问答 8.GPT的结构 9.各个类别数据不均衡怎么办? 10.关于模型的部署和优化 11.a,b是两个常数,怎么在不
1、自我介绍,完了之后面试官又介绍了他们在做的工作 2、问论文、项目内容 3、介绍transformer的结构;为什么要用多头;注意力有什么用等等 4、chatgpt了解吗,用过吗,聊了很多关于chatgpt这些大模型 5、写代码(给定两个字符串str1和str2,求字符串数组strs中str1和str2的最小距离) 6、反问:我问了去了以后做什么工作,偏项目还是科研#NLP#
一面 简单挖简历 你的三个项目怎么做的? 讲一下cnn? 讲一下lstm? 讲一下反向传播? 讲一下sigmoid函数? 讲一下逻辑回归和随机森林的优缺点? 讲一下svm? 在线共享codding—求一个正数的平方根 在线codding,求链表的倒数第k个位置的value,由于时间原因只说了思路 二面 中度挖简历 三个项目的部分细节? 第一个项目后续优化的思路? 讲一下你对大模型的理解,知道哪些大
7.25二面半小时 1. 介绍你最拿得出手的一个工作 2. 介绍实习工作 3. 有没有关注过机器翻译方向 4. 无重复数字的全排列,口述算法思路。 5. 一些别的个人情况介绍 #OPPO信息集散地#
7.19 一面 之前投的是大模型,hr后面让我转岗了。 1.介绍第一个实习做的工作 2.介绍第二个实习的工作 3.介绍论文的工作 没有八股 手撕代码leetcode 769 没写出来,让面试官换成最长公共前缀了。。。 面试半小时结束了 #OPPO信息集散地#
1. 自我介绍 2. 简历项目 3. 大语言模型的微调方法的了解 4. two sum 5. 排序算法(随机选一个写) 基本都回答上来了,算法题也都是easy级别的。两天后就显示流程结束。 哎! #饿了么##面经#