您的位置:首页 > 大数据 > 人工智能

我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境

2018-09-05 12:14 525 查看

    个人笔记本平时个人学习时用来跑跑小数据集的简单网络模型训练还行,如果跑大数据集加复杂网络模型,笔记本是扛不住的,跑得不怎么快不说,机身发热厉害、风扇一直呼呼响,估计你也会心疼,这样下去不知道能用几天几次笔记本估计要报废了,起码风扇容易坏,不是品质过硬的笔记本估计更是撑不住多久,另外有的模型代码训练过程中分配占用内存很大,用于笔记本的2G内存的GPU是撑不住的(这种情况下设置了per_process_gpu_memory_fraction之类GPUOption只会更快出现Out of Memory错误),训练往往开始不久就出现OOM错误,所以必须要转到拥有大内存的GPU的服务器上去,根据训练多个模型的体验,感觉一般每块GPU内存至少不低于8G,最好16G以上。

     公司跑商业的数据集和模型一般是把代码写成支持分布式集群并行计算的部署到多太服务器上同时算以加快训练和测试的速度,一般是两种途径,如果企业本身资金实力雄厚不愁钱花,那么自己买很多高档服务器组成集群,如果是创业公司或者处于发展早期的小公司,资金捉衿见肘,买几台好一点的服务器自己平时做做实验还行,要跑正式的商业数据和模型,可能还非得租用人家大公司的云服务器。

     这种云服务器其实就是一个个可以远程登录使用的VM,你买时建立root账号和密码,然后就可以远程登录使用了,就像使用一台你在自己PC机上刚安装好的Linux环境一样,要跑Tensorflow训练你的模型,什么都得你自己来安装。

     现有T公司两台云服务器,操作系统都是CentOS7.4,一台有5个Xeon E5 2680 CPU、2个Tesla M40 24GB GPU,另一台有7个Xeon E5 2680 CPU、8个Tesla P40 GPU。根据操作系统类型和位数和GPU型号到NVIDIA网站选择对应的选项先下载好对应GPU的驱动的安装程序(比如NVIDIA-Linux-x86_64-384.145.run,这步是非必须的,因为CUDA Tookit里面也包含了GPU驱动可以在安装时选择安装GPU驱动,如果你需要最新版的GPU驱动,当然还是单独下载先安装的好)、CUDA Tookit9.0安装程序(对于CentOS7,选择下载通用Linux版,有1个主安装程序和4个patch安装程序,分别是cuda_9.0.176_384.81_linux.run、cuda_9.0.176.1_linux.run、cuda_9.0.176.2_linux.run、cuda_9.0.176.3_linux.run、cuda_9.0.176.4_linux.run)、cudnn-9.0-linux-x64-v7.1.tgz压缩包、Anaconda3 5.2 Linux安装程序Anaconda3-5.2.0-Linux-x86_64.sh,这些是安装tensorflow前先需要安装的。

     对于为何是需要安装CUDA9.0 + cuDNN7.1.4,而不是其他版本的CUDA,以及如何下载它们,具体详情参见:我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本 。最好安装CUDA前把其他默认的GPU驱动比如nouveau 禁用掉,在安装CUDA的过程也可根据提示禁用掉后退出再重新执行CUDA安装程序安装CUDA (不过这样禁用不会自动更新kernel initramfs文件,所以还是先手工禁用掉nouveau的最好。这两台云服务器上nouveau已经事先禁用了,所以无需我操劳^_^ ),,对于安装CUDA过程中可能需要面对的问题和如何处理,具体详情参见我的AI之路(10)--如何在Linux下安装CUDA和CUDNN

     先安装GPU驱动NVIDIA-Linux-x86_64-384.145.run,再安装CUDA(1+4个文件,别忘了安装4个Patches),安装CUDA Tookit时会提示你是否需要安装GPU驱动,由于已经安装了最新版的GPU驱动,就输入n回车确认,后面安装中提示CUDA 9.0默认安装到/usr/local/cuda-9.0,直接回车确认,后面再提示是否需要创建连接/usr/local/cuda到/usr/local/cuda-9.0/,输入y回车确认,后面cuda-sample可以选择安装也可以不安装,安装完后解压cudnn-9.0-linux-x64-v7.1.tgz,把include里面的头文件拷贝到/usr/local/cuda/include里,把lib64里面的文件和链接也对应拷贝到/usr/local/cuda/lib64/下面。然后执行Anaconda3-5.2.0-Linux-x86_64.sh安装Anaconda到默认的~/anaconda3/下面,最后提示你是否需要把anaconda3的路径加入到~/.bashrc里面的PATH里去,输入yes并确认,在此也别忘了把cuda的bin和lib64路径也加入到~/.bashrc 里PATH和LD_LIBRARY_PATH中:  

       PATH=/usr/local/cuda-9.0/bin:$PATH
       export PATH
       LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH
       export LD_LIBRARY_PATH

      # added by Anaconda3 installer
      export PATH="/home/fychen/anaconda3/bin:$PATH"
 

