作者:王嘉宁,孙秋实,陈诺
【导读】 HugNLP是面向众多主流NLP任务的一站式训练框架。当前,HugNLP支持大量经典预训练模型架构、下游任务和常见数据集,并融合了较为新颖的Prompt Learning技术辅助模型调优。HugNLP团队还基于此框架开发并开源了统一的信息提取产品:HugIE及其模型。此外,在大模型训练异常火爆的今天,基于HugNLP框架,还推出了能够支持类ChatGPT模型进行训练和部署的产品HugChat。
  • 开源项目地址:https://github.com/HugAILab/HugNLP
  • 论文:HugNLP: A Unified and Comprehensive Library for Natural Language Processing[1]
NLP领域的福音来啦!经过超过半年的开发、整合和调试,华东师大 HugAILab 团队基于PyTorch和HuggingFace推出了一款面向NLP研究和应用的开源框架——HugNLP。这个框架已集成了多种类型的主流NLP任务、常用数据集以及便捷的模型训练和部署功能,还包括一系列实用插件。
下图为HugNLP框架总览图:
HugNLP的底层基于Transformers库实现,既易于部署又易于扩展的特点。除此之外,HugNLP还整合了开源实验跟踪框架MLFlow,以便用户能够实时监控任务训练进程。

1. HugNLP简介

HugNLP是一个层级式结构的框架,主要包含四个核心部分:模型层(Models)、处理器层(Processors)、评估器层(Evaluators)和应用层(Applications),除此之外还有一些可插拔配件可供选择。

(1)Models

在Models层,HugNLP已经实现了多种常见的NLP任务类型:
  • 预训练 :Masked LM、Causal LM、知识增强预训练;
  • 指令微调(Instruction-Tuning) :支持自回归生成式、区间抽取式、NLI等统一范式训练;
  • 文本分类/匹配 :传统Fine-tuning、Prompt-tuning、In-Context Learning;
  • 序列标注 :支持NER等序列标注任务;
  • 元学习 :基于序列的元学习(SentenceProto)、基于区间的元学习(SpanProto)、基于token的元学习(TokenProto,NNShot);
  • 问答 :支持抽取式问答、多项选择式问答、开放生成式问答;
  • 文本生成 :支持文本摘要、机器翻译;
  • 代码智能 :目前集成了CodeXGLUE Benchmark中的代码克隆检测(Clone detection)和代码缺陷检测(Defect detection)等Code任务,更多功能(如代码摘要/补全)正在开发测试中。

(2)Processors & Evaluators

在Processors层,HugNLP框架为一些常用的数据集(如GLUE Benchmark)提供了处理器,用户只需要指定Processor的名称即可直接获取并处理相应的数据。Evaluators层旨在对不同类型NLP模型任务的进行评估,主要包括常用的ACC、Precision、F1等,对于生成式任务,也包含BLEU等指标。

(3)Applications

HugNLP的应用层(Applications)包含了众多现有的NLP产品和解决方案,它们主要构建在模型层(Models)、处理器层(Processors)和评估器层(Evaluators)之上。
例如,当用户指定一个模型(如BertForSequenceClassification)、处理器(CLUE Processors)以及评估器(Sequence Classification Evaluator)时,将对应实现一个“基于BERT的CLUE分类”应用。HugNLP框架目前实现了多种Applications,包括:
  • Benchmark刷榜工具 :面向英文GLUE以及中文CLUE榜单的一键刷榜工具;
  • HugIE信息抽取 :基于抽取式Instruction-tuning的统一信息抽取框架,同时支持实体识别和关系抽取;
  • HugChat对话大模型 :支持多种ChatGPT类模型的训练,V100即可训练130亿大模型;
  • 代码理解 :包括代码克隆检测和缺陷检测等基于代码预训练模型的下游任务;
