问题
用来深度学习的服务器重启了,结果会导致nvidia-smi 失效,会出现这样的错误:
NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
原因
Ubuntu 重启后会升级内核,升级后的内核与之前 的nvidia驱动版本不对应
解决方法
把内核降低到原来的版本,找到之前内核与之匹配的nvidia 驱动版本,
ll /usr/src/
图片最下面nvidia-510.60.02 就是之前nvidia 驱动,
然后执行
sudo apt install dkms
sudo dkms install -m nvidia -v 510.60.02
但是往往会执行失败,如果成功的话,就不会出现我们刚开始的问题了。
错误如下
File: /usr/src/nvidia-510.60.02/dkms.conf does not exist.
接下来才是重点:
降低内核版本
- 首先查看自己的grub版本
grub-install --version
看看(GRUB)之后的大版本是2.00以后还是2.00以前 ,后面操作会有不同
- 查看自己的内核版本
uname -r
我的是 5.15.0-58-generic
然后查看内核版本有哪些
grep menuentry /boot/grub/grub.cfg
然后找menuentry
if [ x"${feature_menuentry_id}" = xy ]; thenmenuentry_id_option="--id"menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-229d416d-6318-4310-a1b4-b5b7eb2faf88' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88' {menuentry 'Ubuntu, with Linux 5.15.0-58-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-58-generic-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88' {menuentry 'Ubuntu, with Linux 5.15.0-58-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-58-generic-recovery-229d416d-6318-4310-a1b4-b5b7eb2faf88' {menuentry 'Ubuntu, with Linux 5.15.0-25-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-25-generic-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88' {menuentry 'Ubuntu, with Linux 5.15.0-25-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-25-generic-recovery-229d416d-6318-4310-a1b4-b5b7eb2faf88' {
一共四个,很大可能就是 版本低的5.15.0-25 升级到了5.15.0-58 ,所以我们要降到 25
- 找到自己想换回的内核版本
这里我们换到 25,这里有两个 ,注意我们不看 (recovery mode)
复制上面信息中menuentry之后的单引号内的字符串,比如我的是 Ubuntu, with Linux 5.15.0-25-generic
- 修改grub
在终端输入 sudo vim /etc/default/grub
将第一个 GRUB_DEFAULT=0
修改为刚才复制的内容
GRUB_DEFAULT ="Ubuntu, with Linux 5.15.0-25-generic"
注意加双引号
- 更新grub设置
终端输入
sudo update-grub
出现以下错误
Warning: Please don’t use old title Ubuntu, with Linux 5.15.0-25-generic' for GRUB_DEFAULT, use
Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-25-generic’ (for versions before 2.00) or `gnulinux-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88>gnulinux-5.15.0-25-generic-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88’ (for 2.00 or later)
则根据之前看到的grub版本,如果大于等于2.00,则返回第二步中 要替换的内核版本 第三个单引号内的字符串复制粘贴 (其实也就是上述警告的or 的引号内容) 否则把 use后面单引号的内容复制粘贴。
也就是说一定要重新修改一次grub,就是
sudo vim /etc/default/grub
将 GRUB_DEFAULT ="Ubuntu, with Linux 5.15.0-25-generic"
替换为
GRUB_DEFAULT ="gnulinux-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88>gnulinux-5.15.0-25-generic-advanced-229d416d-6318-4310-a1b4-b5b7eb2faf88"
- 再次输入
sudo update-grub
此时应该没有warning - 重启
sudo reboot
重启会需要一定的时间 - 重启成功后,查看是否降低内核成功
uname -r
如果已经变成你想要改的内核版本,则继续,否则检查是否忘了sudo update-grub或者grub修改错误
此时nvidia的命令就已经可以使用了。
可以到这里就结束啦,目前我使用的没啥问题
如果还想要删除更新的内核
dpkg --get-selections | grep linux-image
linux-image-5.15.0-25-generic install
linux-image-5.15.0-56-generic deinstall
linux-image-5.15.0-57-generic deinstall
linux-image-5.15.0-58-generic install
linux-image-generic-hwe-22.04 install
自己自行搜索查看相关内容
参考
https://blog.csdn.net/HelloJinYe/article/details/106787295
https://blog.csdn.net/Terrence_Z/article/details/121921389