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 亲和性绑定。

浙公网安备 33010602011771号