大模型训练(7):集合通信与通信原语

0 背景

分布式训练过程中设计到许多通信上的操作, 每个操作有其不同的术语并且有所区别,这里将其用简单的例子和描述总结一下,方便理解。

集合通信(Collective Communications)是一个进程组的所有进程都参与的全局通信操作,其最为基础的操作有发送send、接收receive、复制copy、组内进程栅障同步Barrier以及节点间进程同步,这几个最基本的操作经过组合构成了一组通信模板也叫通信原语,比如:

  • 1对多的广播broadcast
  • 多对1的规约reduce
  • 多对多的规约all-reduce
  • 多对1的收集gather
  • 多对多的收集all-gather
  • 1对多的发散scatter
  • 组合的规约与发散reduce-scatter
  • 多对多的all-to-all等

集合通信的难点在于通信效率以及网络硬件连接拓扑结构的最佳适用。其设备间的物理连接方式可以是私有物理互联协议,比如CXL、NVLINK,也可以是PCIe、InfiniBand、Ethernet等,本文将以此物理拓扑结构描述集合通信中常用的几组通信原语。

1 Broadcast(广播)

将一个设备上的数据广播到各个设备上,其他设备对该设备只进行读数据。

image-20250209162919979

Broadcast属于1对多的通信原语,一个数据发送者,多个数据接收者,可以在集群内把一个节点自身的数据广播到其他节点上。如上图所示,GPU1~4表示集群中的训练加速卡节点,小方块表示内存空间,最后都变成了a1b1c1d1。当主节点 1 执行Broadcast时,数据即从主节点0被广播至其他节点。

Broadcast是数据的1对多的同步,它将一张XPU卡上的数据同步到其他所有的XPU卡上,其应用场景有:

  • 数据并行的参数初始化,确保每张卡上的初始参数是一致的
  • All-Reduce里 broadcast + reduce组合操作里的broadcast部分
  • 分布式训练 parameter server 参数服务器结构里的 master 节点 broadcast 数据到 worker 节点,再从 worker 节点 reduce 数据回 master 节点里的broadcast操作

2 Reduce(规约)

Reduce是函数式编程的经典概念。数据规约涉及通过函数将一组数字缩减为一个较小的集合。例如,假设我们有一个数字列表[1,2,3,4,5]。用sum函数缩减这个数字列表将产生sum([1,2,3,4,5])= 15。同样,乘法规约将产生乘法([1, 2, 3, 4, 5]) = 120

image-20250209163514937

在上图的例子中,各设备上相同位置的元素进行加和,并将结果呈现在一个设备上(图中的例子为设备1)。

Reduce属于多对1的通信原语,具有多个数据发送者,一个数据接收者,可以在集群内把多个节点的数据规约运算到一个主节点上,常用的规约操作符有:求累加和SUM、求累乘积PROD、求最大值MAX、求最小值MIN、逻辑与 LAND、按位与BAND、逻辑或LOR、按位或BOR、逻辑异或LXOR、按位异或BOXR、求最大值和最小大的位置MAXLOC、求最小值和最小值的位置MINLOC等,这些规约运算也需要加速卡支持对应的算子才能生效。

Reduce是数据的多对1的规约运算,它将所有张XPU卡上的数据规约(比如SUM求和)到1张XPU卡上,其应用场景有:

  • All-Reduce里的 broadcast + reduce组合里的reduce操作
  • Reduce-Scatter组合里的 reduce操作
  • 分布式训练 parameter server 参数服务器结构里的 master节点 broadcast 数据到worker节点,再从worker节点reduce数据回master节点里的reduce操作;

3 All Reduce(全集规约)

相当于Reduce之后再来了一个Broadcast。

image-20250209163906114

All-Reduce属于多对多的通信原语,具有多个数据发送者,多个数据接收者,其在集群内的所有节点上都执行相同的Reduce操作,可以将集群内所有节点的数据规约运算得到的结果发送到所有的节点上。All-Reduce操作可通过在主节点上执行Reduce + BroadcastReduce-Scatter + All-Gather实现。每个节点的数值就都保持一致。

