关于ml:在-Amazon-Inferentia-上为-PyTorch-自然语言处理应用程序实现-12-倍的吞吐量和低延迟

42次阅读

共计 6696 个字符,预计需要花费 17 分钟才能阅读完成。

Snap、Alexa 和 Autodesk 等亚马逊云科技客户始终在应用 Amazon Inferentia 部署各种机器学习 (ML) 模型以实现高性能和低成本。自然语言解决 (NLP) 模型在实时和离线批处理应用案例中越来越受欢迎。咱们的客户在许多应用程序中部署这些模型,例如聊天机器人、搜寻、排名、文档摘要和自然语言了解。借助 Amazon Inferentia,您还能够在开源 NLP 模型上实现开箱即用的高性能和低成本,而无需进行自定义。

  • Amazon Inferentia
    https://aws.amazon.com/machin…

在本文中,您将理解如何在低提早需要下最大限度地进步实时应用程序和批处理的吞吐量,而 高吞吐量 低成本 是 Amazon Inferentia 的要害性能指标。在本文中,咱们应用 HuggingFace Transformers 预训练的 BERT Base 模型,不须要对模型进行任何批改,并且在 PyTorch 框架级别只更改一行代码即可应用 Amazon Inferentia。与在 GPU 上部署的雷同模型相比,该解决方案在 Amazon Inferentia 上以低 70% 的老本实现了 12 倍的吞吐量。

  • Transformers
    https://github.com/huggingfac…

为了最大限度地进步 Hugging Face 模型在 Amazon Inferentia 上的推理性能,您能够应用 Amazon Neuron PyTorch 框架进行集成。Neuron 是一款软件开发工具包 (SDK),它与常见的机器学习框架(如 TensorFlow 和 PyTorch)集成,从而扩大了框架的 API,从而使您可能在 Amazon EC2 Inf1 实例 上轻松且经济高效地运行高性能推理。只需起码的代码更改,您就能够编译和优化曾经训练好的模型,以便在 Amazon Inferentia 上运行。Neuron 团队 在一直地公布 具备新性能和模型性能改良的更新。1.13 版本 公布后,基于 Transformer 的模型性能又进步了 10%–15%,以达到更小提早和更大吞吐量,即便对于更大的 NLP 工作负载也是如此。

  • Neuron
    https://awsdocs-neuron.readth…
  • Amazon EC2 Inf1 实例
    https://aws.amazon.com/ec2/in…
  • 在一直地公布
    https://aws.amazon.com/machin…
  • 1.13 版本公布
    https://awsdocs-neuron.readth…

要自行测试 Neuron 开发工具包性能,请查看最新的实用于 PyTorch 的 利用 Neuron 性能 教程。

  • 利用 Neuron 性能
    https://awsdocs-neuron.readth…

📢 想要理解更多亚马逊云科技 最新技术公布 实际翻新 ,敬请关注在 上海、北京、深圳三地 举办的2021 亚马逊云科技中国峰会!点击图片报名吧~

NeuronCore 管道模式阐明

通过 Inf1 实例系列 提供的每个 Amazon Inferentia 芯片蕴含四个 NeuronCore。不同的实例类型将别离提供 1 到 16 个 Amazon Inferentia 芯片,在最大的实例类型 (inf1.24xlarge) 上可提供 64 个 NeuronCore。NeuronCore 是运行神经网络 (NN) 图操作的计算单位。

  • Inf1 实例系列
    https://aws.amazon.com/ec2/in…

当您编译没有管道模式的模型时,Neuron 编译器会优化所反对的 NN operation 以在繁多 NeuronCore 上运行。您能够将 NeuronCores 合并到一个组中,甚至跨 Amazon Inferentia 芯片进行组合,以运行编译后的模型。利用此配置,您能够在数据并行模式中跨 Amazon Inferentia 芯片应用多个 NeuronCore。这意味着,即便在最小的实例类型上,也能够有四个模型同时处于活动状态。在大多数状况下,四个(或更多)模型的数据并行推理可提供更高吞吐量和更低成本。这种性能晋升对提早的影响最小,因为 Amazon Inferentia 通过优化,能够最大限度地进步较小的批处理大小的吞吐量。

在管道模式下,Neuron 编译器能够齐全主动的跨多个 NeuronCore 以实现神经网络图的分区和搁置。它容许高效地应用硬件,因为管道中的 NeuronCore 运行流式推理申请,并借助读取速度更快的芯上缓存来保留模型权重。管道中的其中一个外围解决实现第一个申请后,它能够开始解决后续申请,而无需期待最初一个外围实现第一个申请的解决。即便在实时应用程序(例如批处理大小 1)上运行小型批处理大小的推断,这种流式管道推理也会进步每个外围硬件的利用率。

找到适宜单个大模型的最佳 NeuronCore 数量是一个实际的过程。应用以下近似公式是一个良好的开始,但咱们倡议尝试多种配置以实现最佳部署:

