分布式训练通信NCCL之Ring-Allreduce详解

news2025/2/7 17:12:19

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

随着Chat GPT、文生图、多模态等模型的发展,海量的训练数据、超大规模的模型给深度学习带来了日益严峻的挑战,因此,经常需要使用多加速卡和多节点来并行化训练深度神经网络。目前,数据并行和模型并行作为两种在深度神经网络中常用的并行方式,分别针对不同的适用场景,有时也可将两种并行混合使用。数据并行是在不同设备上放置完整的模型,然后将数据划分在每个设备并行计算。这必然会涉及到不同设备之间的数据传输,即,设备通信,在分布式数据并行的情况下,利用 GPU上的 Minibatch进行权重参数梯度的计算,再利用 GPU之间的通信来完成梯度同步,最后更新模型。常见的深度学习框架提供的通信后端主要有Mpi、Gloo、Nccl,其中Nccl通信后端中的Ring-Allreduce通信技术和硬件的P2P通信技术极大的改善了低效的通信传输问题。本文对Ring-Allreduce通信技术和硬件的P2P通信技术进行详细介绍。


文章目录

  • 前言
  • 一、Ring-Allreduce
    • 1. Scatter-Reduce阶段
    • 2. Allgather阶段
    • 3. Ring-Allreduce通信容量分析
  • 二、硬件Direct通信技术
  • 总结


先对分布式训练中数据并行的流程进行一个回顾, 如下图所示,其基本流程包括将整个训练数据集划分为多个小批次,并将这些小批次分配到不同的设备或节点上。每个设备拥有完整的模型副本,独立处理分配给它的数据。在每个训练步骤中,设备执行前向传播、损失计算、反向传播等操作。随后,梯度信息从各设备中聚合,用于更新模型参数。这一过程循环迭代,直至模型达到收敛或事先定义的训练轮数。数据并行的优势在于有效地利用分布式计算资源,加速大规模深度学习模型的训练,提高训练效率。

在这里插入图片描述

可以发现在分布式训练模型的过程中参数的更新之前需要聚合各设备的梯度信息,因此产生了分布式训练过程中的通信需求,而通信的好坏直接影响到整个模型的训练速度。而Nccl作为常见的深度学习框架提供的通信后端,其中Ring-Allreduce通信技术和硬件的P2P通信技术极大的改善了低效的通信传输问题。

一、Ring-Allreduce

Ring-Allreduce是一种以环状拓扑为基础的通信系统。整个体系结构的工作过程见下图,Rank代表了各个 GPU的进程编号,并且梯度信息可以在两个不同的区域中同步传输。在Ring-Allreduce体系结构中,每台计算机都是一个工作节点,按环形排列。
在这里插入图片描述
Ring-Allreduce体系结构的工作过程被分成两个阶段,即Scatter-ReduceAllgather在Scatter-Reduce阶段,完成了数据的分配与并行,各个工作节点之间的数据交换。最后,在每一个节点上都会有一个最终的结果。Allgather阶段实现了数据的整体同步和压缩,每一个工作节点之间都会进行一些最后的处理,这样对于所有节点来说就可以得到一个完整的结果。

1. Scatter-Reduce阶段

Scatter-Reduce阶段:假定这个阶段的目的是求和,在这个系统中有 N个工作结点,每一个结点中的数据量大小都是K,在Scatter-Reduce的后期,每一个结点都有一个包括初始数组和的而且大小相同的矩阵。

具体的,

  • 第一步,每个结点把本设备上的数据分成 N个区块, N是Ring-Allreduce体系结构中的工作节点数目,见下图步骤(1)。
  • 在第二步,在第一次传输和接收结束之后,在每一个结点上累加了其他节点一个块的数据。这样的数据传输模式直到“Scatter-Reduce”阶段结束,见下图步骤(2)。
  • 最后每一个节点上都有一个包含局部最后结果的区块,由(3)中的深色区块表示,这个区块是所有节点相应的位置区块之和。
    在这里插入图片描述

可以使用Python对Scatter-Reduce阶段的求和过程进行模拟,代码如下:

import numpy as np

