build from source 安装 PyTorch及很多坑

文章目录

  • 零、背景
    • 1. 驱动版本极低
    • 2. 初尝试
    • 3. Build from source
  • 一、理解
    • 所谓GPU与PyTorch
    • 所谓安装package
  • 二、具体步骤及坑处理
    • 1. 我们的目标
    • 2. 步骤
      • a. 建立conda环境
      • b. 更新对应CUDA,gcc,cmake等
      • c. 安装Dependencies(译成,依赖包?)
      • d. 下载 PyTorch 源代码
      • e. 安装
      • f. 总是莫名其妙坏掉
  • 三、总结

零、背景

1. 驱动版本极低

众所周知,GPU driver 决定 CUDA版本,CUDA版本决定PyTorch版本,这在很多古老的服务器或者集群上屡见不鲜。比如,我遇到的情况是

  • nvidia-driver是384.98,决定了CUDA版本上限是9.0,也就决定了PyTorch版本最多是1.1,很多mmlab的包起步PyTorch1.3,呵呵哒
  • 此外初始gcc是4.8.5,初始CUDA是8.0

是不是地狱开局?管理员拒绝更新,你只好瑟瑟发抖不知所措。

2. 初尝试

我自己用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及很多坑_第1张图片

3. Build from source

最终呢,还是在导师的推荐下,自己摸索着build from source来安装PyTorch。踩过很多坑之后,我庄重的宣布,Build from source 还是只能装与driver版本相符的CUDA的PyTorch。

一、理解

所谓GPU与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)CUDADriverGPU

这样一来,关系就清楚很多了,Driver的版本决定了CUDA的版本,CUDA的版本决定了PyTorch的版本,也就是说,如果没有sudo权限,我们只能在现有driver版本的基础上,尽可能装一个匹配的CUDA版本,然后再装对应的pytorch版本。

所以说,如果驱动很低,pytorch的高版本是用不了的,虽然可以安装,但是调用torch.cuda.is_available()都会显示False,也就是装了个寂寞。

所谓安装package

我依旧是用的conda环境,在我的理解下,想使用一个python包又这么两种途径:

  1. conda install ***或者 pip install ***等命令,安装在conda,pip管理的环境里,不会显式出现相关包的代码,而是出现在…/packages/…中
  2. 下载源代码,自己setup,这样的话相关代码就会显式出现

我们所采用的所谓的 build from source 其实就是在github上下载pytorch的代码,然后自己安装,也就是上面介绍的第二种途径。

事实上,pytorch有介绍专门介绍如何build from source,但是很简略,我在接下来的环节主要介绍下可能会遇到的坑,前车之鉴,后事之师。

二、具体步骤及坑处理

1. 我们的目标

希望在Linux系统,conda环境中建立一个可以使用GPU的高版本PyTorch。

我们的初始条件

  • nvidia-driver是384.98,gcc是4.8.5,CUDA是8.0
  • 有一个共享文件夹,里面存放了各个版本的gcc和CUDA

2. 步骤

a. 建立conda环境

运行

conda create -n 环境名字 python=3.7 -y
conda activate 环境名字

b. 更新对应CUDA,gcc,cmake等

先把CUDA更新一下,查阅driver-CUDA对应表,找到支持的最高版本的CUDA(我的driver是384.98,最多支持CUDA9.0)
build from source 安装 PyTorch及很多坑_第2张图片
打开~/.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

c. 安装Dependencies(译成,依赖包?)

注意cuda版本要对应改一下,参见官网

conda install -c pytorch magma-cuda90

d. 下载 PyTorch 源代码

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

e. 安装

这一步花时间很多,坑也最多,输入

export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
python setup.py install
  • 如果遇到cmake>=3.5的报错,就按照第一步说的更新一下cmake;如果遇到gcc版本的报错,还是按照第一步说的更新一下gccbuild from source 安装 PyTorch及很多坑_第3张图片

  • 如果出现nccl_external类似的错误,网上搜到的方法是说要切换一个分支(更换PyTorch版本)
    build from source 安装 PyTorch及很多坑_第4张图片

  • 如果中断,再次安装的话,可能会出现以下错误:

    cmake --build . --target install --config Release -- -j 40
    No rule to make target … needed … Stop.
    

    或者
    build from source 安装 PyTorch及很多坑_第5张图片
    只需要删除 build 文件夹就好,rm -rf build,然后继续python setup.py install,或者python setup.py clean

f. 总是莫名其妙坏掉

反回头看看CUDA是不是driver所支持的(具体参照之前的driver-CUDA版本对照表)

三、总结

最开始觉得一头雾水,但是只要耐心DEbug,总会解决的,多在网上搜索,多动脑子,即便最后也没有成功,也多少把这一套都弄透彻了。

最后再强调一下,先看Driver版本,然后查表看支持的CUDA版本上限,再看对应的Pytorch版本上限。如果这一步是错误的,比如nvidia-driver是384.98却想装PyTorch1.3及以上,那注定是做不到的。

你可能感兴趣的:(快乐教程,pytorch,python,深度学习,人工智能,gpu)