把BERT的推断速度提升17倍

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:EMMA NING

编译:ronghuaiyang

导读

微软刚刚开源了Transformer的突破性优化,大大提升了CPU和GPU上的推理速度。

用于自然语言处理的最流行的深度学习模型之一是BERT。由于需要大量的计算,在大规模推断上BERT计算量非常大,甚至在严格的延迟约束下都不可能。最近,我们分享了“Bing has improved BERT inference on GPU for its real-time”,在必应的延迟限制内,每秒服务超过100万个BERT推断。我们很高兴地宣布,微软已经在ONNX Runtime中开源了这些优化的增强版本,并将它们扩展到GPU和CPU上。

有了ONNX Runtime,人工智能开发人员现在可以很容易地在CPU和GPU硬件上生产出高性能的大型transformer模型,使用和微软一样的技术来服务客户。

Bing里的自然语言处理

为了向我们的客户提供最相关的结果,Bing使用了最先进的自然语言处理(NLP)技术来更好地理解用户查询、网页和其他文档。NLP的一个关键组件是语言表示模型,如BERT、RoBERTa或MT-DNN。必应开发和调优了自己的语言表征模型,用于网络搜索,问答,以及图像的描述等任务上面。

然而,在实时生产环境中使用大型的transformer network会带来延迟和成本方面的挑战,因为为每个查询运行12层或24层的BERT在计算上非常昂贵。正如去年11月宣布的那样,我们首先使用知识蒸馏将较大的模型浓缩成一个三层的BERT模型,没有显著的精度损失,显著降低了计算成本。但是,经过提炼的三层BERT模型仍然以77ms的延迟为基准,每秒运行数百万个查询和文档的速度仍然非常昂贵。为了进一步优化,使用c++ api重新实现了整个模型,充分利用了GPU架构,与CPU相比,该架构实现了800x的吞吐量提升。

一旦这些优化在Bing产品中成功使用,就有更多的事情要做。由于这些大型的transformer network可用于web搜索之外的更多NLP任务,所以我们需要一种简单的方法来为其他人共享这些有益的工作。当前的解决方案要求每个模型开发人员使用我们的c++库重新实现模型,这是非常耗时的。为了进一步普及transformer推理并使其他人能够从这些改进中获益,我们进一步优化了它们,将它们扩展到CPU,并在ONNX Runtime中开放它们的源代码。

使用ONNX Runtime实现17x BERT推理加速

ONNX Runtime是一个高性能的机器学习模型推理引擎。它与PyTorch、TensorFlow以及许多其他支持ONNX标准的框架和工具兼容。ONNX Runtime设计了一个开放和可扩展的体系结构,通过利用内置的图形优化和跨CPU、GPU和边缘设备的各种硬件加速功能,可以轻松地优化和加速推理。ONNX Runtime可以很容易地插入到你的技术堆栈中,因为它可以在Linux、Windows、Mac和Android上工作,并且为Python、c#、c++、C和Java提供了方便的api。

像BERT这样的Transformer模型由许多操作符组成。图形优化,从小的图形简化和节点清除到更复杂的节点融合和布局优化,是构建在ONNX Runtime中的一项基本技术。由于BERT模型主要由堆叠的Transformer单元组成,我们通过将多个基本运算符的关键子图融合成CPU和GPU的单一内核来优化每个单元,包括Self-Attention层、LayerNormalization层和Gelu层。这大大减少了大量基本计算之间的内存复制。

另外,在Self-Attention的CPU实现中,根据Self-Attention heads的数量对矩阵Q、K、V的列进行了划分。通过这种优化,我们可以显著提高并行性,并充分利用可用的CPU内核。并且,Q、K、V全连接后的转置运算可以在GEMM中进行计算,进一步降低了计算成本。

通过这些优化,ONNX Runtime在Azure标准NC6S_v3 (GPU V100)上对128个序列长度和批大小为1的BERT-SQUAD执行推理:

  • 12层 fp16 BERT-SQUAD为1.7ms。

  • 24层 fp16 BERT-SQUAD为4.0ms。