def scatter_reduce(data, num_nodes):
    # 假设data是每个节点上的初始数组
    # num_nodes是工作节点数目
    
    # 第一步:每个节点把本设备上的数据分成N个区块
    local_blocks = np.array_split(data, num_nodes)
    
    # 第二步:在每个节点上累加其他节点一个块的数据
    for i in range(num_nodes):
        other_blocks = [local_blocks[j] for j in range(num_nodes) if j != i]
        local_blocks[i] += np.sum(other_blocks, axis=0)
    
    # 第三步:每个节点上都有一个包含局部最后结果的区块
    final_result = np.sum(local_blocks, axis=0)
    
    return final_result

# 示例
num_nodes = 4
data_size_per_node = 5
total_data_size = num_nodes * data_size_per_node

# 生成随机数据作为每个节点上的初始数组
data = np.random.randint(0, 10, total_data_size)

# 模拟Scatter-Reduce过程
result = scatter_reduce(data, num_nodes)

# 打印结果
print("初始数据:", data)
print("最终结果:", result)

2. Allgather阶段

Allgather阶段:每个工作节点将包含最终结果的块数据块交换, 这样所有的结点就会得到一个完整的结果,

  • Allgather阶段总共包含有数据发送和接收N一1次,不同的是,Allgather阶段并不需要将接收到的值进行累加,而是直接使用接收到的块内数值去替环原来块中的数值。在迭代完第1次这个过程后,每个节点的最终结果的块变为2个,如图3.3步骤(2)所示。

  • 之后会继续这个迭代过程直到结束,使得每一个节点都包含了全部块数据结果。下图为整个Allgather过程,可以从图中看到所有数据传输过程和中间结果值。
    在这里插入图片描述
    同样可以使用Python对Allgather阶段的过程进行模拟,代码如下:

import numpy as np

def allgather(local_blocks, num_nodes):
    all_blocks = [np.empty_like(local_blocks) for _ in range(num_nodes)]
    
    for i in range(num_nodes):
        # 第一次迭代直接复制本地块到目标块
        all_blocks[i][:] = local_blocks[i]
    
    for _ in range(num_nodes - 1):
        # 迭代过程中交换块数据
        for i in range(num_nodes):
            target_node = (i + 1) % num_nodes
            # 发送当前节点的块到目标节点
            np.copyto(all_blocks[target_node], local_blocks[i])
            # 接收目标节点的块到当前节点
            np.copyto(local_blocks[i], all_blocks[target_node])
    
    return all_blocks

# 示例
num_nodes = 4
data_size_per_node = 5
total_data_size = num_nodes * data_size_per_node

# 生成随机数据作为每个节点的初始数组
local_data = np.random.randint(0, 10, (num_nodes, data_size_per_node))

# 模拟Allgather过程
result_blocks = allgather(local_data, num_nodes)

# 打印结果
print("初始数据块:", local_data)
print("Allgather结果块:", result_blocks)

3. Ring-Allreduce通信容量分析

从上述Ring-Allreduce的算法过程可以看到,

  • Scatter-Reduce 阶段的工作节点会进行数据的同时收发,具体的,在这一阶段共有 N − 1 N-1 N1次通信容量为 K / N K/N K/N的数据通信过程。

  • 同样的在Allgather阶段的工作节点也会进行数据的同时收发并且共有 N − 1 N-1 N1次通信容量为 K / N K/N K/N的数据通信。

故,在使用Ring-Allreduce算法改善后,每个节点传输数据总量变为:

V c o m m u n i c a t i o n = 2 × K × N − 1 / N Vcommunication=2×K×N-1/N Vcommunication=2×K×N1/N

由上式可知,当工作节点的数量变得很大时,在Ring-Allreduce架构中单个节点的通信数据量近似为 2 × K 2\times K 2×K,与节点数$N¥没有关系。这不仅在一定程度上相比传统的BS(参数服务器)通信方式减少了通信量,同时在节点数量增大时,具有很好的可扩展性。

二、硬件Direct通信技术

在常见的分布式训练加速设备中,常常是多节点多加速卡的形式,节点也可被称之为主机或CPU,加速卡的种类很多,常见的有GPU、DCU、FPGA等。如下图所示,在单节点多加速卡的情况下,节点和加速卡以及加速卡之间的数据通信依靠PCIe或NVLink实现,多节点多加速卡的情况下,节点之间的数据通信依靠以太网或Infiniband实现。

