基於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

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