【笔记】PyTorch DDP 与 Ring-AllReduce

news2024/9/23 9:27:22

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

 

文内若有错误,欢迎指出!


image.png

         今天我想跟大家分享的是一篇虽然有点老,但是很经典的文章,这是一个在分布式训练中会用到的一项技术, 实际上叫ringallreduce。 为什么要叫这个吗?因为现在很多框架,比如像pytorch他内部的分布式训练用到的就是这个。 所以知道他的原理的话也方便我们后面给他进行改进和优化。他是一项来自HPC的技术,但实际上现在分布式机器学习上的很多技术都是借鉴自HPC。下面的内容一部分来自论文,另一部分是来自网络。

        这里先介绍一点背景知识。
        以数据并行为例,在分布式训练中,需要将数据分布到不同的GPU上面进行训练,然后训练一个epoch后进行梯度更新。这里的更新可以分为同步和异步,为了方便理解,这里我画了几张图。 同步比较好理解,每个GPU在完成之后,需要等其他GPU也完成才能进行梯度更新。异步的话,就是说每个GPU可以独自进行梯度更新,并且在一定的时间点进行梯度交换,因此并不需要等其他的GPU也完成。而这两种方式中的梯度交换也引申出了很多研究内容。
        总的来说是基于两种方式,一种是使用参数服务器,另一种是通过reduce操作。 参数服务器的方式是通过指定一个服务器来协调计算每个GPU的梯度。他的缺点也很明显,随着GPU的增加,参数服务器的通信成为了瓶颈。 而reduce的方式是去除了参数服务器的存在,让每个GPU互相通信,他也分了map-reduce、all-reduce、ring-reduce、ring-allreduce等等。

https://zh.d2l.ai/chapter_computational-performance/parameterserver.html

image.png

        这里先介绍一下一些通信原语的概念,方便后面理解。 

image.png

        然后回到论文中来。
        在allreduce中用的比较多的是蝶形算法。在没有网络竞争的情况下,这个算法在延迟和带宽中都是最优的,但是事实上,这种通信模式会导致在许多当代集群中产生网络竞争,如广泛部署的SMP/多核集群,因为这些集群往往共享了一些网络资源。
在没有网络竞争的情况下,蝶形算法之所以在延迟和带宽方面都表现最优,主要有以下几个原因:
        1.对等通信模式: 蝶形算法采用了对等通信模式,即每个节点都与其他节点建立了直接连接。在没有网络竞争的情况下,节点之间的通信路径是独立的,不存在其他节点的干扰。这使得通信的延迟最小化,因为消息可以通过最短的路径尽快到达目标节点。
        2.逐级通信: 蝶形算法通过多个通信阶段逐级地将数据进行聚合。每个阶段中,节点与距离它最近的节点进行通信,然后逐渐扩展到更远的节点。这种逐级通信方式使得数据的聚合过程更加高效,减少了通信的次数和总延迟。
        3.负载平衡: 蝶形算法通过分阶段聚合数据,确保了在通信过程中负载的平衡。即使在节点之间的计算能力或带宽存在差异的情况下,蝶形算法仍能在通信过程中保持相对均衡的负载,最大限度地利用每个节点的计算资源。
        4.带宽优化: 蝶形算法在每个阶段的通信中只传输部分数据,而不是直接传输全部数据。这样可以减少单次通信的数据量,从而更好地利用带宽资源。在没有网络竞争的情况下,节点之间的通信通常能够占用整个可用带宽,因此通过优化单次通信的数据量,蝶形算法可以最大程度地提高带宽利用率。
        (蝶形全局求和的过程是,第一步将两个相邻的节点分作一组,互相通信他们的 sum,那么这个两节点小组的每个结点中的 sum 都是这个小组的局部和。第二步将四个节点分作一组,前半部分与后半部分相互通信,那么这个四节点小组的每个结点中的 sum 都是这个小组的局部和。循环进行这个步骤直到小组容量大于总进程数。)
        而作者提出的基于环的方式,声称可以在几乎所有当代集群中实现无争用通信,并且可以需要比较少的内存需求,也不需要2的幂个节点。但它也存在一些问题,比如只在带宽上有优化;而且可能存在精度问题。这个精度问题是指,由于并行计算中涉及到浮点数运算,不同节点上进行计算的结果可能受到舍入误差的影响,因为不同节点对于浮点数计算的精度可能会有差异。此外,Ring算法虽然在中等规模的运算中非常有优势,较小的传输数据量,无瓶颈,带宽完全利用起来。不过在大型规模集群运算中,巨大的服务器内数据,极长的Ring环,Ring的这种切分数据块的方式就不再占优势。

1.png

2.png

3.png

1.png

4.png

5.png

6.png

7.png

8.png

9.png

