资讯详情

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版本吗? 这么倒腾了一圈这个问题并没有解决。

所以,问题的正解是,也就是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就能见证奇迹:

标签: 卡用连接器装置

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台