实验对比
前端时间搭建了TensorRT 、 Torchserve-GPU,最近抽时间将这两种方案做一个简单的实验对比。
实验数据
- Cuda11.0、Xeon® 6242 3.1*80、RTX3090 24G、Resnet50
- 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机器紧缺的情况下可以通过多点普通机器、做高并发,弥补模型推导的缺陷。