Ubuntu更新显卡驱动与升级cuda版本“采坑“小记

1. 写在前面

这次记录下今天安装百度的自动驾驶框架Apollo的时候,在硬件环境上采的一些坑,花费了5个多小时的时间,才把Apollo框架装上且能正常使用GPU,通过今天的摸索,让我对Cuda升级和显卡驱动等有了一定的了解。

关于Apollo框架的安装过程,可以直接见官网

我直接按照这个步骤来的,一开始是直接按照官网上说的步骤来的,不过之前由于实验室服务器上都装好了cuda等,所以这步跳了过去。从docker这里开始。 把前面的基础工作弄完之后,然后开始安装Apollo,这个也没费多大劲,装完。

然后apollo项目主目录,通过命令./apollo.sh拉镜像建容器然后启动,本以为大功告成,结果到最后告诉我Failed to start docker container "apollo_runtime_standalone_wu,也就是容器启动失败,由于我这是第一次接触这个东西,对于docker更是只知道皮毛,所以到这里就懵逼了下,百度也没出个结果,那就自己摸索了。

既然./apollo.sh命令直接这样报错,也不说原因,那我就想单独启动下这个容器试试。

# 先看看当前有哪些容器
docker ps -a

# 启动上面失败的容器
docker start apollo_runtime_standalone_wu

结果依然是启动失败,但这次报了原因 nvidia-container-cli: requirement error: unsatisfied condition: cuda>=11.1, please update your driver

这里就说cuda版本太低了,匹配不上当前容器需要的cuda版本,于是我nvidia-smi了下,发现当前的cuda=10.4

于是乎我就差不多知道解决办法了。于是乎就想着,升级驱动呗。

2. 更新显卡驱动

升级驱动,我了解过之前,必须要把之前的驱动卸载掉,所以这里就使用了下面几行命令:

sudo /usr/bin/nvidia-uninstall
sudo apt-get --purge remove nvidia-\*  # 有的不需要加-\
sudo apt-get purge nvidia-\*   # 有的不需要加-\
sudo apt-get purge libnvidia-\*  # 有的不需要加-\

这样完事之后,输入

sudo dpkg --list | grep nvidia-*

正常的话,是没有出现任何内容,算是驱动卸载干净了,但是我这里还出现了一些内容,于是

sudo apt-get autoremove

这样才清理干净。

清理干净之后, 那就装驱动呗, 但是装什么版本呢? 升级到什么版本呢? 这个我就不知道了,因为之前对这块不了解, 也不知道究竟当前cuda适合啥驱动版本,没注意,于是开始就无脑根据apollo官网给的:

sudo apt-get update
sudo apt-add-repository multiverse
sudo apt-get update
sudo apt-get install nvidia-driver-455

安装了个455版本,装完之后,输入nvidia-smi,结果可想而知:Failed to initialize NVML: Driver/library version mismatch, 我就知道肯定不会这么顺利。

出现了个版本不匹配,大致上我能猜到,就是当前cuda与装的这个455版本对应不上吧。 于是乎,百度搜了下,根据这篇博文,了解到NVIDIA 内核驱动版本与系统驱动不一致,那就先看下当前内核驱动版本是多少:

cat /proc/driver/nvidia/version

-->
NVRM version: NVIDIA UNIX x86_64 Kernel Module  440.34  Wed Jun 26 12:19:48 CDT 2019
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~18.04.12)

哦,系统内核是440,结果装了个455的,故出现了这个问题。

那怎么解决呢? 那你可能说,我再装个440的驱动不就行了? 果真,我还就这么尝试了,这里倒是行了, 那我折腾这么一圈的意义是啥呢? 本质上我不是为了解决Apollo框架里面不支持10.x版本吗? 这么倒腾了一圈这个问题并没有解决。

所以,问题的正解是NVIDIA系统内核版本的升级,也就是Cuda版本的升级。

3. Cuda版本升级

首先,可以来这个目录下目前安装的cuda版本:

在这里插入图片描述
之前的话我这里只有一个10.1版本的。所以接下来就是在这个版本的基础上重新整一个11.x的版本,参考的这篇博文

这里还是先按照上面的方法把旧的驱动给卸载掉,因为我发现新的cuda安装的时候,会自带驱动,所以,我这里就直接把cuda11.2的安装包下载了下来。

wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run

下载完了之后,开装:

sudo sh cuda_11.2.0_460.27.04_linux.run

结果报驱动安装失败,所以这里就打算,单独去官网下载驱动。参考上面博文的方式,选择了470.82版本,下载。完事之后,安装:

sudo chmod a+x NVIDIA-Linux-x86_64-470.82.run

sudo ./NVIDIA-Linux-x86_64-470.82.run -no-x-check -no-nouveau-check -no-opengl-files

