随着深度学习的发展,从单机单卡,升级到单机多卡和多机多卡,这一进化的必然性由大模型参数逐渐增大导致.GPU 之间是如何通信的呢?
Background: PCIe
在计算机中,CPU 与 GPU 之间通过 PCIe 链接和传输数据.PCIe 的特点是点对点、独立通道,每个通道可以同时进行双向通信,支持多通道拓展.且串行总线效率比并行总线更高.

GT/s表示 Giga-Transfers per second,只描述物理层信号的传输速率;GB/s表示 Giga-Bytes per second,我们真正需要的实际有效带宽Channel Width (
Bytes/Transfer) transfer/second (GT/s) =GB/s
单机多卡
在单机多卡的场景下,我们想要将数据从 GPU0 搬运到 GPU1 上,传统方法需要经过 CPU 中转:即先把数据从 GPU0 复制到 CPU RAM,再把数据从 CPU RAM 上复制到 GPU1 上.
那么能不能去掉 CPU 这个环节进行加速呢?可以,一般来说,有两种方法:
- DMA (Direct Memory Access). CPU 和 GPU 之间可以直接传输,无需 CPU 干涉,但仍然需要 RAM
- 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 核心上做局部优化.
NVLink, NVSwitch, GPUDirect P2P
NVIDIA 专用互联技术,实现 GPU 之间、GPU 与 CPU 之间的点对点通信.
跨机器通信(多机)
需要通过 NIC (Network Interface Card) 进行通信.传统方案,由于数据需要以特定格式封装和处理,所以需要先经由 CPU 处理.传统流程包括
- 数据传输到 CPU
- CPU 进行协议栈处理
- CPU 将处理好的数据传输到 NIC
- NIC 通过网络传输到 Target NIC
- Target NIC 传输到 Target CPU
- Target CPU 进行数据处理
- Target CPU 将数据传输到 Target GPU
RNIC (RDMA NIC)
上面的流程中,我们发现一个可以优化的点在于我们需要用 CPU 进行协议栈处理导致必须发生 GPU -> CPU 数据传输.
RNIC 就是支持 RDMA 的 NIC,也被称为 HCA (Host Channel Adaptor).协议栈逻辑执行是在 RNIC 上的,而不是 CPU 的内核协议栈,所以可以无需经过 CPU.
RDMA (Remote DMA):无需双方操作系统接入的 DMA
所以优化后的流程为:
- 数据直传到 RNIC
- RNIC 处理数据
- RNIC 通过网络传输到 Target RNIC
- Target RNIC 处理数据
- Target RNIC 将数据传输到 Target GPU 上