NCCL 概述¶
NVIDIA 集合通信库 (NCCL,发音为 “Nickel”) 是一个库,提供拓扑感知的 GPU 间通信原语,可以轻松集成到应用程序中。
NCCL 实现了集合通信和点对点发送/接收原语。它不是一个功能完善的并行编程框架;而是一个专注于加速 GPU 间通信的库。
NCCL 提供了以下集合通信原语
- AllReduce(全归约)
- Broadcast(广播)
- Reduce(归约)
- AllGather(全收集)
- ReduceScatter(分散归约)
此外,它还允许点对点发送/接收通信,从而实现 scatter、gather 或 all-to-all 操作。
通信处理器之间的紧密同步是集合通信的关键方面。基于 CUDA 的集合通常通过 CUDA 内存复制操作和 CUDA 内核进行本地归约来实现。另一方面,NCCL 在单个内核中实现每个集合,处理通信和计算操作。这可以实现快速同步,并最大限度地减少达到峰值带宽所需的资源。
NCCL 方便地消除了开发人员针对特定机器优化其应用程序的需求。NCCL 在单个和跨节点的多个 GPU 上提供快速集合通信。它支持多种互连技术,包括 PCIe、NVLINK、InfiniBand Verbs 和 IP 套接字。
除了性能之外,易于编程是 NCCL 设计中的首要考虑因素。NCCL 使用简单的 C API,可以从各种编程语言轻松访问。NCCL 密切遵循 MPI(消息传递接口)定义的流行的集合 API。因此,任何熟悉 MPI 的人都会发现 NCCL 的 API 非常自然易用。与 MPI 略有不同的是,NCCL 集合采用 “stream” 参数,该参数提供与 CUDA 编程模型的直接集成。最后,NCCL 几乎与任何多 GPU 并行化模型兼容,例如
- 单线程控制所有 GPU
- 多线程,例如,每个 GPU 使用一个线程
- 多进程,例如,MPI
NCCL 已在深度学习框架中得到广泛应用,其中 AllReduce 集合大量用于神经网络训练。通过 NCCL 提供的多 GPU 和多节点通信,可以实现神经网络训练的有效扩展。