发表时间: 2019-10 · arXiv:1910.03771
原文: https://arxiv.org/abs/1910.03771
作者/机构: Thomas Wolf, Lysandre Debut, Victor Sanh, Julien Chaumond, Clement Delangue, Anthony Moi, Pierric Cistac, Tim Rault, Remi Louf, Morgan Funtowicz, Joe Davison, ´ Sam Shleifer, Patrick von Platen, Clara Ma, Yacine Jernite, Julien Plu, Canwen Xu, Teven Le Scao, Sylvain Gugger, Mariama Drame, Quentin Lhoest, Alexander M. Rush
机构: Hugging Face, Brooklyn, USA
一句话结论 本文介绍了 Hugging Face 开发的 Transformers 库,通过统一的 API 设计、模块化架构和社区驱动的模型中心,解决了预训练语言模型在分发、微调和部署环节的工程壁垒,极大促进了自然语言处理技术的工业落地。
要解决什么问题 尽管基于 Transformer 架构的预训练模型在自然语言处理领域取得了突破性进展,但从业者在将这些前沿模型投入实际应用时,面临着严重的工程卡点。原有的开源工具往往局限于特定的框架或单一的任务,导致模型在训练、分析、扩展、微调和部署等环节存在巨大的摩擦力。具体而言,研究人员难以在不同的模型架构之间快速切换和对比,工程师在将庞大的预训练模型从研究环境迁移到生产环境时缺乏标准化的转换路径,且基于 Python 的传统分词机制在处理海量数据时速度极慢。这种研究与生产之间的割裂,使得普通开发者难以低成本地获取、复现和应用最新的预训练模型,阻碍了自然语言处理技术的广泛普及。
怎么做的 Transformers 库通过高度模块化的设计和统一的抽象接口来绕开上述工程卡点。该库将所有支持的模型解耦为三个核心构建模块。首先是分词器,负责将原始文本转换为稀疏索引编码,为了解决 Python 处理大数据的性能瓶颈,库默认采用基于 Rust 语言编写的底层分词库,大幅加速了训练和部署时的分词过程。其次是 Transformer 模型本身,负责将稀疏索引转换为上下文嵌入,所有模型都遵循相同的抽象层次,通过一个基类实现从嵌入矩阵投影到自注意力层的完整计算图,且每个模型通常在独立文件中实现以保证可扩展性。最后是模型头,作为附加在 Transformer 上下文嵌入之上的输出层和可选损失函数,用于执行序列分类、语言建模等特定任务的预测。为了屏蔽底层架构的差异,该库设计了一组 Auto 类,能够根据预训练模型的配置自动实例化对应的分词器和模型,允许用户仅用几行代码就在不同架构甚至 PyTorch 和 TensorFlow 框架之间无缝切换。此外,该库构建了一个领域特定的模型中心,允许社区用户上传和下载包含分词器、模型权重和模型头的完整存档。模型中心不仅通过模型卡片提供训练数据集和偏见说明等元数据,还内置了实时推理功能,让用户无需编写代码即可在真实数据上测试模型输出。在部署层面,该库支持将微调后的模型导出为 TorchScript 以及 ONNX 等中间神经网络格式,并提供了向移动端 CoreML 转换的适配器,从而打通了从模型微调到边缘设备部署的完整链路。
效果如何 由于本文是一篇系统性技术报告,其评估主要侧重于社区采纳度、生态覆盖面以及工程部署的性能提升,而非单一任务的精度对比。在社区活跃度方面,统计数据显示从 2019 年 10 月至 2020 年 5 月,模型中心已汇聚了 2097 个由社区贡献的预训练和微调模型,其中 BERT、GPT-2 以及专为该库开发的轻量化模型 DistilBERT 的日均独立下载量呈现显著的持续增长。在部署性能的量化测试中,作者与 ONNX 团队合作,将库中的 BERT、RoBERTa 和 GPT-2 模型导出为 ONNX 中间格式进行推理实验,结果表明转换后的模型推理速度获得了近 4 倍的提升。此外,论文通过三个真实场景的案例研究证明了该库的普适性:模型架构师能够利用该库训练并分发针对生物医学文本的 SciBERT 模型;任务训练者能够将其作为通用前端接入 Jiant 评测框架,在多种模型上进行微调和横向对比;而应用层用户则无需任何机器学习专业知识,即可直接从模型中心下载并部署预训练好的摘要模型用于自动文档处理。这些结果共同证明了该库在兼顾研究灵活性与工业鲁棒性方面的有效性。
本文介绍了 Transformers,一个旨在向更广泛的机器学习社区开放自然语言处理(NLP)领域最新进展的开源库。
核心问题: 尽管 Transformer 架构 【Ashish Vaswani et al., Attention is all you need, 2017, NIPS】 和模型预训练 【Bryan McCann et al., Learned in translation: Contextualized word vectors, 2017, NIPS; Jeremy Howard and Sebastian Ruder, Universal language model fine-tuning for text classification, 2018, ACL; Matthew E Peters et al., Deep contextualized word representations, 2018; Jacob Devlin et al., BERT: Pre-training of deep bidirectional transformers for language understanding, 2018, NAACL】 极大地推动了 NLP 的发展,但这些模型在被广泛应用时面临着一系列实际挑战,包括训练、分析、扩展、增强、分发、微调、部署和压缩等。
研究目标: Transformers 库的目标是解决上述挑战,致力于支持基于 Transformer 的架构,并促进预训练模型的分发和使用。该库的理念是为流行的模型变体提供工业级强度的实现,这些实现易于阅读、扩展和部署。
创新点与核心贡献:
开源研究工具的传承与启发。Transformers 的结构受到了来自 Google Research 的开创性库 tensor2tensor 【Ashish Vaswani et al., Tensor2tensor for neural machine translation, 2018, CoRR】 和 BERT 【Jacob Devlin et al., BERT: Pre-training of deep bidirectional transformers for language understanding, 2018, NAACL】 原始源代码的启发。为预训练模型提供便捷缓存的概念源于 AllenNLP 【Matt Gardner et al., AllenNLP: A deep semantic natural language processing platform, 2018】。该库还与神经翻译和语言建模系统密切相关,如 Fairseq 【Myle Ott et al., fairseq: A fast, extensible toolkit for sequence modeling, 2019】、OpenNMT 【Guillaume Klein et al., OpenNMT: Open-source toolkit for neural machine translation, 2017, ACL】、Texar 【Zhiting Hu et al., Texar: A modularized, versatile, and extensible toolkit for text generation, 2018】、Megatron-LM 【Mohammad Shoeybi et al., Megatron-lm: Training multi-billion parameter language models using gpu model parallelism, 2019, arXiv】 和 Marian NMT 【Marcin Junczys-Dowmunt et al., Marian: Fast neural machine translation in c++, 2018】。在此基础上,Transformers 增加了额外的面向用户的特性,以便轻松下载、缓存和微调模型,并实现向生产环境的无缝过渡。Transformers 与这些库保持一定的兼容性,最直接的是包含了一个工具,可以使用来自 Marian NMT 和 Google 的 BERT 的模型进行推理。
与通用NLP库的关系。在易于使用的通用NLP库方面,历史悠久的两个核心库是 NLTK 【Edward Loper and Steven Bird, NLTK: The natural language toolkit, 2002】 和 Stanford CoreNLP 【Christopher D Manning et al., The stanford CoreNLP natural language processing toolkit, 2014, ACL】,它们将多种不同的NLP方法整合到一个包中。近期,通用的开源库主要专注于各种NLP任务的机器学习,包括 Spacy 【Matthew Honnibal and Ines Montani, spacy 2: Natural language understanding with bloom embeddings, convolutional neural networks and incremental parsing, 2017】、AllenNLP 【Matt Gardner et al., AllenNLP: A deep semantic natural language processing platform, 2018】、flair 【Alan Akbik et al., Flair: An easy-to-use framework for state-of-the-art nlp, 2019, NAACL】 和 Stanza 【Peng Qi et al., Stanza: A python natural language processing toolkit for many human languages, 2020】。Transformers 提供了与这些库类似的功能。此外,这些库现在都使用 Transformers 库和模型中心作为其底层框架。
与通用模型中心的对比。由于 Transformers 提供了一个 NLP 模型中心,它也与流行的模型中心如 Torch Hub 和 TensorFlow Hub 相关,这些中心收集了特定框架的模型参数以便于使用。与这些中心不同,Transformers 是领域特定的,这使得系统能够为模型分析、使用、部署、基准测试和简便的可复现性提供自动支持。
库的核心设计理念。Transformers 库的设计旨在模仿标准的 NLP 机器学习模型流程:处理数据、应用模型和进行预测。尽管该库包含了促进训练和开发的工具,本技术报告将重点放在核心建模规范上。
模型的三大构建模块。库中的每个模型都由三个构建模块完全定义,如图2所示:(a) 分词器(tokenizer),将原始文本转换为稀疏索引编码;(b) Transformer模型(transformer),将稀疏索引转换为上下文嵌入;以及 (c) 模型头(head),使用上下文嵌入来进行特定于任务的预测。大多数用户的需求都可以通过这三个组件来满足。
核心Transformer架构实现。库的核心是经过仔细测试的、在 NLP 领域广泛使用的 Transformer 架构变体的实现。当前已实现的架构完整列表显示在图2(左侧)。虽然这些架构都共享相同的多头注意力核心,但它们之间存在显著差异,包括位置表示、掩码(masking)、填充(padding)以及序列到序列设计的使用。此外,各种模型被构建用于针对 NLP 的不同应用,如理解、生成和条件生成,以及一些特殊用例,如快速推理或多语言应用。
统一的抽象层次与实现。在实践中,所有模型都遵循相同的抽象层次:一个基类实现了模型的计算图,从编码(在嵌入矩阵上的投影)开始,经过一系列自注意力层,直到最终的编码器隐藏状态。每个模型的基类都是特定的,并紧密遵循其原始实现,这为用户提供了轻松剖析每个独立架构内部工作原理的灵活性。在大多数情况下,每个模型都在一个单独的文件中实现,以便于扩展。
Auto类与跨模型/框架的兼容性。在可能的情况下,不同的架构遵循相同的 API,允许用户在不同模型之间轻松切换。一组 Auto 类提供了一个统一的 API,可以非常快速地在模型之间甚至在框架之间进行切换。这些类会根据用户指定的预训练模型所定义的配置自动进行实例化。
分词器(Tokenizer)的实现与功能。该库一个关键的 NLP 特定方面是使用每个模型所必需的分词器的实现。分词器类(每个都继承自一个共同的基类)既可以从相应的预训练模型实例化,也可以手动配置。这些类存储其对应模型的词汇表(token-to-index映射),并根据模型的特定分词过程处理输入序列的编码和解码。已实现的分词器如图2(右侧)所示。用户可以通过接口轻松修改分词器,以添加额外的词元映射、特殊词元(如分类或分隔词元),或调整词汇表大小。
分词器的附加特性。分词器还可以为用户实现其他有用的功能。这些功能范围广泛,从序列分类任务中的词元类型索引(token type indices),到考虑到模型特定的特殊词元(大多数预训练的Transformer模型都有最大序列长度)的最大长度序列截断。
高性能分词器实现。在非常大的数据集上进行训练时,基于 Python 的分词通常速度慢得令人不满意。在最新版本中,Transformers 默认将其实现切换到一个高度优化的分词库。这个底层库,tokenizers,是用 Rust 编写的,以加速训练和部署过程中的分词程序。
模型头(Head)的实现与应用。每个 Transformer 都可以与多个现成的模型头之一配对,这些头的输出适用于常见类型的任务。这些模型头被实现为在基类之上的额外包装类,在 Transformer 的上下文嵌入之上添加一个特定的输出层和可选的损失函数。已实现的全套模型头如图2(顶部)所示。这些类遵循类似的命名模式:XXXForSequenceClassification,其中 XXX 是模型的名称,可用于适应(微调)或预训练。一些模型头,如条件生成头,支持额外的功能,如采样和束搜索(beam search)。
预训练头与微调头的灵活性。对于预训练模型,我们发布了用于预训练模型本身的头。例如,对于 BERT,我们发布了语言建模和下一句预测头,这使得使用预训练目标进行适应变得容易。我们还让用户可以轻松地将相同的核心 Transformer 参数与各种其他头一起用于微调。虽然每个头都可以通用,但该库还包括一系列示例,展示了每个头在实际问题上的应用。这些示例演示了如何使用给定的头来调整预训练模型,从而在各种NLP任务上取得最先进的结果。
模型中心的目标与现状。Transformers 旨在促进预训练模型的便捷使用和分发。这本质上是一个社区过程;一次预训练可以促进在许多特定任务上的微调。模型中心使任何终端用户都能简单地访问模型以用于自己的数据。该中心现在包含了来自社区的2097个用户模型,包括预训练和微调过的模型。图1显示了流行transformers模型随时间的增长和分布情况。虽然像BERT和GPT-2这样的核心模型仍然很受欢迎,但其他专门的模型,包括为该库开发的DistilBERT 【Victor Sanh et al., DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter, 2019】,现在也被社区广泛下载。
模型上传与使用。模型中心的用户界面设计得简洁并对社区开放。要上传模型,任何用户都可以注册账户并使用命令行界面生成一个包含分词器、transformer和模型头的存档。这个包可能是在库中训练的模型,也可能是从其他流行训练工具的检查点转换而来的。这些模型随后被存储并赋予一个规范名称,用户可以用这个名称来下载、缓存和运行模型,无论是用于微调还是推理,只需两行代码。要加载FlauBERT 【Hang Le et al., Flaubert: Unsupervised language model pre-training for french, 2020, LREC】,一个在法语语料库上预训练的BERT模型,命令是:
from transformers import AutoTokenizer, AutoModelWithLMHead
tokenizer = AutoTokenizer.from_pretrained("flaubert/flaubert_base_cased")
model = AutoModelWithLMHead.from_pretrained("flaubert/flaubert_base_cased")
模型卡片与元数据。当一个模型被上传到模型中心时,它会自动获得一个描述其核心属性、架构和用例的登录页面。可以通过模型卡片(model card) 【Margaret Mitchell et al., Model cards for model reporting, 2018】 提供额外的模型特定元数据,该卡片描述了其训练属性、工作引用、预训练期间使用的数据集,以及关于模型及其预测中已知偏见的任何注意事项。图3(左)展示了一个模型卡片的示例。
领域特定的高级功能。由于模型中心是专门针对基于 transformer 的模型的,我们可以针对那些对于更通用的模型集合来说难以实现的用例。例如,因为每个上传的模型都包含有关其结构的元数据,所以模型页面可以包含实时推理功能,允许用户在真实数据上实验模型的输出。图3(右)展示了带有实时推理功能的模型页面示例。此外,模型页面还包含指向其他模型特定工具的链接,如基准测试和可视化工具。例如,模型页面可以链接到 exBERT 【Benjamin Hoover et al., exBERT: A visual analysis tool to explore learned representations in transformers models, 2019】,一个 Transformer 可视化库。
社区案例研究引言。模型中心突显了 Transformers 如何被各种不同的社区利益相关者使用。我们根据 Strobelt 等人(2017)的架构师、训练者和最终用户的划分,总结了实践中观察到的三个具体用例。
案例1:模型架构师。AllenAI 是一个主要的 NLP 研究实验室,他们开发了一种名为 SciBERT 【Iz Beltagy et al., SciBERT: A pretrained language model for scientific text, 2019, EMNLP-IJCNLP】 的新型预训练模型,用于改进生物医学文本的提取。他们利用 PubMed 的数据训练了该模型,生成了一个在目标文本上取得最先进结果的掩码语言模型。然后,他们使用模型中心来分发该模型,并将其作为 CORD - COVID-19 挑战的一部分进行推广,使社区可以轻松使用。
案例2:任务训练者。纽约大学的研究人员有兴趣开发一个测试平台,用于评估 Transformers 在各种不同语义识别任务上的性能。他们的框架 Jiant 【Yada Pruksachatkun et al., jiant: A software toolkit for research on general-purpose text understanding models, 2020, arXiv】 允许他们实验不同的模型预训练方式并比较其输出。他们使用 Transformers API 作为通用前端,并在各种不同模型上进行微调,这促成了对 BERT 结构的研究 【Ian Tenney et al., Bert rediscovers the classical nlp pipeline, 2019, ACL】。
案例3:应用用户。Plot.ly 是一家专注于用户仪表盘和分析的公司,他们有兴趣部署一个用于自动文档摘要的模型。他们希望找到一种扩展性好且易于部署的方法,但不需要训练或微调模型。他们通过搜索模型中心找到了 DistilBART,这是一个为准确、快速推理而设计的预训练和微调过的摘要模型。他们能够直接从模型中心运行和部署该模型,无需任何研究或机器学习专业知识。
部署目标。Transformers 一个日益重要的目标是让模型能够轻松高效地部署到生产环境中。不同的用户有不同的生产需求,部署通常需要解决与训练截然不同的挑战。因此,该库支持多种不同的生产部署策略。
PyTorch与TensorFlow的互操作性。该库的一个核心特性是模型同时支持 PyTorch 和 TensorFlow,并且两个框架之间具有互操作性。在一个框架中训练的模型可以通过标准序列化保存,并能在另一个框架中从保存的文件中无缝重新加载。这使得在模型的生命周期中(训练、服务等)从一个框架切换到另一个框架变得特别容易。
框架原生部署方案。每个框架都有其部署建议。例如,在 PyTorch 中,模型与 TorchScript 兼容,后者是 PyTorch 模型的一种中间表示,可以在 Python 中以更高效的方式运行,或者在 C++ 等高性能环境中运行。因此,微调后的模型可以导出到生产友好的环境中,并通过 TorchServing 运行。TensorFlow 在其生态系统内包含多种服务选项,这些选项可以直接使用。
中间格式导出与性能优化。Transformers 还可以将模型导出为中间神经网络格式以进行进一步编译。它支持将模型转换为开放神经网络交换格式(ONNX)进行部署。这不仅使模型能够以标准化的可互操作格式运行,还带来了显著的速度提升。图4显示了与 ONNX 团队合作优化 Transformers 库中的 BERT、RoBERTa 和 GPT-2 的实验结果。使用这种中间格式,ONNX 在该模型上实现了近4倍的加速。该团队还在试验其他有前景的中间格式,如 JAX/XLA 【James Bradbury et al., JAX: composable transformations of Python+NumPy programs, 2018】 和 TVM 【Tianqi Chen et al., {TVM}: An automated end-to-end optimizing compiler for deep learning, 2018, OSDI】。
边缘设备部署。随着 Transformers 在所有 NLP 应用中越来越广泛地使用,将其部署到手机或家用电子产品等边缘设备变得日益重要。模型可以使用适配器将模型转换为适用于嵌入 iOS 应用程序的 CoreML 权重,以实现边缘设备上的机器学习。类似的方法也可用于安卓设备。
本文作为一篇系统性论文,并未提供一个统一的、标准的实验环境配置。相关配置信息散布在不同章节的描述中。
SciBERT 使用 PubMed 数据集进行训练。tokenizers 库来提升性能。TorchScript, TorchServing, TensorFlow Serving, ONNX, JAX/XLA, TVM, 以及用于移动端的 CoreML。本文的实验结果主要体现在库的采用率、社区活跃度以及部署性能上。
推理性能优化 (图 4):
社区案例研究:
随着 Transformer 架构和预训练技术在自然语言处理(NLP)中扮演越来越重要的角色,让研究人员和最终用户能够方便地接触和使用这些模型变得至关重要。Transformers 是一个开源库和社区,旨在帮助用户访问大规模预训练模型,在其基础上进行构建和实验,并以最先进的性能将它们部署到下游任务中。自发布以来,Transformers 获得了显著的自然增长,并已准备好继续提供核心基础设施,同时帮助促进对新模型的访问。