转换onnx_模型推理加速系列|如何用ONNX加速BERT特征抽取(附代码)

本文介绍如何使用ONNX和ONNXRuntime加速BERT模型的CPU推理,通过将PyTorch的BERT模型转换为ONNX格式并进行优化,实现了约3倍的性能提升,单条请求耗时约40ms。
摘要由CSDN通过智能技术生成

0346960fadf6932db01e45d4dca1758e.png

卖切糕的小男孩今天化身冒总和李队的迷弟,一来致谢两位室友当年球场带,二来今天分享的主题与之密(擦)切(边)相关,都是关于速度。小伙伴们都知道,BERT体系模型庞(臃)大(肿),各种刷榜自然是香,但是在工业落地上的推理性能一直是道坎。如何高效提升NLP,在今年的EMNLP2020上有一场tutorial非常广泛地介绍了各种提高NLP效率的奇技淫巧,感兴趣的可以☛戳这里。本文从模型格式角度介绍如何用ONNX来加速BERT模型推理,并最终实现CPU上3倍提速,单条请求耗时约40ms。

503962366de4ee782bff4d24cd461fa3.png

简介

本次实验目的在于介绍如何使用ONNX + ONNXRuntime加速BERT模型推理。实验中的任务是利用BERT抽取输入文本特征,至于BERT在下游任务(如文本分类、问答等)上如何加速推理,后续再介绍。

PS:本次的实验模型是BERT-base中文版本次实验的完整代码,请后台回复"加速"

环境准备

由于ONNX是一种序列化格式,在使用过程中可以加载保存的graph并运行所需要的计算。在加载ONNX模型之后可以使用官方的onnxruntime进行推理。出于性能考虑,onnxruntime是用c++实现的,并为c++、C、c#、Java和Python提供API/Bindings。

在本文的示例中,将使用Python API来说明如何加载序列化的ONNX graph,并通过onnxruntime在后端执行inference。Python下的onnxruntime有2种:

  • onnxruntime: ONNX + MLAS (Microsoft Linear Algebra Subprograms)
  • onnxruntime-gpu: ONNX + MLAS + CUDA

可以通过命令安装:

pip install transformers onnxruntime onnx psutil matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install transformers onnxruntime-gpu onnx psutil matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/

本文这里先以 CPU 版进行对比。

PS:本次实验环境的CPU型号信息如下:

32 Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz

Pytorch Vs ONNX

将 transformers 模型导出为 ONNX

huggingface 的 transformers 已经提供将 PyTorch或TensorFlow 格式模型转换为ONNX的工具(from transformers.convert_graph_to_onnx import convert)。Pytorch 模型转为 ONNX 大致有以下4个步骤:

  1. 基于transformers载入PyTorch模型。
  2. 创建伪输入(dummy inputs),并利用伪输入在模型中前向inference,换一句话说用伪输入走一遍推理网络并在这个过程中追踪记录操作集合。因为convert_graph_to_onnx这个脚本转为ONNX模型的时候,其背后是调用torch.onnx.export,而这个export方法要求Tracing网络。
  3. <
BERT(Bidirectional Encoder Representations from Transformers)是一种预训练模型,可以用于文本特征提取。BERT模型通过在大规模文本数据上进行无监督的预训练来学习通用的文本表示,在此基础上可以进行各种下游任务的微调或特征提取。 要使用BERT模型抽取文本特征,首先需要将输入的文本转换BERT所需的格式。对于英文文本,可以使用WordPiece标记化方法将文本拆分为词片段,并添加特殊的标记(如[CLS]和[SEP])来表示句子的开始和结束。对于中文文本,可以使用字级别的标记化方法。 然后,将标记化后的文本输入到BERT模型中,获取模型的隐藏状态。BERT模型通常有多层Transformer编码器,每层都会输出相应的隐藏状态。可以选择使用最后一层的隐藏状态,或者将多个层的隐藏状态进行融合,得到最终的文本特征表示。 一种常用的方法是将最后一层的隐藏状态与特定位置的标记(如[CLS])进行连接,得到表示整个句子的特征向量。这个特征向量可以用作文本分类、句子相似度计算等下游任务的输入。 除了最后一层的隐藏状态,BERT模型还可以提供其他层的隐藏状态,这些隐藏状态可以更细粒度地表示文本的各个方面。可以根据具体的任务需求选择相应的隐藏状态进行特征提取。 需要注意的是,由于BERT模型参数较多,对大规模文本数据进行完整的特征提取可能会比较耗时。为了提高效率,可以使用批量化技术对多个文本样本进行并行处理,或者使用模型压缩等方法减少模型的大小和计算量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值