“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

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

评论

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

Ts中string、number和any等类型 不能当做索引用,怎么处理?

肥晨

三周年连更

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践

融云 RongCloud

运维 网络 融云 泛娱乐 出海

Mac无损音乐播放器:Audirvana for Mac中文

真大的脸盆

Mac Mac 软件 音乐播放 音乐播放器

刘浩:当谈到RTO < 8s时,OceanBase究竟在说什么?

OceanBase 数据库

数据库 oceanbase

华为亮相KubeCon EU 2023 新云原生开源项目Kuasar推动“云上演进”

华为云开发者联盟

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

【Python实战】Python采集皮肤图片数据

BROKEN

三周年连更

linux下怎么拉取远程的代码并且合并到本地,保证不冲突

linux大本营

git Linux

怎样判断户外LED显示屏质量是否达标

Dylan

媒体 广告 户外LED显示屏

Java 应用程序在 Kubernetes 上棘手的内存管理

做梦都在改BUG

Java Kubernetes JVM 内存管理

用C语言实现,终端输入1.2.3.4/32,解析输出unsignedint类型的1.2.3.4和32

linux大本营

C语言

open3d将pcd存数据库

linux大本营

sqlite 数据库 存储 :MySQL 数据库

C语言sqlite3,实现判断一个数据库存不存在,不存在就创建

linux大本营

数据库 C语言 sqlite3

用纯python写web app:Streamlit

AIWeker

Python python小知识 三周年连更

ShareSDK 微信平台注册指南

MobTech袤博科技

超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!

飞桨PaddlePaddle

人工智能 计算机视觉 目标检测 百度飞桨

如何在makefile中链接Json解析库Reader

linux大本营

json makefile reader

震撼!阿里架构师全新产出Java面试突击宝典。我觉得泰库辣!

Java你猿哥

Java redis spring Spring Boot JVM

SaaS 软件的 SLA 和 Escalation

Jerry Wang

SaaS Cloud 三周年连更

ubuntu如何安装Json解析库Reader

linux大本营

ubuntu JSON库 reader

HummerRisk V1.0.1:k8s检测扩充、批量删除及修复bug

HummerCloud

开源 云原生 云安全 云原生安全

Android C++系列:函数返回值注意事项

轻口味

c++ android 三周年连更

软件测试/测试开发丨自动化测试之读取配置文件

测试人

软件测试 自动化测试 测试开发

深入探索数据库MySQL,性能优化与复杂查询相关操作

做梦都在改BUG

Java MySQL 数据库 性能优化

递归算法

linux大本营

递归 数据结构与算法

写一个回调函数

linux大本营

回调函数 C++

基于STM32设计避障寻迹小车

DS小龙哥

三周年连更

数仓实践丨主动预防-DWS关键工具安装确认

华为云开发者联盟

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

目前江西省等级测评公司有几家?都在南昌吗?

行云管家

江西 等保 等级保护 等保2.0

websocket底层原理

linux大本营

nginx HTTP websocket 通信协议 web服务器

canvas-绘制一个柱状图

格斗家不爱在外太空沉思

CSS canvas 三周年连更

免费云堡垒机用哪个牌子软件好?包含哪些功能?

行云管家

云计算 网络安全 IT运维 云堡垒机

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