分布式训练

模型并行与数据并行

Parameter Server

同步更新:
在 work 比较多的情况下,parameter server 承受的压力会比较大,网络开销也大

异步更新:
1参数和更新用的梯度并不来自同一个迭代。用来更新的梯度可能是几步更新前的参数算出来的。
2参数的读取并没有加锁。这导致 worker 可能会读到更新一半的参数。

AllReduce

参考:https://blog.csdn.net/gaofeipaopaotang/article/details/94028949
目标:减少参数传递所需要的时间,有 ring-allreduce 和 tree-allreduce

Ring-Allreduce

scatter-reduce

step 1:

image.png

step 2:

image.png

step 3:

image.png

step 7:

image.png

all-gather

step 1:

image.png

step 5:

image.png

Tree-AllReduce
Tree-AllReduce算法过程也分为两个阶段:reduce与broadcast.

reduce & broadcast

image.png

首先还是先回顾下参数同步更新和异步更新的区别:
同步更新模式下,所有 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有线性加速能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844645.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔安装thinkphp低版本路径不对

如果你在宝塔面板上安装了ThinkPHP低版本(例如ThinkPHP 5.0或更早版本),但遇到了路径问题,可以按照以下步骤进行排查和解决: 1. 检查网站根目录设置 确保你的网站根目录设置正确。通常,ThinkPHP项目的入口文件是 public 目录下的 index.php 文件。登录宝塔面板。 进入“网…

C#基础之集合讲解

目录1 集合1.1 数组1.1.1 简介1.1.2 声明使用1.1.2.1 声明 & 初始化1.1.2.2 赋值给数组1.1.2.3 访问数组元素1.1.3 多维数组1.1.3.1 声明1.1.3.2 初始化二维数组1.1.3.3 访问二维数组元素1.1.4 交错数组1.1.5 传递数组给函数1.1.6 Array1.1.6.1 简介1.1.6.2 属性1.1.6.3 方…

织梦网站关键词修改,如何优化DedeCMS的关键词设置

修改织梦网站(DedeCMS)的关键词设置可以通过以下步骤实现:登录管理后台:使用管理员账号登录DedeCMS管理后台。 进入SEO设置:导航至“系统” > “系统基本参数” > “SEO设置”。 修改关键词:在“关键词”字段中,输入新的关键词。 保存更改:确认无误后,保存修改。…

C#基础之不安全代码讲解

目录1 不安全代码1.1 简介1.2 指针变量1.3 编译不安全代码1.4 使用示例1.4.1 简单使用1.4.2 使用指针检索数据值1.4.3 传递指针作为方法的参数1.4.4 使用指针访问数组元素1.5 fixed1.5.1 为什么需要 fixed1.5.2 为什么 int *p 和 int[] p 是不同的类型1.5.3 示例1.6 stackalloc…

IDA+WSL2实现本地linux动态调试

1、首先在ida安装目录找到dbgsrv这个文件夹,打开后把“linux_server”这个文件拖到你的linux中(我放在/root位置)2、然后赋予两个文件权限(linux-server和要调试的文件) chmod +x /root/linux_server chmod +x 你的待调试文件位置然后运行调试组件 /root/linux_server64参…

英特尔固态硬盘维修数据恢复

固态硬盘(SSD)在维修和数据恢复方面,需要根据具体情况采取不同的方法。以下是一些常见的固态硬盘维修和数据恢复方法: 一、检查硬件连接与电源 检查连接线: 打开计算机主机箱,检查SATA或NVMe接口的连接线是否插紧,是否有松动或断裂。 重新插拔连接线,然后重启计算机,看…

WEB AK赛-web2_观星

一看就是sql注入题 尝试了一下发现过滤的东西还挺多的(union,like,=,’,空格,and,if,逗号,ascii,sleep)等 不能用正常的布尔盲注:1^if(ascii(substr(flag,1,1))=104,1,0) 题目过滤了if 看了wp才知道有这种方式:case(A)when(B)then(C)else(D)end 绕过过滤: 过滤了空格可以用(…

【学校训练记录】12月个人训练赛1个人题解

A对于n本书拿出k本较为难实现,但是从n本书里拿出n-k本就容易多了 对于n本书里拿一本为特殊情况,不管怎么拿都为0 对于n本书里拿n-k本的话,我们假设拿的最后一本为i那么 他就是拿出n-k-1本书的情况再加上拿出第i本的情况 其中差值变化为拿出n-k-1本书的值,加上我abs(w[i]-w[…

MySQL底层概述—7.优化原则及慢查询

大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路1.Explain概述 使用Explain关键字可以模拟查询优化器来执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,从而分析出查询语句和表结构的性能瓶颈。MySQL查…

升鲜宝生鲜配送供应链管理系统Mysql表结构数据字典的生成小工具V0.01

最近最近要交付升鲜宝生鲜配送供应链管理系统源代码给上海的客户,需要将蓝湖UI设计图及数据字典交接给别人。在网上找了半天没有找到合适的根据Mysql生成Word数据字典,自己就写了几行代码,记录一下.后面可能会继续改造。主要的代码如下:using System; using System.Collect…

非递归线段树实现

ZKW 非递归线段树 参考文章:线段树详解(非递归版)_非递归线段树-CSDN博客 建树: 原数组[1,n] 存在线段树的 [2,n+1] (为了方便区间查询,要空出第一个节点和最后一个节点) 区间查询 若查询[L,R] 区间, 选取L-1和 R+1 两个节点, 向上寻找.每次到达父节点 L-1 查看自己的父亲的右…

hot100-一刷-01哈希(共3道题)

1.两数之和 题目链接 题目描述代码实现 分析:暴力的话就是两个for循环依次寻找相加为target的两个数。 用一个map记录已经遍历过的数,其中key就用这个数的字面值,value就存它的下标。 判断是否相加为taget的时候,只需要看map中是否有target-nums[i]就可以,说明当前的nums[…