博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Horovod 通信策略
阅读量:5122 次
发布时间:2019-06-13

本文共 1241 字,大约阅读时间需要 4 分钟。

因为最近的工作要和Horovod打交道,所以分析了Horovod的源码。在这里记一笔。

Horovod有几个亮点,第一,它不依托于某个框架,自己通过MPI建立了一套分布式系统,完成了allreduce, allgather等collective operations通信工作. 第二,发现了Tensor fusion, 梯度传递的时候可以将小的tensor合并成一个大的tensor再进行传递,从而减小每一次操作的额外开销(overhead). 第二点比较好理解,本文讲一下horovod的通信策略。

为了简洁,以下称Horovod为hvd。

hvd将通信和计算框架分离之后,计算框架只需要直接调用hvd接口,如HorovodAllreduceOp来进行梯度求平均即可。但是,因为计算框架往往采用多线程执行训练的计算图,所以在多节点情况下,拿allreduce操作来举例,我们不能保证每个节点上的allreduce请求是有序的。因此MPI_Allreduce并不能直接用。

为了解决这一个问题,hvd 设计了一个主从模式,rank0为master节点,rank 1-n为worker节点。除此之外,我们需要了解hvd在每个节点上定义的数据结构,每个worker节点上都有一个消息队列,而在master节点上除了一个消息队列,还有一个消息map。

每当计算框架发来通信请求时,hvd并不直接执行MPI,而是封装了这个消息并推入自己的消息队列。我们通常在python文件中使用hvd.init()来初始化hvd,实际上是开了一个后台线程和一个MPI线程。后台线程采用定时轮询的方式访问自己的消息队列,如果非空,worker会将自己收到的所有tensor通信请求都发给master。因为是同步MPI,所以每个节点会阻塞等待MPI完成。master收到worker的消息后,会记录到自己的消息map中。如果一个tensor的通信请求出现了n次,也就意味着,所有的节点都已经发出了对该tensor的通信请求,那这个tensor就需要且能够进行通信。master节点会挑选出所有符合要求的tensor进行MPI通信。不符合要求的tensor继续留在消息map中,等待条件符合。

决定了tensor以后,master又会将可以进行通信的tensor 名字和顺序发还给各个节点。至此,所有的节点都得到了即将进行的MPI的tensor和顺序,MPI通信得以进行。

以上所有操作。除了MPI通信外,均在后台进程中执行。

hvd的核心在文件中,也是本文介绍的内容。而其对Tensorflow, Pytorch的接口定义分别在horovod/tensorflow, horovod/pytorch文件夹中。

 

知乎link: https://zhuanlan.zhihu.com/p/45439173

转载于:https://www.cnblogs.com/ethanhong/p/10134885.html

你可能感兴趣的文章
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
CGRect知多少
查看>>
Android 开发环境安装配置手册
查看>>
Qt工程文件说明
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
WIN7下搭建CORDOVA环境
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
300 多个免费网站和应用资源
查看>>
Oracle数据库备份还原工具之Expdp/IMPdp
查看>>
【来龙去脉系列】什么是区块链?
查看>>
Wpf 之Canvas介绍
查看>>
Java工程师学习指南 入门篇
查看>>
linux history
查看>>
rpm软件包类型
查看>>
除去内容中的空格与换行
查看>>
jQuery on(),live(),trigger()
查看>>