深度学习多机多卡解决方案-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
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
sudo apt-get update
sudo apt-get --yes --force-yes install gcc-4.8 g++-4.8
sudo apt-get --yes --force-yes install gfortran
2.2、安装CUDA和CUDNN
这里我使用的是CUDA-7.0版本,目前知道的是支持的版本有(6.5,7.0,7.5)。需要注意的是,如果安装了其他版本的CUDA,需要先卸载原来版本的CUDA才能安装新的,避免冲突。
卸载CUDA的方法如下:
sudo perl /usr/local/cuda/bin/uninstall_cuda_7..pl
卸载完原来版本的CUDA之后,需要卸载ubuntu自带的驱动,因为CUDA的安装包中已经自带了相应的驱动。
sudo apt-get --yes --force-yes remove nvidia*
由于桌面会占用驱动导致CUDA无法安装显卡驱动,所以在安装CUDA之前,需要先关闭桌面,再执行CUDA的安装包,cuda的安装包可以从官方网站下载:https://developer.nvidia.com/cuda-downloads
sudo /etc/init.d/lightdm stop
sudo sh ./cuda_7..18_linux.run
接下来需要配置cudnn,cudnn是NVIDIA官方维护的深度学习加速库,在某种程度上将,这个库的性能是最快的,所以purine也借用了cudnn来优化性能。cudnn下载前要先注册和申请,稍微比较麻烦一点,地址如下:https://developer.nvidia.com/cudnn,我使用的是cudnn7.0的版本,直接解压然后把对应的文件拷贝到cuda的安装目录即可。
sudo tar -xvf ./cudnn-7.0-linux-x64-v3.-prod.tgz
sudo mv ./cuda/include/* /usr/local/cuda/include/
sudo mv ./cuda/lib64/* /usr/local/cuda/lib64/
sudo rm -rf cuda/
2.3、安装libuv
libuv是一个异步编程的C++库,通过libuv可以很容易实现“事件”,“线程同步”,“线程等待”,“线程池”等逻辑。libuv是个开源库,可以现在源码下来编译:https://github.com/libuv/libuv,我使用的是1.x的版本。
先安装libuv依赖库:
sudo apt-get --yes --force-yes install aptitude
sudo apt-get --yes --force-yes install libtool automake autoconf autogen
解压下载的安装包进行编译和安装:
echo "Install libuv"
rm -rf ./libuv-.x.zi
sudo unzip libuv-.x.zip
cd ./libuv-.x/
sudo sh autogen.sh
sudo ./configure/
sudo make -j4
sudo make install
cd ../
rm -rf ./libuv-.x/
2.4、CMake安装
CMake是一个跨平台组织编译依赖的工具,可以下载源码进行安装编译,建议使用3.3.2或者以上的版本,一方面是因为我验证过了,第二方面是因为CMAKE对CUDA的支持较晚,建议不要使用3.3.2以下的版本,避免做无用功,CMAKE下载地址https://cmake.org/
echo "cmake install"
rm -rf ./cmake-3.3.
sudo tar -xvf ./cmake-3.3..tar.gz
cd ./cmake-3.3./
./configure
make -j
sudo make install
cd ../
rm -rf ./cmake-3.3.
2.5、安装opencv
opencv是一个图像处理的库,caffe和purine依赖于这个库,建议选择3.0以上的版本,http://opencv.org/downloads.html,这里我使用的是3.0版本,并且使用源码进行编译,此外,建议关闭WITH_CUDA 和 WITH_IPP,因为这两个实际上在purine的项目里面用不上,命令如下:
echo "Install opencv"
sudo apt-get remove libopencv-dev
rm -rf opencv-3.0./
sudo unzip ./opencv-3.0..zip
cd ./opencv-3.0./
cmake -D WITH_CUDA=OFF -D WITH_IPP=OFF .
make -j
sudo make install
cd ../
rm -rf opencv-3.0./
2.6、安装MPI
MPI是一套并行编程的接口,其主要是依赖于SPMD(单个程序,多个数据流,具体到集群就是每个节点所处理的逻辑都是一样的,但是数据流不一样)思想进行编程设计的,由于purine只支持mpich,所以我使用的版本是mpich-3.2b4,地址如下:https://www.mpich.org/2015/07/25/mpich-3-2b4-released/
echo "Install mpich"
rm -rf ./mpich-.2b4/
tar -xvf ./mpich-.2b4.tar.gz
cd ./mpich-.2b4/
./configure
make -j
sudo make install
cd ../
rm -rf ./mpich-.2b4/
2.7、其他依赖:
#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
sudo apt-get --yes --force-yes install libprotobuf-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler libboost-dev
sudo apt-get --yes --force-yes install libatlas-base-dev libatlas3gf-base
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做了修改保证其能正常编译。我后续还在上面做了不少改进的尝试,不过都是增量维护的,并没有曲解作者的初衷,所以可以放心使用我的分支代码。
git clone https://github.com/zhxfl/purine2
代码下载下来之后,使用下面命令进行编译,如果这里"cmake ."命令没有顺利通过,可以联系我"zhxfl##mail.ustc.edu.cn",将“##”替换为@,可能是我前面描述少了导致某些依赖出了问题。
cd purine2/
cmake .
make -j2
3.2 demo数据库制作
这里选用cifar-10数据集,运行
~/tmp/purine2/data/cifar-/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文件中加入
64
0 1 64
这三个参数分别表示(机器编号,显卡标号,迭代对应的batch_size)
接下来要配置一下HOSTFILE文件,填入本机的IP地址,一个地址一行,接下来使用如下命令启动purine运行,该命令表示启动两个进程,
mpirun -n -hostfile HOSTFILE ./test/nin_cifar10
3.4 多机多卡
1、在进行多机多卡之前,在不同机器之间配置一下ssh无密码认证。
2、确认不同机器之间已经可以无密码认证之后,先配置一下每台机器上的hosts文件,给每个机器取一个名字,比如我们有两个节点,分别为A,B,其中A上面有两块显卡。那么parallel_config文件配置如下:
HOSTFILE
A
B
将这两个配置文件拷贝到不同机器的purine目录下,这里要保证每台机器都有purine目录,并且其可执行文件都是一样的,此外,由于我们没有分布式文件系统,所以必须保证每台机器上都有数据。
接下来执行如下命令:
mpirun -n -hostfile HOSTFILE ./test/nin_cifar10
此外,所有log都保存在系统/tmp/目录下
四、硬件配置建议
如果是用于学术研究而不是商业化,推荐一个经济实惠的硬件方案:
1、显卡:titianx显卡2个,gtx98ti也可以,
2、主板可以选可以插几块显卡的,一般也就几千块钱,如“技嘉LGA2011-3 GA-X99”
机箱和电源什么让供应商配就行了,整个解决方案可以控制在2,3w之间。
五、其他
如果你不是研究集群性能的,只是有做做实验,甚至希望在windows上进行开发和研究,
可以考虑我们实验室的其他开源CUDA-CNN和CUDA-MCDNN,我们大部分修改算法的尝试都是在这两个项目上进行的。
如果有其他问题,可以联系我:zhxfl##mail.ustc.edu.cn
深度学习多机多卡解决方案-purine的更多相关文章
- 【PyTorch深度学习】学习笔记之PyTorch与深度学习
第1章 PyTorch与深度学习 深度学习的应用 接近人类水平的图像分类 接近人类水平的语音识别 机器翻译 自动驾驶汽车 Siri.Google语音和Alexa在最近几年更加准确 日本农民的黄瓜智能分 ...
- 深度学习论文TOP10,2019一季度研究进展大盘点
9012年已经悄悄过去了1/3. 过去的100多天里,在深度学习领域,每天都有大量的新论文产生.所以深度学习研究在2019年开了怎样一个头呢? Open Data Science对第一季度的深度学习研 ...
- 深度学习读书笔记之RBM(限制波尔兹曼机)
深度学习读书笔记之RBM 声明: 1)看到其他博客如@zouxy09都有个声明,老衲也抄袭一下这个东西 2)该博文是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的 ...
- 5700刀打造3卡1080Ti深度学习机器【转】
本文转载自:https://www.jianshu.com/p/ca2e003bf77e 5700美刀,打造3x1080Ti实验室GPU深度学习机器 最近为公司搭建了一台实验用的深度学习主机,在网 ...
- Hadoop 2.0 上深度学习的解决方案
原文连接:https://www.paypal-engineering.com/tag/data-science/ 摘要:伴随着数据的爆炸性增长和成千上万的机器集群,我们需要使算法可以适应在如此分布的 ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】
转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...
- 机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...
- MXNet设计笔记之:深度学习的编程模式比较
市面上流行着各式各样的深度学习库,它们风格各异.那么这些函数库的风格在系统优化和用户体验方面又有哪些优势和缺陷呢?本文旨在于比较它们在编程模式方面的差异,讨论这些模式的基本优劣势,以及我们从中可以学到 ...
- 让AI简单且强大:深度学习引擎OneFlow技术实践
本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...
随机推荐
- Android开发之onClick事件的三种写法(转)
package a.a; import android.app.Activity; import android.os.Bundle; import android.view.View; import ...
- Akka官方文档翻译:Cluster Specification
参加了CSDN的一个翻译项目,翻译Akka的文档.CSDN提供的翻译系统不好使,故先排版一下放在博客上. 5.1 集群规范 注意:本文档介绍了集群的设计理念.它分成两部分,第一部分描述了当前已经实现的 ...
- FireFly 服务端 Unity3D黑暗世界 客户端 问题
启动服务端成功截图: 连接成功截图: 测试服务端是否启动成功: 在Web输入:http://localhost:11009/ 按回车 (查看cmd启动的服务端 是否多出如下显示) 服务端启动成功.P ...
- Nagios3完整配置文档
第一章:简单快速安装nagios 1.1 准备软件包 在做安装之前确认要对该机器拥有root权限. 确认你安装好的linux系统上已经安装如下软件包再继续. Apache GCC编译器 GD库与开发库 ...
- Data transfer object
Data transfer object (DTO) is a design pattern used to transfer data between software application su ...
- c#基础精华01(强调代码规范,虚方法,抽象方法,接口)
强调代码规范 规则(法律,必须遵守否则报错) 语法 规范(道德,大家都喜欢有道德的人.) 注释//,/**/,/// 骆驼命名 :第一个单词首字母小写,之后的单词首字母大写 userName.user ...
- 算法总结之欧拉函数&中国剩余定理
算法总结之欧拉函数&中国剩余定理 1.欧拉函数 概念:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)( ...
- dom4j 的小小测试
@Test public void gogo() throws IOException{ InputStream in = this.getClass().getClassLoader() .getR ...
- PHP+Mysql无限分类的方法汇总
无限分类是个老话题了,来看看PHP结合Mysql如何实现.第一种方法这种方法是很常见.很传统的一种,先看表结构表:categoryid int 主键,自增name varchar 分类名称pid in ...
- Android开发UI之手动显示和隐藏软键盘
1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...