深度学习多机多卡解决方案-purine

未经允许请不要转载,原作者:zhxfl,http://www.cnblogs.com/zhxfl/p/5287644.html

目录:

一、简介

二、环境配置

三、运行demo

四、硬件配置建议

五、其他

一、简介

深度学习多机多卡集群已经成为主流,相对于caffe和mxnet这两个比较活跃的开源,purine显得更值得在高校的学生细读,因为purine的代码显得更加短小精悍,作者的C++功力也相当浑厚,其采用的思想也是非常有价值和启发性的。但是purine已经停止维护,所以其实并不适合企业用户,但是依然有很大的学术价值,特别适合高校研究软件体系结构,深度学习,甚至机器学习GPU集群性能优化等方向的学生阅读。

二、环境配置

2.1、支持C++11

由于purine使用了C++11的标准,所以在ubuntu执行安装gcc-4.8和g++-4.8的命令,此外,为了避免多个版本冲突的问题,可以把其他版本的都卸载掉,免得要去管理和切换编译器的版本。这里我选的是gcc-4.8

1 sudo apt-get --yes --force-yes remove gcc-4.6 g++-4.6 gcc-4.7 g++-4.7 gcc-4.9 g++-4.9
2 sudo apt-get update
3 sudo apt-get --yes --force-yes install gcc-4.8 g++-4.8
4 sudo apt-get --yes --force-yes install gfortran

2.2、安装CUDA和CUDNN

这里我使用的是CUDA-7.0版本,目前知道的是支持的版本有(6.5,7.0,7.5)。需要注意的是,如果安装了其他版本的CUDA,需要先卸载原来版本的CUDA才能安装新的,避免冲突。
卸载CUDA的方法如下:

1 sudo perl /usr/local/cuda/bin/uninstall_cuda_7.5.pl

卸载完原来版本的CUDA之后,需要卸载ubuntu自带的驱动,因为CUDA的安装包中已经自带了相应的驱动。

1 sudo apt-get --yes --force-yes remove nvidia*

由于桌面会占用驱动导致CUDA无法安装显卡驱动,所以在安装CUDA之前,需要先关闭桌面,再执行CUDA的安装包,cuda的安装包可以从官方网站下载:https://developer.nvidia.com/cuda-downloads

1 sudo /etc/init.d/lightdm stop
2 sudo sh ./cuda_7.5.18_linux.run

接下来需要配置cudnn,cudnn是NVIDIA官方维护的深度学习加速库,在某种程度上将,这个库的性能是最快的,所以purine也借用了cudnn来优化性能。cudnn下载前要先注册和申请,稍微比较麻烦一点,地址如下:https://developer.nvidia.com/cudnn,我使用的是cudnn7.0的版本,直接解压然后把对应的文件拷贝到cuda的安装目录即可。

