这不部分实在踩了很多坑,花了两天多算是debug用时最长的一次了。网上的内容太杂,资料很难找。这里整理一下遇到的问题。
一.cuda与cudnn
首先是nvcc --version报错 与 nvidia-smi报错
nvcc按照报错提示 使用sudo apt-get install nvidia-cuda-toolkit安装后,可以正常显示,这里应该是自动下载了10.1的版本
这里安装非常慢,换了几个源都没有效果,最后选择去linux软件与更新换成最佳服务器后终于解决
nvidia-smi报错则是最后也没有解决
nvidia-smi报错无法解决,这就导致我无法查看我cuda最高支持的版本是什么。
因此后续出现的版本不兼容问题,我就无法使用cuda 10.1以外的版本进行测试。
按照上述内容安装好了cuda,就可以安装cudnn了
这里推荐去https://developer.nvidia.com/rdp/cudnn-archive寻找与自己cuda匹配的版本下载
解压后按照解决cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2无法查看cudnn版本的问题_cudnn.h没有版本信息-CSDN博客中提到的方法进行复制
值得一提的是我这里在复制的时候会报错,没有找到路径
但是使用sudo nautilus打开一个有管理员权限的文件管理器,然后去/usr/local中直接新建lib64和include就能够复制了。
二.libtorch解压与vins-fusion的编译
安装libtorch是个大坑,一定要选择和自己cuda版本对应的libtorch安装
参考了pytorch官网上下载libtorch各个版本的url_libtorch官网-CSDN博客
其他资料中的也可以,这里我最后下载的是libtorch-shared-with-deps-1.7.0+cu101
这个解压完了是一个libtorch文件夹
安装好了cuda和cudnn,我的superpoint移植vins-fusion的代码也写完了,接下来就是编译了
这里报错信息很长
主要的error是‘Tensor’ is ambiguous
‘TensorExample’ was not declared in this scope
‘TensorExample’ does not name a type
template argument 1 is invalid
这种,这些报错全部都是namespace的问题,不知道libtorch中的torch跟哪个包里的重名了,因此这里只需要根据红色的报错信息一个一个改,在所有的Torch前面加上torch::
都改成torch::Torch
主要改的位置是
/home/u20/3rdparty/libtorch/include/torch/csrc/api/include/torch/data/samplers/random.h:51:3
/home/u20/3rdparty/libtorch/include/torch/csrc/api/include/torch/data/example.h:11:27:两个
/home/u20/3rdparty/libtorch/include/torch/csrc/api/include/torch/data/example.h:53:56
再往后的这些都是并发症,改完前面就可以不用管了
改完之后重新编译
此时如果选择的错误的版本会出现大量的ros报错
undefined reference to `ros::console::initializeLogLocation
首先我尝试了YOLOv4在ROS-Melodic上的部署-libtorch(附源码,非Darknet)_移植yolov4至ros-CSDN博客中提到的方法
完成这个设置之后确实不报ros问题了。
这个问题一开始我以为是cmake的问题,后来发现就是libtorch版本问题
这里测试了很多版本
其中1.7.1出现了 CMakeLists.txt:7 (find_package)
-- Configuring incomplete, errors occurred!的问题,根据指定的路径找不到包
更改到正确的版本后,这里选择了1.7.0重新编译
接下来出现了so文件缺失的错误,在/usr/local/cuda/lib64中缺失libnvToolEXT和libcudart
这里选择整个电脑搜索,最后在usr/lib/x86_64-linux-gnu中找到,复制到相应的文件夹,这里也建议使用sudo nautilus打开之后去复制
这几个so文件还有链接的问题,要先复制so.1.0.0再去复制so.1最后复制so,不然会断链接
补上缺失的文件后再次编译,如果出现c10的错误,也是版本问题,建议换版本,终于编译通过