报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

评论

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

“纯C”实现——三子棋小游戏

一介凡夫

c 后端、 #开源 8月月更

FinClip | 来了, 2022 年 7 月更新大盘点

FinClip

DVWA 通关记录 2 - 命令注入 Command Injection

Todd-Lee

如何在技术上来保证LED显示屏质量?

Dylan

LED显示屏 led显示屏厂家

10份重磅报告 — 展望中国数字经济未来

阿里技术

研究报告

开源一夏 | GO语言框架中如何快速集成日志模块

Masters

开源

外包学生管理系统架构文档

8大软件供应链攻击事件概述

SEAL安全

开源 DevOps DevSecOps 软件供应链安全 软件供应链攻击

半夜赶工制作简报的我好想说 : 确定了,最终稿就是这样

叶小鍵

博云入选Gartner中国DevOps代表厂商

BoCloud博云

云计算 容器 DevOps 云原生 云平台

小程序插件的生态丰富,加速开发建设效率

Speedoooo

小程序 小程序容器 小程序插件

React高频面试题合集(二)

helloworld1024fd

React

Vite2 + Vue3 + TypeScript + Pinia 搭建一套企业级的开发脚手架

小周先生

开源 Vite2 vue3.0 #开源 8月月更

react常见面试题

helloworld1024fd

React

基于threejs的商品VR展示平台的设计与实现思路

Five

js vr three.js 签约计划第三季 8月月更

阿里前端智能化技术探索和未来思考

阿里技术

前端 智能化

阿里云数据存储生态计划发布,助力伙伴数据创新

云桌派

阿里云

松哥手把手教你在 Vue3 中自定义插件

江南一点雨

Java Vue

流动性质押挖矿系统开发如何制作?单双币系统开发成熟技术

开发微hkkf5566

【LeetCode】设计数字容器系统Java题解

Albert

LeetCode 8月月更

OSI 七层模型和TCP/IP模型及对应协议(详解)

Five

TCP/IP TCP协议 8月月更

react高频面试题总结(一)

helloworld1024fd

React

受邀出席Rust开发者大会|Rust如何助力量化高频交易?

非凸科技

量化策略 量化交易

爆款视频怎么做?这里或许有答案!

博文视点Broadview

重磅大咖来袭!阿里云生命科学与智能计算峰会精彩内容剧透

阿里云弹性计算

高性能计算 生命科学 AI制药 智能计算

一体化在线政务服务平台,小程序容器技术加速建设步伐

Speedoooo

小程序 小程序容器 政务平台

C++关于函数参数的分析与函数重载进阶教程

CtrlX

c++ 编程语言 后端 cpp 8月月更

C++引用分析实例与案例刨析及使用场景分析详解

CtrlX

c c++ 后端 程序员进阶 8月月更

转转反爬攻防战

转转技术团队

爬虫

Geoffrey Hinton:深度学习的下一个大事件

OneFlow

人工智能 神经网络 深度学习

Maven中的scope

六月暴雪飞梨花

maven 开源 技术 8月月更 scope

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