1 sudo tar -xvf ./cudnn-7.0-linux-x64-v3.0-prod.tgz
2 sudo mv ./cuda/include/* /usr/local/cuda/include/
3 sudo mv ./cuda/lib64/* /usr/local/cuda/lib64/
4 sudo rm -rf cuda/

2.3、安装libuv

libuv是一个异步编程的C++库,通过libuv可以很容易实现“事件”,“线程同步”,“线程等待”,“线程池”等逻辑。libuv是个开源库,可以现在源码下来编译:https://github.com/libuv/libuv,我使用的是1.x的版本。

先安装libuv依赖库:

1 sudo apt-get --yes --force-yes install aptitude
2 sudo apt-get --yes --force-yes install libtool automake autoconf autogen

解压下载的安装包进行编译和安装:

 1 echo "Install libuv"
 2 rm -rf ./libuv-1.x.zi
 3 sudo unzip libuv-1.x.zip
 4 cd ./libuv-1.x/
 5 sudo sh autogen.sh
 6 sudo ./configure/
 7 sudo make -j4
 8 sudo make install
 9 cd ../
10 rm -rf ./libuv-1.x/

2.4、CMake安装

CMake是一个跨平台组织编译依赖的工具,可以下载源码进行安装编译,建议使用3.3.2或者以上的版本,一方面是因为我验证过了,第二方面是因为CMAKE对CUDA的支持较晚,建议不要使用3.3.2以下的版本,避免做无用功,CMAKE下载地址https://cmake.org/

1 echo "cmake install"
2 rm -rf ./cmake-3.3.2
3 sudo tar -xvf ./cmake-3.3.2.tar.gz
4 cd ./cmake-3.3.2/
5 ./configure
6 make -j 4
7 sudo make install
8 cd ../
9 rm -rf ./cmake-3.3.2

2.5、安装opencv

opencv是一个图像处理的库,caffe和purine依赖于这个库,建议选择3.0以上的版本,http://opencv.org/downloads.html,这里我使用的是3.0版本,并且使用源码进行编译,此外,建议关闭WITH_CUDA 和 WITH_IPP,因为这两个实际上在purine的项目里面用不上,命令如下:

 1 echo "Install opencv"
 2 sudo apt-get remove libopencv-dev
 3 rm -rf opencv-3.0.0/
 4 sudo unzip ./opencv-3.0.0.zip
 5 cd ./opencv-3.0.0/
 6 cmake -D WITH_CUDA=OFF -D WITH_IPP=OFF .
 7 make -j 4
 8 sudo make install
 9 cd ../
10 rm -rf opencv-3.0.0/

2.6、安装MPI

MPI是一套并行编程的接口,其主要是依赖于SPMD(单个程序,多个数据流,具体到集群就是每个节点所处理的逻辑都是一样的,但是数据流不一样)思想进行编程设计的,由于purine只支持mpich,所以我使用的版本是mpich-3.2b4,地址如下:https://www.mpich.org/2015/07/25/mpich-3-2b4-released/

1 echo "Install mpich"
2 rm -rf ./mpich-3.2b4/
3 tar -xvf ./mpich-3.2b4.tar.gz
4 cd ./mpich-3.2b4/
5 ./configure
6 make -j 4
7 sudo make install
8 cd ../
9 rm -rf ./mpich-3.2b4/

2.7、其他依赖:

1 #sudo apt-get --yes --force-yes install libprotobuf-dev libleveldb-dev libsnappy-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
2 sudo apt-get --yes --force-yes install libprotobuf-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler libboost-dev
3 sudo apt-get --yes --force-yes install libatlas-base-dev libatlas3gf-base
4 sudo apt-get install libatlas-base-dev libatlas3gf-base

三、运行demo

3.1 编译

先从git上把代码拉下来,原作者的官网在https://github.com/purine/purine2,但是原来git上的工程不能编译通过,其发布的CMakeList.txt有一些bug导致无法编译。也可以使用我fork的分支https://github.com/zhxfl/purine2,我的分支将cmakelist.txt做了修改保证其能正常编译。我后续还在上面做了不少改进的尝试,不过都是增量维护的,并没有曲解作者的初衷,所以可以放心使用我的分支代码。

1 git clone https://github.com/zhxfl/purine2

代码下载下来之后,使用下面命令进行编译,如果这里"cmake ."命令没有顺利通过,可以联系我"zhxfl##mail.ustc.edu.cn",将“##”替换为@,可能是我前面描述少了导致某些依赖出了问题。

1 cd purine2/
2 cmake .
3 make -j2

3.2 demo数据库制作

这里选用cifar-10数据集,运行

1 ~/tmp/purine2/data/cifar-10/get_cifar10.sh

到purine根目录下执行cifar10_data生成数据库,代码如下,这里强调一下,因为代码利用的是相对目录,所以必须在purine2/目录下执行,执行完毕之后会在purine2/data/cifar-10目录下会生成两个数据库文件cifar-10-train-lmdb和cifar-10-test-lmdb两个目录。

./test/cifar10_data

3.3 单机多卡

运行demo之前,需要先配置两个文件,parallel_config文件中加入

0 0 640 1 64

这三个参数分别表示(机器编号,显卡标号,迭代对应的batch_size)

接下来要配置一下HOSTFILE文件,填入本机的IP地址,一个地址一行,接下来使用如下命令启动purine运行,该命令表示启动两个进程,

mpirun -n 1 -hostfile HOSTFILE ./test/nin_cifar10

3.4 多机多卡

1、在进行多机多卡之前,在不同机器之间配置一下ssh无密码认证

2、确认不同机器之间已经可以无密码认证之后,先配置一下每台机器上的hosts文件,给每个机器取一个名字,比如我们有两个节点,分别为A,B,其中A上面有两块显卡。那么parallel_config文件配置如下:

0 0 64
0 1 64
1 0 64

HOSTFILE

A
B

将这两个配置文件拷贝到不同机器的purine目录下,这里要保证每台机器都有purine目录,并且其可执行文件都是一样的,此外,由于我们没有分布式文件系统,所以必须保证每台机器上都有数据。

接下来执行如下命令:

mpirun -n 2 -hostfile HOSTFILE ./test/nin_cifar10

此外,所有log都保存在系统/tmp/目录下

四、硬件配置建议

如果是用于学术研究而不是商业化,推荐一个经济实惠的硬件方案:

1、显卡:titianx显卡2个,gtx98ti也可以,

2、主板可以选可以插几块显卡的,一般也就几千块钱,如“技嘉LGA2011-3 GA-X99”

机箱和电源什么让供应商配就行了,整个解决方案可以控制在2,3w之间。

五、其他

如果你不是研究集群性能的,只是有做做实验,甚至希望在windows上进行开发和研究,

可以考虑我们实验室的其他开源CUDA-CNNCUDA-MCDNN,我们大部分修改算法的尝试都是在这两个项目上进行的。

如果有其他问题,可以联系我:zhxfl##mail.ustc.edu.cn

时间: 2024-07-29 02:49:15

深度学习多机多卡解决方案-purine的相关文章

秦涛:深度学习的五个挑战和其解决方案

深度学习的五个挑战和其解决方案 编者按:日前,微软亚洲研究院主管研究员秦涛博士受邀作客钛媒体,分享他对深度学习挑战和解决方案的思考 ,本文为秦涛博士在此次分享的实录整理. 大家好,我是微软亚洲研究院的秦涛,今天我将分享我们组对深度学习这个领域的一些思考,以及我们最近的一些研究工作.欢迎大家一起交流讨论. 先介绍一下我所在的机器学习组.微软亚洲研究院机器学习组研究的重点是机器学习,包含机器学习的各个主要方向,从底层的深度学习分布式机器学习平台(AI的Infrastructure)到中层的深度学习.

深度学习与脑机接口_1(基于卷积神经网络的P300信号检测)

参考论文<Convolutional Neutral Networks for P300 Detection with Application to Brain-Computer Interfaces> Hubert Cecotti and Axel Gra¨ser ?1.所研究问题:检测单次刺激P300信号的有无(即不经过叠加平均) 以下四个图全部都包含P300波形: 我们只能从图1和4中观察出P300波形,图2和图3很难确定的说P300波形存在与否(然而实际上是有的) 提出问题:如何在叠加

Hadoop 2.0 上深度学习的解决方案

原文连接:https://www.paypal-engineering.com/tag/data-science/ 摘要:伴随着数据的爆炸性增长和成千上万的机器集群,我们需要使算法可以适应在如此分布的环境下运行.在通用的分布式计算环境中运行机器学习算法具有一系列的挑战.本文探讨了如何在一个Hadoop集群中实现和部署深度学习. 波士顿的 数据科学团队正在利用尖端工具和算法来优化商业活动,且这些商业活动是基于对用户数据中的深刻透析.数据科学大量使用机器算法,可以帮助我们在数据中识别和利用模式.从互

深度学习主机攒机小记

本文來源網址:http://www.52nlp.cn/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B8%BB%E6%9C%BA%E6%94%92%E6%9C%BA%E5%B0%8F%E8%AE%B0 Update: 这篇文章写于一年以前,这一年深度学习的大潮继续推进,1080也升级到1080TI了,攒机也有了更多更好的选择.最近更新了一篇文章:<从零开始搭建深度学习服务器:硬件选择>,可以看完下文后(主要提供了一些选择的思路),再来看最新的这篇(主要提供了一

构建和优化深度学习模型(神经网络机器识图)

DSL(Deep Learning Service)是基于华为云强大高性能计算提供一站式深度学习平台服务,内置大量优化的网络模型算法,以兼容.便携.高效的品质帮助用户轻松使用深度学习技术,通过灵活调度按需服务化方式提供模型训练.评估与预测. 深度学习训练模型:数据准备-->数据模型训练(优化参数)-->反馈损失值-->更多训练 评估模型:返回结果为预测值与测试数据集标注值的错误率或准确率 深度学习模型的优化方法? 训练次数的调整? 代价函数的调整? 学习率的调整? 训练算法的优化? 神经

机器学习和深度学习资料合集

机器学习和深度学习资料合集 注:机器学习资料篇目一共500条,篇目二开始更新 希望转载的朋友,你可以不用联系我.但是一定要保留原文链接,因为这个项目还在继续也在不定期更新.希望看到文章的朋友能够学到更多.此外:某些资料在中国访问需要梯子. <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.Deep Learning. <Deep Learning in

[转]机器学习和深度学习资料汇总【01】

本文转自:http://blog.csdn.net/sinat_34707539/article/details/52105681 <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.Deep Learning. <Deep Learning in Neural Networks: An Overview> 介绍:这是瑞士人工智能实验室Jurgen

机器学习与深度学习资料

<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.Deep Learning. <Deep Learning in Neural Networks: An Overview> 介绍:这是瑞士人工智能实验室Jurgen Schmidhuber写的最新版本<神经网络与深度学习综述>本综述的特点是以时间排序,从1940年开始讲起,到60-80

MXNet设计笔记之:深度学习的编程模式比较

市面上流行着各式各样的深度学习库,它们风格各异.那么这些函数库的风格在系统优化和用户体验方面又有哪些优势和缺陷呢?本文旨在于比较它们在编程模式方面的差异,讨论这些模式的基本优劣势,以及我们从中可以学到什么经验. 我们主要关注编程模式本身,而不是其具体实现.因此,本文并不是一篇关于深度学习库相互比较的文章.相反,我们根据它们所提供的接口,将这些函数库分为几大类,然后讨论各类形式的接口将会对深度学习编程的性能和灵活性产生什么影响.本文的讨论可能不只针对于深度学习,但我们会采用深度学习的例子来分析和优