今天在捣鼓服务器的时候,无意间把nvidia驱动程序给清除了,无意间造成了一个大麻烦。由于服务器上多个用户都已经安装了多个不同版本的cuda,而这些不同版本的cuda全都依赖于之前安装的nvidia驱动,现在面临这着两个窘境:1、可能直接重新安装一下先前版本的nvidia驱动就直接可以解决问题,但是目前还不清楚之前安装的nvidia驱动是什么版本的。2、如果重新安装驱动也不成功的话,那么就要考虑先卸载cuda,等安装完nvidia驱动之后再安装并且配置cuda了。
一、抱着侥幸的想法,想先尝试一下第一步:直接重新安装一下驱动:
用以下命令查看以下设置自己服务器的驱动:
ubtuntu-drivers devices
#查看显卡型号的命令
lshw -numeric -C display
1、考虑能偷懒就偷懒的原则,能用apt安装驱动的话,自然是最好的,这就需要先在apt中添加一下显卡驱动的源:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
然后根据提示用apt命令安装合适的显卡驱动:
sudo apt install nvidia-driver-XXX
# 可选步骤
##安装推荐的nvidia
sudo ubuntu-drivers autoinstall
##安装确定版本的nvidia
sudo apt install nvidia-340
要是能成的话,就是走大运了,但是根据以往走坑的经验,大概率没有那么容易。。
二、如果上一部果然失败了,那么就老老实实地重新卸载nvidia驱动、cuda,然后重新手动安装吧。
在执行这部分的时候有一个原则:尽量让服务器上原先的用户还能够使用默认的torch、tensorflow等环境。这里又要分两种情况:1、这些环境所依赖的cuda全都是用conda自动安装在各自环境之中的。在这样的情况下,不清楚conda环境内的cuda是否和先前的nvidia驱动有依赖关系,如果没有的话,那只要安装一个能够兼容之前环境的nvidia驱动,那么就能够运行了;可是如果有依赖的话,那恐怕就得先安装一个nvidia驱动,然后再设置当前用户中的环境变量指向同样版本的手动安装的cuda了,当然这样的情况是有风险的。2、第二种情况是,他们所安装的环境都是依赖于系统中手动安装的cuda,在这种情况下,同样不知道这些手动安装的cuda是否依赖原先的nvidia驱动,如果不依赖的话,那也很方便,安装完nvidia驱动就可以直接运行了;如果不依赖的话,那完蛋。。还得重新手动安装cuda。
所以最为理想的情况是,在不卸载之前手动安装的cuda情况下,尝试重新安装nvidia驱动;次之的情况是安装完nvidia驱动之后,还需要手动安装一下cuda;最惨的情况就是即便手动安装了cuda,指定了环境变量还是没有效果。但根据先前尝试重新安装nvidia驱动的情况来看,会遇到不少相关的问题,其中一个问题的答案说可能就是先前手动安装的cuda与现在安装的nvidia驱动不匹配,导致安装不上。所以最佳的策略应该是先下载多个可能的驱动,逐个尝试一下能否直接安装。之前看服务器是Titan X的显卡,但是不清楚是Titan X_p、Titan X(Pascal) 还是GeForce GTX Titan_X,因此先将这三个显卡对应的nvidia驱动都先下载了下来。幸运的是Titan X_p和GeForce GTX Titan_X对应的显卡驱动是同一个,可以少试一个选项了。
接下来,若是安装Nvidia驱动的过程中都出现了问题,应当适当花一些时间去看看能不能解决,如果可以解决的话固然很好,安装完成后直接测试能够使用cuda,要是不能完成的话,可能就需要卸载cuda了,再安装Nvidia驱动了。
在卸载cuda前,务必要先看安装了哪些cuda,查询的方法是:
# 手动安装的cuda目录一般在这里
/usr/local
# 在conda环境中的torch中查询cuda、cudnn的版本
print(torch.version.cuda)
print(torch.backends.cudnn.version())
务必要记得所卸载的手动下载的cuda
考虑最坏的情况,先卸载手动安装的cuda、再安装nvidia驱动、最后手动安装cuda、cudnn:具体的步骤如下:
1、卸载手动安装的cuda
#卸载nvidia驱动
## 首先ctrl+Alt+F2进入命令行状态,然后停止lightdm
sudo service lightdm stop
##或者
sudo /etc/init.d/lightdm stop
##卸载命令位置/usr/bin/nvidia-uninstall,以下命令即可卸载。
sudo /usr/bin/nvidia-uninstall
## 或者
sudo apt-get autoremove --purge nvidia*
#卸载手动安装的cuda,这里以cuda-8.0为例,具体要看服务器的文件夹
sudo /usr/local/cuda-8.0/bin/uninstall_cuda-8.0.pl
#重启
2、安装nvidia驱动
# 禁用内核
sudo vim /etc/default/grub
添加如下,结果如下所示:
GRUB_CMDLINE_LINUX_DEFAULT="modprobe.blacklist=nouveau"
#重新生成配置
sudo grub-install
#坚持是否禁用成功
lsmod | grep nouveau
重启
reboot
#给驱动程序增加可执行权限
chmod a+x <显卡驱动安装程序>.run
#运行显卡驱动程序
sudo ./NVIDIA-Linux-x86_64-418.56.run -no-x-check -no-nouveau-check -no-opengl-files
运行的过程中,依次选择:Continue installation、No、Ok、Yes、Ok
重启
3、安装cuda、cudnn
#关闭图形界面
sudo service lightdm stop
chmod 777
#运行安装程序
sudo sh
安装cuda过程中不要安装driver
#判断是否安装成功,如果有/dev/nvidia0 /dev/nvidiactl /dev/nvidia-uvm 这三个文件的话,则安装成功
ls /dev/nvidia*
#将对应版本的cudnn文件放入cuda中
sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64
sudo chmod a+r /usr/local/cuda-10.1/include/cudnn.h
sudo chmod a+r /usr/local/cuda-10.1/lib64/libcudnn*
#查看cudnn 版本
cat /usr/local/cuda-10.1/include/cudnn.h | grep CUDNN_MAJOR -A 2
# 最为重要的是根据该账户下的conda环境需要,为不同账户配置不同的cuda环境变量
# 修改文件
sudo vim ~/.bashrc
# 在最后一行添加
export CUDA_HOME=/usr/local/
export PATH=/usr/local/
export LD_LIBRARY_PATH=/usr/local/
# 刷新环境变量
source ~/.bashrc
#测试cuda
进入/usr/local/cuda-10.1/samples/1_Utilities/目录
cd deviceQuery
sudo make
#有输出则表示安装成功
./deviceQuery
重启、完工~