/TensorRT_yolov3

TensorRT for yolov3

Primary LanguagePython

简体中文

TensorRT 是一个有助于在NVIDIA图形处理单元(GPU)上高性能推理c++库。它旨在与TesnsorFlow、Caffe、Pytorch以及MXNet等训练框架以互补的方式进行工作,专门致力于在GPU上快速有效地进行网络推理。

此项目将在DarkNet上训练的开源的yolov3模型首先转化为onnx模型,再使用TensorRT将onnx模型转化为TensorRT支持的trt模型,旨在对比模型转换前后的推理准确率、推理速度以及内存或显存占用并做比较。

实验对比了使用PyTorch加载pt模型推理与TensorRT加载trt模型推理同一张图片的准确率。

GPU Memory 1

推理速度和显存占用,对比的结果如下表所示:

PyTorch TensorRT
Preprocess Cost 2.0ms 1.6ms
Inferprocess Cost 64.8ms 33.8ms
Postprocess Cost 3.0ms 3.9ms
Confidence 0.94 0.92
运行过程中的显存占用如下如所示(左图PyTorch,右图TensorRT):
GPU Memory 1

查阅相关TensorRT资料,结合评估结果,分析得到PyTorch推理直接运行模型前向计算,速度较慢;而TensorRT通过图优化、量化等手段,会加速模型推理。特别是使用FP16/INT8等数据类型,可以大幅提升速度。因此TensorRT理论上可以实现2-5倍左右的推理加速。 PyTorch占用显存主要来自计算所需的中间结果Tensor。TensorRT通过图优化可以减少中间张量,同时支持动态分配内存,理论上可以降低内存消耗。

但是TensorRT使用固定流水线的TRT Engine,事先确定最大显存需求,而PyTorch可能因为批量大小变化导致的动态内存分配问题。

而由于TensorRT对模型进行了一部分的剪枝,所以置信度相比于Pytorch稍有下降。

文档

文档前半部分是环境准备,后半部分是如何使用。

环境准备

安装

此项目使用的环境是CUDA-11.8cudnn-8.7.0NVIDIA GeForce GTX 1660 SUPER
由于此项目的实验平台是win11,安装C++版本的TensorRT较为复杂,因此选择采用Pythontensorrt库,该库底层也是通过对C++的调用实现,因此可以作为实验对象。

使用Conda在一个Python>=3.8环境中安装tensorrt包,这里推荐Conda安装,因为tensorrt安装与本地环境的cuda版本,cudnn版本等有关,因此Conda安装成功率较高。

conda install tensorrt

根据本地实验环境的CUDA版本,安装对应的PyTorch>=1.8,下面给出PyTorch2.0.1-cuda11.8的安装命令。

pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118

安装其余必要的依赖项

pip install -r requirements.txt
验证

在命令行中运行命令:

python -c "import tensorrt"

如果静默则环境安装成功。

使用

DarkNet_to_onnx

首先将Darknet模型转换为onnx模型,运行:

python yolov3_to_onnx.py -d .

运行成功则在当前目录下会得到yolov3.onnx文件。

onnx_to_trt

再将onnx模型转换为TensorRT适配的trt模型,运行前在samples/python/yolov3_onnx/目录下存放一张待检测的照片,例如dog.jpg

python .\onnx_to_tensorrt.py --img_name dog.jpg -d .

运行成功则在当前目录下会得到yolov3.trt文件;注意,该文件同时运行了对图片的检测,因此检测输出的图像在当前目录下bboxes.png

Test Result

模型文件

模型文件可以在百度网盘(提取码1234)中下载,.cfg.weights文件应该放在samples/python/yolov3_onnx/下。