最后,HugNLP还集成了一些可插拔配件,如下所示:
  • Parameter Freezing :冻结模型的backbone/部分参数,用于参数有效性训练;
  • Uncertainty Estimation :评估模型的不确定性,用于半监督学习;
  • Calibration :对模型的预测结果进行校准与去偏见化;
  • 对抗训练 :默认采用FGM对抗训练算法;
HugNLP也是目前 首个插件增强 的开源NLP训练框架,且还有更多插件在更新中。
HugNLP框架易于开发和部署,对于开发者开发自己的应用非常方便,只需要遵循下面的开发流程,即可快速实现新应用。

2. HugNLP核心能力

除了快速搭建和部署NLP任务模型等基本能力以外,HugNLP还具备以下核心能力和特点。

2.1 Prompt-Tuning

在低资源场景下,传统的微调方法容易产生过拟合等问题。因此,通过复用预训练目标来减小预训练(Pre-training)和微调(Fine-tuning)之间的语义差距是一个有效的策略。
因此,HugNLP整合了如PET、P-tuning、Prefix-tuning等各种主流Prompt-Tuning算法,无缝地将它们衔接在面向NLP分类任务的模型中。用户只需指定use_prompt_for_cls参数,即可轻松实现一键Prompt-Tuning功能。

2.2 Instruction-tuning & In-Context Learning

随着大型语言模型(LLMs)能力的不断提升,In-Context Learning 已成为NLP领域的新范式。在此过程中,LLMs仅根据少量示例的上下文进行对目标的预测/生成。当前,探索ICL以评估和推断LLMs的能力也已经成为一个新趋势,因此HugNLP实现基于Decoder-only类模型的ICL Applications,结合指令微调(Instruction Tuning)后并分别用于各种分类和生成任务上。

2.3 Knowledge-Enhanced Pre-training

一些经典的预训练模型(如BERT、GPT2等)是在基于通用语料进行训练的,而对领域事实知识(Factual Knowledge)可能不敏感,因此需要显式地在预训练阶段注入事实知识。我们在HugNLP中主要实现了两个知识增强预训练方案,包括:
  1. KP-PLM[2]:将结构化知识转化为自然语言描述的形式进行注入;
  2. DKPLM[3]:一种可分解的知识注入方法。

2.4 Self-training

Self-training(自训练) 是一种半监督学习方法,结合并利用少量有标注数据和大量无标注数据来提高模型性能。首先使用有标注数据训练一个初始模型,然后用该模型对未标记数据进行预测,为其生成伪标签。接着,将伪标签数据与原始有标注数据一起用于模型的进一步训练,以提高模型的泛化能力。
我们在HugNLP中集成了基于不确定性的自训练pipeline,理论上,当前绝大部分NLP任务都可以通过HugNLP实现半监督训练。

2.5 Parameter-efficient Learning

Parameter-efficient Learning(PEL,即参数有效性学习)是一种调优模型的方法,旨在用较少的参数实现高性能模型调试。PEL的核心目标是在减小模型微调参数量、降低计算成本和内存需求的同时,最大限度地保持模型的预测准确性。其经典代表为当前大模型训练中火爆的LoRA(Low-Rank Adaptation)。
因此,我们在HugNLP的核心功能中考虑了低成本微调的需求,整合了Prefix-Tuning、Adapter、LoRA和BitFit等一系列方法,并且与我们所涉及的不同框架模型能无缝衔接整合。

2.6 代码智能

代码智能是一种特殊的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

3. HugNLP核心产品

在大模型时代,如何将不同类型的NLP任务进行范式的统一,是走向AGI(通用人工智能)的核心要素之一。因此,HugNLP为此定义了三种统一范式的思想:
  • 万物皆可生成 :将所有NLP任务统一建模为单向自回归(Unidirectional Autoregressive)生成模式,如GPT-3、ChatGPT等;
  • 万物皆可抽取 :将所有NLP任务统一建模为抽取式机器阅读理解模式;
  • 万物皆可推断 :将所有NLP任务统一建模为自然语言推理模式。

