最近实验室新到了服务器,需要装了下cuda的环境,并且希望能将各个环境都装上,为了之后的使用,下面是这两天踩到的一些坑。
1. 安装驱动
在安装cuda和cudnn之前需要首先安装显卡驱动,搜索英伟达显卡驱动:nvidia driver download,然后进入官网,选择对应的显卡和系统类型:
然后选择search进行下载,下载完成之后需要加上执行权限:
chmod +x NVIDIA-Linux-x86_64-430.26.run
然后执行:
sudo ./NVIDIA-Linux-x86_64-430.26.run
这里需要注意,因为高版本显卡驱动是对低版本兼容的,而有的版本的cuda需要比较高的显卡驱动,基本对应关系如下表:
所以如果我们为了之后可以随意更换其他版本的cuda,我们这里应该安装尽可能高版本的显卡驱动,所以我这里选择的是430.26这样的高版本驱动。
驱动安装完成之后可以输入nvidia-smi查看是否正常:
2 .cuda下载
这里先说一下一种比较常见也是比较简单的装cuda的方式:
如图中所示,选择runtime(local)的方式进行下载,这种方式是最简单的,下载完成之后和之前一样的操作:
chmod +x cuda_9.0.176_384.81_linux.run
sudo ./cuda_9.0.176_384.81_linux.run
然后就会有一些选项,其中注意不用安装驱动了,然后Samples也可以不用安装,而cuda的安装位置就使用默认的/usr/local/。然后还有一个是否简历软链接的选项,如果选择是也就是在/usr/local/下创建一个cuda文件夹相当于cuda-9.0,选择与否都行,不过如果没选择,你的环境变量添加的cuda位置就是/usr/local/cuda-9.0,这个不要搞错了。
3. cudnn的安装
cudnn的安装也很简单,进入cudnn下载官网,这里cudnn的下载需要在官网上进行登陆,如果没有账号的同学需要登陆一下,然后找到对应的cuda版本:
cudnn版本倒是无所谓,然后最简便的方法就是下载cuDNN Library for Linux。
这里下载下来之后是cudnn-9.0-linux-x64-v7.6.0.64.solitairetheme8,我们需要将它重命名为tgz文件:
mv cudnn-9.0-linux-x64-v7.6.0.64.solitairetheme8 cudnn-9.0-linux-x64-v7.6.0.64.tgz,
然后解压:
tar -xvf cudnn-9.0-linux-x64-v7.6.0.64.tgz
解压完的文件夹名称为cuda,然后将一些文件拷入/usr/local/cuda-version下面就行:
sudo cp cuda/include/cudnn.h /usr/local/cuda-9.0/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-9.0/lib64/
sudo chmod a+r /usr/local/cuda-9.0/include/cudnn.h
sudo chmod a+r /usr/local/cuda-9.0/lib64/libcudnn*
然后将cuda加入到系统或者用户环境变量都可以:
系统环境变量 /etc/profile:
export PATH=/usr/local/cuda-9.0/binKaTeX parse error: Expected '}', got 'EOF' at end of input: {PATH:+:{PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64KaTeX parse error: Expected '}', got 'EOF' at end of input: …LIBRARY_PATH:+:{LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-9.0
添加完之后 source /etc/profile使环境变量生效
用户环境变量 ~/.bashrc:
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-9.0
添加完之后 source ~/.bashrc使环境变量生效
4. tensorflow和pytorch 的安装
这里注意tensorflow的版本也是和cuda之间有一定对应关系的,但是我并没有查到具体的对应关系,只查到这个:
所以我们为了稳妥,选择1.12.0版本的tensorflow:
pip3 install tensorflow-gpu==1.12.0,
pytorch 安装可以去pytorch官网选择一下:
所以我们也直接pip3 install torch torchvision。
至此,我们也就可以去python3中查看tensorflow-gpu和pytorch是否安装完成:
导入未发生错误,代表安装正确。
如果出现下面错误:
也就是最常见的错误,如果出现这个代表环境变量可能没有配置好,可以输入env看一下自己的环境变量是否有刚才加入的三项。
5. 多版本cuda
此时我们已经装好了一个版本的cuda,然后可以下载其他版本的cuda runtime 和其他版本的cudnn,相同的方法重复2和3步,只是最后不添加环境变量,当我们想用到那个版本的时候,在环境变量中换成相应版本即可。
6. 新的尝试
虽然此时已经可以使用,但是因为环境变量的存在,如果在某些情况下加载不了/etc/profile和~/.bashrc中的环境变量时,cuda就会又报错,就比如使用pycharm远程连接服务器,这时既没有执行/etc/profile环境变量,也没有执行用户下的.baserc环境变量,机会继续报上面那个ImprotError错误,当然可以通过在pycharm中添加环境变量解决,但是每次重新创建一个远程项目都需要这样,会特别麻烦,不优美。所以能不能有什么方法更优美,答案时肯定的。
之前我们选在使用runtime安装,这里我们选择使用deb方式安装:
然后按照官网给我步骤:
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
sudo apt-key add /var/cuda-repo-9.0/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
注意这里会安装大量的依赖,速度会特别的慢,并且这里会重新安装一下这里的驱动,也就是9.0内置的384驱动,安装完之后,同样的方法下载cudnn:
这里我们也是deb版本,这里下载runtime版本,然后执行:
sudo dpkg -i libcudnn7-dev_7.5.0.56-1+cuda9.0_amd64.deb
这个依赖就比较少了,安装速度很快。
等安装完成之后就不需要配置环境变量直接可以用了。
并且也不会出现pycharm需要重新设置环境变量的问题。
7. 遇到的错误
ERROR: You appear to be running an X server; please exit X before installing. For further details, please see the section INSTALLING THE NVIDIA DRIVER in the README available on the Linux driver download page at www.nvidia.com
发生了调用冲突,解决方案:
sudo service lightdm stop
sudo lightdm stop
pip3报错,subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1.:
sudo rm /usr/bin/lsb_release
8. 新的挑战
之前提到一个问题,我们需要安装尽可能高的版本的驱动,这样才能兼容多版本的cuda,但是刚才使用deb的方法安装cuda虽然能解决环境变量不加载的问题,但是deb却默认安装了384版本的驱动,这显然时不能兼容所有cuda9.0以上的版本,所以我们需要重新装驱动,但是之前装cuda安装了大量的依赖,贸然卸载驱动依赖,可能吧cuda也弄好,打着大不了重装系统(新机子)的勇气,我直接安装之前下载的430驱动:
sudo ./NVIDIA-Linux-x86_64-430.26.run
其中有一些选择基本选默认就行,大家可能根据描述自由选择,而且和最开始安装430有一些不一样的提示,很刺激。安装完之后执行nvidia-smi,发现错误:
Failed to initialize NVML: Driver/library version mismatch,
此时心有点凉,当然如果就此停止,也就不会有这篇博客,直接搜索这个错误,发现stackoverflow上有这个错误,解决方案说的reboot,心中窃喜,立即重启,之后,重新nvidia-smi,结果还是这个错误:
Failed to initialize NVML: Driver/library version mismatch,然后感觉是之前的驱动没卸载干净,因为使用:
dpkg -l | grep -i nvidia
还是可以看到有384的依赖存在,此时直接卸载:
sudo apt-get remove --purge nvidia-384
后面的384根据你的实际情况更改,然后reboot,执行nvidia-smi,一切正常。
至此,我们解决了环境变量不能加载问题,也安装了430的驱动为未来使用其他版本cuda奠定基础。
谢谢大家观看点赞,也欢迎批评指正,有问题可以评论区交流。