All-Reduce 是数据的多对多的规约运算,它将所有的XPU卡上的数据规约(比如SUM求和)到集群内每张XPU卡上,其应用场景有:

  • AllReduce应用于数据并行
  • 数据并行各种通信拓扑结构比如Ring,All-Reduce、Tree All-Reduce里的 All-Reduce操作

4 Gather(收集)

收集(即把东西放到一起,并不做运算),与Reduce不同的地方是,Gather只是将数据汇总到一起,而Reduce需要按照指定的映射函数进行运算

image-20250209220535754

Gather操作属于多对1的通信原语,具有多个数据发送者,一个数据接收者,可以在集群内把多个节点的数据收集到一个节点上,如上图所示,不同数据块都汇聚到了GPU1上。

Gather是数据的多对1的收集,它将多张XPU卡上的数据收集到1张XPU卡上,他的反向操作对应Scatter。

5 All Gather(全集收集)

即将所有人的所有数据都让所有人知道,做到所有数据透明。和Broadcast的区别是,这里是针对全局所有机器的数据来说,而Broadcast是针对一个机器,让其他所有人都知道你的数据。也就是All Gather数据传输的量更大。

image-20250209220929865

All-Gather是数据的多对多的同步全收集,它将多张XPU卡上的数据收集到多张XPU卡上,可以看做Gather + Broadcast的操作组合,它的反向操作对应Reduce-Scatter,其最应用场景有:

  • All-Gather可应用于模型并行
  • 模型并行里前向计算里的参数全同步,需要用All-Gather把模型并行里将切分到不同的XPU上的参数全同步到一张XPU上才能进行前向计算

6 Scatter(离散)

中文意思为离散,扩散。即将一个机器上的不同数据分别给到不同机器。

image-20250209221206467

同Broadcast一样,Scatter也是一个1对多的通信原语,也是一个数据发送者,多个数据接收者,可以在集群内把一个节点自身的数据发散到其他节点上。与Broadcast不同的是Broadcast把主节点0的数据发送给所有节点,而Scatter则是将数据的进行切片再分发给集群内所有的节点,如上图所示,主节点 1 将数据分为3份分发到了节点1-3。

Scatter是数据的1对多的分发,它将一张XPU卡上的数据进行分片再分发到其他所有的XPU卡上,他的反向操作对应Gather,其应用场景有:

  • Reduce-Scatter 组合里的 Scatter 操作
  • 模型并行里初始化时将模型 Scatter 到不同的XPU上

7 Reduce-Scatter(规约离散)

Reduce_scatter最终呈现效果为:每个GPU上有一部分完成所有设备粒度规约的数据,但是只有一块,其他块在其他的设备上。他和All reduce的区别在于,All reduce是所有设备上都有完整规约的数据。

这是一个不常见的通信函数,在深度学习显存优化ZeRO中经常被用到,如下图所示。

image-20250209222056096

Reduce-Scatter 属于多对多的通信原语,具有多个数据发送者,多个数据接收者,其在集群内的所有节点上都按维度执行相同的Reduce规约运算,再将结果发散到集群内其他的节点上,Reduce-Scatter等价于节点个数次的reduce规约运算操作,再后面执行节点个数的scatter次操作,其反向操作是All-Gather。

ReduceScatter是数据的多对多的reduce + scatter运算,它将所有的XPU卡上的数据先规约(比如SUM求和)到1张XPU卡上,再进行scatter,其应用场景有:

  • Reduce-Scatter即可应用于数据并行也可应用于模型并行
  • 数据并行All-Reduce里的 Reduce-Scatter + All-Gather组合里的Reduce-Scatter操作
  • 模型并行里在前向All-Gather后的反向计算里的Reduce-Scatter

8 All-To-All

All-To-All 操作每一个节点的数据会 Scatter 到集群内所有节点上,同时每一个节点也会 Gather 集群内所有节点的数据。

All-To-All 是对 All-Gather 的扩展,区别是 All-Gather 操作中,不同节点向某一节点收集到的数据是相同的,而在 All-To-All 中,不同的节点向某一节点收集到的数据是不同的,如下图所示

image-20250209232352094