在这里插入图片描述
在跨节点加速卡通信的过程中,往往需要先将加速卡的数据传输到相应节点的CPU上,然后CPU通过以太网传输数据,之后又将数据传给加速卡,这种数据在节点和加速卡之间频繁移动所造成的通信开销是很大的,鉴于此,英伟达公司发布了 GPU Direct技术,用于提高加速卡之间通信的效率。

  • 在单节点多加速卡通信中,提出P2P(GPU Direct peer-to-peer)技术。如下图(a)(b)所示,它实现了节点内部加速卡的直接通信,即加速卡可以直接访问另一个加速卡的内存并实现数据的直接传输,避免了加速卡的数据复制到节点CPU内存上作为中转。

  • 在多节点多加速卡通信中,提出了GDR(GPU direct RDMA)技术,如下图(c)所示,加速卡和网卡可以直接通过PCIe进行数据交互,避免了跨节点通信过程中内存和CPU的参与。从而实现加速卡可以直接访问其他节点的加速卡内存。
    在这里插入图片描述

总结

无论是Ring-Allreduce通信技术还是硬件的P2P通信技术都从硬件层面极大的改善了低效的通信传输问题,并且,相比于Mpi和Gloo对于硬件层面的通信优化程度更高,并且,对于英伟达的GPU,Nccl所提供的通信后端更加高效。

文中有不对的地方欢迎指正。

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

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

相关文章

SKU低价了如何监测

品牌在做控价的过程中,需要先监测商品的价格,但一条链接里如果有多个SKU应该如何监测呢,有时多个SKU会共用一个标题,只会在款式中体现不同,这就需要监测工作非常细致,否则容易监测失误。 监测低价可以由人工…

C/C++ BM2链表内指定区间反转

文章目录 前言题目1. 解决方案一1.1 思路阐述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这题是BM1的升级版,不过是把完整的链表翻转变成了指定区间。 题目 描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 …

第二证券:我国股市涨跌幅限制是多少?

我国股市涨跌幅束缚是多少? 1、主板:新股上市后的前5个交易日不设价格涨跌幅束缚,第6个交易日起,涨跌幅束缚为10%。 2、创业板:新股上市后的前5个交易日没有价格涨跌幅束缚,第6个交易日起,涨跌…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

【Jmeter、postman、python 三大主流技术如何操作数据库?】

前言 1、前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性;例如商品搜索功能 自动化测试或性能测试…

Pytorch深度强化学习2-1:基于价值的强化学习——DQN算法

目录 0 专栏介绍1 基于价值的强化学习2 深度Q网络与Q-learning3 DQN原理分析4 DQN训练实例 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理,并且采用Pytorch框架对常见的强化学习算法、案例进行实现,帮助读者理解并快速上手开发。同时,辅…

swing快速入门(二十九)播放器工具条

注释很详细,直接上代码 上一篇 新增内容 1.工具条按钮添加响应及图标 2.为控件添加滚动条(通用) 3.在工具按钮之间添加自动间隔 4.设置工具条的可否移动状态(默认可移动) package swing21_30;import javax.swing…

Spring系列学习二、Spring框架的环境配置

Spring框架的环境配置 一、Java环境配置二、 Spring框架的安装与配置三、Maven与Gradle环境的配置四、IDE环境配置(Eclipse与IntelliJ IDEA)五、结语 一、Java环境配置 所有编程旅程总是得从基础开始,如同乐高积木大作的基座,首先…

Ubuntu20.04-查看GPU的使用情况及输出详解

1. 查看GPU的使用情况 1.1 nvidia-smi # 直接在终端得到显卡的使用情况 # 不会自动刷新 nvidia-smi# 重定向到文件中 nvidia-smi > nvidia_smi_output.txt# 如果输出的内容部分是以省略号表示的,可以-q nvidia-smi -q 1.2 nvidia-smi -l # 会自动刷新&#x…

Python高级用法:enumerate(枚举)

