目录
硬件环境:
GPU: RTX 3080
CPU: AMD 5800 8 core 16 thread
Operating System: Ubuntu20.04
一. 问题溯源:更新软件后无法调用
1.事情起因如下,我当时使用的是Ubuntu20.04的系统,
查看系统当前使用内核:
uname -r
发现是:
5.13.0-30-generic
本以为我的问题应该不是显卡驱动的问题,我通过nvidia-smi是可以显示出显卡使用信息的,只不过显卡无法调用而已,最后证明
确实需要重装显卡驱动!
查看推荐的显卡驱动版本:
ubuntu-drivers devices
二. 重装显卡驱动
2.1 卸载原有显卡驱动
先删除旧驱动:
sudo apt-get remove --purge nvidia*
安装一些需要的库:
sudo apt-get update
sudo apt-get install dkms build-essential linux-headers-generic
2.2 禁用nouveau
sudo vim /etc/modprobe.d/blacklist.conf
打开配置文件,在最后加入:
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
2.3 禁用nouveau内核模块
echo options nouveau modeset=0
sudo update-initramfs -u
重启,如果运行下面的命令无报错,说明禁用成功:
lsmod | grep nouveau
2.4 关闭用户图形界面
sudo systemctl set-default multi-user.target
sudo reboot
2.5 开启用户图形界面
sudo systemctl set-default graphical.target
sudo reboot
2.6 图形化安装(对我不可行)
网上有人通过图形化选择额外驱动对显卡驱动进行安装可以成功,我试了发现不行,输入
nvidia-smi
结果还是显示找不到驱动,说明这条路走不通.
2.7 PPA源驱动安装(可行)
1.首先查看电脑最适合(推荐)的显卡驱动版本:
我的显示推荐510版本的驱动.
到NVIDIA官网还可以查看显卡驱动版本对应的CUDA:
- 配置PPA:
sudo add-apt-repository ppa:graphics-drivers/ppa
3.更新:
sudo apt-get update
4.安装显卡驱动:
自动安装推荐版本:
sudo ubuntu-drivers install
sudo apt install nvidia-driver-510
提示正在安装:
安装块结束会提示你为Secure boot设置密码,如果前面没有
禁用secure boot
,则会在安装过程中会提示设置一个密码,在重启时需要输入密码验证以禁用secure boot,重启后
会出现蓝屏
,这时候不能直接选择comnue,而应该按下按键,选择Enroll MOK, 确认后在下一个选项中选择continue,接着输入安装驱动时设置的密码,开机。
建议在BIOS中禁用Secure boot,否则你每次都得输入密码,要不然桌面重启后都会卡进一个图标很大的Ubuntu桌面!
5.安装mesa包:
sudo apt-get install mesa-common-dev
6.完成安装后重启:
sudo reboot
三.重启后显卡驱动确认
1.如果Ubuntu显示器开启夜灯模式,夜灯如果功能正常,初步说明驱动应该是安装上了:
2.输入:
nvidia-smi
发现已经可以找到:
3.测试pytorch-GPU是否正常工作:
import torch
flag = torch.cuda.is_available()
print(flag)
运行后发现:
表明一切回归正常!
四. 删除错误内核
查看所有内核版本:
dpkg --get-selections | grep linux
删掉这个linux-modules-5.13.0-35-generic版本的内核:
sudo apt-get remove linux-modules-5.13.0-35-generic
这样每次启动默认都是正确的内核版本了!
五.总结
1.这次还是因为手贱,点击了软件更新,虽然没有更新内核,只更新了几个lib包,结果显卡还是不能正常工作了,来来回回又是改内核,又是重装显卡驱动,最后得出了一个重要结论:
如果非必要,不要进行软件更新!
2.当然如果你疯狂地在底线边缘试探,请记得安装如上方法安装显卡驱动,一般显卡驱动重装了就好了!