写点什么

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

评论

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

财务世界中数据叙事对于企业决策的影响力

智达方通

企业管理 全面预算 财务管理 数据叙事

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

阿里云云效

阿里云 云原生 云效

生成式AI的「七宗罪」!

脑极体

AI

通义灵码入职阿里云后,同事们的工作发生了哪些改变?

阿里巴巴云原生

阿里云 云原生 通义灵码

神经网络极简入门

EquatorCoco

人工智能 神经网络 网络协议

Sermant在异地多活场景下的实践

华为云开源

开源 微服务 云原生 服务治理 sermant

AI 001 号员工通义灵码入职阿里云丨阿里云云原生 4 月产品月报

阿里巴巴云原生

阿里云 AI 云原生

软件测试学习笔记丨后端接口开发 - MyBatis 增删改查

测试人

软件测试

教你用Perl实现Smgp协议

快乐非自愿限量之名

Linux 电信

大营销抽奖系统,DDD开发要如何建模?

不在线第一只蜗牛

谷歌确认:链接并不那么重要

九凌网络

生成式AI的「七宗罪」!

白洞计划

AI

开发体商融合:提升体育赛事直播平台发展新路径

软件开发-梦幻运营部

阿里巴巴中国站关键字搜索API返回值全攻略:精准定位所需商品

技术冰糖葫芦

API 编排 API boy API】 pinduoduo API

通义灵码入职阿里云后,同事们的工作发生了哪些改变?

阿里云云效

阿里云 云原生 通义灵码

GLM国产大模型训练加速:高效性能与成本优化的实践

百度开发者中心

人工智能 深度学习 大模型

观测云 VS ELK:谁是日志监控的王者?

观测云

ELK 日志分析

一款自研的热门AI产品-帝阅DeepRead

Baird

AI 产品开发 大模型

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

阿里巴巴云原生

阿里云 云原生 云效

博睿数据将出席ClickHouse Hangzhou User Group第1届 Meetup

博睿数据

Databend 开源周报第 143 期

Databend

京东JD商品详情API返回值揭秘:精准掌握商品信息

技术冰糖葫芦

API 编排 API boy API 策略 pinduoduo API

部署 LangServe 应用到 AWS

Jade@pluto-lang

AI AWS 教程 langchain Pluto

RAG 修炼手册|揭秘 RAG 时代的新向量数据库

Zilliz

Zilliz 向量数据库 rag

CCE云原生混部场景下的测试案例

不在线第一只蜗牛

云原生

破茧成蝶,展翅翱翔——行云乔迁,再启新程!

行云管家

行云管家 行云 乔迁

使用 jps 命令查看Java进程

带双筷子🥢去旅行

Java虚拟机

企业号 5月 PK 榜,火热开启!

InfoQ写作社区官方

热门活动 企业号2024年5月PK榜

面试官:这就是你理解的Java多线程基础?

快乐非自愿限量之名

Java 多线程 开发语言

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