028-86048320
新闻资讯
关注图奕科技最新动态,了解行业最新成果
【导读】 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,以便用户能够实时监控任务训练进程。
HugNLP是一个层级式结构的框架,主要包含四个核心部分:模型层(Models)、处理器层(Processors)、评估器层(Evaluators)和应用层(Applications),除此之外还有一些可插拔配件可供选择。
在Processors层,HugNLP框架为一些常用的数据集(如GLUE Benchmark)提供了处理器,用户只需要指定Processor的名称即可直接获取并处理相应的数据。Evaluators层旨在对不同类型NLP模型任务的进行评估,主要包括常用的ACC、Precision、F1等,对于生成式任务,也包含BLEU等指标。
HugNLP的应用层(Applications)包含了众多现有的NLP产品和解决方案,它们主要构建在模型层(Models)、处理器层(Processors)和评估器层(Evaluators)之上。
例如,当用户指定一个模型(如BertForSequenceClassification)、处理器(CLUE Processors)以及评估器(Sequence Classification Evaluator)时,将对应实现一个“基于BERT的CLUE分类”应用。HugNLP框架目前实现了多种Applications,包括:
最后,HugNLP还集成了一些可插拔配件,如下所示:
HugNLP也是目前 首个插件增强 的开源NLP训练框架,且还有更多插件在更新中。
HugNLP框架易于开发和部署,对于开发者开发自己的应用非常方便,只需要遵循下面的开发流程,即可快速实现新应用。
除了快速搭建和部署NLP任务模型等基本能力以外,HugNLP还具备以下核心能力和特点。
在低资源场景下,传统的微调方法容易产生过拟合等问题。因此,通过复用预训练目标来减小预训练(Pre-training)和微调(Fine-tuning)之间的语义差距是一个有效的策略。
因此,HugNLP整合了如PET、P-tuning、Prefix-tuning等各种主流Prompt-Tuning算法,无缝地将它们衔接在面向NLP分类任务的模型中。用户只需指定use_prompt_for_cls参数,即可轻松实现一键Prompt-Tuning功能。
随着大型语言模型(LLMs)能力的不断提升,In-Context Learning 已成为NLP领域的新范式。在此过程中,LLMs仅根据少量示例的上下文进行对目标的预测/生成。当前,探索ICL以评估和推断LLMs的能力也已经成为一个新趋势,因此HugNLP实现基于Decoder-only类模型的ICL Applications,结合指令微调(Instruction Tuning)后并分别用于各种分类和生成任务上。
一些经典的预训练模型(如BERT、GPT2等)是在基于通用语料进行训练的,而对领域事实知识(Factual Knowledge)可能不敏感,因此需要显式地在预训练阶段注入事实知识。我们在HugNLP中主要实现了两个知识增强预训练方案,包括:
Self-training(自训练) 是一种半监督学习方法,结合并利用少量有标注数据和大量无标注数据来提高模型性能。首先使用有标注数据训练一个初始模型,然后用该模型对未标记数据进行预测,为其生成伪标签。接着,将伪标签数据与原始有标注数据一起用于模型的进一步训练,以提高模型的泛化能力。
我们在HugNLP中集成了基于不确定性的自训练pipeline,理论上,当前绝大部分NLP任务都可以通过HugNLP实现半监督训练。
Parameter-efficient Learning(PEL,即参数有效性学习)是一种调优模型的方法,旨在用较少的参数实现高性能模型调试。PEL的核心目标是在减小模型微调参数量、降低计算成本和内存需求的同时,最大限度地保持模型的预测准确性。其经典代表为当前大模型训练中火爆的LoRA(Low-Rank Adaptation)。
因此,我们在HugNLP的核心功能中考虑了低成本微调的需求,整合了Prefix-Tuning、Adapter、LoRA和BitFit等一系列方法,并且与我们所涉及的不同框架模型能无缝衔接整合。
代码智能是一种特殊的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
在大模型时代,如何将不同类型的NLP任务进行范式的统一,是走向AGI(通用人工智能)的核心要素之一。因此,HugNLP为此定义了三种统一范式的思想:
随着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大模型。以下为一些例子,首先是 “给教授写一封套磁信”
虽说参数量不多,但也可以帮你编写一些简单的代码:
信息抽取(IE,Information Extraction)是建立知识库的关键环节之一,通常涉及命名实体识别(Named Entity Recognition)和关系抽取(Relation Extraction)两个方面。为了使NLP研究人员更轻松地开展相关任务,我们推出了一款基于HugNLP开发的实用工具HugIE,其主要特点如下:
我们已发布了一个基于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']}
下面简单介绍如何使用HugNLP:
git clone https://github.com/HugAILab/HugNLP.git[5]
cd HugNLP
python3 setup.py install
bash ./applications/benchmark/glue/run_glue.sh
bash ./applications/benchmark/glue/run_causal_incontext_glue.sh
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]