写点什么

浅谈 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:243754

评论

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

Spring Cloud Bus 消息总线介绍

阿里巴巴云原生

Java 微服务 云原生 中间件 数据格式

Apache Flink Meetup 北京站,1.13 新版本发布 x 互娱场景实践分享的开发者盛筵!

Apache Flink

大数据 flink

高性能JavaScriptの笔记(一)

空城机

JavaScript 性能优化 大前端 5月日更

打破思维定式(七)

Changing Lin

5月日更

手把手 Golang 实现静态图像与视频流人脸识别

天黑黑

音视频 人脸识别 Go 语言

云图说|不要小看不起眼的日志,“小日志,大作用”

华为云开发者联盟

运维 日志 云日志服务 安全监控审计

堪称完美!淘宝内部百亿级Java高并发系统架构设计PDF手册分享

Java架构追梦

Java 架构 高并发 淘宝网 亿级架构设计

2021年5月国产数据库排行榜:“华为高斯模式”取得成功,阿里OPA持续攀升

墨天轮

数据库 dba tdsql TiDB Gauss DB

MapReduce排序以及序列化

五分钟学大数据

大数据 hadoop mapreduce

更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性

阿里巴巴云原生

容器 运维 云原生 中间件 边缘计算

新思科技发现开源安全、许可证合规性和维护问题依然很普遍

InfoQ_434670063458

新思科技 OSSRA 开源安全

智慧党建三维云展厅可视化

一只数据鲸鱼

数据可视化 智慧党建 三维可视化

Linux C/C++ 学习路线总结!助我拿下腾讯offer

赖猫

后台开发 C/C++ Linux服务器开发

怎么进大厂?166位Java工程师的大厂面试经验分享

北游学Java

Java 面试 大厂

数据库学习笔记

lenka

5月日更

阿里开源的“高并发设计笔记”就这水平!?我反正是跪着看完的

Java架构师迁哥

为啥你写的代码总是这么复杂?

华为云开发者联盟

软件 代码 代码注释 bug 复杂度

阿里开源的“SpringCloudAlibaba笔记”这么细节的吗?真秀!

Java架构师迁哥

再次荣获最受观众喜爱奖

Serverless Devs

阿里云 云原生 cncf #Serverless

官宣:恭喜 ChaosBlade 项目进入 CNCF Sandbox

阿里巴巴云原生

容器 云原生 k8s 监控 Go 语言

论好文章和烂文章

阿里巴巴云原生

程序员 开发者 云原生 写作技巧 成长与思考

如何做一场高质量的分享

阿里巴巴云原生

深度学习 开发者 云原生 分享

BIP研发课堂:领域、单据类型、交易类型

paraboy1

客户营销:4P理论

石云升

创业 营销 职场经验 5月日更

CampusBulider(模模搭)学习笔记5:创建自定义建筑

ThingJS数字孪生引擎

大前端 可视化 3D 3D可视化 数字孪生

不要盲目跟风:中小企业运营自媒体需三思而后行

石头IT视角

阿里出品还是香,这份Redis笔记”从头到尾,全是精华

Java架构师迁哥

数据采集之js自定义采集

大数据技术指南

大数据

Fedora 34成哑巴了?

吴脑的键客

fedora

Newtonsoft.Json的使用整理

happlyfox

json netcore 5月日更

我崩溃了!BTAJ面试有关散列(哈希)表的面试题详解,电子版已问世

欢喜学安卓

android 程序员 面试 移动开发

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