深度学习入门(二十二)天河二号 极端情况下配置所有GPU环境

Jun 12, 2019


原创:岐山凤鸣,转载请注明本站域名

觉得不错不妨star/follow一下我的Github

前言

配环境是所有计算机实验开始之前的必经之路,关于配环境在互联网上有着大量的教程,按照教程,很多情况下都能很顺利的配好一个环境。

那么存不存在一种情况,当不能root+联网只能scp的时候,如何在Linux配置好一整套Python3+TensofFlow-gpu+CUDA+cudnn环境呢?

当然存在!我用的天河二号就是这种情况,而且他的说明书对这方面基本没怎么提,很恼火。

本篇博文详细介绍一下,当不能root,非scp不可联网,不能再像以前一样pip, apt-get, conda, setup.py的时候,如何配好一套gpu环境。

这也是配环境的暴力美学了。

考虑问题

拿到手上的Linux系统,我们首先要浏览一下我们能做什么,我们不能做什么,这样才能考虑后续的事情。

对我手上的天河二号高性能节点,我能对user目录下(即登陆进去的~目录下)所有的东西为所欲为,而我对\/下除user目录下所有的内容都无法进行写入。

对于网络来讲,除scp文件传输外,其他方式均很难访问,ping个baidu都ping不通。

所以以下便是一个列表:

我们面临的是个什么?

  1. Pure Ubuntu 16.04操作系统
  2. 巨量的本地文件存储系统

我们能做什么?

  1. 对user目录下为所欲为
  2. scp传输文件,仅限对user目录

我们不能做什么?

  1. root权限
  2. \/目录下不可写文件
  3. 除scp外其他网络访问

我们想配什么?

  1. Python3环境
  2. 深度学习对应的Python3第三方库
  3. 深度学习框架TensorFlow-gpu-1.11
  4. nvidia显卡驱动cudatoolkit-9
  5. cuda配套的cudnn-7

那么很显然,均不可能按照常规操作来安装,easy_install, pip, apt-get全部不可取

顺带一提,就算传输好whl文件,在本地进行pip install ..whl,也是不可取,因为会写入非用户目录。

当然有同学会说使用pip install –user,呃,这里也因为一些奇妙的原因,不可用。

那是不是有点抓耳挠腮了,对,这种情况很棘手。

来,我们脱离一下常规思维,能不那能想的暴力一点呢。

不,你现在想的还不够暴力,再暴力一点。

我来告诉你我的做法,既然上述提到,我面临的是一个Pure Ubuntu16.04系统,我能不能采取一个这样的操作。

在一个其他的可root,什么都能访问的同版本操作系统上,把所有的环境都装好,然后移植到该操作系统的【用户环境】里,然后采用更改环境变量的方向,这样来配好一套环境呢。

重述一遍上述的那句话,意思便是我在一个已有的操作系统上配好所有的环境,然后那个系统上所有环境都是已有的,已经存在的,能运行的。我是否能把这样的一个已有已存在的环境完全带到我的目标操作系统里,而且全部带到本地用户下,最后通过修改环境变量全局变量的方向,在用户环境下搭好一套配置环境?

当然是可以的,接下来就是我的操作。

安装Python3

众所周知Python是解释语言,存在一个Commandline Tool即可以进行语句交互。用户在命令行里敲入python的时候发生了什么?

  1. 在/usr/bin下寻找是否存在python可执行程序
  2. 运行该程序,输入对应命令行参数

那么我们安装Python3,实际上把所有Python的【安装目录】和对应可执行文件取下来,上传到本地即可。

在我自己的Linux服务器上,我找到Python的本地包目录+可执行文件,分别在:

/usr/lib/python3.5/dist-packages
/usr/bin/python3

将上述可执行文件,结合本地的包,一起scp传输到目标操作系统的用户目录下。

当然就算传完了直接python3是没有任何用的,要么带上完全的路径,比如/home/user/python3.5/python3 xxx.py,要么重新映射一下环境变量。

映射环境变量参考:

export PATH="/home/user/python3.5/bin:$PATH"
export PATH="/home/user/python3.5/dist-packages:$PATH"

这样就ok了,当然可能遇到其他的问题,可以参考是哪里掉了什么。

安装Python3第三方库

这里是最暴力的地方。

在已知的第三方库无法采用正常操作的情况安装时,只能采用暴力的已配置的环境转移。

一定要注意,在自己的Linux操作系统上,和目标操作系统一定要安装【同版本的】Python。

当前在自己Linux操作系统上安装好所有Python第三方库,然后这些第三方库保存的位置在:

/usr/local/lib/python3.5/dist-packages/

对于非操作原生Python,一般都在site-packages里,可以进入python交互式命令后,采用下述方式得到路径:

>>> import site
>>> site.getsitepackages()

这个里面保存的可不只有.py文件,还有一个很重要的是动态链接库,即.so文件。对.so文件,是存在严格的版本控制的,例如对于numpy,在我本地的:

/usr/local/lib/python3.5/dist-packages/numpy/core

下,存在,

/usr/local/lib/python3.5/dist-packages/numpy/coremultiarray.cpython-35m-x86_64-linux-gnu.so

可以看到,对于Python3.5,和linux-gnu操作系统,都是有唯一指派的,所以本地操作系统里配置的,和目标操作系统里要完全一致,才可以采用暴力操作。

如果不一致,就本地操作系统采取virtualenv、conda等制作虚拟机的形式,这里不再赘述。

好的,我们拿到了本地操作系统的所有第三方库,接下来怎么办呢?

在目标操作系统,我们创建一个文件夹:

~/.local/lib/python3.5/site-packages

然后,把所有本地的site-packages,传到目标操作系统的site-packages,就ok了。python3会自动解析这一文件夹下所有第三方库。

很暴力是不是,一定要注意版本要对齐!

同理里面也存在TensorFlow-gpu,不需要手动再进行安装。

安装对应版本CUDA、Cudnn

我要安装的是CUDA-9.0和Cudnn-7.x

怎么办,暴力一点啦。

在本地操作系统,找到cuda,和配好的Cudnn。什么?root+联网情况下配不好cuda和cudnn,这个你就可以看看其他的教程了,这里就主要说极端环境下怎么配,不阐述基本的配置方法。

在本地找到配好的cuda+cudnn,全部在:

/usr/local/cuda-9.0

直接把这个文件夹,传到目标操作系统本地目录,然后改环境变量映射:

export PATH=/home/user/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/home/user/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/home/user/cuda-9.0

可以采用下述命令查看版本号对不对。

# CUDA
nvcc -V
# CUDNN
cat /home/user/cuda-9.0/include/cudnn.h | grep CUDNN_MAJOR -A 2

到这步就可以进行实验TensorFlow-gpu是否能运转了,实验步骤如下:

$ python3
>>> import tensorflow as tf
>>> sess = tf.Session()

如果不报错+显示了TensorFlow的GPU相关配置,则说明配置成功,极端环境下生存成功!

如果有报错,接下来根据报错给予你几个解决方案:

  1. 如果报错说找不到python3,可以考虑Google非root非联网情况下如何安装Python3,资料应该会有很多
  2. 如果报错找不到其他第三方库(cannot import module),如numpy,一定要注意版本号配对,查看site-packages下是否存在numpy,和你本地的有没有差别,有没有少传文件或文件夹,在你本地能不能跑起来。
  3. 如果报错cuda版本不支持,搜索你的tensorflow-gpu支持的cuda版本和cudnn版本,重新下载cuda和cudnn,一定一定要完全配套,否则跑不起来。
  4. 如果是未知问题,呃…未知问题我怎么知道怎么解决。

总之以上就是配置的全流程。

哦对了,由于天河二号采用的是dash,不是bash,所以每次上线,那一堆export都得手动再运行一遍才能重定向,写个脚本每次上线跑一下就行啦。

觉得有用的话就follow/star一下我的Github吧!