这里,sudo ./xx.run 命令后面必须添加选项-no-x-check -no-nouveau-check -no-opengl-files,否则会报错。

–no-opengl-files 只安装驱动文件,不安装OpenGL文件
–no-x-check 安装驱动时不检查X服务
–no-nouveau-check 安装驱动时不检查nouveau

单独安装了驱动, 在启动上面Cuda的安装程序,此时把驱动这里的叉号去掉,即不用它装了。
在这里插入图片描述
再次安装,就出现了

An NVIDIA kernel module ‘nvidia-drm’ appears to already be loaded in your kernel. This may be because it is in use (for example, by an X server, a CUDA program, or the NVIDIA Persistence Daemon), but this may also happen if your kernel was configured without support for module unloading. Please be sure to exit any programs that may be using the GPU(s) before attempting to upgrade your driver. If no GPU-based programs are running, you know that your kernel supports module unloading, and you still receive this message, then an error may have occured that has corrupted an NVIDIA kernel module’s usage count, for which the simplest remedy is to reboot your computer.

这个问题解决办法,关闭所有装置,并停止载入NVIDIA驱动程序

sudo systemctl isolate multi-user.target
sudo modprobe -r nvidia-drm

完事之后,一路ok,算是把Cuda给升级好了。由于这次装的驱动也和这个Cuda的版本匹配,所以此时再输入nvidia-smi, 奇迹出现。
在这里插入图片描述
成功把Cuda的版本从10.4升级到11.4。

4. 安装NVIDIA Container Toolkit

这里是默认已经装好了docker,如果想让容器使用服务器的GPU的话,需要运行下面命令来安装NVIDIA Container Toolkit

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get -y update
sudo apt-get install -y nvidia-docker2

安装完成后,重启下docker就可以了, 如果不执行这个命令,在启动Apollo的时候,会提示找不到GPU驱动,自动开启一个cpu的。

sudo systemctl restart docker

5. 进入Apollo

此时再次回到apollo/的主目录, 重启docker,把之前的容器删除掉,

docker rm -f apollo_runtime_standalone_qiao

然后再运行命令
在这里插入图片描述
就进来了。

这样就能愉快的进行后面的学习啦。

6. 小总

这次采坑的两点收获:

  1. 更新显卡驱动的时候,一定要把之前的驱动删干净,另外不要乱更新,一定要和当前的cuda版本匹配上
  2. 升级cuda的正确姿势

7. 后记

在学习框架的时候,发现必须要使用浏览器,因为dreamview是界面交互的那种形式,而我目前是xshell远程连接的服务器,一些基础命令还可以测试,但遇到了各种界面交互操作,服务器上的浏览器没法在本地xshell打开。所以后续还需要去解决这块问题才行。

今天探索了下,第一种方法就是在xshell的基础上,再装一个Xmanager,在这里面
在这里插入图片描述
有个Xstart,可以按照下面方法配置命令(事先保证存在),这样一运行:
在这里插入图片描述
可以先从Xshell里面运行下这个命令,有没有,如果报错说$DISPLAY没有存在,就用下面代码指定:

export DISPLAY='219.216.65.179:0.0'

这里的这个ip地址就是我们本机的ip地址。这里的原理就相当于把服务器上的浏览器界面转到本机上进行运行,所以需要本机的IP。这时候点击上面的运行,就出来一个新的命令行代码。 此时在里面输入firefox,就能在本机上打开火狐浏览器了。

当然,这个方法发现打开相关页面会非常慢,所以就探索了第二种方式, VNC viewer软件。这里只说使用:

  1. 首先Windows上安装Vnc viewer客户端

  2. 其次,在Linux上安装Vnc viewer服务器端, 命令如下:

    # Unbuntu安装  这时候会涉及到设计密码,这个密码当客户端连接的时候会用到
    sudo apt-get install vnc4server
    
    # 启动   后面的:2是进程号,具体连接的时候需要指定
    vncserver :2
    # 杀掉
    # vncserver -kill: 2
    
    # 如果忘了之前设置的密码,可以重新修改密码
    vncpasswd
    
  3. 客户端连接,这时候只需要输入服务器端的ip+进程号即可。

    在这里插入图片描述
    这样就能直接连接远程的Linux桌面了,前提是远程Linux是安装了桌面的。如果没有的话,可以看这篇文章,如何打开。 我实验室服务器默认之前装了图形界面的。所以到了这一步就直接能显式远程的Linux桌面了。

此时,apollo容器里面输入

./scripts/bootstrap.sh

就能开启DreamView了。

打开谷歌浏览器(火狐我这边竟然显式不出界面来), 输入localhost:8888就能见证奇迹:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wuzhongqiang/article/details/124502761