Linux 35.5 + JetPack v5.1.3@CUDA安装和版本切换
- 1. 源由
- 2. 现象
- 3. 分析
- 3.1 看本质
- 3.2 善动脑
- 3.3 笔记回忆
- 3.4 底层思考
- 3.5 多版本
- 4. 版本切换
- 5. 总结
1. 源由
最近遇到一些CUDA编程,以及编译链接过程出现一些版本不匹配的问题。
首先,申明下,本人是从来没有做过CUDA开发的。想在此表达的意思,只要底层概念清楚,去理解解决一些问题,还是能非常快的搞定的(反正我花了大概2个小时解决CUDA版本不一致导致无法编译成功的问题)。
2. 现象
从提示角度看,编译链接的时候发现找到了CUDA 12.6版本,但是要求使用11.4的版本。
注:之前这个软件包编译链接一切顺利,突然莫名其妙的就这样了。妥妥的直接崩溃!!!
-- +++ processing catkin package: 'camera_models'
-- ==> add_subdirectory(VINS-Fusion/camera_models)
CMake Error at /usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):Could NOT find CUDA: Found unsuitable version "12.6", but required is exactversion "11.4" (found /usr/local/cuda)
Call Stack (most recent call first):/usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:391 (_FPHSA_FAILURE_MESSAGE)/usr/share/cmake-3.16/Modules/FindCUDA.cmake:1104 (find_package_handle_standard_args)/usr/local/lib/cmake/opencv4/OpenCVConfig.cmake:86 (find_package)/usr/local/lib/cmake/opencv4/OpenCVConfig.cmake:108 (find_host_package)VINS-Fusion/camera_models/CMakeLists.txt:16 (find_package)
3. 分析
底层逻辑思维的重要性,在于透过现象看本质;而技术出发的角度不仅仅是善于动脑,更要学会动手。
3.1 看本质
看这篇文章的小伙伴,不知道有几个用过Windows 95/98的?呵呵,如果用过,请评论留言。因为这样的小伙伴依然在这样一线动脑的可能不多了。
在上述系统上,如果出现蓝屏或者系统重启,通常Windows操作系统会提示用户,请卸载最近安装的程序(应用软件或者驱动程序)。
因此,大概率是最近安装什么导致了这个当前系统在编译链接的时候由于底层库或者配置环境的变更,导致了此次错误。
回忆:是的,我装了CUDA 12.6,而且一开始装了12.6,nvcc --version
命令还用不了,还需要修改PATH
路径。
好吗,估计这里就是问题的原因了。可是乍解决呢?知道管个PPPPPPPP用,,,所以,,,,
3.2 善动脑
俗话说“懒人多福”,在此就是,既然我都装了最新的CUDA12.6,凭什么我要换回去,再说了我也没有删除或者卸载CUDA 11.4啊。
能不能两个都要,随意切换呢?
3.3 笔记回忆
俗话说“好记性,不如烂笔头”,笔者的习惯就是干活干事,都会比较好的做一些简单的记录。
有以下几个好处:
- 能够有个过程记录,以免受到干扰忘记做到哪里了;
- 事后可提供详实的复现步骤;
- 根据前面的工序,通过记录内容,进行回退工作;
- 根据实验步骤或者先后次序,结合结果进行底层逻辑分析,定位可能问题;
- CUDA Toolkit 12.6 Update 1 Downloads
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/arm64/cuda-ubuntu2204.pin
$ sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/12.6.1/local_installers/cuda-tegra-repo-ubuntu2204-12-6-local_12.6.1-1_arm64.deb
$ sudo dpkg -i cuda-tegra-repo-ubuntu2204-12-6-local_12.6.1-1_arm64.deb
$ sudo cp /var/cuda-tegra-repo-ubuntu2204-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-12-6 cuda-compat-12-6
$ export PATH=/usr/local/cuda/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
3.4 底层思考
- 环境变量
$ export PATH=/usr/local/cuda/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
- 安装路径,第一层
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Wed_Aug_14_10:14:07_PDT_2024
Cuda compilation tools, release 12.6, V12.6.68
Build cuda_12.6.r12.6/compiler.34714021_0
- 安装路径,第二层
$ ls /usr/local/cuda -l
lrwxrwxrwx 1 root root 22 9月 4 08:05 /usr/local/cuda -> /etc/alternatives/cuda
$ ls /etc/alternatives/cuda -l
lrwxrwxrwx 1 root root 20 9月 14 07:09 /etc/alternatives/cuda -> /usr/local/cuda-12.6
3.5 多版本
那现在有哪些CUDA在系统上,分别是如何安装的?
$ ls /usr/local/cuda -l
lrwxrwxrwx 1 root root 22 9月 4 08:05 /usr/local/cuda -> /etc/alternatives/cuda$ ls /etc/alternatives/cuda* -l
lrwxrwxrwx 1 root root 20 9月 14 07:09 /etc/alternatives/cuda -> /usr/local/cuda-12.6
lrwxrwxrwx 1 root root 20 9月 4 08:05 /etc/alternatives/cuda-11 -> /usr/local/cuda-11.4
lrwxrwxrwx 1 root root 20 9月 14 07:09 /etc/alternatives/cuda-12 -> /usr/local/cuda-12.6
4. 版本切换
- Step 1:编辑 .bashrc 文件
在文件末尾添加:
export PATH=/usr/local/cuda-11.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
保存并退出后,运行:source ~/.bashrc
- Step 2:切换 CUDA 版本
$ sudo rm /etc/alternatives/cuda
$ sudo ln -s /usr/local/cuda-11.4 /etc/alternatives/cuda$ ls /etc/alternatives/cuda -l
lrwxrwxrwx 1 root root 20 9月 14 10:01 /etc/alternatives/cuda -> /usr/local/cuda-11.4
因为环境变量是关联在/usr/local/cuda
的bin
和lib64
的,所以环境变量不需要更新。
- Step 3:验证当前CUDA版本
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Sun_Oct_23_22:16:07_PDT_2022
Cuda compilation tools, release 11.4, V11.4.315
Build cuda_11.4.r11.4/compiler.31964100_0
注:如果实在不放心,重启下板子,看看是否还有cache什么的问题(这个逻辑,还没有深入研究)。
- Step 4:重新编译ROS工程
$ rm build/ devel/ -rf
$ catkin_make
5. 总结
当然除了这个方法以外,还可以通过工程里面指定编译的CUDA版本。
总的来说,学会底层逻辑思维(透过现象看本质),勤于动手,事情总是能解决的!