与Ubuntu的初识准确来说是2020年的11月份,当时安装是为了使用ROS上的一些功能。折腾了一两天,ROS安装上了,后来却因某些原因搁置了ROS的进一步学习。到了年末,学校布置课设,拿到的是一个图像处理的任务。我心想Ubuntu都装好了,就顺便装个Python开发环境,以后就直接用Ubuntu开发好了,跟CUDA的“爱恨情仇”就此展开。
CUDA与其他软件的安装不同,对系统环境的要求较高。比如各版本的CUDA需要与驱动严格对应,CUDA与cuDNN也必须对应,在Linux系统中还需要与gcc版本严格对应(这里涉及我血的教训)。关于CUDA与显卡驱动和cuDNN的对应关系,在我之前Windows系统安装CUDA的教程里面有相应的总结,客官请移步。
关于我具体安装的版本介绍如下:我的Ubuntu选择的是18.04版本,我的显卡是笔记本端的1050,在Ubuntu 软件和更新-附加驱动中可以看到系统推荐的几个驱动版本,包括390、410、460、470等版本,这里我选择的是460版本的驱动。
基于上述基本情况,我选择的CUDA版本是10.1,cuDNN版本是7603。
Ubuntu中安装显卡驱动的方式五花八门,但很多方法风险性较大,一旦安装出错需要一定的调校能力方可使系统恢复正常。这边给出一个我去年安装显卡驱动的帖子,此帖在我当时看来是众多不靠谱教程中还算靠谱的一个。
去年安装的时候因为不熟悉Ubuntu系统嘛,胡乱安装操作一通,英伟达显卡驱动是安装上了的。但后来在安装CUDA的时候出了问题,甚至听信某帖子关闭图形界面,把我的Ubuntu启动界面给搞无了。一直搁置到最近才重新拾起Ubuntu上CUDA安装的问题,根据我现在安装的经验,如下方法在安装驱动的时候是最为有效的。
在Ubuntu的 软件和更新-附加驱动中可以看到本机显卡支持的驱动版本,根据要安装的CUDA版本选择合适的驱动。例如我要安装的是CUDA 10.1,上述列出的390和410版本是无法使用的,我选择的是460版本。在选择完相应的驱动版本后,需要应用更改,大致界面就是下图(采用的是网图,倾删)这样:
在快结束的时候会让输入一个 secure boot 的密码,这个密码在重启时进入 perform mok management 界面是有大用的,需谨记!!!
重启进入 perform mok management 界面后,选择第二个 enroll mok,然后选择continue,再选择yes,输入之前的 secure boot 密码。
这里给出我在搞定驱动问题时参考的一篇博客,此博客极其适合刚入门的小白,看了之后绝对清楚!
在2020年的时候,我是安装驱动成功,安装CUDA失败才罢手的。到2021年的现在,我是先解决了CUDA的安装,而后发现命令行输入 nvidia-smi 指令显示不对后又重新深刻地认识了驱动安装的问题。
我输入 nvidia-smi 显示如下:
NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
网上搜索了一下,博客中提到的大致解决方法如下:
sudo apt-get install dkms
sudo dkms install -m nvidia -v xxx.xx
上述shell命令第二行是与各自的驱动版本直接相关的。以我的驱动版本为例,第二行应写作:
sudo dkms install -m nvidia -v 460.84
需要说明的一点是,该方法适用的情形大体是之前驱动和CUDA都安装成功了,但由于Ubuntu内核版本的升级,CUDA与驱动直接的依赖关系被破坏了。但我今年在解决了去年遗留的CUDA安装问题后采用这两行命令仍旧无法正常让CUDA和驱动间建立联系,真实情况是除了内核,你的gcc版本决定了驱动程序能否正常工作。
之前在搜索驱动和CUDA间无法通信的解决方案时就看到了这篇博文,文章中提到的报错与我大致相似,也是让我去make.log文件中查看具体的错误原因。
Error! Bad return status for module build on kernel: 5.4.0-80-generic (x86_64)
Consult /var/lib/dkms/nvidia/460.84/build/make.log for more information.
起初我没太当回事,忽视了这一条。在我自己搞崩溃找了淘宝卖家也无法解决的第二个星期,我注意到了这条错误,且我真的打开了make.log文件去查看具体的错误原因。文件中所提及的错误与博客中并不一样,报错的一个示例如下:
unrecongnized command line option '-fstack-protector-strong'
稍加搜索,我发现基本也是引流到gcc版本的问题上,而后我通过
gcc -v
看到我的gcc版本是4.8.x,这与主流的7.3.0版本相差甚远。参考这篇博文,将我的gcc默认版本设置成gcc7,至此,重复前文提到的驱动安装步骤即可在驱动和CUDA间建立联系。
因为我们事先已经定好了要下载CUDA 10.1版本,直接打开CUDA官网,选择之前的版本。一波选择之后,会提示你安装的步骤,根据英伟达官方提供的教程一步步安装应该就能顺利安装上CUDA。
注意,这边需选择deb格式,本地安装,方便采用命令直接安装。如果网速较慢,也可先下载deb文件包,然后再进行后续的安装步骤。总之,Linux环境下安装东西都需要一个较好的网络环境。
CUDA安装成功的关键一点是需要配置相应的环境。reboot 重启系统后,采用如下命令打开配置文件:
sudo gedit ~/.bashrc
在文件末尾添加如下命令:
export PATH=/usr/local/cuda-10.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
保存之后在命令行窗口使用 nvcc -V 查看能否检测到安装成功
因为CUDA是去年装了一半嘛,然后又因为网络原因先下了10.0,又下了10.1,两个都安装了,但显示检测不到。大概的原因是版本之间的依赖存在一定的错误,我选择把10.0给卸载,但CUDA在Ubuntu已安装的软件中找不到对应的图标,这边找到一个完全卸载CUDA的方法:ubuntu完全卸载CUDA
因为我是时隔半年才打开的Ubuntu,中间一直没有更新系统的源:
sudo apt-get update
所以在一开始安装驱动、包括CUDA与驱动间重新建立通信的语句全部都是失效的。然后更新系统源就会报如下错误:
W: GPG 错误:http://packages.ros.org/ros/ubuntu bionic InRelease: 下列签名无效: EXPKEYSIG F42ED6FBAB17C654 Open Robotics
E: 仓库 “http://packages.ros.org/ros/ubuntu bionic InRelease” 没有数字签名。
我采用的是中科大的源,然后运行如下语句即可重新拿到秘钥并更新源:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
参考博文:sudo apt-get update 出现签名无效或者没有数字签名