众所周知,GPU driver 决定 CUDA版本,CUDA版本决定PyTorch版本,这在很多古老的服务器或者集群上屡见不鲜。比如,我遇到的情况是
是不是地狱开局?管理员拒绝更新,你只好瑟瑟发抖不知所措。
我自己用PyTorch官网的安装方法,
conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit=9.2 -c pytorch
换过各种版本的CUDA,试了四个版本的PyTorch(1.3, 1.5, 1.7, 1.8),最后都是提示driver太老了
最终呢,还是在导师的推荐下,自己摸索着build from source来安装PyTorch。踩过很多坑之后,我庄重的宣布,Build from source 还是只能装与driver版本相符的CUDA的PyTorch。
简单来说,显卡(GPU)是一个处理矩阵速度很快的硬件,这玩意需要一个叫做驱动(driver)的底层程序来控制。一个显卡可以支持若干个版本的driver,也就是说可以用多套控制系统来控制GPU这个硬件。Driver可以在NVIDIA官网进行下载和安装,但是需要sudo权限,本文不涉及这一块的内容。
但是我们所写的python是高级语言,不能直接控制driver,所以就需要CUDA这个通用并行计算架构来做“中间商”,也就是说,
p y t h o n ( p y t o r c h ) → C U D A → D r i v e r → G P U python(pytorch) \rightarrow CUDA \rightarrow Driver \rightarrow GPU python(pytorch)→CUDA→Driver→GPU
这样一来,关系就清楚很多了,Driver的版本决定了CUDA的版本,CUDA的版本决定了PyTorch的版本,也就是说,如果没有sudo权限,我们只能在现有driver版本的基础上,尽可能装一个匹配的CUDA版本,然后再装对应的pytorch版本。
所以说,如果驱动很低,pytorch的高版本是用不了的,虽然可以安装,但是调用torch.cuda.is_available()
都会显示False,也就是装了个寂寞。
我依旧是用的conda环境,在我的理解下,想使用一个python包又这么两种途径:
conda install ***
或者 pip install ***
等命令,安装在conda,pip管理的环境里,不会显式出现相关包的代码,而是出现在…/packages/…中我们所采用的所谓的 build from source 其实就是在github上下载pytorch的代码,然后自己安装,也就是上面介绍的第二种途径。
事实上,pytorch有介绍专门介绍如何build from source,但是很简略,我在接下来的环节主要介绍下可能会遇到的坑,前车之鉴,后事之师。
希望在Linux系统,conda环境中建立一个可以使用GPU的高版本PyTorch。
我们的初始条件
运行
conda create -n 环境名字 python=3.7 -y
conda activate 环境名字
先把CUDA更新一下,查阅driver-CUDA对应表,找到支持的最高版本的CUDA(我的driver是384.98,最多支持CUDA9.0)
打开~/.bashrc
,这个文件是管理环境变量的地方,简单来说,就是告诉系统去哪里找CUDA,gcc等东西,语法很简单,
PATH=/new/path: $PATH
意思就是给PATH加了一个新的位置/new/path。所以,为了让系统找到CUDA,gcc等,我们要在~/.bashrc
最后添加这么几句话
export CUDA_HOME=/path/to/cuda
export LD_LIBRARY_PATH=/path/to/cmake:/path/to/gcc/lib64:/path/to/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/path/to/cmake/bin:/path/to/gcc/bin:/path/to/cuda/bin:$PATH
然后运行source ~/.bashrc
来激活。
(其中cmake的更新可以直接用conda install cmake
,gcc亦然)
总之就是更新一下CUDA, gcc, cmake等,更新之后可以检测一下是否成功
nvcc -V
gcc -v
cmake -version
注意cuda版本要对应改一下,参见官网
conda install -c pytorch magma-cuda90
submodule就类似于PyTorch需要的其他包,这一步就是下载Pytorch代码和其他包代码。
注意下载其他包代码的时候可能会卡顿,而且一卡就是好久,不要犹豫,直接Ctrl+C退出来,再输一遍git submodule update --init --recursive
它会自动接着下载的。(我当初就是等半天浪费好多时间,后来又手动一个一个下载的233333)
git clone --recursive https://github.com/pytorch/pytorch
# git checkout 某个分支版本 (如果你想安装特定分支,就加上这句话)
cd pytorch
git submodule sync
git submodule update --init --recursive
这一步花时间很多,坑也最多,输入
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
python setup.py install
如果遇到cmake>=3.5的报错,就按照第一步说的更新一下cmake;如果遇到gcc版本的报错,还是按照第一步说的更新一下gcc
如果中断,再次安装的话,可能会出现以下错误:
cmake --build . --target install --config Release -- -j 40
No rule to make target … needed … Stop.
或者
只需要删除 build 文件夹就好,rm -rf build
,然后继续python setup.py install
,或者python setup.py clean
反回头看看CUDA是不是driver所支持的(具体参照之前的driver-CUDA版本对照表)
最开始觉得一头雾水,但是只要耐心DEbug,总会解决的,多在网上搜索,多动脑子,即便最后也没有成功,也多少把这一套都弄透彻了。
最后再强调一下,先看Driver版本,然后查表看支持的CUDA版本上限,再看对应的Pytorch版本上限。如果这一步是错误的,比如nvidia-driver是384.98却想装PyTorch1.3及以上,那注定是做不到的。