neuronCore_pipeline_cores = 4*round(number-of-weights-in-model/(2E7))

通过指定编译中 neuroncore-pipeline-cores 的值来明确最终模型管道模式下应用的 NeuronCore 的数量,要启用此性能,请将此参数增加到您所需的框架的罕用 编译流

  • 编译流
    https://awsdocs-neuron.readth…

在 TensorFlow Neuron 中,应用以下代码:

  • TensorFlow Neuron
    https://awsdocs-neuron.readth…

在 PyTorch Neuron 中,应用以下代码:

  • PyTorch Neuron
    https://awsdocs-neuron.readth…

对于 NeuronCore 管道和其余 Neuron 性能 的更多信息,请参阅 Neuron 性能。

  • Neuron 性能
    https://awsdocs-neuron.readth…

在 Amazon Inferentia 中运行 HuggingFace 问答模型

要在 Amazon Inferentia 上运行 Hugging Face BertForQuestion Answering 模型,除了导入 torch_neuron 框架之外,您只需在罕用的 Transformer 施行中增加一行额定的代码。您能够参考如下 示例

  • Hugging Face BertForQuestionAnswering 模型
    https://huggingface.co/transf…
  • 示例
    https://huggingface.co/transf…

    1from transformers import BertTokenizer, BertForQuestionAnswering
    2import torch
    3import torch_neuron
    4
    5tokenizer = BertTokenizer.from_pretrained('twmkn9/bert-base-uncased-squad2')
    6model = BertForQuestionAnswering.from_pretrained('twmkn9/bert-base-uncased-squad2',return_dict=False)
    7
    8question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"
    9inputs = tokenizer(question, text, return_tensors='pt')
    10
    11neuron_model = torch.neuron.trace(model, 
    12                                  example_inputs = (inputs['input_ids'],inputs['attention_mask']),
    13                                  verbose=1)
    14
    15outputs = neuron_model(*(inputs['input_ids'],inputs['attention_mask']))

    前述代码中额定的一行是调用 torch.neuron.trace() 办法。此调用将编译模型并返回一个新的 neuron_model() 办法,您能够应用该办法对原始输出运行推理,如脚本最初一行所示。如果您想测试此示例,请参阅 PyTorch Hugging Face 预训练 BERT 教程

  • PyTorch Hugging Face 预训练 BERT 教程
    https://awsdocs-neuron.readth…

可能编译和运行推理是优化生产中部署的模型第一步。与 GPU 部署计划(咱们将在本文前面探讨)相比,曾经能够将性能进步两倍,老本升高 70%。当您联合 NeuronCore 组和管道性能时,您能够摸索在单个 Inf1 实例中打包模型的更多其余形式。

应用 NeuronCore 组和管道优化模型部署

HuggingFace 问答模型的部署须要设置一些模型的参数。Neuron 是一个事后 (AOT) 编译器,它须要在编译时理解张量形态。为此,咱们为模型部署定义了批处理大小和序列长度。在后面的示例中,Neuron 框架从传递的输出中推断出这些:(inputs[‘input_ids’], inputs[‘attention_mask’])。

除了这两个模型参数之外,您能够设置编译参数‘–neuroncore-pipeline-cores’和环境变量‘NEURONCORE_GROUP_SIZES‘来微调您的模型服务器在 Amazon Inferentia 芯片上应用 NeuronCore 的形式。

例如,为了最大限度进步在单个 Amazon Inferentia 芯片上解决推理申请的并发工作线程数量(四个外围),您将 NEURONCORE_GROUP_SIZES=”1,1,1,1”以及增加编译参数‘–neuroncore-pipeline-cores’并设置为 1。下图形容了这种拆分。它是一个残缺的数据并行部署。

为了实现最低提早,您能够将‘–neuroncore-pipeline-cores’设置为 4 并设置 NEURONCORE_GROUP_SIZES=”4”,以便使单个模型同时应用全部四个 NeuronCore。Amazon Inferentia 芯片能够将四个推理申请作为一个流并发解决。模型管道并行部署如下图所示。

数据并行部署通过由多个工作线程并发解决申请来进步吞吐量。并行管道模式有利于升高提早,并能够因流解决行为而进步吞吐量。借助这两个额定的参数,您能够依据场景需要调整这两个参数值。

优化以实现最小提早:多核管道并行

思考应用须要低提早的应用程序,例如 序列分类 作为在线聊天机器人工作流程的一部分。当用户提交文本时,运行在后端的模型会对单个用户输出的用意进行分类,并尽可能的疾速实现推理。模型很可能必须对单个输出(批处理大小 1)申请提供响应。

  • 序列分类
    https://huggingface.co/transf…