安装好上面这些必须的环境支持程序后在再创建 ~/ .condarc 文件,并输入如下内容以设置国内清华的镜像站点:

    channels:
       - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
       - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
       - defaults
    ssl_verify: true
    show_channel_urls: true

然后执行

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu

把tensorflow安装到conda默认的主环境(root env)里,如果你想安装到conda里一个独立的隔离环境里,你需要先用conda创建一个env然后activate它,再执行上面的命令来安装(具体详情参见 我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8)。

  上面如果不设置国内镜像站点,整个安装过程会从国外网站下载非常慢,可能经常下载失败,设置了镜像站点后,后面你安装其他支持库包时只要镜像网站上有的会优先默认从镜像网站上下载安装,所以会快多了。

    安装完支持环境和Tensorflow,把要训练的代码和训练数据集上传到服务器,设置好学习率、衰减率、总训练步数(如果有的话)等超参数以及跟具体网络模型相关的需要调的特殊参数,然后执行命令把训练进程跑起来,比如假设你的代码的入口在一个叫train.py的文件里,执行: 

    nohup python train.py >output.log &

    启动进程并转入后台,如果没错误,你可以用ps加grep命令查到进程跑起来了,查看output.log可以看到控制台在不断输出打印日志,比如Tensorflow启动时打印出使用了几个GPU,每个GPU的信息,以及你的训练代码启动时的日志打印等等。

    要查看GPU使用情况,可以执行watch加nvidia-smi命令来监控GPU,比如:

     watch -n 3 nvidia-smi

    看到两台服务器上输出:

    

    

   Tensorflow默认使用全部GPU来计算,如果你需要只使用指定的GPU来训练你的网络模型(比如服务器上已经有其他任务在使用一部分GPU,你只能使用剩下空闲的),那么你可以在执行上面的启动命令前执行 export  CUDA_VISIBLE_DEVICES=<ids of GPU>来指定使用哪几个GPU,比如:

    export CUDA_VISIBLE_DEVICES=6,7  #使用ID靠最后两块GPU

或者在代码的入口main()函数或者代码的全局定义里写上:

     import os

    os.environ["CUDA_VISIBLE_DEVICES"] = "6,7"

通过观察,发现几点:

1)千万注意训练的日志打印不要太频繁,否则会很影响性能,如果日志打印太频繁会造成两台配置相差大的服务器在性能上表现差不多,我想这是因为日志输出是CPU处理的,CPU太忙会成为整体性能的瓶颈,即使有再多GPU也没用,GPU只是用于矩阵运算和能转化为矩阵运算的卷积运算。

2) 就像NVIDIA宣传的那样,P40相对M40来说,长时间跑时,P40温度和功耗比M40低不少。另外,我试过在两台服务器上限制训练时都只使用两块GPU来对比性能,发现P40比M40计算速度也确实快了不少。

3) Tensorflow在自动调度分配使用多个GPU上似乎做的不好,如果代码中没用使用tf.device()来指定代码使用特定的GPU运算,则由Tensorflow自己调用使用GPU,但Tensorflow大多时候都把计算任务压在第一块(0号)GPU上,两台服务器上都可以观察到总是第一块GPU比较忙,这点是Tensorflow做得不如Caffe的地方:

 

 

我的AI之路(1)--前言

我的AI之路(2)--安装Fedora 28

我的AI之路(3)--安装Anaconda3 和Caffe

我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8

我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本

我的AI之路(6)--在Anaconda3 下安装PyTorch

我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm

我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题

我的AI之路(9)--使用scikit-learn

我的AI之路(10)--如何在Linux下安装CUDA和CUDNN

我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误

我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误

我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型

我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决

我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境

我的AI之路(17)--Tensorflow和Caffe的API及Guide

我的AI之路(18)--Tensorflow的模型安装之object_detection

我的AI之路(19)--如何在Windows下安装pycocotools PythonAPI

我的AI之路(20)--用Tensorflow object_detection跑raccoon数据集

我的AI之路(21)--用Tensorflow object_detection跑PASCAL VOC 2012数据集

我的AI之路(22)--使用Object_Detection_Tensorflow_API

我的AI之路(23)--在Windows下编译Bazel和使用Bazel编译tensorflow

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: