EC2上的深度学习:CUDA 7/cuDNN/caffe/DIGITS实战教程

Refer from http://www.csdn.net/article/2015-05-07/2824637

摘要:本教程将演示如何在一个g2.2xlarge EC2实例(运行64位Ubuntu14.04)中设置CUDA7、cuDNN、caffe和DIGITS,以及如何快速上手DIGITS。文章通过一个检测糖尿病视网膜病变的Kaggle竞赛案例来说明DIGITS的具体应用。

本教程将演示如何在一个g2.2xlarge EC2实例(运行64位的Ubuntu14.04)中设置CUDA7、cuDNN、caffe和DIGITS,以及如何快速上手DIGITS。为了说明DIGITS的应用,本教程使用一个当前的 Kaggle竞赛项目作为案例进行演示, 是关于糖尿病视网膜病变检测的,其状态来自于荧光血管造影。

图像分类的卷积深度神经网络(DNN)

对于图像的分类或回归,你有两种选择:

  • 特征工程及把图像转换为向量;
  • 依赖于一个卷积DNN求出特征。

深度神经网络对计算的要求相当苛刻。这是由两个原因造成的:

  • 即使你使用一个很小的图像分辨率,输入数据也大得多,256×256的RGB像素意味着196608个输入神经元(256×256×3)。而如果你要使你的特征工程智能一些,那么1000个神经元已经是一个很大的数量了;
  • 让网络有计算出相关特征也需要一个更复杂的网络结构和更多层。

幸运的是,许多浮点矩阵的运算都被显卡的GPU无意中解决。

NVIDIA DIGITS和caffe

利用GPU支持深度学习的主流框架目前有三个,包括Theano、Torch和caffe。 NVIDIA DIGITS则是一个网络服务器,它提供了一个方便的网络接口,用于训练和测试基于caffe的深度神经网络。我打算在以后的文章中涵盖如何使用caffe工作。在这里,我会告诉你如何设置CUDA。

首先你需要一个AWS帐号和g2.2xlarge实例启动和运行,并确保为你的IP的5000端口添加入站规则——这是DIGITS服务器的需要。

# don't forget to get your system up to date
sudo apt-get update
sudo apt-get dist-upgrade

安装CUDA7

这一步的主要来源是 Markus Beissinger关于建立Theano的博客文章。

[js] view plain copy
  1. # installation of required tools  
  2. sudo apt-get install -y gcc g++ gfortran build-essential \  
  3.   git wget linux-image-generic libopenblas-dev python-dev \  
  4.   python-pip python-nose python-numpy python-scipy  
  5.   
  6. # downloading the (currently) most recent version of CUDA 7  
  7. sudo wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0-28_amd64.deb  
  8.   
  9. # installing CUDA  
  10. sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb  
  11.    
  12. sudo apt-get update  
  13. sudo apt-get install cuda  
  14.   
  15. # setting the environment variables so CUDA will be found  
  16. echo -e "\nexport PATH=/usr/local/cuda/bin:$PATH" >> .bashrc  
  17. echo -e "\nexport LD_LIBRARY_PATH=/usr/local/cuda/lib64" >> .bashrc  
  18.    
  19. sudo reboot  
  20.   
  21. # installing the samples and checking the GPU  
  22. cuda-install-samples-7.0.sh ~/  
  23. cd NVIDIA\_CUDA-7.0\_Samples/1\_Utilities/deviceQuery    
  24. make    
  25. ./deviceQuery  

安装cuDNN

要进一步加快深度学习相关的计算,安装cuDNN库是一个好主意。为了这个目的,你将需要注册一个NVIDIA开发者账户,并加入CUDA注册开发者计划。最后一步需要NVIDIA解锁你的帐户,这可能需要一两天。但你也可以在没有cuDNN库的情况下开始。只要你得到他们的允许—— 下载cuDNN并把它上传到您的实例。

[js] view plain copy
  1. # unpack the library  
  2. gzip -d cudnn-6.5-linux-x64-v2.tar.gz  
  3. tar xf cudnn-6.5-linux-x64-v2.tar  
  4.   
  5. # copy the library files into CUDA's include and lib folders  
  6. sudo cp cudnn-6.5-linux-x64-v2/cudnn.h /usr/local/cuda-7.0/include  
  7. sudo cp cudnn-6.5-linux-x64-v2/libcudnn* /usr/local/cuda-7.0/lib64  

安装caffe

caffe及DIGITS的安装步骤主要来源于 DIGITS项目的自述文件。

[js] view plain copy
  1. sudo apt-get install libprotobuf-dev libleveldb-dev \  
  2.   libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev \  
  3.   libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler \  
  4.   libatlas-base-dev  
  5.   
  6. # the version number of the required branch might change  
  7. # consult https://github.com/NVIDIA/DIGITS/blob/master/README.md  
  8. git clone --branch v0.11.0 https://github.com/NVIDIA/caffe.git  
  9.    
  10. cd ~/caffe/python  
  11. for req in $(cat requirements.txt); do sudo pip install $req; done  
  12.    
  13. cd ~/caffe  
  14. cp Makefile.config.example Makefile.config  
  15.   
  16. # check that USE_CUDNN is set to 1 in case you would  
  17. # like to use it and to 0 if not  
  18.    
  19. make all  
  20. make py  
  21. make test  
  22. make runtest  
  23.    
  24. echo -e "\nexport CAFFE_HOME=/home/ubuntu/caffe" >> ~/.bashrc  
  25.   
  26. # load the new environmental variables  
  27. bash  

安装DIGITS

[js] view plain copy
  1. cd ~  
  2. git clone https://github.com/NVIDIA/DIGITS.git digits  
  3. cd digits  
  4. sudo apt-get install graphviz gunicorn  
  5. for req in $(cat requirements.txt); do sudo pip install $req; done  

启动和配置DIGITS

DIGITS在第一次启动时会问你一些关于配置目的的问题。这些设置是非常直白,并且可以事后在~/.digits/digits.cfg中更改。你可能要考虑在一个EBS上定位你的工作目录(jobs_dir)——在我的例子中,大约140,000 张PNG图像数据集,消耗大约10 GB的空间,训练模型(含所有的模型快照)约占1 GB。

[js] view plain copy
  1. # change into your digits directory  
  2. cd digits  
  3.   
  4. # start the server  
  5. ./digits-devserver  

DIGITS故障排除

当你第一次启动DIGITS时,你可能会遇到一些错误和警告。以下是我的情况。

[js] view plain copy
  1. "libdc1394 error: Failed to initialize libdc1394"  
  2.   
  3. # no big deal - either ignore or treat symptomatically  
  4. sudo ln /dev/null /dev/raw1394  
[js] view plain copy
  1. "Gtk-WARNING **: Locale not supported by C library."  
  2.   
  3. # not sure how serious this is - but it is easy to resolve  
  4. sudo apt-get install language-pack-en-base  
  5. sudo dpkg-reconfigure locales  
  6.   
  7. # check what locales are available and then ...  
  8. locale -a  
  9. # ... set LC_ALL to it  
  10. echo -e "\nexport LC_ALL=\"en_US.utf8\"" >> ~/.bashrc  
[js] view plain copy
  1. "Gdk-CRITICAL **: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed"  
  2.   
  3. # this is a big deal and will cause the server start up to fail:  
  4. # connect with ssh flags -Xi  
  5. ssh -Xi ...  
[js] view plain copy
  1. "Couldn't import dot_parser, loading of dot files will not be possible."  
  2.   
  3. # reinstall pyparsing:  
  4. sudo pip uninstall pyparsing  
  5. sudo pip install pyparsing==1.5.7  
  6. sudo pip install pydot  

DIGITS入门

首先,你必须在想要训练的模型上创建一个数据集。你必须提供至少一个大的图片数据集用于训练并且任选两个较小的数据集进行验证和测试。你可以通过不同的文件夹的意思分离这些数据集(及它们正确的标签),或者通过提供相应的CSV。这些CSV中都应该具有两个未命名的制表符分隔列。第一列保证图像的完整路径(home不要使用~,要使用它的实际路径),第二列保证基于0的索引引用正确的类。你还需要提供一个文本文件持有不同的类别——每行一个。

EC2上的深度学习:CUDA 7/cuDNN/caffe/DIGITS实战教程_第1张图片

例如,如果你有两个类“POS”(行1)和“NEG”(行2)——那么一个属于“POS”类的图像必须有与之相关联的类索引0。加载可能需要一段时间。我加载140,000个PNG的256×256分辨率的图像历时约一小时。

EC2上的深度学习:CUDA 7/cuDNN/caffe/DIGITS实战教程_第2张图片

设置目标训练模型会很容易,倘若你坚持使用默认建议——你只需要选择要使用的数据集、网络就可以了。在描述的数据集上训练一个30 epochs的 GoogLeNet大约花一天又6小时。所以你需要确保以下两点:

  • 对于Spot实例的出价不能太低——否则你会有被终止的风险;
  • 在tmux session上启动服务器。否则,如果连接中断(也许因为你的IP在一夜之间改变了),服务器进程将会被杀死。

应对糖尿病性视网膜病变的Kaggle挑战

所提供的训练集由约35,000个高分辨率的图像组成——压缩和拆分成五个文件。所有ZIP压缩包大小约33 GB。我用lynx直接下载五个压缩包到一个EBS中——因为你可以定期登录并启动下载。顺便说一下,g2.2xlarge实例的下载速度是令人难以置信——你被授予最高100MB/秒的速度。我同时开始所有的五个下载任务,每个下载任务的速度是6MB/秒。准确地说,是兆字节(mega byte),而不是兆比特(mega bit——DSL提供商使用的单位)。

糖尿病性视网膜病变的可见指标,按照我的理解主要是泄漏(瘤)和病理上不断增长的血管。我认为,这些特征像具有相似性且旋转不变。因此,为了增加可用训练集我创建了四个版本:

  • (A):调整为256×256像素并保存为PNG;
  • (R):(A)的180度旋转;
  • (A)的垂直镜像;
  • (R)的垂直镜像。

因为手头的任务显然不是一个分类而是一个回归,我放弃尝试学习一个分类为无DR和DR的四个阶段。我标记所有DR的情况为“积极”,无DR情况为“消极”。这都会被执行于所有四个可能的分割({0} VS {1,…,4},…,{0,…,3},{4}),这些预测最后会相对实际阶段回归。

这一变换的bash脚本,你都可以在相应的 bash命令行上找到。

结果

一方面我本来希望看到一个更高的精度——在另一方面,我勉强可以(如果有的话)做出在一些健康的情况下和在有些极端的第四阶段情况下之间的差异。以73.95%为消极的情况下的比例——这也是网络精度的起点。经过30 epochs,它提高约8个百分点,达到81.8%。

EC2上的深度学习:CUDA 7/cuDNN/caffe/DIGITS实战教程_第3张图片

问题

关于DIGITS特性和具体问题,强烈推荐 DIGITS Google Group,在这里你可以和DIGITS的开发者进行有效和开放的交流。

原文链接: GPU Powered DeepLearning with NVIDIA DIGITS on EC2

你可能感兴趣的:(EC2上的深度学习:CUDA 7/cuDNN/caffe/DIGITS实战教程)