写点什么

浅谈 Tensorflow 分布式架构:ring all-reduce 算法

  • 2019-12-02
  • 本文字数:1177 字

    阅读完需:约 4 分钟

浅谈Tensorflow分布式架构:ring all-reduce算法

首先还是先回顾下参数同步更新和异步更新的区别:


同步更新模式下,所有 GPU 在同一时间点与参数服务器交换、融合梯度;异步更新模式下,所有 GPU 各自独立与参数服务器通信,交换、融合梯度。


  • 异步更新通信效率高速度快,但往往收敛不佳,因为一些速度慢的节点总会提供过时、错误的梯度方向。可通过上一篇介绍的 Stale Synchronous Parallel Parameter Server 方法缓解该问题。

  • 同步更新通信效率低,通常训练慢,但训练收敛稳定,因为同步更新基本等同于单卡调大 的 batch size 训练。

  • 但是传统的同步更新方法(各个 gpu 卡算好梯度,求和算平均的方式),在融合梯度时,会产生巨大的通信数据量,这种通信压力往往在模型参数量很大时,显得很明显。因此我们需要找到一种方法,来解决同步更新的网络瓶颈问题。其中最具代表性的一种方法就是:ring all-reduce。


##parameter server 框架下同步更新方式,网络瓶颈定量分析


这边假设有 1 个 server 端(存放参数),10 个 worker 端(计算梯度),模型是 Deep Speech 2,参数量 300M,相当于 1.2 G 的大小的内存数据(300M * sizeof(float))。假设网络带宽 1G bytes/s (万兆网卡),10 卡同步更新,需要 10.8 s 完成参数 Send。在单 ps 节点、有限带宽环境下,通信时间随着 GPU 数量的增加而线性增长,很难想象一个 10 卡的集群每训练一个 batch 都需要等待 10 ~ 20s 来同步参数!通信时延几乎完全覆盖掉了 GPU 并行计算节节省下的计算时间。当然也可以通过一些技巧来缓解通信压力,比如增加 server 的个数。

Ring Allreduce 框架下同步更新算法

定义 GPU 集群的拓扑结构:



每个 GPU 只从左邻居接受数据、并发送数据给右邻居。


算法主要分两步:


  1. scatter-reduce:会逐步交换彼此的梯度并融合,最后每个 GPU 都会包含完整融合梯度的一部分。

  2. allgather:GPU 会逐步交换彼此不完整的融合梯度,最后所有 GPU 都会得到完整的融合梯度


scatter-reduce


举例:数组求和



Step1:将数组在每个 GPU 上都分块



Step2:N-1 轮的 scatter-reduce,每一轮中,每个 GPU 将自己的一个 chunk 发给右邻居,并接收左邻居发来的 chunk,并累加。






Allgather

和 scatter-reduce 操作类似,只不过将每个 chunk 里面的操作由累加值变为替换。







通信代价分析:每个 GPU 在 Scatter Reduce 阶段,接收 N-1 次数据,N 是 GPU 数量;每个 GPU 在 allgather 阶段,接收 N-1 次 数据;每个 GPU 每次发送 K/N 大小数据块,K 是总数据大小;所以,Data Transferred=2(N−1)*K/N ,随着 GPU 数量 N 增加,总传输量恒定。也就是理论上,随着 gpu 数量的增加,ring all-reduce 有线性加速能力。


下面一篇文章,将给大家介绍 tensorflow 中是如何实现 ring all-reduce 算法的。


参考文献:


https://zhuanlan.zhihu.com/p/34172340


http://andrew.gibiansky.com/


本文转载自 Alex-zhai 知乎账号。


原文链接:https://zhuanlan.zhihu.com/p/69797852


2019-12-02 16:243547

评论

发布
暂无评论
发现更多内容

强推!华为内部都在用的783页大数据处理系统:Hadoop源代码pdf

Java 编程 架构 面试 架构师

MQTT-消息传输协议

一个大红包

8月日更

Druid 集群方式部署 —— 配置调整

HoneyMoose

架构实战营模块四作业

maybe

基于 HLS 创建 Golang 视频流服务器

声网

音视频 HLS

Druid 集群方式部署 —— 端口调整

HoneyMoose

外包三年给整废了,备战两月终拿到4家大厂offer,阿里P6+这回稳了

Java架构师迁哥

分布式认知工业互联网平台如何赋能企业数字化转型?

CECBC

【前端 · 面试 】HTTP 总结(六)—— HTTP 版本区别

编程三昧

面试 HTTP 8月日更 http版本

Druid 集群方式部署 —— 启动服务

HoneyMoose

PostgreSQL正强势回归!

数据库 大数据 时序数据库 tsdb 数据智能

如何洞察出推荐的关键时刻

石云升

推荐 用户体验 体验设计 8月日更

专访融云 CTO 任杰:构建通信云全能力

融云 RongCloud

这是一次鸡肋的代码审计

网络安全学海

网络安全 信息安全 计算机 渗透测试 安全漏洞

浅谈限流组件的应用和设计原则

xiaoxi666

redis sentinel 分布式限流 redisson redis-cell

人在年轻的时候,最核心的能力是什么?

非著名程序员

认知提升 个人提升 提升自我 8月日更

云原生时代,腾讯如何做好容器安全体系建设?

腾讯安全云鼎实验室

腾讯云 容器

架构实战营毕业设计

Saber

架构实战营

Druid 集群方式部署 —— 配置 Zookeeper 连接

HoneyMoose

101道经典JavaScript面试题总结(附答案,建议收藏)

前端依依

面试 大前端 JavaScrip

趁着课余时间学点Python(五)用课余时间提升自己关于高级数据类型的知识

ベ布小禅

8月日更

Black Hat 2021上的七大网络威胁趋势

百度开发者中心

最佳实践 方法论

明道实施与需求的耦合

明道云

在明道云上搭建的应用维护管理的几点建议

明道云

getInteger还是getIntValue,这是一个问题

FunTester

Java json Groovy

使用 MVC 架构构建 Flask CRUD 应用程序

吴脑的键客

Python flask

hbase运维故障案例分析

GrowingIO技术专栏

大数据 运维 HBase

阿里顶级大佬整理出十六个专题的Java面试指南,金九银十不用愁!

Java 编程 架构 面试 架构师

Java操作Office:POI之word生成

程序员架构进阶

Java Apache POI 技术应用 8月日更 代码实战

双证在手,运维无忧!明道云通过两项国家级质量认证

明道云

区块链技术改进身份和访问管理(IAM)的10种用例

CECBC

浅谈Tensorflow分布式架构:ring all-reduce算法_语言 & 开发_Alex-zhai_InfoQ精选文章