我觉得这个需求肯定很多朋友都有。
首先应该考虑一点:如果装了不同版本的CUDA,是不是也得装不同版本的cuDNN?我目前的结论是:为了不影响系统中本来的cuDNN,是可以不装的。按照这篇博客的介绍:https://www.cnblogs.com/laosan007/p/12612511.html
“如果没有编译cuDNN的话,执行一些基于Caffe这一深度学习框架的程序速度上要慢3-5倍”
这个measurement我没有自己做过,如果目的仅仅是为了试着跑一下别人的代码,完全可以不理会cuDNN。另外针对上面的这个博客有点疑问,这篇博客里说:“这种方法如果不重置cuDNN相应的符号链接的话是不能成功的安装cuDNN的。”呵呵,我仔细拜读了这篇文章很多遍,也没发现他在什么地方重置了所谓的符号链接啊。
言归正传,首先,我们应该清楚针对目前系统中的显卡驱动,能够装哪些版本的CUDA,具体可以参考这里:
https://blog.csdn.net/hesongzefairy/article/details/89946900
当然我还是有点疑问,如果显卡驱动比较新,装老的版本的CUDA会有什么影响吗?这个表并不能看出这一点。
其次,要搞清楚我们为什么要装多个版本的CUDA,原因也很简单,一些老版本的PyTorch对应的CUDA也比较老。那怎么样知道我们要用的pytorch版本对应的CUDA呢,这个说实话从PyTorch的主页是看不出来的:https://pytorch.org/get-started/locally/
不过可以用一些迂回的方法:我们在这里:https://pytorch.org/get-started/previous-versions/#via-pip
可以看到下面几个链接实际上列出了CUDA版本所能对应的pytorch版本:
Download the whl
file with the desired version from the following html pages:
- https://download.pytorch.org/whl/cpu/torch_stable.html # CPU-only build
- https://download.pytorch.org/whl/cu80/torch_stable.html # CUDA 8.0 build
- https://download.pytorch.org/whl/cu90/torch_stable.html # CUDA 9.0 build
- https://download.pytorch.org/whl/cu92/torch_stable.html # CUDA 9.2 build
- https://download.pytorch.org/whl/cu100/torch_stable.html # CUDA 10.0 build
例如我们点开这个:https://download.pytorch.org/whl/cu92/torch_stable.html
可以看到,最早的PyTorch版本是0.4.1了,例如我现在要用PyTorch 0.3.0,那似乎装CUDA 9.2可能不行。
所以我决定装CUDA 9.0试试。在这里:https://developer.nvidia.com/cuda-toolkit-archive
找到9.0的链接:https://developer.nvidia.com/cuda-90-download-archive
按照这里的建议:https://blog.csdn.net/tunhuzhuang1836/article/details/79545625
我们需要选择runfile进行安装(这样可以做到不影响之前的版本):
下载下来之后按照这里的教程正常安装即可:https://blog.csdn.net/ashome123/article/details/105822040/
结果我运行了:
sudo sh cuda_9.0.176_384.81_linux.run
之后报错:
Error: cannot find Toolkit in /usr/local/cuda-9.0
呵呵呵。
先试了一下大家说的最简单的办法:
sudo apt install nvidia-cuda-toolkit
结果经过漫长的等待,报了一堆:ibcudnn_cnn_train.so.8 is not a symbolic link这样的错误,看来cudnn的符号链接确实有问题啊。不过我关心的是安装低版本的CUDA,这个问题可以先不管。再试了一遍,结果报了:
unsupported compiler: 7.5.0. Use --override to override this check.
呵呵呵,其实应该早点预料到这个错,按照网友的介绍:https://www.cnblogs.com/simingfan/p/12310833.html
可以改成gcc 6.x,不过改成gcc-6的时候又碰到问题了:
当我输入:
sudo apt install gcc-6 g++-6
会报这样的错:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
没有可用的软件包 gcc-6,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到
E: 软件包 gcc-6 没有可安装候选
呵呵呵呵呵呵,估计是我用的Ubuntu 20.04版本太新了吧。
按照这里网友的建议:https://askubuntu.com/questions/1236552/how-can-i-downgrade-gcc-to-version-6-on-20-04
可以临时地在/etc/apt/sources.list中增加旧版本ubuntu的源(当然这个也很好理解咯)
所以输入:
sudo gedit /etc/apt/sources.list
在打开的文件中的最上面一行增加:
deb http://us.archive.ubuntu.com/ubuntu/ bionic main universe
顾名思义,就是暂时当作Ubuntu 18.04,参考这里:https://blog.csdn.net/songfulu/article/details/85310273
然后再依次运行:
sudo apt-get update
sudo apt install gcc-6 g++-6
就可以正常安装gcc-6了,不过安装完成之后最好是把我们临时加的那一条注释掉。然后再update一下。
这时候我们再输入:
ls /usr/bin/gcc*
我这里可以看到3个gcc,呵呵呵。如下图所示:
然后依次输入:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 150
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
再输入:
sudo update-alternatives --config gcc
可以查看gcc的优先级顺序。
把这些做完之后,再运行一遍:
sudo sh cuda_9.0.176_384.81_linux.run
首先EULA很长的一段文字不要看了,按q跳过,然后需要我们输入的选项如下:
Do you accept the previously read EULA?
accept/decline/quit: accept
You are attempting to install on an unsupported configuration. Do you wish to continue?
(y)es/(n)o [ default is no ]: y
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n
Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: y
Enter Toolkit Location
[ default is /usr/local/cuda-9.0 ]:
Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: n
Install the CUDA 9.0 Samples?
(y)es/(n)o/(q)uit: n
Installing the CUDA Toolkit in /usr/local/cuda-9.0 ...
最重要的就是注意不要建立到/usr/local/cuda的软连接。
另外需要注意的是:安装完成后,就不要进行环境变量的更新了。我们参考这几位网友的方法:https://blog.csdn.net/clksjx/article/details/86530905
https://zhuanlan.zhihu.com/p/137874101
具体来讲,首先进入到我们想使用其他版本CUDA的anaconda环境中,输入:
echo ${CONDA_PREFIX}
就可以看到这个虚拟环境的绝对路径,例如我的是在这里:/home/yu/anaconda3/envs/pytorch0.3
那么我依次输入以下:
mkdir -p /home/yu/anaconda3/envs/pytorch0.3/etc/conda/activate.d
gedit /home/yu/anaconda3/envs/pytorch0.3/etc/conda/activate.d/activate.sh
chmod +x /home/yu/anaconda3/envs/pytorch0.3/etc/conda/activate.d/activate.sh
在其中第二步打开的文件中输入:
ORIGINAL_CUDA_HOME=$CUDA_HOME
ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
ORIGINAL_PATH=$PATH
export CUDA_HOME=/usr/local/cuda-9.0
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export PATH=$CUDA_HOME/bin:$PATH
主要目的就是使对应虚拟环境启动时,自动切换为cuda9.0。
相应地:
mkdir -p /home/yu/anaconda3/envs/pytorch0.3/etc/conda/deactivate.d
gedit /home/yu/anaconda3/envs/pytorch0.3/etc/conda/deactivate.d/deactivate.sh
chmod +x /home/yu/anaconda3/envs/pytorch0.3/etc/conda/deactivate.d/deactivate.sh
在第二步中对我们刚才在两步前对环境变量的修改进行还原:
export CUDA_HOME=$ORIGINAL_CUDA_HOME
export LD_LIBRARY_PATH=$ORIGINAL_LD_LIBRARY_PATH
export PATH=$ORIGINAL_PATH
unset ORIGINAL_CUDA_HOME
unset ORIGINAL_LD_LIBRARY_PATH
unset ORIGINAL_PATH
以上这个过程不能不说是很麻烦啊。到这里终于大功告成!安装完后,对应的环境变量是下面截图中这样的:
看到这个截图后,是不是感觉自己可以愉快地自动切换CUDA版本了?
看到有些朋友这样设置了以后,通过$CUDA_HOME来判断是否设置正确,例如:https://zhuanlan.zhihu.com/p/137874101
应该说,这样判断是不对的!因为正常安装CUDA的时候我们只需要设置PATH和LD_LIBRARY_PATH,并不需要设置$CUDA:https://blog.csdn.net/ashome123/article/details/105822040/
个人认为最稳妥的方法还是输入:
nvcc --version
来检查CUDA的版本。
另外,还有些朋友说可以通过Anaconda自己安装CUDA乃至cuDNN,我试了一下,似乎确实可以,但也有人指出,这种安装并不能保证CUDA的功能完整,在性能方面也会受比较大印象,例如这里的评论:https://blog.csdn.net/xq_nbu/article/details/83188570
“作者留言:通过anaconda自动安装cuda可能会出现cuda安装不全的现象,即有时运行会出现部分组件缺失,故应以实际情况为准,可能还需完整安装cuda和cudnn,本文仅供参考。”
“我用这种方法装完跑程序总是显存不够,8G显存,batchsize设置成4都报错,请问是不是因为这种安装方法的原因?rtx2060s的显卡”
我也一直不理解Anaconda自己装CUDA和cuDNN的思路是怎么回事。总体上来讲,个人感觉还是自己手动安装最好。
上面的工作都完成了之后,我们可以最后展示一下效果。由于如前面所属,Anaconda可以自己装PyTorch,所以我们选择在对应的虚拟环境下通过pip安装,具体就是在这里:https://pytorch.org/get-started/previous-versions/#via-pip
选择CUDA 9.0 build,然后我下载了torch-0.3.0-cp27-cp27mu-linux_x86_64.whl
再通过pip install torch-0.3.0-cp27-cp27mu-linux_x86_64.whl安装即可。最后通过一张截图展示最终效果:
可以保证大家按照上面的流程,也可以得到这样的结果。