模型推理加速系列 | 07: 以BERT为例全面评测各种推理加速方案

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 今天这篇小作文尝试以NLP领域中的常用模型BERT为例(仅将输入文本进行encode),综合评测包括Pytorch、ONNX、JIT、TensorRT和OpenVino在内这5种推理方案的性能。

简介

冬至夜月圆,霜露点清银。枫叶落尽霜,寒风凛冽水。山河冰封路,长夜独酌愁。火炉照暖家,窗外雪花飞。小伙伴们好,我是微信公众号:小窗幽记机器学习的首席试药师:卖布洛芬的小男孩。上面这首诗是最近顶流ChatGPT模仿李白风格创作的,仅供欣赏。前文以CV领域中的resnet18模型为例综合评测各种推理加速方案,具体评测结果可以参考之前的小作文:模型推理加速系列 | 06: 基于resnet18加速方案评测。今天这篇小作文尝试以NLP领域中的常用模型BERT为例(仅将输入文本进行encode),综合评测包括Pytorch、ONNX、JIT、TensorRT和OpenVino在内这5种推理方案的性能。

模型导出

导出 ONNX

如何将Pytorch版BERT导出为ONNX格式可以参考之前的文章:模型推理加速系列|04:BERT模型推理加速 TorchScript vs. ONNX

导出 TorchScript

如何将Pytorch版BERT导出为TorchScript格式可以参考之前的文章:模型推理加速系列|04:BERT模型推理加速 TorchScript vs. ONNX,更多关于TorchScript模型格式的介绍可以参考之前的文章:模型推理加速系列|05:TorchScript模型格式简介及其使用

导出 TensorRT

在TensorRT这部分依次评测变长定长版(指文本输入长度上的限制),所以在导出TensorRT模型格式的时候,导出支持变长和定长文本输入的两个版本。

导出输入文本定长版 TensorRT engine格式模型示例如下:

CUDA_VISIBLE_DEVICES=0 trtexec --onnx=/home/model_zoo/nlp/onnx/bert-base-chinese/bert_dynamic.onnx  --minShapes=input_ids:1x32,attention_mask:1x32,token_type_ids:1x32 --optShapes=input_ids:64x32,attention_mask:64x32,token_type_ids:64x32 --maxShapes=input_ids:128x32,attention_mask:128x32,token_type_ids:128x32 --saveEngine=/home/model_zoo/nlp/tensorrt/bert_static_32.engine

PS:

以上导出的模型在batch size维度上的动态的,但是只支持长度为32的输入文本。

导出输入文本变长版 TensorRT engine格式模型示例如下:

CUDA_VISIBLE_DEVICES=0 trtexec --onnx=/home/model_zoo/nlp/onnx/bert-base-chinese/bert_dynamic.onnx --minShapes=input_ids:1x8,attention_mask:1x8,token_type_ids:1x8 --optShapes=input_ids:64x32,attention_mask:64x32,token_type_ids:64x32 --maxShapes=input_ids:128x64,attention_mask:128x64,token_type_ids:128x64 --saveEngine=/home/model_zoo/nlp/tensorrt/bert_dynamic_max64.engine

导出 OpenVino

使用的镜像是openvino/ubuntu20_runtime:latest。先用之前Pytorch格式模型转为的ONNX格式模型,再将ONNX格式模型转为OpenVino所需要的格式。这里需要用到mo命令,安装方式如下:pip3 install openvino-dev[all]。将ONNX模型转为openvino的命令如下:

mo --input_model /home/model_zoo/nlp/onnx/bert-base-chinese/bert_dynamic.onnx --input "input_ids[-1 128],attention_mask[-1 128],token_type_ids[-1 128]" --output_dir /home/model_zoo/nlp/openvino/bert/ --data_type FP32

评测结果

输入文本长度为 8

CPU:

