写点什么

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

评论

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

中国边缘云公有云服务市场 Top2,百度智能云让智算无处不在

Baidu AICLOUD

分布式云

上海首个大模型产业发展研讨会圆满落幕,众顶尖专家共探大模型产业

NLP资深玩家

【FAQ】统一扫码服务常见问题及解答

HarmonyOS SDK

HMS Core

常用工具

流火

Apache Flink ML 2.2.0 发布公告

Apache Flink

大数据 flink 实时计算

Rust、Go 和 Swift 在性能和并发性方面有何差异?

非凸科技

Go swift 性能 编程语言 高并发

有道CEO周枫:当我们谈论大模型时,应该关注哪些新能力?

有道技术团队

全栈开发实战|Vue进阶——使用静态模块打包工具webpack

TiAmo

Vue webpack 三周年连更 静态模块打包

ChatGPT及大模型专题研讨会在蓉成功举办共探前沿技术与产业发展

NLP资深玩家

GPU 加速药物研发与基因组学分析

Baidu AICLOUD

生命科学

大语言模型时代狂飙以来,到底是谁在让你失业|社区征文

小诚信驿站

三周年征文

AI数字人产品“世优BOTA”发布会落幕,世优科技纪智辉演讲回顾

联营汇聚

如何通过C#/VB.NET代码将PowerPoint转换为HTML

在下毛毛雨

html PowerPoint 文档转换

浅谈智能语音交互

六月的雨在InfoQ

语音识别 语音合成 三周年连更 智能语音交互

生物计算大模型技术在药物研发领域的应用

Baidu AICLOUD

生命科学 PaddleHelix

终于有人把动态规划、冒泡排序、二叉树、链表、栈全部讲清楚了

架构师之道

算法

没有主机跑开源软件?速来牧云助手免费领一台!

百川云开发者

云计算 开源 云主机 教程 免费

Apple 的 plist 编辑器入门指南:基础操作与高级功能详解

雪奈椰子

【Linux】firewall-cmd之防火墙简介及命令详解【附加实战⭐建议收藏!!⭐】

A-刘晨阳

Linux 防火墙 Firewalld防火墙 三周年连更

天呐!我真的没想到推特GIF动图保存到手机相册竟然简单几步就能完成!

frank

twitter

如何雇佣一名全民开发者?

草料二维码

开发者 低代码 无代码开发 无代码 无代码微信小程序

从零学习SDK(9)SDK的局限

MobTech袤博科技

手语识别:解锁语言交流的新时代

来自四九城儿

为什么说网络安全行业是IT行业最后的红利?

网络安全学海

网络安全 安全 信息安全 渗透测试 WEB安全

技术干货|如何利用 ChunJun 实现数据实时同步?

袋鼠云数栈

开源 数据采集

赋能开发者,开放原子全球开源峰会期待你的声音!

开放原子开源基金会

大数据 开源 开源软件

2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

NineData

MySQL 腾讯云 阿里云 云数据库 技术沙龙

Go 语言快速入门指南:GET 和 POST 方法

宇宙之一粟

Go HTTP post GET 三周年连更

Split to Be Slim: 论文复现

华为云开发者联盟

人工智能 华为云 论文 华为云开发者联盟 企业号 4 月 PK 榜

华为云GaussDB坚持技术引领,以数字化转型激活金融科技新动能

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

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