All-To-All是数据的多对多的转置,它将所有张XPU卡上的数据转置到所有的XPU卡上,其主要应用场景有:

  • All-To-All应用于模型并行;
  • 模型并行里的矩阵转置;
  • 数据并行到模型并行的矩阵转置;

9 Send 与 Receive

数据或参数在不同XPU之间的发送与接收。

10 Barrier

Barrier同步操作会阻塞所有的调用者直到所有的组内成员都调用了它, 用于一个集合通信子中所有进程的同步,调用函数时进程将处于等待状态,直到通信子中所有进程 都调用了该函数后才继续执行。

11 Signal与Wait

Signal与Wait属于记录型信号量机制: wait(s),signal(s)可用于解决进程间的同步问题,在通信原语里从一个节点发送一个数据到另外一个节点时,会同时signal一个event值到对端,对端的wait操作接收到这个event时会返回一个确认给signal,这样保证在节点的进程间进行数据的同步操作。

12 相互关系与总结

在分布式训练过程中,深度学习训练框架不会去直接操作底层的通信网络,而是通过使用网络通信库来完成数据的集合通信,各家AI芯片加速卡厂家都会提供私有的网络通信库比如:xxx-AWARE OpenMPI或xCCL来完成这个底层通信硬件的屏蔽与抽象。在分布式训练集群里网络通信硬件连接样式多种多样,可以是Ethernet、InfiniBand 、RoCE v2/v1 等也可以是CXL、NVLINK等私有协议,这就要求在通信的后端层根据各个厂家的自己的SDK开发库接口,根据实际情况实现 各自的网络通信库,比如cuda-aware MPI、NCCL、NVSHMEM,以及根据实际的网络拓扑组合完成对应的最有效的网络拓扑算法。

本文讲述了分布式训练里的集合通信原语,这些原语是集合通信拓扑算法的基本组成单元,后续的文章里会讲述如何组合这些通信原语以完成合适的通信拓扑算法。

  • 只有Reduce相关的操作要做计算,其余操作都不涉及计算
  • Broadcast是针对单台机器对多台机器(1->N)
  • Gather是多台机器对单台机器(N->1)
  • All相关的操作是多台机器对多台(N->N)
  • All Reduce包括了All Gather的概念,即将加和(或者其他操作)后的数据再分发到各个设备上

Last 参考文献

  • Megatron + zero_我想静静,的博客-CSDN博客
  • Operations — NCCL 2.6.4 documentation
  • Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?-腾讯云开发者社区-腾讯云
  • 第3篇 - 分布式训练常用的集合通信及其通信原语 - 知乎

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

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

相关文章

全程Kali linux---CTFshow misc入门(38-50)

