实验对比

前端时间搭建了TensorRT 、 Torchserve-GPU,最近抽时间将这两种方案做一个简单的实验对比。

实验数据

  • Cuda11.0Xeon® 6242 3.1*80RTX3090 24GResnet50
  • TensorRT 、Torchserve-GPU各自一张卡搭建10进程接口,感兴趣的可以查看我个人其他文章。
  • 30进程并发 、2000 张1200*720像素图像的总量数据
  • TensorRT 的部署使用了RTX3090 10进程
  • Torchserve-GPU的部署使用了RTX3090 10进程
  • Torchserve-CPU的部署使用了3台10核40线程的CPU服务器,每台10进程

实验一 TensorRT与Cuda加速对比

  • 输入普遍使用(1,224,224,3)的浮点张量

模型

torch(cpu)

torch(gpu)

onnx(cpu)

onnx(gpu)

TensorRT

resnet18

0.029

0.0024

0.004

-

0.0012

resnet50

0.08

0.0056

0.008

0.0030

0.0018

resnet101

0.16

0.010

0.018

0.0051

0.0032

resnet152

0.23

0.016

0.021

0.0074

0.0045

  • 结论:不同模型针对tensorrt的提速均在4-5倍左右。

实验二 TorchRT与Torchserve-gpu加速对比

  • 使用同一模型,输入不同的尺寸,尽量减少因为传输导致的耗时,使用单个数据的输入,测试单个数据的请求响应

框架

输入尺寸

耗时(s)

TensorRT+Flask

1200 720

0.14

torchserve-gpu

1200 720

0.05

torchserve-cpu

1200 720

0.28

TensorRT+Flask

224 224

0.018

torchserve-gpu

224 224

0.025

torchserve-cpu

224 224

0.19

TensorRT+Flask

10 10

0.009

torchserve-gpu

10 10

0.023

torchserve-cpu

10 10

0.16

* 结论:大尺寸图像的信息传输是导致tensorrt耗时较长的主要原因,torchserve-gpu底层为java要比我试验时用flask(python)效率要快。
当使用小尺寸图像,将耗时主要集中在模型推导时,tensorrt的优势就体现出来了。

实验三 多尺寸并发实验

  • 分配量两张RTX3090卡,一张卡部署tensorrt、一张卡部署torchserve-gpu

框架

框架进程

测试并发数

数据量

耗时(s)

CPU

TensorRT+Flask

4

30

2000 1200*720

29s

-

TensorRT+Flask

10

30

2000 1200 720

12.2s

-

Torchserve-GPU

4

30

2000 1200*720

23

-

Torchserve-GPU

10

30

2000 1200*720

11.73

-

Torchserve-CPU

30

30

2000 1200*720

19.3

-

框架

框架进程

测试并发数

数据量

耗时(s)

CPU

TensorRT+Flask

10

30

2000 224*224

3.3

34%

Torchserve-GPU

10

30

2000 224*224

6.83

21%

Torchserve-CPU

30

30

2000 224*224

13

48%

* 实验使用 2000张1200X720像素的图像数据、224X224像素的图像数据分别进行实验。
同时使用30并发测试2000份数据,明显可以看出tensorrt在模型方面的优势。

实验四 GPU分布并发实验

框架

框架进程

测试并发数

数据量

耗时(s)

CPU

Torchserve-GPU(单卡/四卡)

4

30

2000 1200*720

23/19.9

-

Torchserve-GPU(单卡/四卡)

10

30

2000 1200*720

11.73/8.64

-

Torchserve-GPU(单卡/四卡)

20

30

2000 1200*720

未知/4.76

-

Torchserve-GPU(单卡/四卡)

4

30

2000 224*224

8.14/5.84

-

Torchserve-GPU(单卡/四卡)

10

30

2000 224*224

6.83/2.77

-

Torchserve-GPU(单卡/四卡)

10

30

2000 224*224

未知/2.15

-

  • 结论:这里主要对比了torchserve-gpu,多进程分布在一张卡要比多进程分布多张卡要慢一些。
  • 推测原因:多进程分布在一张卡,相互之间可能存在资源抢占,建议分布在多卡。
  • 推测:Tensorrt可能存在同样的问题,如果分布在多张卡,速度可再提升。

总结

  • TensorRT适合复杂模型,传输方面不会耗费太多资源的算法,如复杂模型推荐。
    不太适合大功率http传输的的算法、如cv,要不然大部分资源都浪费在了传输上。
    tensorRT主要还是针对模型前向推导的优化。
  • Torchserve-GPU 在前向推导方面逊色于TensorRT,但是模型搭建便捷。
    数据传输方面Torchserve-GPU内部应该有优化,搭建的flask+TensorRT可能存在传输效率问题。
  • Torchserve-CPU,CPU机器紧缺的情况下可以通过多点普通机器、做高并发,弥补模型推导的缺陷。