环境说明
系统:windows 10
VS2017
TensorRT-8.2.4.2
CUDA 10.2
显卡1650
看自己cuda的版本可以打开cmd,输入nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2019 NVIDIA Corporation Built on Wed_Oct_23_19:32:27_Pacific_Daylight_Time_2019 Cuda compilation tools, release 10.2, V10.2.89
关于cuda的安装网上有很多,这里不再说明【但要注意版本的对应,还有装CUDA10.2一定要装上官网提供的两个补丁!】
可以一个电脑上装多个版本的cuda,比如我的电脑就是装了cuda10.0和cuda10.2,只需要切换环境变量即可。
TensorRT下载与配置
进入官网应该如果没有账号就注册一个,登录以后才可以下载,会有如下界面
选择你想要的下载的版本【注意和自己的cuda对应】
比如我下载的版本为8.2.4.2,cuda版本10.2,cudnn8.2
下载好以后解压
1. 将 TensorRT-8.2.4.2\include中头文件 copy 到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
2. 将TensorRT-8.2.4.2\lib 中所有lib文件 copy 到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
3. 将TensorRT-8.2.4.2\lib 中所有dll文件copy 到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin
VS2017配置
用VS2017测试一下Tensorrt是否安装成功
打开【TensorRT-8.2.4.2\samples\sampleMNIST\sample_mnist.sln】
打开项目后,右键项目》属性》配置属性》常规,检查下我画红框的地方【VS2015不一样】
然后点VC++目录,在右侧常规中的可执行文件目录中,将TensorRT中的lib库文件路径填写进去。填写进去以后要点击右下角的应用。
再点C/C++,右侧的附加包含目录,将tensorrt的bin目录路径填写上去,然后点右下角应用
再点击链接器》输入,在右侧的附加依赖项中将TensorRT下lib库中的.lib放进去 然后点击应用。
我的附加依赖项中包含以下lib文件【可以参考以下】,就把你lib文件下的lib文件全放进来,其中cudnn.lib,cublas.lib,cudart.lib,nvrtc.lib,是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64 目录下的
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
cudnn.lib
cublas.lib
cudart.lib
nvrtc.lib
全部设置好,回到VS界面中,右键项目生成
生成项目以后,会在F:\TensorRT-8.2.4.2\bin 目录下生成一个sample_mnist.exe文件,然后用cmd进行该路径下,运行这个exe文件,出现以下案例就说明安装成功了。
&&&& RUNNING TensorRT.sample_mnist [TensorRT v8204] # F:\TensorRT-8.2.4.2\bin\sample_mnist.exe [05/27/2022-15:16:25] [I] Building and running a GPU inference engine for MNIST [05/27/2022-15:16:26] [I] [TRT] [MemUsageChange] Init CUDA: CPU +396, GPU +0, now: CPU 3492, GPU 890 (MiB) [05/27/2022-15:16:27] [I] [TRT] [MemUsageSnapshot] Begin constructing builder kernel library: CPU 3516 MiB, GPU 890 MiB [05/27/2022-15:16:27] [I] [TRT] [MemUsageSnapshot] End constructing builder kernel library: CPU 3623 MiB, GPU 926 MiB [05/27/2022-15:16:28] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +193, GPU +70, now: CPU 3800, GPU 996 (MiB) [05/27/2022-15:16:29] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +178, GPU +86, now: CPU 3978, GPU 1082 (MiB) [05/27/2022-15:16:29] [W] [TRT] TensorRT was linked against cuDNN 8.2.1 but loaded cuDNN 8.2.0 [05/27/2022-15:16:29] [I] [TRT] Local timing cache in use. Profiling results in this builder pass will not be stored. [05/27/2022-15:16:43] [I] [TRT] Some tactics do not have sufficient workspace memory to run. Increasing workspace size may increase performance, please check verbose output. [05/27/2022-15:16:45] [I] [TRT] Detected 1 inputs and 1 output network tensors. [05/27/2022-15:16:45] [I] [TRT] Total Host Persistent Memory: 5440 [05/27/2022-15:16:45] [I] [TRT] Total Device Persistent Memory: 0 [05/27/2022-15:16:45] [I] [TRT] Total Scratch Memory: 0 [05/27/2022-15:16:45] [I] [TRT] [MemUsageStats] Peak memory usage of TRT CPU/GPU memory allocators: CPU 1 MiB, GPU 16 MiB [05/27/2022-15:16:45] [I] [TRT] [BlockAssignment] Algorithm ShiftNTopDown took 0.0466ms to assign 3 blocks to 8 nodes requiring 57857 bytes. [05/27/2022-15:16:45] [I] [TRT] Total Activation Memory: 57857 [05/27/2022-15:16:45] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +0, GPU +8, now: CPU 4472, GPU 1250 (MiB) [05/27/2022-15:16:45] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +0, GPU +10, now: CPU 4472, GPU 1260 (MiB) [05/27/2022-15:16:45] [W] [TRT] TensorRT was linked against cuDNN 8.2.1 but loaded cuDNN 8.2.0 [05/27/2022-15:16:45] [I] [TRT] [MemUsageChange] TensorRT-managed allocation in building engine: CPU +0, GPU +4, now: CPU 0, GPU 4 (MiB) [05/27/2022-15:16:45] [I] [TRT] [MemUsageChange] Init CUDA: CPU +0, GPU +0, now: CPU 4398, GPU 1164 (MiB) [05/27/2022-15:16:45] [I] [TRT] Loaded engine size: 1 MiB [05/27/2022-15:16:46] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +59, GPU +66, now: CPU 4457, GPU 1232 (MiB) [05/27/2022-15:16:46] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +3, GPU +8, now: CPU 4460, GPU 1240 (MiB) [05/27/2022-15:16:46] [W] [TRT] TensorRT was linked against cuDNN 8.2.1 but loaded cuDNN 8.2.0 [05/27/2022-15:16:46] [I] [TRT] [MemUsageChange] TensorRT-managed allocation in engine deserialization: CPU +0, GPU +1, now: CPU 0, GPU 1 (MiB) [05/27/2022-15:16:46] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +79, GPU +66, now: CPU 4372, GPU 1198 (MiB) [05/27/2022-15:16:46] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +2, GPU +8, now: CPU 4374, GPU 1206 (MiB) [05/27/2022-15:16:46] [W] [TRT] TensorRT was linked against cuDNN 8.2.1 but loaded cuDNN 8.2.0 [05/27/2022-15:16:46] [I] [TRT] [MemUsageChange] TensorRT-managed allocation in IExecutionContext creation: CPU +0, GPU +0, now: CPU 0, GPU 1 (MiB) [05/27/2022-15:16:46] [I] Input: @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@.*@@@@@@@@@@ @@@@@@@@@@@@@@@@.=@@@@@@@@@@ @@@@@@@@@@@@+@@@.=@@@@@@@@@@ @@@@@@@@@@@% #@@.=@@@@@@@@@@ @@@@@@@@@@@% #@@.=@@@@@@@@@@ @@@@@@@@@@@+ *@@:-@@@@@@@@@@ @@@@@@@@@@@= *@@= @@@@@@@@@@ @@@@@@@@@@@. #@@= @@@@@@@@@@ @@@@@@@@@@= =++.-@@@@@@@@@@ @@@@@@@@@@ =@@@@@@@@@@ @@@@@@@@@@ :*## =@@@@@@@@@@ @@@@@@@@@@:*@@@% =@@@@@@@@@@ @@@@@@@@@@@@@@@% =@@@@@@@@@@ @@@@@@@@@@@@@@@# =@@@@@@@@@@ @@@@@@@@@@@@@@@# =@@@@@@@@@@ @@@@@@@@@@@@@@@* *@@@@@@@@@@ @@@@@@@@@@@@@@@= #@@@@@@@@@@ @@@@@@@@@@@@@@@= #@@@@@@@@@@ @@@@@@@@@@@@@@@=.@@@@@@@@@@@ @@@@@@@@@@@@@@@++@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ [05/27/2022-15:16:46] [I] Output: 0: 1: 2: 3: 4: ********** 5: 6: 7: 8: 9: &&&& PASSED TensorRT.sample_mnist [TensorRT v8204] # F:\TensorRT-8.2.4.2\bin\sample_mnist.exe
如果运行exe报错,比如以下错误
[ltWrapper.cpp::nvinfer1::rt::CublasLtWrapper::setupHeuristic::327] Error Code 2: Internal Error (Assertion cublasStatus == CUBLAS_STATUS_SUCCESS failed. ) [01/19/2022-11:26:08] [E] [TRT] 2: [builder.cpp::nvinfer1::builder::Builder::buildSerializedNetwork::609] Error Code 2: Internal Error (Assertion enginePtr != nullptr failed. )
这可能是cuda10.2和Tensorrt兼容问题,需要安装cuda10.2补丁包(官网有),如果你确定已经安装了,可以再重新生成一下项目再试试。
YOLOV5 部署
针对YOLOv5 6.0版本进行部署
以yolov5s.pt为例,下载yolov5 6.0 和上述链接中的代码到本地:
根据基于上述参考链接中的代码,本项目添加了视频检测功能,可替换自己的类。同时为了可以读取类的txt文件,在项目中添加了一个获得类的函数
std::vector<std::string> get_classes(std::string &path) { std::vector<std::string> classes_name; std::ifstream infile(path); if (infile.is_open()) { std::string line; while (getline(infile,line)) { classes_name.emplace_back(line); } } return classes_name; }
git clone -b v6.0 https://github.com/ultralytics/yolov5.git https://github.com/YINYIPENG-EN/YOLOv5TensorRT.git
生成wts模型
将yolov5s.pt 文件放到yolov5文件夹下
运行:
-w参数为输入pt权重模型路径,-o参数为输出wts模型的路径。将会在当前文件夹下生成yolov5s.wts文件,这个文件是用来之后转换成tensorrt的序列化模型
python gen_wts.py -w yolov5s.pt -o yolov5s.wts