第三十八题: ctfshow{48b722b570c603ef58cc0b83bbf7680d} 第三十九题: 37换成1,36换成0,就得到长度为287的二进制字符串,因为不能被8整除所以,考虑每7位转换一个字符,得到flag。 ctfshow{5281…

计算机视觉的研究方向、发展历程、发展前景介绍

以下将分别从图像分类、目标检测、语义分割、图像分割(此处应主要指实例分割)四个方面,为你介绍研究生人工智能计算机视觉领域的应用方向、发展历程以及发展前景。 文章目录 1.图像分类应用方向发展历程发展前景 2.目标检测应用方向发展历程…

Android性能优化

Android性能优化 如何优化一个包含大量图片加载的Android应用,以提高性能和用户体验? 优化一个包含大量图片加载的Android应用,可以从以下几个方面入手,以提高性能和用户体验: 选择合适的图片加载库 使用成熟的图片…

C++Primer学习(2.2)

2.2 变量 变量提供一个具名的、可供程序操作的存储空间。C中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C程序员来说,“变量(variable)”和“对象(object)”一般可以互换使用。 术…

49-拓展(1)

49-拓展(1) 扩展概述 扩展可以为在当前 package 可见的类型(除函数、元组、接口)添加新功能。 当不能破坏被扩展类型的封装性,但希望添加额外的功能时,可以使用扩展。 可以添加的功能包括: …

Maven 安装配置(完整教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

25寒假周报1,2

cf是“可怜楼上月徘徊” PTA是“有心栽花花不开” 牛客是“独钓寒江雪” (补题链接) 周报一 复习了一下一些基础算法,高级算法没补到。 debug的时候思路一定要清晰,梳理枝节 周报二 做了线段树,莫队&#…

C++病毒

第一期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook; LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) {if (nCode HCBT_ACTI…

DeepSeek为何能爆火

摘要&#xff1a;近年来&#xff0c;DeepSeek作为一款新兴的社交媒体应用&#xff0c;迅速在年轻人群体中走红&#xff0c;引发了广泛关注。本文旨在探讨DeepSeek为何能在短时间内爆火&#xff0c;从而为我国社交媒体的发展提供参考。首先&#xff0c;通过文献分析&#xff0c;…

数据分析如何做EDA

探索性数据分析&#xff08;EDA&#xff0c;Exploratory Data Analysis&#xff09;是数据分析过程中至关重要的一步&#xff0c;其目的是通过统计和可视化技术对数据进行初步分析&#xff0c;从而揭示数据的潜在模式、特征和异常值&#xff0c;并为后续的数据预处理、特征工程…

Faveo Helpdesk存在目录遍历漏洞(CVE-2024-37700)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

NLP_[2]-认识文本预处理

文章目录 1 认识文本预处理1 文本预处理及其作用2. 文本预处理中包含的主要环节2.1 文本处理的基本方法2.2 文本张量表示方法2.3 文本语料的数据分析2.4 文本特征处理2.5数据增强方法2.6 重要说明 2 文本处理的基本方法1. 什么是分词2 什么是命名实体识别3 什么是词性标注 1 认…

Unity-Mirror网络框架-从入门到精通之Discovery示例

文章目录 前言Discovery示例NetworkDiscoveryNetworkDiscoveryHUDServerRequestServerResponse最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Un…

哈佛大学“零点项目”(Project Zero)简介

哈佛大学“零点项目”&#xff08;Project Zero&#xff09;简介 起源与背景 “零点项目”&#xff08;Project Zero&#xff09;由美国哲学家纳尔逊古德曼&#xff08;Nelson Goodman&#xff09;于1967年在哈佛大学教育研究院创立。名称源于“从零开始研究艺术教育”的理念&…

PostgreSQL 18新特性之DML语句RETURNING增强

PostgreSQL 很早就支持 DML 语句的 RETURNING 子句&#xff0c;用于返回插入、更正或者删除的数据。例如&#xff1a; CREATE TABLE t(id int, v numeric); INSERT INTO t(id, v) VALUES(1,1); INSERT INTO t(id, v) VALUES(2,5); INSERT INTO t(id, v) VALUES(3,10);UPDATE t…

【机器学习】数据预处理之scikit-learn的Scaler与自定义Scaler类进行数据归一化

scikit-learn的Scaler数据归一化 一、摘要二、训练数据集和测试数据集的归一化处理原则三、scikit-learn中的Scalar类及示例四、自定义StandardScaler类进行数据归一化处理五、小结 一、摘要 本文主要介绍了scikit-learn中Scaler的使用方法&#xff0c;特别强调了数据归一化在…

DeepSeek介绍,以及本地部署和API使用

认识大模型 决策式ai 通过数据作分析和预测 生成式ai 基于历史数据进行创造&#xff0c;生成全新的内容 推理模型创新 GPT的o1慢思考 成本极高&#xff0c;功能强大 模型参数量大&#xff0c;推理速度相对更慢&#xff0c;处理复杂问题时需要较长的时间 DeepSeek的r1深度思…

MySQL视图索引操作

创建学生表&#xff1b; mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-> Ssex char(2) check (Ssex男 or Ssex女) not null,-> Sage int not null,-> Sdept varchar(10) default 计算机 not …

知识库升级新思路:用生成式AI打造智能知识助手

在当今信息爆炸的时代&#xff0c;企业和组织面临着海量数据的处理和管理挑战。知识库管理系统&#xff08;Knowledge Base Management System, KBMS&#xff09;作为一种有效的信息管理工具&#xff0c;帮助企业存储、组织和检索知识。然而&#xff0c;传统的知识库系统往往依…