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

2022-03-28 15:46:06 浏览数 (1)

由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间高带宽完成梯度更新 参数更新,可明显的提高整个训练速度。

在这里插入图片描述在这里插入图片描述
代码语言:txt复制
     图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生成秘钥操作,分布式计算节点ssh通信可以无密访问了:

代码语言:txt复制
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

0 人点赞