3.1 HugChat

随着ChatGPT引发的大模型热潮,不论是高校、研究机构还是个人都渐渐开始训练自己的对话式大模型。我们希望能简化此工作流,达到一键训练指定模型的目的,因此基于HugNLP框架开发了基于生成式Instruction的产品——HugChat,可以用于快速完成GPT-2、GPT-Neo、OPT、GLM等模型的训练。
(1) 示例1: 可直接执行脚本训练GPT-2-XL:
bash ./application/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_gpt2_xl.sh
(2) 示例2: 训练一个GPT-2(1.3B)模型执行简单的对话任务,只需要执行如下命令:
python3 applications/instruction_prompting/HugChat/hugchat.py
此外,我们还开源了约200万条英文、300万条中文对话数据,用于训练对话式模型。经过测试,在8张V100 32G的朴素条件下,即可训练一个OPT-13B大模型。以下为一些例子,首先是 “给教授写一封套磁信”
虽说参数量不多,但也可以帮你编写一些简单的代码:

3.2 HugIE

信息抽取(IE,Information Extraction)是建立知识库的关键环节之一,通常涉及命名实体识别(Named Entity Recognition)和关系抽取(Relation Extraction)两个方面。为了使NLP研究人员更轻松地开展相关任务,我们推出了一款基于HugNLP开发的实用工具HugIE,其主要特点如下:
  1. 将实体识别与关系抽取整合为一种全新范式——采用基于抽取式阅读理解方法的Global Pointer模型,HugIE实现了信息提取功能;
  2. 利用Instruction Prompt引导模型生成所需提取的信息;
  3. 通过多任务学习方法进行训练。
我们已发布了一个基于HugIE训练的模型:https://huggingface.co/wjn1996/wjn1996-hugnlp-hugie-large-zh[4],使用示例如下:
>>> 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']}

4. 使用指南

下面简单介绍如何使用HugNLP:
  1. Clone HugNLP仓库代码至本地或服务器:
git clone https://github.com/HugAILab/HugNLP.git[5]
cd HugNLP
  1. 安装HugNLP:
python3 setup.py install
  1. GLUE刷榜示例:基于BERT训练一个GLUE榜单数据集RTE,可直接执行:
bash ./applications/benchmark/glue/run_glue.sh
  1. 基于GPT-2的In-Context Learning队RTE进行分类,可执行:
bash ./applications/benchmark/glue/run_causal_incontext_glue.sh
  1. 大模型训练,仅需8张V100,即可以训练基于OPT-13B的对话大模型:
bash ./applications/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_opt_lora.sh
目前HugNLP已支持的应用如下表所示:
我们相信不论是对新手还是老鸟,HugNLP都能大大简化NLP任务的开发流程。还有更多丰富有趣的应用正在开发中,我们也欢迎有志之士加入HugAILab参与开源开发工作 🤗
  • 开源项目地址:https://github.com/HugAILab/HugNLP
  • 论文:HugNLP: A Unified and Comprehensive Library for Natural Language Processing[6]
一起交流
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)

团队介绍

本文参考资料

[1]
HugNLP: A Unified and Comprehensive Library for Natural Language Processing: https://arxiv.org/abs/2302.14286
[2]
KP-PLM: https://arxiv.org/abs/2210.08536
[3]
DKPLM: https://arxiv.org/abs/2112.01047
[4]
https://huggingface.co/wjn1996/wjn1996-hugnlp-hugie-large-zh: https://huggingface.co/wjn1996/wjn1996-hugnlp-hugie-large-zh
[5]
https://github.com/HugAILab/HugNLP.git: https://github.com/HugAILab/HugNLP.git
[6]
HugNLP: A Unified and Comprehensive Library for Natural Language Processing: https://arxiv.org/abs/2302.14286
继续阅读
阅读原文