[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime

使用HuggingFace和ONNX Runtime更快更小得量化NLP模型

原文地址 

https://medium.com/microsoftazure/faster-and-smaller-quantized-nlp-with-hugging-face-and-onnx-runtime-ec5525473bb7icon-default.png?t=M3K6https://medium.com/microsoftazure/faster-and-smaller-quantized-nlp-with-hugging-face-and-onnx-runtime-ec5525473bb7

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第1张图片

该文章出自HuggingFace机器学习工程师Morgan Funtowicz和微软高级软件工程师Yufeng Li。

用于自然语言处理(NLP)的Transformer模型很大。BERT-base-uncased约有1.1亿个参数,RoBERTa-base约有1.25亿个参数,GPT-2约有1.17亿个参数。每个参数都是需要32位(FP32)的浮点数。这意味着这些模型的文件大小和占用的内存都很大。更不用说需要在所有这些位上进行的所有计算了。

这些挑战使得在内存和计算资源有限的客户端设备上运行Transformer模型变得困难。人们对隐私和数据传输成本的认识日益提高,使得设备上的推断具有吸引力。即使在云上,延迟和成本也非常重要,任何大型应用程序都需要为此进行优化。

量化和蒸馏是处理这些尺寸和性能挑战的两种常用技术。这些技术是互补的,可以一起使用。在之前的一篇HuggingFace的博文中讲到了蒸馏。这里我们讨论量化,它可以很容易地应用于您的模型,而无需再训练。这项工作建立在我们之前分享的ONNX Runtime优化推理的基础上,可以为您提供额外的性能提升,以及在客户端设备上解除阻塞推理。

量化

量化以较低的位宽数字近似浮点数,从而显著减少内存占用并提高性能。量化可能会导致精度损失,因为较少的位会限制精度和值的范围。然而,研究人员已经广泛证明,权重和激活可以用8位整数(INT8)表示,而不会导致精度上的显著损失。

与FP32相比,INT8表示将数据存储和带宽减少了4倍,这也降低了能耗。就推理性能而言,整数计算比浮点数学更有效。

更快推理

性能因输入数据和硬件而异。对于在线推断,小批量(输入数量)是常见的。序列长度(输入的大小)因场景而异。在我们的基准测试中,我们测量了1和4的批量大小,序列长度从4到512不等。现代CPU支持用于高性能计算的高级向量扩展2(AVX2)指令集。最新的英特尔CPU还支持AVX512矢量神经网络指令(AVX512 VNNI),该指令旨在加速深入学习INT8推理性能。我们在两台机器上对BERT-base-uncased、RoBERTa-base和GPT-2的性能进行了基准测试:
    AVX2: Intel(R) Xeon(R) CPU E5–1650 v4 @ 3.60GHz
    VNNI: Intel(R) Xeon(R) Gold 6252 CPU @ 2.10GHz

对于PyTorch,我们将PyTorch 1.6与TorchScript一起使用。对于PyTorch+ONNX Runtime,我们使用了HuggingFace的convert_graph_to_ONNX方法,并使用ONNX Runtime1.4进行推断。

通过使用ONNX Runtime的量化,我们看到了与原始模型相比的显著性能提升:

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第2张图片

相对于原始PyTorch模型的加速来自量化和ONNX Runtime的加速。让我们看看它是如何分解的。与ONNX RuntimeFP32相比,我们发现,对于VNNI机器上的所有三种模型,ONNX RuntimeINT8量化可以将推理性能提高6倍。我们在AVX2机器上看到了更小但仍然显著的加速。

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第3张图片

与在AVX2和VNNI机器上使用PyTorch INT8量化相比,使用ONNX Runtime INT8量化始终显示出性能提升:

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第4张图片

我们的详细数据将在本文末尾分享。

更小的模型

在将原来的PyTorch FP32模型转换为ONNX FP32格式后,模型大小几乎与预期相同。然后,我们在两个模型上应用了各自的INT8量化过程。ONNX Runtime能够量化更多的层,并将模型大小减少了近4倍,生成的模型大约是量化PyTorch模型的一半。

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第5张图片

不要忘了准确率

更小更快是很好的,但我们还需要确保模型返回良好的结果。鉴于准确度是特定于任务的,我们采用了经过微调的BERT模型进行准确度基准测试。该模型使用通用语言理解评估基准(GLUE)中的微软研究释义语料库(MRPC)任务的Hugging Face Transformers中的基于BERT模型进行了微调。MRPC是用于语言分类的常见NLP任务。

准确度衡量总预测值中正确预测值的数量。这并不是一个完整的衡量标准,因为当假阴性很多时,它就不能很好地发挥作用。因此,我们还计算了F1分数,同时考虑了精确度和召回率。当你更关心正例时,这会更有用。与Pytork量化相比,即使使用较小的模型,ONNX Runtime量化也显示出相同的精度和略高的F1分数。

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第6张图片

开始尝试

我们希望你有兴趣亲自尝试一下。以下是开始量化HuggingFace模型的说明,以减小尺寸并加快推断速度。

步骤1:将Hugging Face Transformer模型导出到ONNX

Hugging Face Transformers库包含一个工具,可以轻松使用ONNX Runtime。convert_graph_to_onnx.py脚本位于Transformers存储库的根目录下,并接受一些参数,例如要导出的模型和要从中导出的框架(PyTorch或TensorFlow),以生成关联的ONNX图。


结合ONNX Runtime 1.4版本中的量化支持,我们还更新了HuggingFace Transformers转换脚本,并添加了一个新的命令行参数——quantize,以便直接从Transformers轻松导出量化的ONNX模型:

python convert_graph_to_onnx.py --framework pt --model bert-base-uncased --quantize bert-base-uncased.onnx

这将输出全精度ONNX模型和量化ONNX模型。

注意:使用-quantize选项时,当前对模型大小的限制是小于2GB。下一个ONNX Runtime版本将删除此选项。

步骤2:使用ONNX Runtime进行推理

一旦得到量化模型,就可以在ONNX Runtime以通常的方式推断这个INT8模型。ONNX Runtime为不同的语言提供了各种API,包括Python、C、C++、C#、Java和JavaScript,因此您可以将其集成到现有的服务堆栈中。下面是Python代码的样子:

session = onnxruntime.InferenceSession(onnx_model_path)
session.run(None, ort_inputs)

你可以在这个笔记本的HuggingFace上找到这些步骤。本笔记本显示了端到端的流程,使用了一个经过微调的HugginFace BERT模型,用于MPRC任务和GLUE数据。

资源

ONNX Runtime INT8 量化在HuggingFace transformer模型上显示了非常有效的性能加速和模型尺寸缩减结果。我们希望在您尝试生产场景时听到任何反馈或建议。GitHub: Hugging Face Transformers库 和 ONNX Runtime。

到目前为止,我们一直在讨论推理优化。在未来的博客中,我们将介绍训练优化,以帮助您显著减少训练和微调NLP模型所需的时间。

性能测试结果

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

BERT
 

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第7张图片

RoBERTa
 

[译文]Faster and smaller quantized NLP with Hugging Face and ONNX Runtime_第8张图片

GPT-2
 

你可能感兴趣的:(深度学习,自然语言处理,自然语言处理,深度学习,人工智能)