1、首先找到rangnet++推理版的github地址
https://github.com/PRBonn/rangenet_lib
2、安装
2.1、TensorRT
TensorRT版本和cuda版本有严格的对应关系,虽然作者说他们的代码和预训练模型仅在TensorRT-5.1上有效,但是因为本人电脑的cuda版本为11.2,其对应的TensorRT版本不是5.1,而且因为本地已经安装了其它模型,所以不太可能重装cuda,所以本人决定安装cuda11.2对应版本的TensorRT。
官网https://developer.nvidia.com/nvidia-tensorrt-8x-download查看cuda11.2对应的TensorRT版本为8.0.0.3,找到对应版本“TensorRT 8.0 EA for Linux and CUDA 11.1, 11.2 & 11.3”点击第一个“TensorRT 8.0 EA for Linux x86_64 and CUDA 11.1, 11.2 & 11.3 TAR package”,如图所示,
这样会下载tar压缩包格式的安装包,名字叫TensorRT-8.0.0.3.Linux.x86_64-gnu.cuda-11.3.cudnn8.2.tar.gz。
下载好后,我把它安装在了/usr/local下
cd ~/Downloads
sudo tar -xzvf TensorRT-8.0.0.3.Linux.x86_64-gnu.cuda-11.3.cudnn8.2.tar.gz -C /usr/local/
当然,安装在任何地方都可以
配置环境变量
gedit ~/.bashrc
在.bashrc文件最后一行增加路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/TensorRT-8.0.0.3/lib
配置生效
source ~/.bashrc
编译TensorRT的示例,会在bin路径下生成一个针对MINIST数据集的sample_mnist可执行文件
cd /usr/local/TensorRT-8.0.0.3/samples/sampleMNIST
sudo make
cd ../../bin/
./sample_mnist
成功运行的提示
&&&& RUNNING TensorRT.sample_mnist [TensorRT v8000] # ./sample_mnist
[10/14/2022-17:01:44] [I] Building and running a GPU inference engine for MNIST
[10/14/2022-17:01:44] [I] [TRT] [MemUsageChange] Init CUDA: CPU +146, GPU +0, now: CPU 151, GPU 407 (MiB)
[10/14/2022-17:01:44] [I] [TRT] [MemUsageSnapshot] Builder begin: CPU 153 MiB, GPU 407 MiB
[10/14/2022-17:01:45] [W] [TRT] TensorRT was linked against cuBLAS/cuBLAS LT 11.4.2 but loaded cuBLAS/cuBLAS LT 11.4.1
[10/14/2022-17:01:45] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +182, GPU +76, now: CPU 335, GPU 483 (MiB)
[10/14/2022-17:01:45] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +128, GPU +80, now: CPU 463, GPU 563 (MiB)
[10/14/2022-17:01:45] [W] [TRT] TensorRT was linked against cuDNN 8.2.0 but loaded cuDNN 8.1.0
[10/14/2022-17:01:45] [W] [TRT] Detected invalid timing cache, setup a local cache instead
[10/14/2022-17:01:50] [I] [TRT] Some tactics do not have sufficient workspace memory to run. Increasing workspace size may increase performance, please check verbose output.
[10/14/2022-17:01:50] [I] [TRT] Detected 1 inputs and 1 output network tensors.
[10/14/2022-17:01:50] [I] [TRT] Total Host Persistent Memory: 5440
[10/14/2022-17:01:50] [I] [TRT] Total Device Persistent Memory: 0
[10/14/2022-17:01:50] [I] [TRT] Total Scratch Memory: 0
[10/14/2022-17:01:50] [I] [TRT] [MemUsageStats] Peak memory usage of TRT CPU/GPU memory allocators: CPU 1 MiB, GPU 4 MiB
[10/14/2022-17:01:50] [W] [TRT] TensorRT was linked against cuBLAS/cuBLAS LT 11.4.2 but loaded cuBLAS/cuBLAS LT 11.4.1
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +0, GPU +8, now: CPU 619, GPU 629 (MiB)
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +0, GPU +8, now: CPU 619, GPU 637 (MiB)
[10/14/2022-17:01:50] [W] [TRT] TensorRT was linked against cuDNN 8.2.0 but loaded cuDNN 8.1.0
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +0, GPU +0, now: CPU 619, GPU 621 (MiB)
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +0, GPU +0, now: CPU 619, GPU 605 (MiB)
[10/14/2022-17:01:50] [I] [TRT] [MemUsageSnapshot] Builder end: CPU 619 MiB, GPU 605 MiB
[10/14/2022-17:01:50] [W] [TRT] TensorRT was linked against cuBLAS/cuBLAS LT 11.4.2 but loaded cuBLAS/cuBLAS LT 11.4.1
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +0, GPU +8, now: CPU 617, GPU 613 (MiB)
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuDNN: CPU +0, GPU +8, now: CPU 617, GPU 621 (MiB)
[10/14/2022-17:01:50] [W] [TRT] TensorRT was linked against cuDNN 8.2.0 but loaded cuDNN 8.1.0
[10/14/2022-17:01:50] [I] Input:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@%.:@@@@@@@@@@@@
@@@@@@@@@@@@@: *@@@@@@@@@@@@
@@@@@@@@@@@@* =@@@@@@@@@@@@@
@@@@@@@@@@@% :@@@@@@@@@@@@@@
@@@@@@@@@@@- *@@@@@@@@@@@@@@
@@@@@@@@@@# .@@@@@@@@@@@@@@@
@@@@@@@@@@: #@@@@@@@@@@@@@@@
@@@@@@@@@+ -@@@@@@@@@@@@@@@@
@@@@@@@@@: %@@@@@@@@@@@@@@@@
@@@@@@@@+ +@@@@@@@@@@@@@@@@@
@@@@@@@@:.%@@@@@@@@@@@@@@@@@
@@@@@@@% -@@@@@@@@@@@@@@@@@@
@@@@@@@% -@@@@@@#..:@@@@@@@@
@@@@@@@% +@@@@@- :@@@@@@@
@@@@@@@% =@@@@%.#@@- +@@@@@@
@@@@@@@@..%@@@*+@@@@ :@@@@@@
@@@@@@@@= -%@@@@@@@@ :@@@@@@
@@@@@@@@@- .*@@@@@@+ +@@@@@@
@@@@@@@@@@+ .:-+-: .@@@@@@@
@@@@@@@@@@@@+: :*@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[10/14/2022-17:01:50] [I] Output:
0:
1:
2:
3:
4:
5:
6: **********
7:
8:
9:
[10/14/2022-17:01:50] [I] [TRT] [MemUsageChange] Init cuBLAS/cuBLASLt: CPU +0, GPU +0, now: CPU 617, GPU 605 (MiB)
&&&& PASSED TensorRT.sample_mnist [TensorRT v8000] # ./sample_mnist
参考:http://www.yaotu.net/biancheng/26353.html
3、编译
$ mkdir -p ~/catkin_ws/rangenet++/src
$ cd ~/catkin_ws/rangenet++/src
$ git clone https://github.com/PRBonn/rangenet_lib.git
$ cd ..
$ catkin_make
编译会报很多错,原因是TensorRT版本由5.1升级到8.0导致的。在寻求解决办法的过程中发现已经有大神解决了rangenet++适配TensorRT-8.0版本的问题,并且代码已经开源https://github.com/vincenzo0603/rangenet_lib_forTensorRT8XX。
于是,直接改为编译大神贡献的适配TensorRT-8.0的这版rangenet++,在编译过程中会报TensorRT的一些小bug,需要在CMakeLists.txt中添加TensorRT-8.0.0.3的路径,如下所示
set(CMAKE_PREFIX_PATH "/usr/local/TensorRT-8.0.0.3/lib")
include_directories(/usr/local/TensorRT-8.0.0.3/include)
link_directories(/usr/local/TensorRT-8.0.0.3/lib/)
4、运行
编译通过后,开始测试一个demo。
首先在这里下载一个预训练模型model,然后在~/catkin_ws/rangenet++/src/rangenet_lib路径下新建一个model文件夹,将其放进去。
单帧的点云数据在这里~/catkin_ws/rangenet++/src/rangenet_lib/example/000000.bin
推理并可视化的命令如下
$ cd ~/catkin_ws/rangenet++
$ ./devel/lib/rangenet_lib/infer -p ~/catkin_ws/rangenet++/src/rangenet_lib/model/darknet53 -s ~/catkin_ws/rangenet++/src/rangenet_lib/example/000000.bin --verbose
运行结果如下图所示
这明显不对,通过修改kFP16为kTF32,如图所示,
解决了这个问题,运行效果如下,要注意,修改后要删除model.trt,重新编译才会生效。
至此即完成了rangenet++推理版的部署,然而,这个版本无法实时读取ros的bag包数据,还是没办法为我所用。
5、rangenet++实时订阅ros消息推理版安装
正在我调研如何让rangenet++可以实时订阅ros消息,为我所用时,发现了一个更大的大神,大神已经实现了,并且开源了代码https://github.com/Natsu-Akatsuki/RangeNetTrt8
作者说该工程只适用于TensorRT8.2.3,但是我觉得用我目前的TensorRT8.0.0.3版本一样可以通过一些小改动部署它的工程。作者提供了两种安装方法,由于docker下载环境需要很大空间,所以我选择了第二种方法,安装在本地。
onnx模型还用之前下载好的。所以在前面部署rangenet++安装的环境基础上,该工程只需要额外安装libtorch。libtorch版本同样和cuda版本有严格的对应关系,同时libtorch版本和pytorch版本是一致的,因为之前验证过安装1.8.1+cuda11.1版本的pytorch是可行的,于是选择安装1.8.1版本的libtorch,下载链接https://download.pytorch.org/libtorch/cu111/libtorch-cxx11-abi-shared-with-deps-1.8.1%2Bcu111.zip
安装命令如下
unzip libtorch-cxx11-abi-shared-with-deps-1.8.1+cu111.zip
配置环境变量
gedit ~/.bashrc
在.bashrc文件最后一行增加路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/tools/libtorch/lib
配置生效
source ~/.bashrc
参考:https://blog.csdn.net/agq358/article/details/121074551
https://blog.csdn.net/agq358/article/details/121078611
6、rangenet++实时订阅ros消息推理版编译
修改CMakeLists:修改其中的TensorRT, libtorch等依赖库的路径
$ catkin_make
编译出现的问题及解决方法:
问题1:
找不到math_functions.hpp
解决方法:
/usr/local/cuda/include/中没有math_functions.hpp,建立软连接
sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp
问题2:
[报错]In file included from /usr/local/cuda/include/cuda_runtime.h:115:0,
from :0:
/usr/local/cuda/include/crt/common_functions.h:74:24: error: token ““CUDACC_VER is no longer supported. Use CUDACC_VER_MAJOR, CUDACC_VER_MINOR, and CUDACC_VER_BUILD instead.”” is not valid in preprocessor expressions
#define CUDACC_VER “CUDACC_VER is no longer supported. Use CUDACC_VER_MAJOR, CUDACC_VER_MINOR, and CUDACC_VER_BUILD instead.”
^
/usr/local/cuda/include/crt/common_functions.h:74:24: note: in definition of macro ‘CUDACC_VER’
#define CUDACC_VER “CUDACC_VER is no longer supported. Use CUDACC_VER_MAJOR, CUDACC_VER_MINOR, and CUDACC_VER_BUILD instead.”
解决方法:
cd /usr/local/cuda/include/crt
sudo gedit common_functions.h
将第74行对应内容直接注释
问题3:
project_kernel.cu中不能使用constexpr
解决方法:
删除constexpr,如下所示
__device__ float means[] = {12.12, 10.88, 0.23, -1.04, 0.21};
__device__ float stds[] = {12.32, 11.47, 6.91, 0.86, 0.16};
// __device__ constexpr float means[] = {0.0, 0, 0.0, 0.0, 0.0};
// __device__ constexpr float stds[] = {1.0, 1.0, 1.0, 1.0, 1.0};
问题4:
utils/pointcloud_io.h文件报pcd_io.h的错
解决方法:
将
#include
替换为
#include
#include
问题5:
camkelist change
问题6:
zhushi 596
7、rangenet++实时订阅ros消息推理版运行
完成编译后,将kitti转换为bag,由于kitti2bag软件需要python2.7的解释器,而目前本地python为3.9,所以新建一个虚拟环境python2.7,在里面安装。
生成bag后,修改launch文件,执行以下命令运行
$ roslaunch /src/RangeNetTrt8/launch/rangenet.launch
$ roslaunch /src/RangeNetTrt8/launch/rosbag.launch
效果如下