下面是ONNX Runtime上3层fp32 BERT与128序列长度的详细的性能数字。在CPU上,我们看到了17x的加速,在GPU上,我们看到了超过3倍的加速。

在全局大规模使用ONNX Runtime推理

随着最新的BERT优化在ONNX Runtime可用,Bing将transformer推理代码库转换为联合开发的ONNX Runtime。ONNX不仅在Bing流量范围内对大型transformer网络进行了推理,而且新的优化还降低了Bing的延时。此外,Bing发现ONNX Runtime更容易使用,并将新场景优化的重用时间从几天缩短到几个小时。

除了Bing之外,ONNX Runtime还被微软的数十种产品和服务所部署,包括Office、Windows、Cognitive services、Skype、Bing Ads和PowerBI等。ONNX Runtime用于计算机视觉、语音、语言处理、预测等各种模型。与以前的推理解决方案相比,团队在相同的硬件上实现了最多18倍的性能改进。

开始使用BERT加速

你可以利用微软的技术在你自己的产品中使用的相同的加速,不管你是针对云还是智能边缘,或者你是使用cpu还是gpu。我们开始:

  1. 使用或从流行的框架(如PyTorch或TensorFlow)加载预训练的模型。

  2. 通过从PyTorch导出或从TensorFlow/Keras转换为ONNX格式,为优化推断准备模型。

  3. 使用ONNX Runtime进行跨多个平台和硬件的高性能推理。

我们提供了PyTorch BERT加速:http://aka.ms/pytorchbertwithort和TensorFlow BERT加速:http://aka.ms/tfbertwithort的示例代码。

—END—

英文原文:https://cloudblogs.microsoft.com/opensource/2020/01/21/microsoft-onnx-open-source-optimizations-transformer-inference-gpu-cpu/

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧

### BERT模型的性能优化方法 #### 训练阶段的性能优化 在训练过程中,为了提高BERT模型的效率和效果,可以采用以下几种技术: 1. **批量大小的选择** 批量大小直接影响到GPU显存利用率和收敛速度。较大的批量通常能够更稳定地收敛,但也可能增加显存需求。因此,在实际操作中可以根据硬件条件选择合适的批量大小[^4]。 2. **混合精度训练** 利用半精度浮点数(FP16)代替单精度浮点数(FP32),可以在减少内存占用的同时加速计算。这种方法通过动态缩放梯度防止溢出来实现稳定性。 3. **分布式训练** 当单一设备无法满足大规模数据集的需求时,可以通过多机多卡的方式分担计算压力。PyTorch中的`DistributedDataParallel`模块或者TensorFlow的策略接口可以帮助开发者轻松设置跨节点同步机制。 4. **学习率调度器** 合理的学习率调整策略对于快速找到最优解至关重要。Warmup-Learning Rate Scheduler是一种常用的方法,它先让初始几轮迭代使用较低的学习率逐步升温至正常水平再降温直至结束训练周期。 #### 推断阶段的性能优化 进入推理环节后,则需考虑降低延迟并保持较高的吞吐量: 1. **量化技术的应用** 将权重从高比特位压缩成低比特位表示形式(比如INT8),从而减小存储空间消耗,并加快前向传播运算时间。不过需要注意的是这可能会带来一定精确性的牺牲。 2. **剪枝与稀疏化处理** 移除那些对最终预测贡献较小的部分神经元连接关系形成更加紧凑轻便的新结构版本。这种做法既减少了参数数量又提升了运行效率。 3. **蒸馏(Distillation)** 把复杂的大规模教师网络的知识迁移到相对简单的学生模型上完成同样的任务目标。这样不仅可以大幅削减资源开销还能维持接近原版的表现力。 ```python import torch from transformers import BertForSequenceClassification, BertTokenizerFast # 加载预训练好的bert-base-uncased模型及其对应的tokenizer model_name = 'bert-base-uncased' tokenizer = BertTokenizerFast.from_pretrained(model_name) model = BertForSequenceClassification.from_pretrained(model_name) def optimize_model_for_inference(): # 应用量化 model_quantized = torch.quantization.convert(torch.quantization.prepare(model.eval(), inplace=False)) return model_quantized ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值