batch size Pytorch ONNX JIT OpenVino(定长版) OpenVino(变长版)
1 24.5 10.1 18.8 12.1 12.5
2 46.7 12.0 35.5 14.7 16.2
4 53.9 18.0 40.9 25.4 25.5
8 65.2 30.3 50.6 35.0 36.8
16 82.6 53.6 65.3 66.1 66.2
32 126.3 99.1 105.9 112.7 112.1
64 236.2 194.2 192.9 198.5 200.1
128 474.9 368.2 360.3 362.1 364.6

GPU:

batch size Pytorch ONNX JIT TensorRT(定长版) TensorRT(变长版)
1 10.7 6.5 8.3 4.8 7.9
2 11.6 6.6 8.3 5.1 7.9
4 10.9 7.1 7.2 5.5 8.0
8 11.6 10.0 11.3 7.8 8.0
16 15.8 14.9 15.4 13.0 20.9
32 24.3 23.8 23.9 20.6 75.3
64 44.6 42.6 44.4 37.2 287.9
128 86.5 87.6 83.9 73.5 568.1

输入文本长度为 16

CPU:

batch size Pytorch ONNX JIT OpenVino(定长版) OpenVino(变长版)
1 46.1 12.2 35.5 14.6 16.3
2 52.7 18.1 41.9 21.8 24.2
4 64.1 30.0 51.9 31.9 38.6
8 81.1 52.7 68.0 52.5 66.2
16 125.4 97.4 111.1 102.6 112.4
32 235.2 190.8 216.7 185.8 197.1
64 430.8 362.8 352.6 340.7 366.3
128 754.7 725.4 769.1 620.1 718.5

GPU:

batch size Pytorch ONNX JIT TensorRT(定长版) TensorRT(变长版)
1 11.0 6.6 8.0 5.1 21.1
2 11.2 7.1 7.2 5.5 21.1
4 11.8 10.2 11.4 7.9 21.4
8 16.2 15.2 15.8 13.5 21.9
16 25.1 24.7 24.8 20.9 20.8
32 45.9 43.7 45.4 38.0 74.3
64 88.8 90.1 87.2 75.8 286.9
128 174.2 174.8 170.8 148.6 571.2

TensorRT 模型是定长输入,如果使用变长版TensorRT,但是输入的文本长度设置为16。

输入文本长度为 32

CPU:

batch size Pytorch ONNX JIT OpenVino(定长版) OpenVino(变长版)
1 45.8 18.0 39.7 21.8 22.7
2 64.7 29.8 51.1 32.2 32.4
4 80.6 52.9 65.6 52.7 52.0
8 129.4 96.8 115.2 95.4 92.6
16 244.9 191.7 213.5 178.8 196.3
32 420.1 363.7 362.3 312.2 318.2
64 794.5 733.0 701.9 636.4 713.7
128 1648.0 1477.6 1501.5 1281.9 1441.1

GPU:

batch size Pytorch ONNX JIT TensorRT(定长版) TensorRT(变长版-maxlen512)
1 10.6 7.5 7.2 5.5 74.6
2 12.0 10.5 11.7 7.9 74.9
4 16.3 15.6 16.0 13.5 75.4
8 24.8 24.7 24.8 21.8 76.4
16 44.9 44.1 45.6 37.3 74.9
32 86.5 89.4 86.6 74.5 74.4
64 173.3 174.6 170.7 146.1 288.0
128 326.9 346.8 322.3 285.6 1188.4

输入文本长度为 64

CPU:

batch size Pytorch ONNX JIT OpenVino(定长版) OpenVino(变长版)
1 56.7 30.2 49.4 32.1 32.6
2 72.2 53.3 72.0 52.8 53.3
4 112.4 98.3 105.8 93.0 93.2
8 218.4 197.1 205.6 208.9 177.3
16 402.5 367.9 392.9 310.0 391.7
32 764.8 739.3 752.7 653.2 711.3
64 1531.4 1488.3 1442.0 1356.5 1580.3
128 3244.5 3139.7 2883.6 3063.2 3133.2

GPU:

batch size Pytorch ONNX JIT TensorRT(定长版) TensorRT(变长版-maxlen512) TensorRT(变长版-maxlen64)
1 11.8 10.5 11.5 8.0 287.7 287.4
2 16.3 15.4 16.1 13.7 287.8 287.5
4 25.3 24.6 25.3 22.0 288.6 291.6
8 44.9 43.6 46.2 39.4 293.1 291.1
16 88.9 89.8 86.7 74.7 287.3 288.9
32 176.2 174.9 170.5 146.2 287.9 288.9
64 332.7 348.1 322.7 287.3 288.6 288.6
128 675.4 683.1 655.1 569.2 1185.5 574.9

结论

根据上述实验结果可以得出以下结论:

  • 对于CPU,短文本和小batch size 场景,ONNX推理速度最快,OpenVnio次之。而在长文本和大batch size的场景,OpenVino推理速度最快
  • 对于OpenVino,在短文本和小batch size场景,定长输入和变长输入性能差别不大。随着文本长度增加和batch size增大,定长版OpenVino显著优于变长版OpenVino
  • 对于GPU定长版TensorRT显著优于变长版TensorRT。但是,定长版在实际使用中可能会涉及对输入文本的padding操作,需要在具体使用场景中评测该部分的耗时。
相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
4月前
|
PyTorch 算法框架/工具
Bert Pytorch 源码分析:五、模型架构简图 REV1
Bert Pytorch 源码分析:五、模型架构简图 REV1
33 0
|
4月前
|
机器学习/深度学习 人工智能 开发工具
如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face
Hugging Face是一个机器学习(ML)和数据科学平台和社区,帮助用户构建、部署和训练机器学习模型。它提供基础设施,用于在实时应用中演示、运行和部署人工智能(AI)。用户还可以浏览其他用户上传的模型和数据集。Hugging Face通常被称为机器学习界的GitHub,因为它让开发人员公开分享和测试他们所训练的模型。 本次分享如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face。
如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face
|
4月前
|
PyTorch 算法框架/工具
Bert Pytorch 源码分析:五、模型架构简图
Bert Pytorch 源码分析:五、模型架构简图
27 0
|
4月前
|
机器学习/深度学习 人工智能 Cloud Native
大语言模型推理提速,TensorRT-LLM 高性能推理实践
大型语言模型(Large language models,LLM)是基于大量数据进行预训练的超大型深度学习模型,本文主要讲述TensorRT-LLM利用量化、In-Flight Batching、Attention、Graph Rewriting提升 LLM 模型推理效率。
100321 2
|
4月前
|
机器学习/深度学习 数据采集 人工智能
【NLP】Datawhale-AI夏令营Day3打卡:Bert模型
【NLP】Datawhale-AI夏令营Day3打卡:Bert模型
|
4月前
|
机器学习/深度学习 自然语言处理 数据格式
训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类
训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类
55 0
|
5月前
|
机器学习/深度学习 自然语言处理 数据挖掘
预训练语言模型中Transfomer模型、自监督学习、BERT模型概述(图文解释)
预训练语言模型中Transfomer模型、自监督学习、BERT模型概述(图文解释)
63 0
|
5月前
|
自然语言处理 Python
BERT模型基本理念、工作原理、配置讲解(图文解释)
BERT模型基本理念、工作原理、配置讲解(图文解释)
378 0
|
2天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
2天前
|
机器学习/深度学习 数据可视化 算法
【Python机器学习专栏】t-SNE算法在数据可视化中的应用
【4月更文挑战第30天】t-SNE算法是用于高维数据可视化的非线性降维技术,通过最小化Kullback-Leibler散度在低维空间保持数据点间关系。其特点包括:高维到二维/三维映射、保留局部结构、无需预定义簇数量,但计算成本高。Python中可使用`scikit-learn`的`TSNE`类实现,结合`matplotlib`进行可视化。尽管计算昂贵,t-SNE在揭示复杂数据集结构上极具价值。