随着深度学习的发展,从单机单卡,升级到单机多卡和多机多卡,这一进化的必然性由大模型参数逐渐增大导致.GPU 之间是如何通信的呢?

Background: PCIe

在计算机中,CPU 与 GPU 之间通过 PCIe 链接和传输数据.PCIe 的特点是点对点、独立通道,每个通道可以同时进行双向通信,支持多通道拓展.且串行总线效率比并行总线更高.

PCIe

GT/s 表示 Giga-Transfers per second,只描述物理层信号的传输速率;GB/s 表示 Giga-Bytes per second,我们真正需要的实际有效带宽

Channel Width (Bytes/Transfer) ×\times transfer/second (GT/s) = GB/s

单机多卡

在单机多卡的场景下,我们想要将数据从 GPU0 搬运到 GPU1 上,传统方法需要经过 CPU 中转:即先把数据从 GPU0 复制到 CPU RAM,再把数据从 CPU RAM 上复制到 GPU1 上.

那么能不能去掉 CPU 这个环节进行加速呢?可以,一般来说,有两种方法:

  1. DMA (Direct Memory Access). CPU 和 GPU 之间可以直接传输,无需 CPU 干涉,但仍然需要 RAM
  2. Peer-to-Peer (P2P). 这个方法连 CPU RAM 都不需要了,可以直接在 GPU 之间通过 PCIe 互传,但是需要 GPU 支持.

PCIe Switch

先前提到过 PCIe 是独立通道.随着 GPU 增多,通道数量可能不够.我们可以通过 PCIe Switch 对 GPU 进行管理,形成树状结构,像网络路由器那样.

PCIe 一个重要功能是支持对等通信.例如说,Dev0 -> Dev1 进行传输时无需先传输到 CPU Root,而是可以直接通过 PCIe Switch 进行传输.

多 CPU

Tips: 如何查看机器上 GPU 之间的互联结构

可以运行

1
nvidia-smi topo -m

CPU 共享内存与总线

通常被叫作 SMP (Symmetric Multi-Processor) 或者 UMA (Uniform Memory Access)

因为共享内存,耗时较少但是拓展性差.

CPU 不共享内存与总线

通常被叫作 AMP (Asymmetric Multi-Processor) 或者 NUMA (Non-Uniform Memory Access)

一个 CPU 通过 PCIe Switch 管理的 GPUs 会分成若干个 NUMA 节点.跨 NUMA 节点(跨 CPU)有较大开销,但是拓展性好,可以将进程绑定 (pinning) 到 CPU 核心上做局部优化.

NVIDIA 专用互联技术,实现 GPU 之间、GPU 与 CPU 之间的点对点通信.


跨机器通信(多机)

需要通过 NIC (Network Interface Card) 进行通信.传统方案,由于数据需要以特定格式封装和处理,所以需要先经由 CPU 处理.传统流程包括

  1. 数据传输到 CPU
  2. CPU 进行协议栈处理
  3. CPU 将处理好的数据传输到 NIC
  4. NIC 通过网络传输到 Target NIC
  5. Target NIC 传输到 Target CPU
  6. Target CPU 进行数据处理
  7. Target CPU 将数据传输到 Target GPU

RNIC (RDMA NIC)

上面的流程中,我们发现一个可以优化的点在于我们需要用 CPU 进行协议栈处理导致必须发生 GPU -> CPU 数据传输.

RNIC 就是支持 RDMA 的 NIC,也被称为 HCA (Host Channel Adaptor).协议栈逻辑执行是在 RNIC 上的,而不是 CPU 的内核协议栈,所以可以无需经过 CPU.

RDMA (Remote DMA):无需双方操作系统接入的 DMA

所以优化后的流程为:

  1. 数据直传到 RNIC
  2. RNIC 处理数据
  3. RNIC 通过网络传输到 Target RNIC
  4. Target RNIC 处理数据
  5. Target RNIC 将数据传输到 Target GPU 上

RDMA 实现方式一:InfiniBand

RDMA 实现方式二:RoCEv1

RDMA 实现方式三:RoCEv2

RDMA 实现方式四:iWARP