下表比拟了 Inf1 实例与优化的 GPU 实例系列 g4dn.xlarge 在云中进行推理时的性能和老本,同时在数据并行与管道并行配置和批处理大小 1 中运行 HuggingFace BERT base 模型。比照提早指标的第 95 个百分位数 (p95),在 4 核 inf1.xlarge 和 16 核 inf1.6xlarge 实例中,咱们在管道模式下获取的值更低。Inf1 实例之间的最佳配置是 16 核的状况,其中提早升高 58%,达到了 6 毫秒。

测试的模型是 PyTorch 版本的 HuggingFace bert-base-uncase,其序列长度为 128。在 Amazon Inferentia 上,咱们编译模型以应用所有可用的外围并且并行运行整个管道。对于数据并行状况,咱们为单个外围编译模型,并配置 NeuronCore 组认为每个外围运行工作线程模型。GPU 部署应用了与 Amazon Inferentia 雷同的设置,模型在其中应用 TorchScript JIT 进行跟踪,并应用 PyTorch AMP Autocast 强制转换为混合精度。

  • HuggingFace bert-base-uncase
    https://huggingface.co/bert-b…
  • TorchScript JIT
    https://pytorch.org/docs/stab…
  • PyTorch AMP Autocast
    https://pytorch.org/docs/stab…

在 Amazon Inferentia 上应用管道模式时,吞吐量也会进步 1.84 倍,从而达到每秒 1793 句,这是 g4dn.xlarge 吞吐量的 12 倍。比起最经济高效的 GPU 选项,应用 inf1.6xlarge 能够取得更加经济高效的形式,即便每小时老本更高。依据 Amazon Elastic Compute Cloud (Amazon EC2) 按需实例定价,每百万句的老本升高了 70%。对于无奈利用 inf1.6xlarge 的全副吞吐量的提早敏感型应用程序,或者对于 BERT Small 之类的更小模型,咱们倡议在 inf1.xlarge 上应用管道模式以实现经济高效的部署。

  • Amazon Elastic Compute Cloud
    http://aws.amazon.com/ec2

优化以实现最大吞吐量:单核数据并行

一个须要在低提早的根底上尽可能进步吞吐量的 NLP 应用案例是 抽取式问答工作,它属于搜寻和文档检索管道的一部分。在这种状况下,减少并行处理的文档局部的数量能够放慢搜寻后果或进步搜寻答案的品质和广度。在这种设置中,推理更有可能批处理运行(批处理大小大于 1)。

  • 抽取式问答工作
    https://huggingface.co/transf…

为了实现最大吞吐量,咱们通过试验发现,对于之前测试的雷同模型,Amazon Inferentia 上的最佳批处理大小为 6。在 g4dn.xlarge 上,咱们运行了批处理 64(防止显存溢出的前提下)。以下后果有助于显示与 GPU 相比,批处理大小 6 如何在 inf1.6xlarge 上以低 61% 的老本提供 9.2 倍的吞吐量。

在此应用程序中,老本因素还会影响最终的服务架构设计。运行批处理推理的最经济高效的办法是应用 inf1.xlarge 实例。它的吞吐量比 GPU 代替产品高 2.3 倍,成本低 70%。在 inf1.xlarge 与 inf1.6xlarge 之间进行抉择仅取决于次要目标:谋求更低成本还是更高吞吐量。

要自行测试 NeuronCore 管道和组性能,请查看最新的实用于 PyTorch 的利用 Neuron 性能 教程。

  • 利用 Neuron 性能
    https://awsdocs-neuron.readth…

论断

在本文中,咱们应用 NeuronCore 组和管道性能摸索了优化 NLP 模型部署的形式。Amazon Neuron 开发工具包与 PyTorch 的原生集成使您能够编译和优化 HuggingFace Transformers 模型,从而以最小的代码更改在 Amazon Inferentia 上运行。通过将部署架构调整为管道并行,BERT 模型实现了实时应用程序的更低提早,其吞吐量比 g4dn.xlarge 解决方案高 12 倍,同时运行老本升高了 70%。对于批处理推理,咱们的吞吐量进步了 9.2 倍,老本升高了 60%。

本文中形容的 Neuron 开发工具包性能也实用于其余 ML 模型类型和框架。无关更多信息,请参阅 Amazon Neuron 文档

  • Amazon Neuron 文档
    https://awsdocs-neuron.readth…

本篇作者


Fabio Nonato de Paula
Amazon Annapurna Labs 的高级解决方案架构师经理。
他帮忙客户应用 Amazon Inferentia 和 Amazon Neuron 开发工具包减速和扩大 Amazon Web Services 中的机器学习工作负载。Fabio 热衷于遍及减速 ML 模型推理,并将深度学习模型投入生产。在工作之余,Fabio 喜爱在利弗莫尔山谷的山丘上骑摩托车或者浏览。


Mahadevan Balasubramaniam
自主计算的首席解决方案架构师
在深度学习、工业零碎大规模构建和部署数字孪生畛域领有近 20 年的教训。Mahadevan 领有麻省理工学院的机械工程博士学位,并领有超过 25 项专利和出版物。

正文完
 0