10.png

        这篇论文很长,而且数学公式较多,我们就不看数学证明,直接来看他的实现流程。不过他对流程介绍的也少,所以又从网上找了一些资料过来。
        所提的方法主要是结合了三种现有技术于一身。以下图为例,看一下他的执行流程。
        首先将数据分为 N 个块,每个GPU负责1个块。
        然后,第N个GPU发送第N个块,并接收第N-1个块。
        ……
        这么做有什么好处呢?
        每个 GPU 在Scatter Reduce阶段,接收 N-1 次数据,N 是 GPU 数量;每个 GPU 在allgather 阶段,接收 N-1 次数据;每个 GPU 每次发送 K/N 大小数据块,K 是总数据大小;所以,每个GPU的Data Transferred=2(N−1)*K/N = (2(N−1)/N)*K,随着 GPU 数量 N 增加,总传输量恒定!(我的理解是,随着N变大,1/N不断减小,总传输量趋近于固定值?)总传输量恒定意味着通信成本不随 GPU 数量增长而增长,也就是说我们系统拥有理论上的线性加速能力。
        allreduce的速度受到环中相邻GPU之间最慢(最低带宽)连接的限制。给定每个GPU的正确邻居选择,该算法是带宽最优的,并且是执行allreduce的最快算法(假设延迟成本与带宽相比可以忽略不计)。

image.png

        在Pytorch中有两种实现分布式数据并行训练的方式,分别是DP和DDP。DP由于只在主进程中管理多个任务和更新参数,因此其计算量和通讯量都很重,训练效率很低。
        现在普遍用的较多的是DDP的方式,简单来讲,DDP就是在每个计算节点上复制模型,并独立地生成梯度,然后在每次迭代中互相传递这些梯度并同步,以保持各节点模型的一致性。
        而在pytorch中的DDP实际就是使用了Ring-ALLReduce来实现AllReduce算法。
        DDP的执行流程大致如下:
        各个GPU首先进行环境初始化和模型的广播,使初始状态相同。然后初始化模型bucket和reducer。在训练阶段,通过采样获取数据,计算前向传播,然后进行反向传播和使用all-reduce进行梯度同步,最后完成参数的更新。
        这里说明了allreduce是在前向传播完成后用于梯度同步的,并且提到了一个新词 bucket。
        (模型参数以(大致)与给定模型 Model.parameters() 相反的顺序分配到存储桶中。使用相反顺序的原因是,DDP 期望梯度在向后传递期间大致按照该顺序准备就绪。)

image.png

        实际上,DDP中的设计是通过将全部模型参数划分为无数个小的bucket,然后在bucket级别建立allreduce。比如当所有进程中bucket0的梯度计算完成后就立刻开始通信,而此时bucket1中梯度还在计算。
        这样可以实现计算和通信过程的时间重叠。这种设计能够使得DDP的训练更高效,可以在参数量很大时,获得很好的加速效果。

        简单总结一下前面的内容。
        1、Pytorch中分布式训练用的比较多的是DDP;
        2、DDP中的Allreduce使用的是ring-allreduce,并且使用bucket来引入异步;
        3、Allreduce发生在前向传播后的梯度同步阶段,并且与反向传播计算重叠;
        4、Ring-allreduce优化了带宽,适用于中规模的集群,但其可能存在精度问题,切不适合大规模的集群;
        5、allreduce的速度受到环中相邻GPU之间最慢连接的限制;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hyper-v 设置静态IP 搭建集群

背景 最近想在本机WIN11上创建几个Centos用于做几个试验,之前一直用VMWare,需要安装额外的软件,正好win自带虚拟机功能,只需要在功能中安装Hyper-v就可以使用。 新建虚拟机 虚拟机交换器 Hyper-V 虚拟交换机是基于软件的第 2 层…

P5691 [NOI2001] 方程的解数

题目 思路 暴搜显然会TLE,所以这时候就应该请出DFS的伙伴——折半搜索(meet in the middle)了 折半搜索的思路就是先搜完后一半后,借助这一半的数据来搜索前一半,效率是原来的2倍 这个题怎么才能折半搜索呢&#xff1…

链表OJ题目1 (移除链表元素)

