背景
NCCL上承CUDA程序,下启RDMA(不一定是rdma)通信,来提供GPU到GPU的集合通信,从而加速GPU间通信。
关键信息
- NVIDIA Collective Communications Library(NCCL,发音为“Nickel”)是一个库,提供拓扑感知的 GPU 间通信基元
- 它不是一个成熟的并行编程框架;相反,它是一个专注于加速 GPU 间通信的库。
- 五种集合通信原语
- AllReduce 全部减少(规约)
- Broadcast 广播
- Reduce 减少
- AllGather 全聚集
- ReduceScatter 减少散射
- 什么是“local reductions” ?在并行计算和分布式系统中,“local reductions” 是指的是在每个计算节点(或设备)内部对数据进行的归约操作。归约操作(reduction)是一种常见的并行计算模式,用于对一组数据执行某种操作(如求和、求最大值、求最小值等),并将结果归约为一个单一的值或一组值。每个设备(例如 GPU)内部独立完成的归约操作,而不是跨设备的全局归约操作。部归约是并行计算中常见的优化手段,可以减少通信开销,提高整体计算效率
- 集合通信的关键要素:通信处理器之间的紧密同步。通过 CUDA 内存复制和 CUDA 内核组合来实现,以实现局部归约。另一方面,NCCL 在单个内核中实现每个集合,同时处理通信和计算。并听过快速同步,最大限度地减少达到峰值带宽所需的资源。
- NCCL 在节点内和节点之间为多个 GPU 提供快速集合。它支持各种互连技术,包括 PCIe、NVLINK、InfiniBand Verbs 和 IP 套接字。
- NCCL 紧跟 MPI(消息传递接口)定义的流行集合 API。因此,任何熟悉 MPI 的人都会发现 NCCL 的 API 使用起来非常自然。
- NCCL 是一个通信库,为高性能应用程序提供优化的 GPU 到 GPU 通信。它不像 MPI 那样提供包括进程启动器和管理器的并行环境。因此,NCCL 依赖于应用程序的进程管理系统和 CPU 端通信系统来获得自己的引导程序。
- NCCL 不在 GPU 之间提供安全的网络通信。
几种集合通信源语
Reduce 归约
(这里归约不一定准确 大概表达归一和约的意思,约在小学学习是“压榨掉共同的部分”,比如公约数)
Reduce作执行与 AllReduce 相同的操作(操作是跨设备对数据(例如 sum、min、max)执行归约),但仅将结果存储在指定根排名的接收缓冲区中。
Reduce 后,在进行 Broadcast 等同于 AllReduce
root 参数是等级之一(不是设备编号),因此会受到不同等级到设备映射的影响。
AllReduce 全归约
AllReduce操作是跨设备对数据(例如 sum、min、max)执行缩减,并将结果存储在每个排名的接收缓冲区中。
在 k 个等级之间的 sum allreduce作中,每个等级将提供一个包含 N 个值的数组,并在 N 个值的数组中接收相同的结果,其中 out[i] = in0[i]+in1[i]+…+in(k-1)[i]
Broadcast 广播
Broadcast作将 N 元素缓冲区从根 rank 复制到所有 rank。
AllGather 全聚合
AllGather作将 k 个排名中的 N 个值收集到大小为 k*N 的输出缓冲区中,并将该结果分发到所有rank。输出按 rank 索引排序。因此,AllGather会受到不同等级到设备映射的影响。
ReduceScatter 归约散射
ReduceScatter作执行与 Reduce 相同的作,不同之处在于结果分散在等级之间大小相等的块中,每个等级根据其等级索引获取一个数据块。
这里有点类似将所有的Reduce之后根据等级拆开 scatter到不同的rank上。
ReduceScatter作受不同等级到设备映射的影响,因为等级决定了数据布局。
综述:
- reduce就是把所有的都归约起来,放到某个里面。他是其他操作的根本。allreduce是指归约到某个里面后,然后散射到其他所有gpu。 boardcast不错归约这种算法类的操作,仅仅是“阳光普照”。 ruduce是众人拾柴火焰高。 allreduce是众人拾柴然后阳光普照。
- AllGather和ReduceScatter强调的是根据排名仅仅取一部分来做操作。和Linux内存的scatter gather类似。都是对整体一个拆散或者聚合成一个整理。操作单元最大是1个单元。 将每个rank的0.x单元放在一起叫allgather,注意是每个。 将某个单元的分成0.x个小单元放入每个rank叫做allscatter
- reduce是把大家各自的饼放在一起(归)做压缩饼干(约)。allreduce是压缩后再clone给其他(比copy更贴切)。all都用reduce的东西。boardcast是iclone。
- gather和scatter中gather是每个人拿出一点饼凑成一个饼(gather)然后clone给每个人;scatter是把每个人的饼拆成有序的多个,然后分别给大家。每个GPU只拿自己序号的,然后合在一起。也可以理解是allreduce的一部分。每个人拿对应rank序号的一部分。
- Reduce当做一种核心操作。allreduce是reduct后然后all。 allgather类似是gather之后给all。 reducescatter是reduce后scatter
参考链接:
nccl官网介绍:https://developer.nvidia.com/nccl
Overview of NCCL