keras分布式训练模型 openMpi+Horovod+keras -Effective DeepLearning

最近因为项目的需要我们之前做的模型的分类猛增3,4倍,数量的数据也随之增加导致了训练模型的时间从原来的10几个小时增加到现在的大概要100小时,这时候之前用的单机双GPU的训练方式明显已经遇到了瓶颈(我们的开发机GPU是GTX1080i PC级别算是最好的了吧)。这时候我们只能从单机训练方式转化到分布式的训练方式。Keras官文首页写着方便迁移方便做分布式训练的所以想都不想就开工做了,谁知道原来这才是踩坑的开始o(╥﹏╥)o。所以写下整个踩坑过程希望对大家有点帮助。

首先Keras关于如何使用分布式训练英文官网文档(中文文档完全没有估计中文是翻译过来的并不是真正官方维护)里面只有4行,而且4行都是跳转到其他Githup的页面。4行里面分别是叫你用multi_gpu_model, horovod, spark+keras和xxxx 4种方法,下面是我对这4个方法的个人感受。首先multi_gpu_model 这个是多gpu训练,但是我找到的资料这个方法只能是单机多GPU的训练并不能多机多GPU的训练 ̄□ ̄|| 如果哪位知道怎么用这个方法做多机多GPU训练麻烦告知;然后再看看 spark+keras和xxxx 这两个方法,打开Githup看到文档稀疏的几行,维护人员也只有5,6个,这情况只能放弃了;最后只剩下horovod这个开源方法。

咋一看horovod文档也算清晰以为可以轻松搞定,然鹅并不是o(╥﹏╥)o。一轮吐槽之后正式开始

一. 背景
现在keras的分布式的训练的方法在它的官网上总共列了下面4个解决方案(官网链接 https://keras.io/why-use-keras/#keras-has-strong-multi-gpu-support-and-distributed-training-support),详细的解析如下
1. built-in support for multi-GPU data parallelism 这里是指用keras的keras.utils.training_utils里面的multi_gpu_model这个方法。这个方法只能用在单机多GPU的情况下,多机多GPU不能用,由于每个物理机器能搭载的gpu数量总有限制,而且我们现状是多机多GPU所以不适用。
2. Horovod, from Uber, has first-class support for Keras models  Horovod 是 Uber做的一个开源的支持keras做分布式运算的一个框架。正在用的方案
3.Keras models can be turned into TensorFlow Estimators and trained on clusters of GPUs on Google Cloud  这个是指将Keras转换成TensorFlow Estimators 然后在Google Cloud上运行。未来的方向
4.Keras can be run on Spark via Dist-Keras (from CERN) and Elephas  Dist-Keras 这是Yahoo工程师做的一个支持Keras的分布式的框架,维护人员和用户都很少,放弃使用了。

二. openMpi和Horovod的安装:

1.安装 NCCL2
NCCL是NVIDIA的Multi-GPU多卡通信框架,细节自行百度了解了。安装包在https://developer.nvidia.com/nccl下载 nccl_2.2.13-1+cuda9.0_x86_64。 这里需要的注意的是如果要重新安装要对应上你安装gpu内核的时候用的cuda的版本,我们cuda版本是9.0所以就是nccl2+cuda9.0版本。去到上面的目录,然后将解压目录下所有文件复制到/usr/local/nccl下,然后修改/etc/profile和~/.bashrc文件,在最后添加export LD_LIBRARY_PATH=/usr/local/nccl/lib:$LD_LIBRARY_PATH,保存退出,暂时不需要激活因为后面还需要修改这两个文件,最后一并改完之后再激活。

2. 安装Open MPI
安装包在https://www.open-mpi.org/下的openmpi-3.1.2,解压然后切换到改目录下。先运行./configure —prefix=/usr/local/openmpi,准备好之后再运行make && make install,就可以把openmpi编译并放到/usr/local/openmpi下。 然后分别修改/etc/profile和~/.bashrc文件,在上面第1步的基础上修改export LD_LIBRARY_PATH=/usr/local/nccl/lib:/usr/local/openmpi/lib:/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH  和  export PATH=/usr/local/openmpi/bin:/usr/local/cuda-9.0/bin:$PATH。 把openmpi的包还有可执行文件放到环境里面。这里由于要修改系统的PATH所以要格外小心,注意一定要把$PATH带上不然操作系统会被弄坏的就要重装系统了。/etc/profile和~/.bashrc文件都改完之后用命令 source ~/.bashrc 先激活当前用户的环境,看看没有问题之后,再用命令
source /etc/profile 激活整个系统的环境,这样第一次激活如果有错,也可以通过切换用户来纠正。
这里必须要修改~/.bashrc不然做集群的时候其他机器不能访问改机器了。另外需要集群必须要设置各个机器之间免密登录,不免密也是访问不了喔,这个就不在这里说了。

3. 安装 horovod
这里比较坑的是不能直接pip install horovod这样去安装,这样会导致horovod这个框架没有把nccl和mpi的包编译进去,最后导致用的时候一直只能用cpu的方法去跑。安装一定要用这个命令HOROVOD_NCCL_HOME=/usr/local/nccl HOROVOD_GPU_ALLREDUCE=NCCL pip3 install --no-cache-dir horovod 这样子就可以安装完成了。整个过程其实不复杂但是由于horovod的安装指引没有把gpu的支持放在显眼的地方,所以如果按照官网首页的步骤去装就会踩坑。到这里就基本完成安装,然后再按照horovod的文档加上需要代码就可以运行集群的训练

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章