多 GPU 拓扑简单教程
多 GPU 拓扑简短笔记
在多 GPU 服务器上,显卡数量多并不一定代表多卡训练效率就高。实际使用中,经常会遇到这样的情况:同样是三卡或四卡服务器,有的双卡训练很快,有的四卡训练反而加速不明显;有的显卡虽然都能被系统识别,但 GPU 之间通信路径很远,甚至不支持 P2P。
因此,在判断一台服务器是否适合多卡训练时,不能只看“有几张 GPU”,还要看 GPU 之间的拓扑关系、CPU/NUMA 归属,以及是否存在 NVLink、PCIe switch 或跨 CPU 通信问题。下面基于几台真机的 nvidia-smi topo -m 输出,简单总结多 GPU 拓扑的判断方法和使用建议。
看多卡服务器时,主要看两类命令:
nvidia-smi topo -m
nvidia-smi topo -p2p r
nvidia-smi topo -p2p w
大致关系可以这样理解:
NVLink > PIX > PXB > PHB > NODE > SYS
近/快 远/慢
其中:
NV# = 有 NVLink
PXB = 经过 PCIe bridge / PCIe switch,比较近
NODE = 同一个 NUMA / CPU 侧,但不是特别近
SYS = 跨系统路径,通常较远
CNS = Chipset not supported,芯片组不支持 GPU P2P
真机例子 1:xmuserver1,三张 RTX 5090
拓扑:
GPU0 <-> GPU1 = NODE
GPU0 <-> GPU2 = SYS
GPU1 <-> GPU2 = SYS
GPU0、GPU1:NUMA 0
GPU2:NUMA 1
分析:
GPU0 和 GPU1 是一组,适合双卡训练;
GPU2 挂在另一颗 CPU/NUMA 侧,和前两张通信要跨 CPU。
推荐:
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node=2 train.py
如果三卡都跑也可以,但 GPU2 会拖一点通信效率。
真机例子 2:PR4910W,四卡服务器
拓扑:
GPU0 <-> GPU1 = PXB
GPU2 <-> GPU3 = PXB
GPU0/1 <-> GPU2/3 = SYS
分析:
GPU0、GPU1 是一组;
GPU2、GPU3 是一组;
两组之间跨 CPU/系统路径。
注意:
PXB 不是 NVLink。
如果有 NVLink,表里会显示 NV1 / NV2 / NV#。
推荐用法:
CUDA_VISIBLE_DEVICES=0,1
或者:
CUDA_VISIBLE_DEVICES=2,3
这台比 NODE 那种更适合双卡训练,因为组内是 PXB。
真机例子 3:scsc-server,双 CPU 四卡,全是 SYS
拓扑:
GPU0-GPU1-GPU2-GPU3 之间全部是 SYS
CPU 信息:
Socket(s): 2
NUMA node(s): 2
Core(s) per socket: 16
Thread(s) per core: 2
分析:
它不是四个 CPU,而是两颗 CPU、两个 NUMA。
但是四张 GPU 没有形成比较近的 PCIe 组合,所以全部显示 SYS。
这类机器可能是比较老的 Sky Lake-E / C621 平台,或者 GPU 分散挂在不同 PCIe root / bridge 下。
适合:
单卡任务
多张卡分别跑不同任务
不太适合:
高效率四卡 DDP
大模型 tensor parallel
频繁 GPU-GPU 通信任务
真机例子 4:gxs@ubuntu,单 CPU 三卡,全是 SYS + CNS
CPU 信息:
Socket(s): 1
NUMA node(s): 1
Core(s) per socket: 32
Thread(s) per core: 2
拓扑:
GPU0-GPU1-GPU2 全部是 SYS
P2P 检查:
GPU0 <-> GPU1 = CNS
GPU0 <-> GPU2 = CNS
GPU1 <-> GPU2 = CNS
分析:
这台不是双 CPU 问题,因为它只有一颗 CPU、一个 NUMA。
真正的问题是芯片组 / 主板 / PCIe 拓扑不支持 GPU P2P。
CNS = Chipset not supported,说明 GPU 之间不能很好地直接互相读写显存。
适合:
单卡训练
三张卡分别跑三个任务
不适合:
三卡 DDP
模型并行
大模型多卡切分
最后总结
PXB/NODE/SYS 不是软件随便调出来的,主要由主板、PCIe 插槽、riser、PCIe switch、CPU/NUMA 拓扑决定。
最推荐的判断方式:
nvidia-smi topo -m
nvidia-smi topo -p2p r
nvidia-smi topo -p2p w
lscpu | egrep "Socket|NUMA|CPU\\(s\\)|Core|Thread"
实际使用上:
PXB / PIX / NVLink:适合多卡训练
NODE:可以双卡训练,优先同组
SYS:多卡通信较差
CNS / NS:P2P 不支持,多卡训练更吃亏
优先策略:
有 PXB 就用 PXB 的一组;
没有 PXB 就用同 NUMA 的一组;
全是 SYS / CNS,就尽量单卡跑,或者多卡分别跑不同任务。

浙公网安备 33010602011771号