基于horovod实现Pytorch多机分布式训练

由Uber公司的开发的Horovod架构,是一个集成了多个深度学习的统一平台,提供分布式训练效率的同事,让深度学习分布式训练变得更方便。

前言

在深度学习领域中,当计算数据较多或者模型较大时,为提高模型训练效率,一般采用多GPU的分布式训练,常见的深度学习框架都支持分布式训练,虽然这些框架都各自有分布式实现,但不能统一到一个平台上,造成使用上体验不好,由Uber公司的开发的Horovod架构,它是一个集成了多个深度学习的统一平台,提供分布式训练同时则让深度学习分布式训练变得更方便。本文主要对Horovod的工作原理进行简单介绍,然后给出TI上包含镜像制作以及ti平台的使用。

工作原理

Uber公司开发的Horovod架构是利用nvidia的NCCL2作为底层的通信基础,实现了单机多卡,多机多卡分布式训练高效的线性加速。为了更好描述NCCL2的通信原理,下面通过两幅图进行表述:图1是单机多卡的通信原理(GPU Direct P2P),图2是多机多卡的通信原理(GPU Direct RDMA)。从图中可以看到,无论单机的GPU通信还是多机的GPU通信,只需要保证GPU在相同PCI-e总线下,即可实现GPU对其他GPU Memory的访问,最终达到高带宽、低延迟和低资源利用率的效果。这点对于深度学习的模型训练而言,通过利用GPU间高带宽完成梯度更新 + 参数更新,可明显的提高整个训练速度。

在这里插入图片描述
图1:单机多卡GPU Direct P2P
在这里插入图片描述
     图2表明跨机的通信,需要网络设备的支持(即网络设备和GPU挂载相同的PCI-e总线下),通信的技术为RDMA,目前RDMA的实现方式主要分为InfiniBand和Ethernet两种传输网络。

镜像制作

官方提供的ubuntu16.04制作有点问题,首先是gcc版本太高编译通不过,需要降级gcc g++到4.9版本,还是躺了不少坑的。

  • 版本信息
FROM nvidia/cuda:9.0-devel-ubuntu16.04

ENV TENSORFLOW_VERSION=1.12.0
ENV PYTORCH_VERSION=1.3.0
ENV TORCHVISION_VERSION=0.4.1
ENV CUDNN_VERSION=7.4.1.5-1+cuda9.0
ENV NCCL_VERSION=2.3.7-1+cuda9.0
ENV MXNET_VERSION=1.4.1
ENV PYTHON_VERSION=3.5

如下修改:

# downgrade gcc g++ ,becase tensorflow incompatable
RUN apt-get install -y gcc-4.9 && apt-get install -y g++-4.9 && \
  cd /usr/bin && \
  rm gcc && \
  ln -s gcc-4.9 gcc && \
  rm g++ && \
  ln -s g++-4.9 g++ && \
  gcc --version

另外镜像处理了ssh生成秘钥操作:

RUN ssh-keygen -t rsa && \
    cat ~/.ssh/id_rsa.pub  >> ~/.ssh/authorized_keys	

详情可以查看附件dockerfile文件。

性能分析

本文使用Pytorch MNIST搭建手写识别算法作为GPU分布式训练性能测试的脚本,所用脚本和训练数据(pytorch_mnist.py + mnist.npz)可以从附件中下载,所在应用组资源有限只分配个位数卡,M40机器还只有1机2卡的机型,暂时只验证对比了M40:1机1卡,1机2卡和2机2卡,2机4卡 ,基本上算是基本功能的验证。其它bg同时如果有更多GPU资源可以做更多对比。

测试数据集: Pytorch MNIST 60000 samples (batch size=100)

在这里插入图片描述
在这里插入图片描述

总结

文章简单说明了horovod镜像制作,简单的对比了性能

参考资料

【1】https://www.infoq.cn/article/J4ry_9bsfbcNkv6dfuqC

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