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

🎀个人主页: 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 npdef 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 npdef 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.mzph.cn/news/578366.shtml

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

相关文章

fpga 8段4位数码管verilator模拟

8段4位数码管verilator模拟 seg.v module seg(input wire clk,input wire rst_n,output wire[7:0] SEG,output wire[3:0] SEL );reg[7:0] digit[0:15] {8h3f, 8h06, 8h5b, 8h4f, 8h66, 8h6d, 8h7d,8h07,8h7f,8h6f, 8h77, 8h7c, 8h39, 8h5e, 8h79, 8h71};reg[31:0] cnt 32…

Opencv_CUDA实现推理图像前处理与后处理

Opencv_CUDA实现推理图像前处理与后处理 通过trt 或者 openvino部署深度学习算法时,往往会通过opencv的Mat及算法将图像转换为固定的格式作为输入openvino图像的前后处理后边将在单独的文章中写出今晚空闲搜了一些opencv_cuda的使用方法,在此总结一下前…

云服务器ECS运维管理

目录 实时掌握CPU、内存使用情况 实时掌握存储的使用情况 定期对云服务器数据做好备份 定期检查云服务器的安全运行情况 要想保证云服务器长期稳定的使用,除了依靠阿里云(云服务提供商)的技术支持,自身必要的安全维护手段也是…

W6100-EVB-Pico评估版介绍

文章目录 1 简介2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图(尺寸:mm)3.4 参考例程 4 硬件协议栈优势 1 简介 W6100-EVB-Pico是一款基于树莓派RP2040和全硬件TCP/IP协议栈以太网芯片W6100的…

ApiPost测试token验证端口(若依)

首先ApiPost自带默认环境与Mock环境。 接下来自己创建新环境设置变量。 注:若本地环境与生产环境端口不一致,这里的url也要带上端口号 创建一个本地环境,增加环境变量url,默认值为localhost。 再新建一个生产环境。 新建一个登…

Hadoop集群部署

目录 1 模板虚拟机环境准备 1.1 修改网卡配置文件 扩展 1.2 修改主机名 1.3 在虚拟机中需要的基础文件包 1.4 关闭防火墙 1.5 创建Hadoop的账户及文件 2 模板虚拟机安装JDK 3 模板虚拟机安装Hadoop 4 克隆虚拟机 5 虚拟机配置主机名称映射 6 集群分发脚本 7 SSH无…

HTML代码全解析

HTML代码全解析实例解析 <!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 utf-8。<title> 元…

1233. 全球变暖(bfs宽搜相邻点)

题目&#xff1a; 1233. 全球变暖 - AcWing题库 思路&#xff1a;bfs 1.临接问题&#xff0c;最短路径问题--->bfs。 2.被完全淹没--->岛屿所以部分均临海。 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1010; struct Point …

【Linux系统编程】进程状态

介绍 进程的状态指的是进程在执行过程中所处的状态。进程的状态随着进程的执行和外界条件的变化而转换。我们可用 kill 命令来进程控制进程的状态。 kill中的 kill -l 指令用于查看系统中定义的所有信号及其对应的编号。这些信号可以用于 kill 命令来向进程发送特定的信号控制其…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toast组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Toast组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Toast组件 Toast 的应用场景也非常广泛&#xff0c;比如网络请求出错了可以弹一个…

鸿蒙开发(二)- 鸿蒙DevEco开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

论文阅读<CF-YOLO: Cross Fusion YOLO for Object Detection in Adverse Weather.....>

论文链接&#xff1a;https://arxiv.org/pdf/2309.08152.pdfhttps://arxiv.org/pdf/2206.01381.pdfhttps://arxiv.org/pdf/2309.08152.pdf 代码链接&#xff1a;https://github.com/DiffPrompter/diff-prompter 目前没有完整代码放出。 恶劣天气下的目标检测主要有以下三种解…

Stable Diffusion系列(三):网络分类与选择

文章目录 网络分类模型基座模型衍生模型二次元模型2.5D模型写实风格模型 名称解读 VAELora嵌入文件放置界面使用 网络分类 当使用SD webui绘图时&#xff0c;为了提升绘图质量&#xff0c;可以多种网络混合使用&#xff0c;可选的网络包括了模型、VAE、超网络、Lora和嵌入。 …

引用jquery.js的html5基础页面模板

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

使用LLaMA-Factory微调ChatGLM3

1、创建虚拟环境 略 2、部署LLaMA-Factory &#xff08;1&#xff09;下载LLaMA-Factory https://github.com/hiyouga/LLaMA-Factory &#xff08;2&#xff09;安装依赖 pip3 install -r requirements.txt&#xff08;3&#xff09;启动LLaMA-Factory的web页面 CUDA_VI…

Java经典框架之Spring MVC

Spring MVC Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring MVC 入门案例 2. 基…

JVS低代码平台:多级菜单配置的详细教程与演示

多级菜单是软件系统一种常见的用户界面设计&#xff0c;它允许用户通过点击或选择不同的菜单项来执行不同的操作或访问不同的功能。多级菜单通常由多个级别的菜单组成&#xff0c;每个级别都包含一组可选择的菜单项。用户可以通过点击或选择菜单项来进入下一级菜单&#xff0c;…

【MYSQL】MYSQL 的学习教程(七)之 慢 SQL 优化思路

1. 慢 SQL 优化思路 慢查询日志记录慢 SQLexplain 分析 SQL 的执行计划profile 分析执行耗时Optimizer Trace 分析详情确定问题并采用相应的措施 1. 慢查询日志记录慢 SQL 如何定位慢SQL呢&#xff1f; 我们可以通过 慢查询日志 来查看慢 SQL。 ①&#xff1a;开启慢查询日志…

vr虚拟高压电器三维仿真展示更立体全面

VR工业虚拟仿真软件的应用价值主要体现在以下几个方面&#xff1a; 降低成本&#xff1a;通过VR技术进行产品设计和开发&#xff0c;可以在虚拟环境中进行&#xff0c;从而减少对物理样机的依赖&#xff0c;降低试错成本和时间。此外&#xff0c;利用VR技术构建的模拟场景使用方…

蓝桥杯-Excel地址[Java]

目录&#xff1a; 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 题目&#xff1a; 题目描述: 输入描述: 输出描述: 输入输出样例: 示例 1: 运行限制: 题解: 思路: 学习目标&#xff1a; 刷蓝桥杯题库日记 学习内容&#xff1a; 编号96题目Ex…