[译文]Accelerate your NLP pipelines using Hugging Face Transformers and ONNX Runtime

使用HuggingFace Transformers和onnx runtime加速NLP piplines

原文地址:https://medium.com/microsoftazure/accelerate-your-nlp-pipelines-using-hugging-face-transformers-and-onnx-runtime-2443578f4333icon-default.png?t=M3K6https://medium.com/microsoftazure/accelerate-your-nlp-pipelines-using-hugging-face-transformers-and-onnx-runtime-2443578f4333

这篇博客来自HuggingFace的Morgan Funtowicz和微软的Tianlei Wu

Transformer模型已经席卷了nlp领域。在创纪录的几个月里,从打破基线到被越来越多的公司使用。模型的应用包含了文本分类,信息抽取,文本生成,机器翻译和文本摘要。

但是考虑到底层架构的复杂性,这些Transformer模型仍然难以大规模训练和部署。训练可能需要几天时间,并且微调关键参数的过程复杂。Transformer模型也需要高度可扩展且可用的环境来进行推理和部署。

今天,我们将分享ONNX Runtime团队和HuggingFace如何合作,以解决和减少Transformer模型训练和部署中的这些挑战。这是一个简化训练并降低推断成本的解决方案。

使NLP更易理解

HuggingFace是一家为实现强大但是易用NLP如tokenizer和transformers而创建开源库的公司。HuggingFace Transformers库提供自然语言理解和自然语言生成的通用框架,比如BERT,GPT-2,RoBERTa,XLM,DistilBert,XLNET,and T5。目前已经包含了超过100种语言的上千个模型。
这些模型在很多的NLP任务中易用且表现强大。模型训练、评估和共享可以通过几行代码实现。该库还支持PyTorch和TensorFlow之间的深度互操作性,以及灵活选择正确框架进行训练、评估和部署。

ONNX Runtime在GPU或CPU生产环境上帮助加速PyTorch和TensorFlow模型。作为一个为性能和广泛平台支持而构建的开源库,ONNX Runtime被用于每天超过200多亿推次断的产品和服务中。ONNX Runtime对Transformer模型进行了优化,加速比高达17倍。延迟、吞吐量和成本方面的这些改进使得部署Transformer模型更加实用。

现在,您可以同时使用ONNX Runtime和HuggingFace Transformers来改善训练和部署NLP模型的体验。HuggingFace可以使得推断Transformer模型变得很容易,通过使用ONNX Runtime和convert_graph_to_onnx.py生成一个可以由ONNX Runtime加载的模型。

NLP推断达到更好效果

推理性能取决于您运行的硬件、批量大小(一次要处理的输入数量)和序列长度(输入大小)。如果你能访问GPU,推断将比在CPU上更快。虽然较大的批量在训练和离线处理期间很有用,但我们通常使用批量大小为1进行在线推断。序列长度因场景而异:更短的长度用于处理查询,而问答和摘要场景使用更长的序列长度。

我们在相同的CPU和GPU配置下,使用不同的批量大小和序列长度,测量了三个HuggingFace Transformer模型的延迟。CPU性能测试在一台Intel Xeon E5-2620 v2处理器包含12个逻辑核的台式机上完成。我们使用NVIDIA V100-PCIE-16GB GPU在Azure Standard_NC12s_v3虚拟机上测试FP32和FP16的GPU测试。我们使用了一个更新版本的HuggingFace基准测试脚本来运行测试。PyTorch版本使用1.5,ONNX Runtime版本使用1.3。

在GPU上,FP16配置下对比PyTorch,PyTorch+ONNX Runtime的加速比在BERT模型上为5.0x,RoBerta模型为4.7x,GPT-2模型达到4.4x。在CPU和GPU/FP32上小一点,但是还是有不错的加速提升。

在GPU上,较小的序列长度通常比较大的序列长度显示出更多的增益。我们的详细数据将在本文末尾分享。

开始使用

我们想向您展示如何将HuggingFace Transformer模型的推断与ONNX Runtime结合到您的项目中。您还可以在自己的硬件和型号上进行基准测试。

步骤如下:

1.将HuggingFace Transformer模型导出到ONNX

运行位于transformers/convert_graph_to_onnx.py的转换脚本。该脚本接受一些参数,例如要导出的模型和要从中导出的框架(PyTorch或TensorFlow)。

python convert_graph_to_onnx.py --framework pt --model bert-base-cased bert-base-cased.onnx

2.应用最新的ONNX Runtime优化

ONNX Runtime在加载模型时自动应用大多数优化。一些尚未集成到ONNX Runtime中的最新优化可以作为一个脚本提供,用于调整模型以获得最佳性能。

您可以访问优化脚本,并使用以下命令在模型上运行它:
   

pip install onnxruntime-tools 
python -m onnxruntime_tools.optimizer_cli --input bert-base-cased.onnx --output bert-base-cased.onnx --model_type bert

--mode_type参数触发特定的优化策略。该脚本还提供了一个标志--float16,以利用较新GPU带来的混合精度性能增益。如果使用的是TensorFlow版本的模型,也应该使用此脚本。ONNX Runtime存储库中进一步描述了这些选项和用法。

3.使用ONNX Runtime进行推理

为了提高性能,ONNX Runtime是用C++编写的,并为Python、C、C++、C#和Java提供API/绑定。它是一个轻量级库,允许您将推理集成到用多种语言编写的应用程序中。

下面是Python中的代码。在Python中,我们使用HuggingFace库中的标记器。在其他语言中,您可能需要实现自己的标记器来处理字符串输入,并将其转换为模型期望作为输入的张量。

你可以在下面的链接中找到一个笔记本,上面显示了HuggingFace的所有步骤。
https://github.com/huggingface/notebooks/blob/main/examples/onnx-export.ipynbicon-default.png?t=M3K6http://pip install onnxruntime-tools      python -m onnxruntime_tools.optimizer_cli --input bert-base-cased.onnx --output bert-base-cased.onnx --model_type bert

Resources


GitHub: Hugging Face Transformers库 和 ONNX Runtime

性能测试结果

我们使用基准脚本来衡量推理性能。该基准还测量IO绑定,这可以显著加快推理速度。我们没有在这里的结果中包括这一点。

以下延迟以毫秒为单位。PyTorch是指带有TorchScript的PyTorch 1.5。PyTorch+ONNX Runtime是指使用ONNX Runtime1.3导出和推断的PyTorch版本的huggingFace模型。

BERT
 

RoBERTa
 

GPT-2
 

对于GPT2测试,我们禁用了过去的状态输入/输出。启用过去状态可以通过重用中间结果来帮助减少计算。过去的状态优化被添加到ONNX Runtime中,这将进一步帮助提高使用大序列时的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值