GPUDirect RDMA

英伟达文档

GPUDirect RDMA

GPUDirect RDMA 结合了 GPU 加速计算和 RDMA(Remote Direct Memory Access)技术,实现了在 GPU 和 RDMA 网络设备之间直接进行数据传输和通信的能力。它允许 GPU 直接访问 RDMA 网络设备中的数据,无需通过主机内存或 CPU 的中介。
GPUDirect RDMA 通过绕过主机内存和 CPU,直接在 GPU 和 RDMA 网络设备之间进行数据传输,显著降低传输延迟,加快数据交换速度,并可以减轻 CPU 负载,释放 CPU 的计算能力。另外,GPUDirect RDMA 技术允许 GPU 直接访问 RDMA 网络设备中的数据,避免了数据在主机内存中的复制,提高了数据传输的带宽利用率。

  • GPU 内存可以直接暴露给 RDMA 设备:InfiniBand 网卡可以直接读取或写入 GPU 内存,而无需经过 CPU 或主机内存中转。
  • GPU 可以间接访问其他节点的内存:虽然 GPU 本身不能直接访问远程内存,但通过 GPUDirect RDMA,InfiniBand 网卡可以直接将数据传输到远程节点的内存中(无论是 CPU 内存还是 GPU 内存)。
  • GPU 本身不能直接访问远程内存,但通过 GPUDirect RDMA,InfiniBand 网卡可以直接访问 GPU 内存,从而实现 GPU 与其他节点内存的高效通信。

GPUDirect RDMA使用的前置条件

  • GPU支持GPUDirect RDMA技术:Tesla与Quadro GPU 系列产品支持GPUDirect RDMA技术。
  • 网卡支持GPUDirect RDMA技术:InfiniBand 网卡支持 GPUDirect RDMA 技术,例如 Mellanox 的 ConnectX 系列产品。
  • 操作系统支持:Linux 操作系统需要安装 NVIDIA 和 Mellanox 的驱动程序。
  • PCIe 拓扑结构:GPU 和 InfiniBand 网卡需要通过 PCIe 总线连接。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #通过此命令查看GPUDirect RDMA支持的拓扑结构信息:GPU不在NUMA内,但是优先使用NUMA Affinity对应的node0/1的内存
    nvidia-smi topo -m
    GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 NIC0 NIC1 NIC2 CPU Affinity NUMA Affinity GPU NUMA ID
    GPU0 X PIX PXB PXB SYS SYS SYS SYS NODE NODE PXB 0-31 0 N/A
    GPU1 PIX X PXB PXB SYS SYS SYS SYS NODE NODE PXB 0-31 0 N/A
    GPU2 PXB PXB X PXB SYS SYS SYS SYS NODE NODE PXB 0-31 0 N/A
    GPU3 PXB PXB PXB X SYS SYS SYS SYS NODE NODE PIX 0-31 0 N/A
    GPU4 SYS SYS SYS SYS X PIX PXB PXB SYS SYS SYS 32-63 1 N/A
    GPU5 SYS SYS SYS SYS PIX X PXB PXB SYS SYS SYS 32-63 1 N/A
    GPU6 SYS SYS SYS SYS PXB PXB X PXB SYS SYS SYS 32-63 1 N/A
    GPU7 SYS SYS SYS SYS PXB PXB PXB X SYS SYS SYS 32-63 1 N/A
    NIC0 NODE NODE NODE NODE SYS SYS SYS SYS X PIX NODE
    NIC1 NODE NODE NODE NODE SYS SYS SYS SYS PIX X NODE
    NIC2 PXB PXB PXB PIX SYS SYS SYS SYS NODE NODE X

    Legend:
    # 设备自身
    X = Self
    # 跨 NUMA 节点的设备之间,通信路径较长,可能涉及 CPU 和高速互联(如 Intel 的 QPI 或 AMD 的 UPI)
    SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
    # PCIe 以及 同一 NUMA 节点内 PCIe 主机桥(PHB)之间的互连,同一 NUMA 节点内的设备之间,通信路径较短,性能优于 SYS
    NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
    # 通过 PCIe 以及 一个 PCIe 主机桥(PHB)
    PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
    # 通过 多个 PCIe 桥,但 不经过 PCIe 主机桥(PHB)
    PXB = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
    # 连接最多通过 一个 PCIe 桥,性能最佳,因为通信路径最短
    PIX = Connection traversing at most a single PCIe bridge
    # 通过 一组绑定的 NVLink,“#”表示绑定的 NVLink 数量
    NV# = Connection traversing a bonded set of # NVLinks

    NIC Legend:

    NIC0: mlx5_0
    NIC1: mlx5_1
    NIC2: mlx5_2

NUMA:非一致性内存访问,是一种内存访问技术,允许不同处理器核心或处理器模块直接访问物理内存的不同部分。在多核处理器或多处理器系统中,NUMA架构旨在减少跨处理器核心的内存访问延迟,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#查看CPU和NUMA的对应关系
~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 1
Core(s) per socket: 24
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 106
Model name: Intel(R) Xeon(R) Gold 5318Y CPU @ 2.10GHz
Stepping: 6
CPU MHz: 2101.000
CPU max MHz: 2101.0000
CPU min MHz: 800.0000
BogoMIPS: 4200.00
Virtualization: VT-x
L1d cache: 48K
L1i cache: 32K
L2 cache: 1280K
L3 cache: 36864K
NUMA node0 CPU(s): 0-23
NUMA node1 CPU(s): 24-47

#查看内存与NUMA的对应关系
~]# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
node 0 size: 257434 MB
node 0 free: 201543 MB
node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
node 1 size: 258027 MB
node 1 free: 213800 MB
node distances:
node 0 1
0: 10 20 #表示从node0访问node1的延迟为20
1: 20 10

开启GPUDirect RDMA

  • Mellanox OFED( InfiniBand驱动和软件栈)
  • 安装GPU驱动程序、cuda工具包
  • 内核模块:nvidia_peermem(较新的驱动)、nv_peer_memory (较旧的驱动)

注意:要先安装 Mellanox OFED,再安装驱动和cuda工具包,最后加载模块。确保使用 MLNX_OFED 提供的 RDMA API 进行编译。

1
2
3
4
5
6
7
8
# 加载模块
modprobe nvidia_peermem
# 检查加载是否成功
lsmod | grep nvidia_peermem
# 持久化加载,如果没有/etc/modules文件,在/etc/modprobe.d/目录下创建一个新的.conf文件,然后在该文件中添加你的模块名“Mydriver”。
echo "nvidia_peermem" | sudo tee -a /etc/modules
# 验证 GPUDirect RDMA,检查 gpu_direct_rdma 字段是否为1
ibv_devinfo -v