力扣(链接放这里喽) 先贴代码再做讲解: struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur head;struct ListNode* tail NULL;while(cur){if(cur->val val){if(cur head){head head->next…

【点云处理教程】01如何创建和可视化点云

一、说明 本文是系列教程,专门介绍点云处理的全流程,是一个入门工具。“点云处理”教程对初学者友好,我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 第1条:点云处理简介文章2:在Python中从深度图…

Python入门【可变参数、lambda表达式和匿名函数、eval()函数、递归函数、嵌套函数(内部函数)、 nonlocal关键字】(十二)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

怎么对XMind思维导图加密?

在现代社会中,信息安全变得越来越重要。对于那些使用XMind思维导图来组织和管理重要信息的人来说,保护思维导图中的内容免受未经授权的访问变得至关重要。本文将介绍如何加密XMind思维导图,以确保您的信息安全。 什么是XMind思维导图&#x…

Qt中postevent造成内存泄漏问题的通用解决方案

在Qt中由QCoreApplication统一管理Qt事件的收发和销毁,其中sendEvent为阻塞式发送,用于单线程的事件发送;postevent为非阻塞式发送,构造事件的线程和接受事件的线程可以为两个线程。 最近在做一个个人项目ShaderLab 需要绘制OpenGL实时渲染的图像,由于OpenGL渲染基本都放…

Flowable-服务-消息任务

文章目录 定义图形标记XML内容集成Rabbitmq引入pom包配置rabbitmq 操作界面 定义 Mq 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Mq 任务是作为一种特殊的服务 任务来实现的,主要做Mq消息发送。 图形标记 由于 Mq 任务不是 BPM…

openGauss学习笔记-25 openGauss 聚集函数

文章目录 openGauss学习笔记-25 openGauss 聚集函数25.1 sum(expression)25.2 max(expression)25.3 min(expression)25.4 avg(expression)25.5 count(expression)25.6 count(*)25.7 delta25.8 mode() within group (order by value anyelement) openGauss学习笔记-25 openGauss…

Vue『卡片拖拽式课程表』

Vue『卡片拖拽式课程表』 概述 在本篇技术博客中,我们将介绍一个使用Vue实现的『卡片拖拽式课程表』。这个课程表允许用户通过拖拽课程卡片来安排不同的课程在时间表上的位置。我们将逐步讲解代码实现,包括课程表的布局、拖拽功能的实现,以…

mac使用brew切换node的版本号

借用的是这篇文章 》 mac 使用brew切换node版本 # 查看node的版本号 brew search node# 安装其他版本. 选择 node16版本 brew install node16# 如果你是第一次安装node的话,执行下面这个操作 brew link --overwrite --force node16# 如果你是第二次安装node的话&am…

一文教会你单向链表

目录 一、什么是链表? 1.链表的定义 2.链表的实现 2.1链表的定义 2.2创建一个链表 二、链表的各个接口 1.创建节点 2.头插(将新创建的节点作为头插入到链表中) 3.打印链表 4.尾插(将新创建的节点插入到链表的末端) 5.头删 6.尾删 7.查找 8.删除指定节点位…

C语言基础入门详解三

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、C语言之函数指针 #include<stdio.h> #include<stdlib.h> /**函数指针 …

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…

实例026 随机更换主界面背景

实例说明 如果开发的软件用户使用频率非常高&#xff0c;可以为程序设计随机更换背景的程序。这样不但可以使用户心情愉快&#xff0c;也增加了软件的人性化设计。下面的界面就是一个随机更换主界面的例子&#xff0c;效果如图1.26所示。 技术要点 随机更换主界面背景使用了…

MySql002——关系型数据库基础知识

前言&#xff1a;因为本专栏学习的是MySQL&#xff0c;而MySQL是关系型数据库&#xff0c;所以这篇文章就来介绍一些关系型数据库基础知识&#xff0c;至于其他知识小伙伴们可以自行学习&#xff0c;同时不足之处也欢迎批评指正&#xff0c;谢谢~ 一、MySQL关系型数据库(RDBMS)…

Flowable-服务-Http任务

目录 定义图形标记XML内容界面操作 定义 Http 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Http 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要调用Http服务使用。 图形标记 由于 Http 任务不是 BPMN 2.0 规范的“官方”任务&…

05-向量的意义_n维欧式空间

线性代数 向量与其运算 向量是线性代数里面最基本的概念&#xff0c;它其实就是一维数组&#xff0c;由 N 个数构成的&#xff0c; X(X1, X2…Xn) 向量的维度可以是任意正整数&#xff0c;可以表示在 n 维空间中的位置或方向。向量本身是一维的&#xff0c; 但向量所处的空间…

JavaWeb+jsp+Tomcat的网上订餐项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88130029?spm1001.2014.3001.5503 技术&#xff1a;ssm jsp JDK1.8 MySQL5.7 Tomcat7.0.5 功能&#xff1a;普通用户与管理员两个登录&#xff0c;管理员可以进行商品的增删改&#xff0c;…

JAVA SE -- 第十二天

&#xff08;全部来自“韩顺平教育”&#xff09; 常用类 一、包装类 1、包装类的分类 ①针对八种基本数据类型相应的引用类型--包装类 ②有了类的特点&#xff0c;就可以调用类中的方法 ③ 基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintInteger…