NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver….

今天学校突然断电了一下,导致两台cuda服务器重启,其中一台重启就无法使用显卡了,使用 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

经查,这是因为内核自动升级导致与原本的显卡驱动不兼容了

方法一:重装驱动

我的解决办法是重装驱动即可

# opengl是用于图形绘制的库,这里不需要
sudo ./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files

驱动下载地址:https://www.nvidia.cn/Download/index.aspx

如果在重装驱动时提示有显卡占用,但实际没有cuda程序在运行的话(例如桌面程序可能还在运行),可以使用以下命令解除占用:

# step 1: 停止图形用户界面并只保留基本的命令行界面
sudo systemctl isolate multi-user.target

# step 2: 卸载Linux内核模块nvidia-drm,该模块是nvidia显卡驱动的一部分
# 或者使用 rmmod 也能卸载模块
sudo modprobe -r nvidia-drm

# step 3: 安装驱动,如果这里还报上述错误,使用 `lsmod | grep nvidia.drm` 命令查看是否还没卸载,如果没有可以重启试试
# lsmod 命令用于在列出已经加载的所有内核模块
sudo ./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files

# step 4: 开启图形界面
sudo systemctl start graphical.target

方法二:DKMS

简介

DKMS(Dynamic Kernel Module Support)是一个软件,需要手动安装。用来管理和维护一些原本依赖内核的模块,使得它们能够独立出来不再依赖内核版本。例如nvidia驱动就依赖内核版本,假如内核更新了则驱动就需要重新编译安装。但如果将这些模块交予DKMS来管理则会方便许多,他会自动检测系统内核,如果有升级它就会自动重新编译和安装它所管理的内核模块。

它在模块构建过程中的角色优点类似于java中的maven或gradle,负责构建和管理整个模块。这些第三方内核模块如果需要加入DKMS的支持,则也需要遵循其开发规范,例如项目需要一个dkms.conf文件用来配置该模块如何进行编译、安装和卸载等,类似maven的配置文件这种。当然,maven只负责这个项目的构建运行相关工作,如果要实现根据环境自动重新编译安装则还需要类似devops的东西,比如jinkens。它们合起来的功能就类似于DKMS在内核管理方面的工作。

除了本身就使用DKMS规范进行开发的第三方内核模块可以使用DKMS进行管理外,其他任何第三方内核模块,如果提供了源码(必须要有源码,因为DKMS是基于源码进行构建的),就可以手动为其添加DKMS,具体操作如下:

nvidia驱动

nvidia驱动从开发之初就添加了DKMS支持,故你只需要在安装驱动时指定使用DKMS版本的就行

sudo ./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files --dkms

网上有些教程使用 dkms install -m nvidia -v xxxx 其本质上也是一样的,只不过这种操作可以手动指定本地已经存在的nvidia驱动源码版本。

参考

https://www.likecs.com/show-205014101.html

https://unix.stackexchange.com/questions/440840/how-to-unload-kernel-module-nvidia-drm

Leave a Comment