Natsu-Akatsuki/RangeNetTrt8

推理速度问题

Closed this issue · 19 comments

您好,感谢您的工作。最近我在我电脑上测试这个工程(RTX3000+128G内存)。我看README.md中表示,速度应该在6ms左右,但我电脑上测试single_shot_demo结果是500ms。想问下这个速度正常吗?

1)在TensorRT engine生成完成后,总时间包括预处理+推理+后处理超过100ms都不正常,具体时间忘了,待我整理一下补充下文档;
2)然后这里的6ms我记得是后处理的部分;
3)如想共讨和定位问题,请将环境依赖版本,已做过的操作进行描述

我重新检查了下,是我之前用kFP16的方式来生成推理模型,所以速度慢了。现在换回kFP32,但速度依然在42ms,速度还是偏慢

您好,模型部署这块,有什么资料可以学习吗?

1)你这个速度统计时的时间包括预处理、推理和后处理吗?更刁钻一点的话,还包括GPU初始化的时间吗?
2)用FP16配置参数优化ONNX模型时生成的engine模型时间比用KFP32生成engine模型的时间要长,而且长很多。但是预测时KFP16是比KFP32要快很多的。印象中推理时间前者是10ms+,或者是500ms+。你这个kFP32速度42ms,有悖于我们使用高版本TensorRT时的现象,我回头有时间用30系列的再测一下。
3)速度偏慢:你预期的是多少
4)关于模型部署,你指的是TensorRT部署的话,我自己的经验还是以项目为导向吧,有啥就查一波文档,学习别人的源码。官方文档其实也挺全的了。

1)你这个速度统计时的时间包括预处理、推理和后处理吗?更刁钻一点的话,还包括GPU初始化的时间吗? 2)用FP16配置参数优化ONNX模型时生成的engine模型时间比用KFP32生成engine模型的时间要长,而且长很多。但是预测时KFP16是比KFP32要快很多的。印象中推理时间前者是10ms+,或者是500ms+。你这个kFP32速度42ms,有悖于我们使用高版本TensorRT时的现象,我回头有时间用30系列的再测一下。 3)速度偏慢:你预期的是多少 4)关于模型部署,你指的是TensorRT部署的话,我自己的经验还是以项目为导向吧,有啥就查一波文档,学习别人的源码。官方文档其实也挺全的了。

多谢你的回答,这边我是打开Performance_LOG这个标志来统计时间,这里只说了推理时间40ms。我期望推理时间是10ms左右。
Screenshot from 2023-06-28 13-01-54

1)你这个速度统计时的时间包括预处理、推理和后处理吗?更刁钻一点的话,还包括GPU初始化的时间吗? 2)用FP16配置参数优化ONNX模型时生成的engine模型时间比用KFP32生成engine模型的时间要长,而且长很多。但是预测时KFP16是比KFP32要快很多的。印象中推理时间前者是10ms+,或者是500ms+。你这个kFP32速度42ms,有悖于我们使用高版本TensorRT时的现象,我回头有时间用30系列的再测一下。 3)速度偏慢:你预期的是多少 4)关于模型部署,你指的是TensorRT部署的话,我自己的经验还是以项目为导向吧,有啥就查一波文档,学习别人的源码。官方文档其实也挺全的了。

这个是时间统计结果:
Screenshot from 2023-06-28 13-05-59

您好,我这边重新测试了一下:
我的环境配置是:
GPU: Quadro RTX 3000 Mobile / Max-Q
CUDA:11.6
LibTorch:1.13.1+cu116
TensorRT: 8.4.1
当我在文件netTensorRT.cpp 260行设置为FP32时

config->setFlag(nvinfer1::BuilderFlag::kTF32);

程序预测整体结果正确(和Rangnet_lib相同),但速度缓慢,一帧的推理要183ms+.
当我设置为16时,能实现加速(推理一帧是42ms),但整体预测结果有较大偏差,不知道您遇到过没?

1)关于不同优化参数16和32,在高版本TRT效果不一样的问题:如果是这个的话,本仓库是解决了这个问题。
2)然后,看下你的输入,你使用的是例程的数据(即KITTI数据集的数据)还是你自己的数据?预测结果差别很大摆个图看看。

1)关于不同优化参数16和32,在高版本TRT效果不一样的问题:如果是这个的话,本仓库是解决了这个问题。 2)然后,看下你的输入,你使用的是例程的数据(即KITTI数据集的数据)还是你自己的数据?预测结果差别很大摆个图看看。
这是32的结果:
Screenshot from 2023-06-28 17-21-59
这是16的结果:
Screenshot from 2023-06-28 17-33-12

1)ok,感谢您的测试。经我这边的复现(3060显卡,TRT8.4和TRT8.2的均进行了测试)和根据您这边的结果,暂时得出如下结论8.4版本并不适用于当前仓库。暂时通过测试为最高TRT版本为8.2.5.1。(通过测试即:16和32的结果定性上差别不大)
2)具体原因可能是TensorRT对优化部分的实现进行了改动,后续将根据文档API进行升级和优化,再次感谢您的反馈。

1)ok,感谢您的测试。经我这边的复现(3060显卡,TRT8.4和TRT8.2的均进行了测试)和根据您这边的结果,暂时得出如下结论8.4版本并不适用于当前仓库。暂时通过测试为最高TRT版本为8.2.5.1。(通过测试即:16和32的结果定性上差别不大) 2)具体原因可能是TensorRT对优化部分的实现进行了改动,后续将根据文档API进行升级和优化,再次感谢您的反馈。

OK,这边是使用3060,测试下来运行速度是在10ms左右对吗?

如果你想总时间低于10ms,感觉你要换一种实现了,再怎么优化他这个实现应该不会低于10ms。

TIME: preprocess_time: 1.37318 ms.
TIME: infer_time: 23.6074 ms.
TIME: postprocess_time: 4.96026 ms.

如果你想总时间低于10ms,感觉你要换一种实现了,再怎么优化他这个实现应该不会低于10ms。

TIME: preprocess_time: 1.37318 ms. TIME: infer_time: 23.6074 ms. TIME: postprocess_time: 4.96026 ms.

看样子上4090,应该有能达到这方面的希望了。另一个问题是,关于这个精度问题,你之前是怎么debug和解决的,能介绍下思路吗?

1)当时定位这个问题找了挺多资料的,找着找着就找到有关 overflow 和 underflow 的问题。然后从这个去切入,找到有问题的layer(二分法),然后冻结它就好了(代码部分详看 Here)。该原仓库的反馈见 Here
2)然后为啥4090就有希望了,对于它提升这么大保持怀疑。

1)当时定位这个问题找了挺多资料的,找着找着就找到有关 overflow 和 underflow 的问题。然后从这个去切入,找到有问题的layer(二分法),然后冻结它就好了(代码部分详看 Here)。该原仓库的反馈见 Here。 2)然后为啥4090就有希望了,对于它提升这么大保持怀疑。

我的想法是现在推理速度应该和显卡的关系比较大。我显卡性能略若于2080 Super,所以40ms左右,现在来看,显卡升级到4090,应该来说就能保证一定的实时性。

OK,期待你的反馈

1)解决用 TensorRT 8.4 优化后的 engine 预测结果异常的问题
2)有关提高运行速度的相关方案,欢迎 PR

1)解决用 TensorRT 8.4 优化后的 engine 预测结果异常的问题 2)有关提高运行速度的相关方案,欢迎 PR

多谢你的帮助!经过测试,现在的推理速度可以达到20ms左右,基本上满足了实时的需求。

OK,欢迎交流~