GPU通信优化大突破!NCCL性能内幕全公开!
高效的 GPU 间通信对于分布式人工智能和高性能计算至关重要。英伟达集体通信库(NCCL)是业界广泛采用的库,专门针对 GPU 间的交互进行了优化,可扩展性强。与 MPI 等通用消息传递框架不同,NCCL 利用 NVLink、PCIe 和 InfiniBand 等互连技术,实现高带宽和低延迟。
新媒网了解到,尽管 NCCL 对大规模 GPU 系统至关重要且已开源,但其内部机制的文档记录仍然不够充分。官方 API 文档虽详尽,但在拓扑构建、算法选择、流水线操作以及跨节点和设备的缓冲区管理等关键方面,缺乏清晰的描述。这种透明度的缺乏,使得系统研究人员、网络架构师和性能工程师难以在新硬件和大规模场景下优化或预测 NCCL 的性能。
本文对 NCCL 的内部架构进行了全面且系统的探索,重点关注 API 结构、通信通道管理、通信协议(Simple、LL、LL128)以及数据传输模型和集体通信算法。通过阐明 NCCL 的内部设计原则,为以 GPU 为中心的高性能计算环境,提供更明智的优化决策依据。
NCCL 专为 GPU 集群提供高度优化的集体通信操作,重点关注低延迟和高带宽。其核心在于通过清晰高效的 API 管理 GPU 间通信,API 抽象了复杂的技术细节,主要为用户提供四类函数:通信器管理、集体通信、点对点通信和组调用。
NCCL 支持三种常见的执行模型,在多个 GPU 上启动操作,每种方法都有不同的侧重。这三种模型分别是:每个 GPU 一个 CPU 进程、每个 GPU 一个 CPU 线程和多个 GPU 一个 CPU 线程。
NCCL 通过三个硬件组件协调通信:GPU、CPU 和网络接口。GPU 执行归约并在缓冲区之间移动数据,CPU 启动内核并管理主机端协调,网卡跨节点传输数据包。为避免瓶颈,NCCL 将每个集体操作细分为通信通道。每个通道作为单独的 CUDA 块启动,并在其自己的 SM 上运行。
NCCL 中的通道管理在通信器级别进行协调,其中每个 GPU 会获得一个介于 0 到 n-1 之间的唯一 rank,n 为参与该通信器的 GPU 总数。在通信器初始化期间,NCCL 会建立一组初始的通道结构,其总数主要由系统拓扑和架构默认值决定。在调用集体操作时,NCCL 为该特定任务动态选择算法和协议。分配给每个通道的逻辑通信拓扑直接决定了每个操作期间 GPU 间的数据流向。
NCCL 采用多种通信协议来优化集体操作期间的数据传输效率。Simple、LL(低延迟)和 LL128 这三种协议旨在实现带宽和延迟之间的不同权衡。
Simple 协议旨在最大化带宽利用率,用于大消息传输。它通过将数据分成相对较大的块,并在通信通道间分发来操作。为保持内存一致性,该协议使用内存屏障来强制数据的正确排序和可见性。
LL 协议针对带宽通常未被充分利用的小消息大小进行了优化。LL 协议不依赖内存屏障,而是使用轻量级的基于标志的同步。
LL128 协议在 LL 的基础上进行了改进,保留了其低延迟特性,同时显著提高了带宽效率,特别是在 NVLink 等高性能互连上。与 LL 一样,它使用基于标志的同步来消除内存屏障,但它以 128 字节为单位传输数据,而不是 8 字节。然而,LL128 有更严格的硬件要求,依赖于 128 字节的原子写入,内存系统或互连不得拆分或重新排序这些写入。
新媒网跨境获悉,NCCL 在运行时,会根据用户设置、集体算法和内部性能,在 Simple、LL 和 LL128 协议之间进行动态选择。
高效的数据移动是 NCCL 通信性能的核心,尤其在多 GPU 和多节点环境中。
NCCL 根据通信是发生在单个节点内(节点内)还是多个节点间(节点间),采用不同的数据传输策略和传输机制。每种传输方式都针对特定的硬件和互连类型进行了优化,以支持可扩展的集合通信。
NCCL 采用复杂的分层方法进行节点内通信,优先选择同一物理机器上 GPU 之间可用的最低延迟和最高带宽路径。该策略大量利用英伟达的 GPUDirect Peer-to-Peer(P2P)技术,该技术使 GPU 能够直接访问彼此的内存,而无需通过 CPU 系统内存中转。
NCCL 的 P2P 传输中的一个关键优化是 P2P_DIRECT 模式,当通信的进程属于同一进程时启用。单进程和多进程通信都利用 GPU 到 GPU 的传输而无需 CPU 参与,P2P_DIRECT 模式通过两种方式显著提高效率。首先,它通过在同一地址空间中使用直接的 GPU 内存指针,绕过了对 IPC(进程间通信)句柄的需求。更重要的是,它通过使用 directSend 和 directRecv 等原语消除了中间数据复制,这些原语直接在源缓冲区和目标缓冲区之间传输数据,而不是通过中间的 FIFO(先进先出)缓冲区路由。
NCCL 不仅在直接的 GPU 到 GPU P2P 通信不可用时,而且在 P2P 不是最优选择时,可能会利用共享内存(SHM)传输方式。SHM 通过将流量路由到系统内存来避免这种情况,使用 PCIe 到内存和内存到 PCIe 的传输,而 CPU 通常对这些传输的处理进行了更好的优化。
NCCL 中的节点间通信协调位于不同物理节点上的 GPU 之间的数据交换。此过程涉及执行 NCCL 内核的 GPU、在 CPU 上运行以管理网络操作的代理线程,以及底层网络结构。NCCL 根据可用硬件在两种主要网络传输方式之间进行选择,即标准的 TCP Socket(套接字)传输方式或高性能的 InfiniBand(IB,无限带宽)Verbs 传输方式。
当网络接口不支持 RDMA(远程直接内存访问)时,NCCL 采用套接字传输方式。在这种模式下,中间缓冲区被分配为主机内存中的 CUDA 固定内存。在发送端,数据从 GPU 复制到该缓冲区,然后使用标准的套接字调用通过网络发送。在接收端,数据被接收到主机缓冲区中,然后复制到 GPU。
对于诸如 InfiniBand 或 RoCE(基于融合以太网的 RDMA)之类的高性能网络,NCCL 使用 IB 传输方式。IB 传输方式利用 RDMA 能力,以最小的 CPU 干预实现节点之间的直接数据移动。与套接字传输方式一样,所有传输都通过中间缓冲区中转,但该缓冲区的位置取决于硬件支持和配置。
IB 传输方式中的一个关键优化是 GPUDirect RDMA(GDRDMA),它使 NIC 能够直接访问 GPU 内存,消除了对主机内存中转的需求。GDRDMA 仅在 NIC 和 GPU 都连接到同一个 PCIe 交换机时使用。
作为提高带宽利用率和减少拥塞的优化措施,IB 传输方式默认情况下为每个远程 GPU 和每个 NIC 实例化 2 个逻辑通道。每个逻辑通道维护自己的 ncclIbSendComm 结构,嵌入独立的 InfiniBand QP(队列对)束。
新媒网跨境了解到,当启用 GPUDirect RDMA 时,发送方必须确保所有未完成的 PCIe 写操作在核(kernel)使用数据之前到达 GPU 内存。NCCL 通过在最后一次接收完成后发出一个 dummy(虚拟的)RDMA_READ 来实现这一点。
集合通信算法是 NCCL 的核心,它支持 GPU 之间高效、同步的通信。这些算法管理数据移动和依赖关系,优化通信路径,并能随 GPU 数量增加而扩展。NCCL 通过将每个集合通信操作分解为低级通信原语,并将其分布到多个并行通道来实现这些算法。算法的选择,通常是环形或树形,取决于具体的集合操作以及相关的执行参数,如消息大小和拓扑结构。
NVLS 和 CollNet 是主要为优化 AllReduce 性能而设计的专门算法,其中 NVLS 还通过利用特定硬件能力支持 ReduceScatter 和 AllGather。CollNet 算法适用于网络基础设施本身可以参与集合操作的场景,例如使用 NVIDIA SHARP(可扩展分层聚合和归约协议)技术,允许将归约或其他部分集合计算卸载到网络交换机,从而减少数据移动和延迟。
CollNet 算法利用 NVIDIA SHARP 技术进行网络辅助的集合操作。CollNet Direct 支持节点内的全对全通信。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。

评论(0)