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

简介

冬至夜月圆,霜露点清银。枫叶落尽霜,寒风凛冽水。山河冰封路,长夜独酌愁。火炉照暖家,窗外雪花飞。小伙伴们好,我是微信公众号小窗幽记机器学习的首席试药师:卖布洛芬的小男孩。上面这首诗是最近顶流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

评测结果

本次实验硬件信息:

GPU:1张 Nvidia T4

CPU:10 Intel® Xeon® Platinum 8255C CPU @ 2.50GHz

以下实验结果是batch size的推理耗时,单位是ms

输入文本长度为 8

CPU:

batch sizePytorchONNXJITOpenVino(定长版)OpenVino(变长版)
124.510.118.812.112.5
246.712.035.514.716.2
453.918.040.925.425.5
865.230.350.635.036.8
1682.653.665.366.166.2
32126.399.1105.9112.7112.1
64236.2194.2192.9198.5200.1
128474.9368.2360.3362.1364.6

GPU:

batch sizePytorchONNXJITTensorRT(定长版)TensorRT(变长版)
110.76.58.34.87.9
211.66.68.35.17.9
410.97.17.25.58.0
811.610.011.37.88.0
1615.814.915.413.020.9
3224.323.823.920.675.3
6444.642.644.437.2287.9
12886.587.683.973.5568.1

输入文本长度为 16

CPU:

batch sizePytorchONNXJITOpenVino(定长版)OpenVino(变长版)
146.112.235.514.616.3
252.718.141.921.824.2
464.130.051.931.938.6
881.152.768.052.566.2
16125.497.4111.1102.6112.4
32235.2190.8216.7185.8197.1
64430.8362.8352.6340.7366.3
128754.7725.4769.1620.1718.5

GPU:

batch sizePytorchONNXJITTensorRT(定长版)TensorRT(变长版)
111.06.68.05.121.1
211.27.17.25.521.1
411.810.211.47.921.4
816.215.215.813.521.9
1625.124.724.820.920.8
3245.943.745.438.074.3
6488.890.187.275.8286.9
128174.2174.8170.8148.6571.2

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

输入文本长度为 32

CPU:

batch sizePytorchONNXJITOpenVino(定长版)OpenVino(变长版)
145.818.039.721.822.7
264.729.851.132.232.4
480.652.965.652.752.0
8129.496.8115.295.492.6
16244.9191.7213.5178.8196.3
32420.1363.7362.3312.2318.2
64794.5733.0701.9636.4713.7
1281648.01477.61501.51281.91441.1

GPU:

batch sizePytorchONNXJITTensorRT(定长版)TensorRT(变长版-maxlen512)
110.67.57.25.574.6
212.010.511.77.974.9
416.315.616.013.575.4
824.824.724.821.876.4
1644.944.145.637.374.9
3286.589.486.674.574.4
64173.3174.6170.7146.1288.0
128326.9346.8322.3285.61188.4

输入文本长度为 64

CPU:

batch sizePytorchONNXJITOpenVino(定长版)OpenVino(变长版)
156.730.249.432.132.6
272.253.372.052.853.3
4112.498.3105.893.093.2
8218.4197.1205.6208.9177.3
16402.5367.9392.9310.0391.7
32764.8739.3752.7653.2711.3
641531.41488.31442.01356.51580.3
1283244.53139.72883.63063.23133.2

GPU:

batch sizePytorchONNXJITTensorRT(定长版)TensorRT(变长版-maxlen512)TensorRT(变长版-maxlen64)
111.810.511.58.0287.7287.4
216.315.416.113.7287.8287.5
425.324.625.322.0288.6291.6
844.943.646.239.4293.1291.1
1688.989.886.774.7287.3288.9
32176.2174.9170.5146.2287.9288.9
64332.7348.1322.7287.3288.6288.6
128675.4683.1655.1569.21185.5574.9

结论

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

  • 对于CPU,短文本和小batch size 场景,ONNX推理速度最快,OpenVnio次之。而在长文本和大batch size的场景,OpenVino推理速度最快
  • 对于OpenVino,在短文本和小batch size场景,定长输入和变长输入性能差别不大。随着文本长度增加和batch size增大,定长版OpenVino显著优于变长版OpenVino
  • 对于GPU定长版TensorRT显著优于变长版TensorRT。但是,定长版在实际使用中可能会涉及对输入文本的padding操作,需要在具体使用场景中评测该部分的耗时。

更多、更新文章欢迎关注微信公众号:小窗幽记机器学习。后续会持续输出模型推理加速和工程部署相关系列,敬请期待~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值