enumerate(枚举) 在编写代码时,为了遍历列表并获取每个元素在列表中的索引,我们可以使用Python中的enumerate函数。下面是一个简单的例子,演示了如何使用enumerate函数实现相同的功能。 原始代码片段: i…

keepalived高可用 | 部署Ceph分布式存储

keepalived高可用 | 部署Ceph分布式存储 keepalived高可用1. 配置第二台haproxy代理服务器部署HAProxy 2.为两台代理服务器配置keepalived配置第一台代理服务器proxy (192.168.4.5)配置第二台代理服务器proxy (192.168.4.6)修改DNS服务器 部署ceph分布式存储准备硬件实验环境准…

10个值得收藏的机器视觉标注工具

推荐:用 NSDT编辑器快速搭建可编程3D场景 我们知道寻找良好的图像标记和注释工具对于创建准确且有用的数据集的重要性。 随着图像注释空间的增长,我们看到开源工具的可用性激增,这些工具使任何人都可以免费标记他们的图像并从强大的功能中受益…

Java代理设计模式--静态代理和动态代理

文章目录 代理设计模式概念代理模式的定义与特点代理模式的结构与实现代理模式的应用场景静态代理实例代理模式的扩展动态代理实现方式JDK动态代理与实例Cglib动态代理JDK动态代理与CGLIB对比 代理设计模式 概念 在有些情况下,一个客户不能或者不想直接访问另一个…

【中小型企业网络实战案例 二】配置网络互连互通

​【中小型企业网络实战案例 一】规划、需求和基本配置-CSDN博客 热门IT技术视频教程&#xff1a;https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 配置接入层交换机 1.以接入交换机ACC1为例&#xff0c;创建ACC1的业务VLAN 10和20。 <…

NFC物联网一次性口令认证解决方案

物联网是由无线传感器网络、射频识别(RadioFrequency Identificalion&#xff0c;RFID)网络、互联网等构成的一种复合型网络&#xff0c;具有部分终端设备体积小、存储和计算处理能力弱的特点。顾名思义&#xff0c;物联网就是“物物相连的互联网”&#xff0c;也就是说,物联网…

Visual Studio2022配置ReSharper C++ 常用设置

如需安装免费的可以在下面留言&#xff0c;看到即回复 文章目录 Visual Studio2022配置ReSharper C 常用设置配置Visual Studio2022&#xff0c;使其能够按回车进行补全配置ReSharper C 设置自动弹出配置ReSharper C 的快捷键ReSharper C 去掉注释拼写使用中文注释 如何关闭新版…

OAuth2.0 四种授权方式讲解

一、OAuth2.0 的理解 OAuth2是一个开放的授权标准&#xff0c;允许第三方应用程序以安全可控的方式访问受保护的资源&#xff0c;而无需用户将用户名和密码信息与第三方应用程序共享。OAuth2被广泛应用于现代Web和移动应用程序开发中&#xff0c;可以简化应用程序与资源服务器之…

在国内如何在速卖通上买东西(在速卖通aliexpress上付款)??

一、速卖通aliexpress上购物流程 1. 登录速卖通aliexpress网站&#xff0c;点击“注册”按钮。 2. 输入您的邮箱地址&#xff0c;然后单击“验证/联系”按钮&#xff1b; 3. 使用您的信用卡支付订单金额&#xff0c;点击获取信用卡 4. 在“我的订单管理器”中查看订单信息。 …

学习笔记14——Springboot以及SSMP项目

SpringBoot Springboot项目 IDEA2023只能创建jdk17和21的springboot项目解决 - 嘿嘿- - 博客园 (cnblogs.com)解决IntelliJ IDEA2022.03创建包时&#xff0c;包结构不自动分级显示的问题_idea建包不分级-CSDN博客IDEA调出maven项目窗口_idea maven窗口-CSDN博客 相比于spring的…

【2023下算法课设】Gray码的分治构造算法

Gray码是一个长度为2ⁿ的序列&#xff0c;序列中无相同元素&#xff0c;且每个元素都是长度为n位的二进制位串&#xff0c;相邻元素恰好只有1位不同。例如长度为2的格雷码为&#xff08;000,001,011,010,110,111,101,100&#xff09;&#xff0c;设计分治算法对任意的n值构造相…