GPU 亲和性

Affinity

亲和性(Affinity)指硬件之间的物理距离远近。距离越近,通信延迟越低、带宽越高。

$ nvidia-smi topo -m
        GPU0    GPU1    GPU2    GPU3    GPU4    GPU5    GPU6    GPU7    NIC0    NIC1    NIC2NIC3     NIC4    NIC5    NIC6    NIC7    NIC8    CPU Affinity    NUMA Affinity   GPU NUMA ID
GPU0     X      NV8     NV8     NV8     NV8     NV8     NV8     NV8     NODE    PXB     PXB NODE     NODE    SYS     SYS     SYS     SYS     0-31,64-95      0               N/A
GPU1    NV8      X      NV8     NV8     NV8     NV8     NV8     NV8     NODE    PXB     PXB NODE     NODE    SYS     SYS     SYS     SYS     0-31,64-95      0               N/A
GPU2    NV8     NV8      X      NV8     NV8     NV8     NV8     NV8     NODE    NODE    NODEPXB      PXB     SYS     SYS     SYS     SYS     0-31,64-95      0               N/A
GPU3    NV8     NV8     NV8      X      NV8     NV8     NV8     NV8     NODE    NODE    NODEPXB      PXB     SYS     SYS     SYS     SYS     0-31,64-95      0               N/A
GPU4    NV8     NV8     NV8     NV8      X      NV8     NV8     NV8     SYS     SYS     SYS SYS      SYS     PXB     PXB     NODE    NODE    32-63,96-127    1               N/A
GPU5    NV8     NV8     NV8     NV8     NV8      X      NV8     NV8     SYS     SYS     SYS SYS      SYS     PXB     PXB     NODE    NODE    32-63,96-127    1               N/A
GPU6    NV8     NV8     NV8     NV8     NV8     NV8      X      NV8     SYS     SYS     SYS SYS      SYS     NODE    NODE    PXB     PXB     32-63,96-127    1               N/A
GPU7    NV8     NV8     NV8     NV8     NV8     NV8     NV8      X      SYS     SYS     SYS SYS      SYS     NODE    NODE    PXB     PXB     32-63,96-127    1               N/A
NIC0    NODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS      X      NODE    NODENODE     NODE    SYS     SYS     SYS     SYS
NIC1    PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYS     NODE     X      PIX NODE     NODE    SYS     SYS     SYS     SYS
NIC2    PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYS     NODE    PIX      X  NODE     NODE    SYS     SYS     SYS     SYS
NIC3    NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYS     NODE    NODE    NODE X       PIX     SYS     SYS     SYS     SYS
NIC4    NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYS     NODE    NODE    NODEPIX       X      SYS     SYS     SYS     SYS
NIC5    SYS     SYS     SYS     SYS     PXB     PXB     NODE    NODE    SYS     SYS     SYS SYS      SYS      X      PIX     NODE    NODE
NIC6    SYS     SYS     SYS     SYS     PXB     PXB     NODE    NODE    SYS     SYS     SYS SYS      SYS     PIX      X      NODE    NODE
NIC7    SYS     SYS     SYS     SYS     NODE    NODE    PXB     PXB     SYS     SYS     SYS SYS      SYS     NODE    NODE     X      PIX
NIC8    SYS     SYS     SYS     SYS     NODE    NODE    PXB     PXB     SYS     SYS     SYS SYS      SYS     NODE    NODE    PIX      X

Legend:

  X    = Self
  SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
  PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
  PIX  = Connection traversing at most a single PCIe bridge
  NV#  = Connection traversing a bonded set of # NVLinks

NIC Legend:

  NIC0: mlx5_0
  NIC1: mlx5_1
  NIC2: mlx5_2
  NIC3: mlx5_3
  NIC4: mlx5_4
  NIC5: mlx5_5
  NIC6: mlx5_6
  NIC7: mlx5_7
  NIC8: mlx5_8

连接类型含义:

标识 含义 延迟
PIX 同一 PCIe 交换机 最低
PXB 跨 PCIe 桥,但同一 CPU
NODE 同一 NUMA 节点,走 CPU
SYS 跨 NUMA 节点,走 QPI/UPI

示意图:

graph LR subgraph NUMA0["NUMA 0 (CPU0)"] direction TB NIC1 ---|PCIe| GPU0 NIC2 ---|PCIe| GPU1 end subgraph NUMA1["NUMA 1 (CPU1)"] direction TB NIC5 ---|PCIe| GPU4 NIC6 ---|PCIe| GPU5 end NUMA0 ===|"QPI/UPI"| NUMA1

GPU0 发数据到其他节点时:

  • 走 NIC1(PXB 亲和):数据直接通过 PCIe 到网卡,一跳完成
  • 走 NIC5(SYS 不亲和):数据要先跨 QPI 到 CPU1,再到 NIC5,多一跳,延迟翻倍

所以 NCCL 会自动选择亲和的网卡,确保每个 GPU 用距离最近的网卡通信。

NUMA

NUMA(Non-Uniform Memory Access,非一致性内存访问)是多路 CPU 服务器的内存架构。

核心概念:每个 CPU 有自己的"本地内存",访问远端内存更慢。

访问延迟对比:

访问类型 延迟 带宽
CPU0 → 本地内存 ~80ns 满速
CPU0 → 远端内存(跨 NUMA) ~140ns 降一半

实际影响:

# 查看 NUMA 拓扑
numactl -H

# 绑定进程到 NUMA 0,避免跨节点访问
numactl --cpunodebind=0 --membind=0 ./train.py

PyTorch 分布式训练时,如果 GPU0 的数据被分配到 NUMA 1 的内存上,每次数据搬运都要跨
QPI,性能会下降。所以大规模训练需要注意 NUMA 亲和性绑定。

posted @ 2026-02-04 00:30  Undefined443  阅读(2)  评论(0)    收藏  举报