深度学习环境搭建

Posted by Hsz on March 2, 2018

深度学习环境搭建

在前面两年的时候python下深度学习的主流环境还是google主导的tensortflow+keras高低搭配环境,而在去年起,由facebook主导的torch从lua单平台port出了pytorch,同时又和微软合作,组成了caffe2+pytorch的高低搭配环境,成为了一种新的选择.

但无论是哪种技术,最大的赢家都是英伟达,现在的主流深度学习框架都是基于cuda的,而对opencl的支持,各家都说在做,但即便支持最好的theano也没有做到完全可用的程度.

本文的是去年同名文章的改进版,去年的那篇已经被删除了.本文旨在提供一个配置流程的参考,并不涉及具体算法和应用.配置的平台是ubuntu和window10.

硬件

  • CPU: Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
  • GUP: NVIDIA Corporation GP104 [GeForce GTX 1080]
  • memory: 16 GB 2400 MHz x2

Cuda配置

前文说了无论哪种框架,只要要用gpu,都需要cuda.本节介绍不同平台下Cuda的配置方式

Linux下

Linux是各种深度学习框架的最优操作系统平台,缺点就是做除了编程以外的各种事都不是太方便,不适合自己家里配. 如果是企业使用,还是使用linux搭配多块显卡搭建一个计算服务平台靠谱.

  1. gcc版本下调

    ubuntu自带的g++版本为6.0以上,过高了多数机器学习工具并不兼容,因此需要降低,我选择使用4.9.4

     sudo apt-get install g++-4.9
    
     sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
     sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
    
     sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20
     sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
    
     sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
     sudo update-alternatives --set cc /usr/bin/gcc
    
     sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
     sudo update-alternatives --set c++ /usr/bin/g++
    
  2. 下载CUDA并安装

    nvidia官方下载适合自己显卡的cuda Toolkit版本 因为这块显卡比较新,只能使用8.0版本.选择合适自己机器的安装包,我选择的是本地的deb文件

    下载好后按照官方的指导安装cuda

     cd <download path>
     sudo dpkg -i <cuda Toolkit install package>
     sudo apt-get update
     sudo apt-get install cuda
    

    重启,然后再次进入,应该就是安装好了,安装的cuda根目录应该在/usr/local/<cuda-x.x>目录下

    在安装目录下有官方自带的sample,可以通过过编译运行测试有没有安装成功,我们以向量加法作为例子,例子位置在/usr/local/<cuda-x.x>/samples/0_Simple/vectorAdd下:

     sudo make
    

    可以看到编译的结果被复制到了/usr/local/<cuda-x.x>/samples/bin/x86_64/linux/release/下,当然,我们make的那个文件夹下也有编译好的可执行文件vectorAdd,运行一下试试结果

     ./vectorAdd   
    
     [Vector addition of 50000 elements]
     Copy input data from the host memory to the CUDA device
     CUDA kernel launch with 196 blocks of 256 threads
     Copy output data from the CUDA device to the host memory
     Test PASSED
     Done
    

    也就是说安装成功了

  3. 下载并安装cudnn

    要下载使用cudnn,首先需要在nvida注册,有了帐号了我们就可以进入cudnn的下载网址下载了.我下载的是5.1版本

    安装也简单,下载好后解压,然后复制对应内容到原来cuda toolkit的文件夹下,然后赋予权限即可

     tar xvzf <cudnn-8.0-linux-x64-vx.x-ga.tgz>
     sudo cp cuda/include/cudnn.h /usr/local/<cuda-x.x>/include
     sudo cp cuda/lib64/libcudnn* /usr/local/<cuda-x.x>/lib64
     sudo chmod a+r /usr/local/<cuda-x.x>/include/cudnn.h /usr/local/<cuda-x.x>/lib64/libcudnn*
    
  4. 编译安装cnmem

    必须有cnmem放在cuda里才能设置使用内存的大小

     cd ~
     git clone https://github.com/NVIDIA/cnmem.git
     cd cnmem
     mkdir build
     cd build
     cmake ..
     make
     sudo cp ~/cnmem/build/libcnmem.so /usr/local/<cuda-x.x>/lib64
     sudo cp ~/cnmem/include/cnmem.h /usr/local/<cuda-x.x>/include
    
  5. 配置cudnn

     export LD_LIBRARY_PATH=/usr/local/<cuda-x.x>/lib64:$LD_LIBRARY_PATH
     export CPATH=/usr/local/<cuda-x.x>/include:$CPATH
     export LIBRARY_PATH=/usr/local/<cuda-x.x>/lib64:$LD_LIBRARY_PATH
    
  6. 验收安装是否成功: 编译<cuda-samples>/1_Utilities/deviceQuery

    运行后结果如下:

     CUDA Device Query (Runtime API) version (CUDART static linking)
     Detected 1 CUDA Capable device(s)
     Device 0: GeForce GTX 1080
     CUDA Driver Version / Runtime Version          8.0 / 8.0
     CUDA Capability Major/Minor version number:    6.1
     Total amount of global memory:                 8112 MBytes (8506179584 bytes)
     (20) Multiprocessors, (128) CUDA Cores/MP:     2560 CUDA Cores
     GPU Max Clock rate:                            1860 MHz (1.86 GHz)
     Memory Clock rate:                             5005 Mhz
     Memory Bus Width:                              256-bit
     L2 Cache Size:                                 2097152 bytes
     Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
     Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
     Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
     Total amount of constant memory:               65536 bytes
     Total amount of shared memory per block:       49152 bytes
     Total number of registers available per block: 65536
     Warp size:                                     32
     Maximum number of threads per multiprocessor:  2048
     Maximum number of threads per block:           1024
     Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
     Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
     Maximum memory pitch:                          2147483647 bytes
     Texture alignment:                             512 bytes
     Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
     Run time limit on kernels:                     Yes
     Integrated GPU sharing Host Memory:            No
     Support host page-locked memory mapping:       Yes
     Alignment requirement for Surfaces:            Yes
     Device has ECC support:                        Disabled
     Device supports Unified Addressing (UVA):      Yes
     Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
     Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    
     deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GTX 1080
     Result = PASS
    

    看到Result = PASS说明安装成功了

