【导读】 华师大HugAILab团队研发了全面统一的NLP训练框架—— HugNLP ,支持包括文本分类、匹配、问答、信息抽取、文本生成等多种NLP任务模型搭建和训练,且已集成大量最新的Prompt技术;基于HugNLP框架,团队还研发了可支持ChatGPT类模型训练和部署产品HugChat,以及统一信息抽取产品HugIE。
HugNLP——全面统一的NLP框架开源了!
开源地址 :https://github.com/HugAILab/HugNLP
(相关资料图)
论文 :https://arxiv.org/abs/2302.14286
NLP研究者们的福音到啦!经过半年的努力, 华师大 HugAILab 团队 基于Huggingface开发了面向NLP研究和应用的开源框架—— HugNLP ,框架内已经集成实现了多种类别NLP任务、数据和模型的训练和部署,下图是HugNLP的框架总览:
HugNLP是基于Huggingface开发的NLP框架,其底层的实现完全基于Transformers,从而具备 易部署 和 易扩展 特性。另外,HugNLP集成了 MLFlow 的追踪服务,方便使用者实时追踪任务训练的进程。
一、HugNLP框架介绍
HugNLP是一个分层式框架,遵循“高内聚低耦合”的开发模式,其核心包括模型层(Models)、处理器层(Processors)、评估器层(Evaluators)和应用层(Applications)四部分。
在Models层,已经实现了多种类型的NLP任务模型,下面是目前已经支持的NLP模型任务列表:
预训练 :Masked LM、Causal LM、知识增强预训练;
Instruction-Tuning :支持自回归生成式、区间抽取式、NLI等统一范式训练;
文本分类/匹配 :传统Fine-tuning、Prompt-tuning、In-Context Learning;
序列标注: 支持NER等序列标注任务;
元学习 :基于序列的元学习(SentenceProto)、基于区间的元学习(SpanProto)、基于token的元学习(TokenProto,NNShot);
问答 :支持抽取式问答、多项选择式问答、开放生成式问答;
文本生成 :支持文本摘要、机器翻译(正在开发中);
代码智能 :目前集成了代码克隆检测(Clone)、代码缺陷检测(Defact)等Code任务;
在Processors层,HugNLP框架为一些常用的数据集提供了处理器,使用者只需要指定Processor的名称即可直接获取并处理相应的数据。Evaluators层旨在对不同类型NLP模型任务的进行评估,主要包括常用的ACC、Precision、F1值等,对于生成式任务,也包含BLEU等。
Applications层开发了大量的NLP现有的产品或解决方案,其主要建立在Models、Processors和Evaluators层之上。例如,如果使用者指定一个模型(例如BertForSequenceClassification)、处理器(CLUE Processors)和评估器(Sequence Classification Evaluator),那么即可对应一个“基于BERT的CLUE分类”的应用。HugNLP框架目前实现了多种Applications,包括:
Benchmark刷榜工具 :面向中文CLUE、英文GLUE榜单;
HugIE信息抽取 :基于抽取式Instruction-tuning的统一信息抽取框架,同时支持实体识别和关系抽取;
HugChat对话大模型 :支持多种ChatGPT类模型的训练,V100即可训练130亿大模型;
Code :包括代码克隆检测和缺陷检测等;
HugNLP还集成了一些可插拔式的配件,包括如下:
Parameter Freezing :选择性冻结模型部分参数,用于参数有效性训练;
Uncertainty Estimation :评估模型的不确定性,用于半监督;
Calibration :对预测结果进行校准;
对抗训练 :用于提高模型鲁棒性;
二、HugNLP核心能力
HugNLP和市面上的一些NLP框架很像,都可以快速搭建和部署NLP任务模型,那么除了这些能力外, HugNLP到底具备哪些核心竞争力呢? 下面简单介绍HugNLP的一些核心能力。
2.1 知识增强预训练
传统的一些预训练模型(例如BERT、GPT2等)是在通用语料上训练的,而对领域事实知识可能不敏感,因此需要显式的在预训练阶段注入事实知识。在HugNLP中,主要实现了两个知识增强预训练,包括DKPLM和KP-PLM。DKPLM是一种可分解的知识注入方法;KP-PLM则是将结构化知识转化为自然语言描述的形式进行注入。
执行下面命令即可进行Masked Language Modeling和Causal Language Modeling的预训练:
bash applications/pretraining/run_pretrain_mlm.sh
bash applications/pretraining/run_pretrain_casual_lm.sh
2.2 Prompt-Tuning & Instruction-Tuning
传统的Fine-tuning在低资源场景下容易出现过拟合问题,因此复用预训练的目标可以拉近Pre-training和Fine-tuning之间的语义差异。HugNLP集成了PET、P-tuning、Prefix-tuning等Prompt-Tuning算法,并无缝嵌入在NLP分类任务的模型里。使用者只需要指定
use_prompt_for_cls
参数即可使用Prompt-Tuning。在大模型时代,如何将不同类型的NLP任务进行范式统一,是构造通用人工智能的核心要素。HugNLP为此定义了三种统一范式的思想:
万物皆可生成 :将所有NLP任务建模为单向自回归生成,例如GPT-3、ChatGPT等;
万物皆可抽取 :将所有NLP任务建模为抽取式机器阅读理解;
万物皆可推断 :将所有NLP任务建模为自然语言推断;
基于三种不同的范式统一,HugNLP推出两个核心产品,分别是:
HugIE :基于抽取式Instruction的统一信息抽取框架;
HugChat :基于生成式Instruction的中小型ChatGPT类模型;
2.3 In-Context Learning
In-Context Learning(ICL) 首次由GPT-3提出,其旨在挑选少量的标注样本作为提示(Prompt),从而在形式上促使大模型生成目标答案。总的来说,ICL具备如下性质:
只需要少量标注样本作为提示;
无需训练模型,直接通过模型生成获得结果;
In-Context Learning可以完成分类和生成两种任务。HugNLP为此实现基于Decoder-only类模型的In-Context Learning的Application并分别用于分类和生成任务上。使用时,只需要指定下面参数即可:
--user_defined="data_name=xxx num_incontext_example=4 l=1 use_calibrate=True"
--use_prompt_for_cls
2.4 Self-training
半监督旨在同时结合标注数据和无标签数据来训练NLP任务。Self-training是一种简单但有效的迭代式训练方法,其通过Teacher模型先获取伪标签,对伪标签进行去噪后,再训练Student模型。HugNLP集成了面向不确定性评估的半监督训练方法,提高了自训练中的噪声处理有效性。理论上,所有的NLP任务都可以通过HugNLP框架实现半监督训练。
HugNLP使用半监督模式,只需要做两件事:
(1)执行脚本时添加参数:
--use_semi
(2)在指定的数据集目录下,存放unlabeled data文件。
2.5 Code代码智能
代码智能是一种特殊的NLP任务领域,旨在训练一个模型能够更好地理解和表征代码语言,现有的一些代表模型有CodeBERT、PLBART等。
"code_cls": {
"roberta": RobertaForCodeClassification,"codebert": CodeBERTForCodeClassification,"graphcodebert": GraphCodeBERTForCodeClassification,"codet5": CodeT5ForCodeClassification,"plbart": PLBARTForCodeClassification,},HugNLP框架也集成了code方面的一些任务,下面列出已经实现的任务和使用方式:(1)代码克隆检测(code clone detection)添加参数:
--task_name=code_clone
--task_type=code_cls
(2)代码修复(code defect)添加参数:
--task_name=code_defect
--task_type=code_cls
三、HugNLP核心产品——HugChat
最近ChatGPT火爆全球,为了让研究者可以训练自己的ChatGPT,HugNLP框架集成了基于生成式Instruction的训练产品——HugChat,其支持 各种类型的单向生成式模型的训练 ,例如GPT-2、GPT-Neo、OPT、GLM等。为了支持较大规模模型(例如OPT-13B)使得其在8张V100 32G的条件下可训练,HugNLP集成了大量的训练优化技术,包括:
混合精度训练FP16;
DeepSpeed+ZeRO技术;
参数有效性训练,例如LoRA、PEFT等;
INT8模型量化;
数据方面,HugAILab团队开源了约200万条英文、300万条中文对话数据,用于训练模型。例如训练GPT-2(XL),可直接执行脚本:
bash ./application/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_gpt2_xl.sh
基于HugNLP,训练的GPT-2(1.3B)模型,即可实现很简单的对话任务。只需要执行如下命令即可:
python3 applications/instruction_prompting/HugChat/hugchat.py
例如可以写套磁信邮件: 再例如搜索谷歌地球的相关信息: 也可以实现编写简单的代码(1.3B的模型具备此能力已经很惊叹了!): HugNLP目前正在开发其他类型的Decoder-only大模型,相关信息和开源内容如下表所示: HugChat后期将推出垂直领域的大模型解决方案,同时将与OpenAI API进行融合,推出大模型服务框架。
四、HugNLP核心产品——HugIE
信息抽取(Information Extraction) 旨在从非结构化的文本中抽取出结构化信息,是构建知识库的重要步骤之一。通常信息抽取包括两个核心步骤,分别是 命名实体识别(Named Entity Recognition) 和 关系抽取(Relation Extraction) 。
我们基于HugNLP研发一款HugIE产品,旨在实现统一信息处理。其主要核心包括如下几个部分:
将实体识别和关系抽取,统一为新的范式——基于抽取式阅读理解的方法。HugIE采用Global Pointer模型实现信息抽取;
定义Instruction Prompt,指导模型生成需要抽取的内容;
采用多任务训练的方法训练;
HugIE目前已经开源了模型:https://huggingface.co/wjn1996/wjn1996-hugnlp-hugie-large-zh可以基于HugNLP框架使用HugIE抽取模型,如下图所示:
>>> from applications.information_extraction. HugIE.api_test import HugIEAPI
>>> model_type = "bert">>> hugie_model_name_or_path = "wjn1996/wjn1996-hugnlp-hugie-large-zh">>> hugie = HugIEAPI(model_type, hugie_model_name_or_path)>>> text = "北京在2008年和2022年分别举办了夏季奥运会和冬季奥运会">>> # Beijing has posted the Summer and Winter Olympics in 2008 and 2022, respectively.>>> entity = "2008年奥运会" # 2008 Olympics Games>>> relation = "举办地" # host place>>> predictions, = hugie.request(text, entity, relation)>>> print(predictions){0: ["北京"]}>>> # {0: ["Beijing"]}五、Benchmark一键刷榜
HugNLP最先开发了面向一些常用榜单的刷榜工具,例如GLUE、CLUE等。用户只需要配置相应的数据集名称,即可实现一键刷榜。为了验证框架的有效性,在22年9月提交了CLUE榜单的刷榜结果,选择一系列中文小模型(RoBERTa、MacBERT、P-BERT等)并结合了logits集成方法,至今依然维持在第15名位置,曾一度超越了部分企业。 例如如果训练CLUE榜单的AFQMC数据集,可编辑文件
applications/benchmark/clue/clue_finetune_dev.sh
修改参数:
--user_defined="data_name=afqmc"
执行下列命令即可:
bash applications/benchmark/clue/clue_finetune_dev.sh
HugNLP框架集成了若干种对抗训练的方法,其中最简单的对抗方法为FGM算法:
在训练时,只需要添加一行参数,即可默认调用FGM算法:
--do_adv
同样的方法还可以训练一些常用的NLP任务,例如阅读理解、实体识别、以及GLUE英文数据集等。
HugNLP还集成了一系列模型用于刷榜,例如BERT、RoBERTa、DeBERTa、MacBERT、Erlangshen等。
六、HugNLP的使用指南
下面简单介绍如何使用HugNLP框架
1、下载HugNLP仓库代码至本地或服务器:
git clone https://github.com/HugAILab/HugNLP.gitcd HugNLP
2、安装HugNLP:
python3 setup.py install
3、基于BERT训练一个GLUE榜单数据集RTE,可直接执行:
bash ./applications/benchmark/glue/run_glue.sh
4、基于GPT-2的In-Context Learning队RTE进行分类,可执行:
bash ./applications/benchmark/glue/run_causal_incontext_glue.sh
5、训练自己的ChatGPT模型,仅需要8张V100,即可以训练基于OPT-13B的对话大模型:
bash ./applications/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_opt_lora.sh
目前HugNLP已支持的应用如下表所示: 还有更多丰富的应用正在开发中。HugNLP也欢迎有志之士加入HugAILab参与开源开发工作 ? 。