windows

windows对于深度学习环境很不友好,但毕竟不是人人都有条件买台电脑装linux,除了做深度学习什么别的都不干, 所以并不建议大多数人为了这个环境而换操作系统.本人之前也是为了深度学习环境装了双系统,但最终还是把linux卸了, 现在的主要开发环境还是windows系统.windows下的配置方式其实差不太多,各种框架也都总有办法支持windows. windows下执行效率也还好,至少对于我这样用来做做小项目的来说够用了.

  1. 安装vs

    微软官方下载vs2015社区版下载并安装,注意这需要有微软帐号,没有就注册一个,只需要安装其中C/C++相关的工具和包即可.vs非常大,你需要一个好网速和一个大硬盘.

  2. 下载CUDA并安装

    和linux上类似我们需要安装一下cuda环境,包括显卡驱动和cuda工具包,具体的可以看英伟达官方的说明,同样cuda也需要注册一个英伟达的帐号,注册一个就是了. 注意不要安装最新的版本,因为各种框架不会第一时间跟进.现在比较通用的是v8.0版本.

  3. 下载并安装cudnn

    类似cuda的安装,同样参考官方文档,注意不要安装最新的版本,因为各种框架不会第一时间跟进. 现在比较通用的版本是cudnn65版本.

  4. 配置环境变量

在系统变量中将cuda的安装位置放到变量CUDA_PATHCUDA_PATH_V8_0下,将cudnn的位置放到CudaDNN变量下,并且将$CUDA_PATH\bin%CUDA_PATH%\lib\x64加入PATH变量方便使用.win10下编辑界面很友好,我就不截图了.

anaconda环境安装

我们的开发实验环境使用python作为语言,最方便的方式就是使用anaconda环境.这部分不多说,可以看我的这篇文章

windows下的额外环境

在windows下我们没有gcc,所以需要先安装一些依赖包才可以继续向下,幸运的是anaconda提供了多数依赖包的简单安装方式:

conda install mingw libpython

其中mingw是windows下的gcc环境,libpython是python的abi

theano安装与配置

依赖的环境都安装好后要做的就是pip install theano就好了,这边有个bug会导致运行theano的test脚本时出错,不过没关系不影响使用

theano配置

linux下配置文件通常放置在~/.theanorc而windows下通常放置在C:\Users\<你的用户名>\.theanorc.txt

  • Linux下配置

    linux下配置文件如下:

      [global]
      floatX=float32
      device=gpu
      optimizer_including=cudnn
    
      [cuda]
      root=/usr/lib/nvidia-cuda-toolkit # cuda位置
    
      [nvcc]
      flags=-D_FORCE_INLINES
    
      [blas]
      ldflags = -lf77blas -latlas -lgfortran #put your flags here
    
      [lib]
      cnmem=0.8
    

    其中cnmem是配置cudnn使用内存占总内存的多少,因此不能大于1

    我们在ipython notebook中测试下

    theano test

  • windows下配置

    windows下的配置略有不同,配置文件如下:

      [global]
      openmp=False
      floatX = float32
      device = gpu
      [blas]
      ldflags=
      [cuda]
      root = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0
    
      [gcc]
      cxxflags=-IC:\Users\Administrator\Anaconda3\MinGW
    

tensorflow安装与配置

相对而言,tensorflow就好装的多,它只用anaconda就可以安装了

在linux下安装需要挑选好安装的python是哪个版本,具体支持哪些python版本可以在这个网页查看 ,安装只需要pip install --ignore-installed --upgrade <url>就行,其中的url就是查到的对应版本的地址.

windows下安装目前只支持python3.5和3.6版本,安装只需要pip3 install --upgrade tensorflow-gpu即可.

keras

keras是一个纯粹的python包,安装只需要使用pip即可,它依赖的也都是python包.

conda install numpy,scipy,matplotlib,scikit-learn,scikit-image

都装好后只要pip install keras即可.

keras实际上只是一个编程前端,实际的运行是调用后端.后端可以是theano,tensorfolw,推荐使用tf作为后端,目前这个后端支持最为充分. 配置方式是在~/.keras/keras.json(windows下是在个人用户目录下的.keras\keras.json位置)文件中设置.

默认配置如下:

{
    "image_data_format": "channels_last",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}
  • iamge_data_format

    字符串,”channels_last”或”channels_first”,该选项指定了Keras将要使用的维度顺序,可通过keras.backend.image_data_format()来获取当前的维度顺序。对2D数据来说,”channels_last”假定维度顺序为(rows,cols,channels)而”channels_first”假定维度顺序为(channels, rows, cols)。对3D数据而言,”channels_last”假定(conv_dim1, conv_dim2, conv_dim3, channels),”channels_first”则是(channels, conv_dim1, conv_dim2, conv_dim3)

  • epsilon

    浮点数,防止除0错误的小数字

  • floatx

    字符串,”float16”, “float32”, “float64”之一,为浮点数精度

  • backend

    字符串,所使用的后端,为”tensorflow”或”theano”

pytorch

pytorch目前官方带GPU的只支持linux,安装方式就是使用conda安装.

conda install pytorch torchvision -c pytorch

而windows版本是又知乎上一位大神提供的方法,他也已经将编译好的pytorch放在anaconda的一个第三方源上这个页面提供了安装方式.

caffe2

caffe2通常用于生产环境,它对移动平台也有官方支持.无论是什么平台,生产环境的话都推荐使用源码编译安装,官方提供了详细的安装流程介绍,本文就不多描述了.

另一种方式是使用docker,官方同样提供了完整的使用方法.这种方式适合开发环境,我们要做的只是拉取镜像然后测试使用罢了.

使用docker的话国内需要换源,国内已经有了docker的官方镜像源registry.docker-cn.com.替换好后拉取的时候只需要docker pull registry.docker-cn.com/caffe2ai/caffe2:c2v0.8.1.cpu.full.ubuntu14.04即可,需要注意的是貌似现在ubuntu16的源国内还无法拉取.并且,目前还不支持python3.

拉取后如果要使用jupyter notebook,那么可以使用命令

docker run -it -p 8877:8888 registry.docker-cn.com/caffe2ai/caffe2:c2v0.8.1.cpu.full.ubuntu14.04 sh -c "jupyter notebook  --allow-root --no-browser --ip 0.0.0.0 /caffe2/caffe2/python/tutorials"

启动jupyter notebook服务.之后登录localhost:8877(为了避免和本地的端口冲突,改为8877)会要求登录密码,密码就是启动的log信息中的?token=的内容.复制下来填入即可.

docker run -it registry.docker-cn.com/caffe2ai/caffe2:c2v0.8.1.cpu.full.ubuntu14.04 ipython

则是进入ipython环境

onno

onno是一个用于caffe2和pytorch间序列化模型对象的工具,我们可以使用conda install -c conda-forge onnx来安装.