gpu驱动持久化及nvlink检查

GPU内存常驻
使用root用户或sudo权限运行以下命令来设置GPU驱动的内存常驻模式:nvidia-smi -pm 1
需要注意的是,启用GPU驱动的内存常驻模式会持续占用系统资源,并增加能耗。因此,在使用完毕后,如果不再需要常驻模式,建议将其禁用,以节省资源和能源。可以使用以下命令将GPU驱动程序设置为非常驻模式:nvidia-smi -pm 0

转载:

https://blog.csdn.net/weixin_54757969/article/details/131960450

操作系统及NVlink桥接及gpu驱动持久化

我最熟悉的linux操作系统是Ubuntu,起初想装23.04,它的内核是6.2。最终选择了装Ubuntu22.04,考虑就是这个版本支持较好。基本上所有的支持linux软件,都有Ubuntu22.04的安装方法。我没装server版,直接上了桌面版本,显卡驱动版本530.41.03。(注:后来我为了安装cuda11.7.1及cudnn8.6,把驱动降至515.65.01,2023.7.26)

然后是让NVlink工作,需要开启驱动持久化模式:

1
2
3
nvidia-smi -pm 1
sudo reboot

检查方法:

1
2
3
4
5
nvidia-smi topo -m

GPU0 GPU1 CPU Affinity NUMA Affinity
GPU0 X NV4 0-23 N/A
GPU1 NV4 X 0-23 N/A

这里有一个事项要说明,NVlink插好时,会发现咔哒一声。起初我插完后,持久化重启,用检查命令查不到nvlink工作。后来断电关机,重新插了一次NVlink,听到咔哒一声。然后再开机,一切正常了。测试一下桥接速度,不知道为何14GB,快吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
allonx@x299:~/qmx_projects/langchain-ChatGLM$ nvidia-smi nvlink -s
GPU 0: NVIDIA GeForce RTX 3090 (UUID: GPU-9cca89b5-8627-6cff-7cb4-d8fae8dfadbe)
Link 0: 14.062 GB/s
Link 1: 14.062 GB/s
Link 2: 14.062 GB/s
Link 3: 14.062 GB/s
GPU 1: NVIDIA GeForce RTX 3090 (UUID: GPU-f3fc3749-f793-189f-b592-5af6bb39a569)
Link 0: 14.062 GB/s
Link 1: 14.062 GB/s
Link 2: 14.062 GB/s
Link 3: 14.062 GB/s


再查一下详细情况:

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
42
43
44
45
46
47
48
49
50
51
52
53
allonx@x299:~/qmx_projects/langchain-ChatGLM$ nvidia-smi nvlink -c
GPU 0: NVIDIA GeForce RTX 3090 (UUID: GPU-9cca89b5-8627-6cff-7cb4-d8fae8dfadbe)
Link 0, P2P is supported: true
Link 0, Access to system memory supported: true
Link 0, P2P atomics supported: true
Link 0, System memory atomics supported: true
Link 0, SLI is supported: true
Link 0, Link is supported: false
Link 1, P2P is supported: true
Link 1, Access to system memory supported: true
Link 1, P2P atomics supported: true
Link 1, System memory atomics supported: true
Link 1, SLI is supported: true
Link 1, Link is supported: false
Link 2, P2P is supported: true
Link 2, Access to system memory supported: true
Link 2, P2P atomics supported: true
Link 2, System memory atomics supported: true
Link 2, SLI is supported: true
Link 2, Link is supported: false
Link 3, P2P is supported: true
Link 3, Access to system memory supported: true
Link 3, P2P atomics supported: true
Link 3, System memory atomics supported: true
Link 3, SLI is supported: true
Link 3, Link is supported: false
GPU 1: NVIDIA GeForce RTX 3090 (UUID: GPU-f3fc3749-f793-189f-b592-5af6bb39a569)
Link 0, P2P is supported: true
Link 0, Access to system memory supported: true
Link 0, P2P atomics supported: true
Link 0, System memory atomics supported: true
Link 0, SLI is supported: true
Link 0, Link is supported: false
Link 1, P2P is supported: true
Link 1, Access to system memory supported: true
Link 1, P2P atomics supported: true
Link 1, System memory atomics supported: true
Link 1, SLI is supported: true
Link 1, Link is supported: false
Link 2, P2P is supported: true
Link 2, Access to system memory supported: true
Link 2, P2P atomics supported: true
Link 2, System memory atomics supported: true
Link 2, SLI is supported: true
Link 2, Link is supported: false
Link 3, P2P is supported: true
Link 3, Access to system memory supported: true
Link 3, P2P atomics supported: true
Link 3, System memory atomics supported: true
Link 3, SLI is supported: true
Link 3, Link is supported: false


其中有提示“Link is supported: false”,不明就里,上网查了一下,有一个人与我一样的情况,回复说是正常。

总体来说,这个主机方案接近完美,为了省钱,我没选择水冷,采用了经济实惠的风冷方案。

装机之后,我先装了一个windows系统测试。可能是这块主板有些古老(2017年生产),试了几次我都没法成功安装win11,只能安装win10。用cup-z、gpu-z、鲁大师、3dmark都进行了测试。也许是华硕tuf 3090都这样,3dmark稳定度测试最高都只达到97%-98%之间,算是勉强通过了测试。

另有一个小小的缺憾,就是这台工作站的主机上面缺少了档板,不知道是不是长期运行主机会进入大量灰尘。而且x299 gaming7的档板很难配,偶尔有卖的,一块档板竟要价近300元。实在没必要。

参考资料:

gpu p2p通信科普

在多GPU服务器或工作站中,P2P(Peer-to-Peer)通信是指GPU卡之间直接进行数据传输,绕过主机CPU和内存,达到更高的带宽和更低的延迟。

GPU间P2P(Peer-to-Peer)含义

通常情况下,多张GPU卡需要共享数据。例如,一个深度学习模型的不同层分布在不同GPU上,需要频繁交换中间结果。这种时候,P2P通信就很关键。


P2P的两种模式

  1. P2P Memory Access(内存访问)
    • 一张GPU可以直接读写另一张GPU的内存(global memory)。
  2. P2P Memory Copy(内存拷贝)
    • 在编程中使用 cudaMemcpyPeer()cudaMemcpyPeerAsync() 实现GPU之间的内存拷贝。

是否支持P2P通信取决于硬件架构

  • GPU之间的物理连接方式
    • 支持P2P的前提是两张GPU之间通过 NVLinkPCIe同一Switch、或 同一个PCIe Root Complex
  • 例如:
    • NVIDIA A100、V100、P100 支持 NVLink 的直接互联,P2P效率高。
    • 如果GPU之间跨Socket(NUMA架构),P2P性能会变差甚至不可用。

如何检测GPU之间是否支持P2P?

可以使用命令:

1
nvidia-smi topo -m

输出示例:

1
2
3
        GPU0    GPU1    CPU Affinity
GPU0 X NV2 0-15
GPU1 NV2 X 0-15

其中 NV2 表示通过 NVLink 2.0 连接,支持高速P2P;若显示 PHB,表示是通过 PCIe Host Bridge,不一定支持高效的P2P。


P2P的优势

  • 避免数据先拷贝到CPU内存再拷贝到另一GPU
  • 显著提升多卡训练、多卡计算的性能
  • 降低系统总线负载,减少延迟

使用场景

  • 分布式深度学习(如TensorFlow、PyTorch多GPU训练)
  • 科学计算中GPU间数据交互
  • GPU直接DMA传输

如你使用NVIDIA GPU,并使用CUDA编程,可通过如下函数开启P2P:

1
2
cudaSetDevice(0);
cudaDeviceEnablePeerAccess(1, 0);

表示:GPU0 允许访问 GPU1。


如果你想我帮你判断你机器的GPU是否支持P2P,可以发我 nvidia-smi topo -m 的输出,我来分析。

扩展查看gpu p2p通信

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
root@A100:~# nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 NIC0 NIC1 NIC2 NIC3 NIC4 NIC5 CPU Affinity NUMA Affinity GPU NUMA ID
GPU0 X NV12 NV12 NV12 NV12 NV12 NV12 NV12 PXB NODE NODE SYS SYS SYS 0-31,64-95 0 N/A
GPU1 NV12 X NV12 NV12 NV12 NV12 NV12 NV12 PXB NODE NODE SYS SYS SYS 0-31,64-95 0 N/A
GPU2 NV12 NV12 X NV12 NV12 NV12 NV12 NV12 NODE PXB PXB SYS SYS SYS 0-31,64-95 0 N/A
GPU3 NV12 NV12 NV12 X NV12 NV12 NV12 NV12 NODE PXB PXB SYS SYS SYS 0-31,64-95 0 N/A
GPU4 NV12 NV12 NV12 NV12 X NV12 NV12 NV12 SYS SYS SYS PXB NODE NODE 32-63,96-127 1 N/A
GPU5 NV12 NV12 NV12 NV12 NV12 X NV12 NV12 SYS SYS SYS PXB NODE NODE 32-63,96-127 1 N/A
GPU6 NV12 NV12 NV12 NV12 NV12 NV12 X NV12 SYS SYS SYS NODE PXB PXB 32-63,96-127 1 N/A
GPU7 NV12 NV12 NV12 NV12 NV12 NV12 NV12 X SYS SYS SYS NODE PXB PXB 32-63,96-127 1 N/A
NIC0 PXB PXB NODE NODE SYS SYS SYS SYS X NODE NODE SYS SYS SYS
NIC1 NODE NODE PXB PXB SYS SYS SYS SYS NODE X PIX SYS SYS SYS
NIC2 NODE NODE PXB PXB SYS SYS SYS SYS NODE PIX X SYS SYS SYS
NIC3 SYS SYS SYS SYS PXB PXB NODE NODE SYS SYS SYS X NODE NODE
NIC4 SYS SYS SYS SYS NODE NODE PXB PXB SYS SYS SYS NODE X PIX
NIC5 SYS SYS SYS SYS NODE NODE PXB PXB SYS SYS SYS 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_5root@A100:~# nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 NIC0 NIC1 NIC2 NIC3 NIC4 NIC5 CPU Affinity NUMA Affinity GPU NUMA ID
GPU0 X NV12 NV12 NV12 NV12 NV12 NV12 NV12 PXB NODE NODE SYS SYS SYS 0-31,64-95 0 N/A
GPU1 NV12 X NV12 NV12 NV12 NV12 NV12 NV12 PXB NODE NODE SYS SYS SYS 0-31,64-95 0 N/A
GPU2 NV12 NV12 X NV12 NV12 NV12 NV12 NV12 NODE PXB PXB SYS SYS SYS 0-31,64-95 0 N/A
GPU3 NV12 NV12 NV12 X NV12 NV12 NV12 NV12 NODE PXB PXB SYS SYS SYS 0-31,64-95 0 N/A
GPU4 NV12 NV12 NV12 NV12 X NV12 NV12 NV12 SYS SYS SYS PXB NODE NODE 32-63,96-127 1 N/A
GPU5 NV12 NV12 NV12 NV12 NV12 X NV12 NV12 SYS SYS SYS PXB NODE NODE 32-63,96-127 1 N/A
GPU6 NV12 NV12 NV12 NV12 NV12 NV12 X NV12 SYS SYS SYS NODE PXB PXB 32-63,96-127 1 N/A
GPU7 NV12 NV12 NV12 NV12 NV12 NV12 NV12 X SYS SYS SYS NODE PXB PXB 32-63,96-127 1 N/A
NIC0 PXB PXB NODE NODE SYS SYS SYS SYS X NODE NODE SYS SYS SYS
NIC1 NODE NODE PXB PXB SYS SYS SYS SYS NODE X PIX SYS SYS SYS
NIC2 NODE NODE PXB PXB SYS SYS SYS SYS NODE PIX X SYS SYS SYS
NIC3 SYS SYS SYS SYS PXB PXB NODE NODE SYS SYS SYS X NODE NODE
NIC4 SYS SYS SYS SYS NODE NODE PXB PXB SYS SYS SYS NODE X PIX
NIC5 SYS SYS SYS SYS NODE NODE PXB PXB SYS SYS SYS 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_5root@A100:~# nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 NIC0 NIC1 NIC2 NIC3 NIC4 NIC5 CPU Affinity NUMA Affinity GPU NUMA ID
GPU0 X NV12 NV12 NV12 NV12 NV12 NV12 NV12 PXB NODE NODE SYS SYS SYS 0-31,64-95 0 N/A
GPU1 NV12 X NV12 NV12 NV12 NV12 NV12 NV12 PXB NODE NODE SYS SYS SYS 0-31,64-95 0 N/A
GPU2 NV12 NV12 X NV12 NV12 NV12 NV12 NV12 NODE PXB PXB SYS SYS SYS 0-31,64-95 0 N/A
GPU3 NV12 NV12 NV12 X NV12 NV12 NV12 NV12 NODE PXB PXB SYS SYS SYS 0-31,64-95 0 N/A
GPU4 NV12 NV12 NV12 NV12 X NV12 NV12 NV12 SYS SYS SYS PXB NODE NODE 32-63,96-127 1 N/A
GPU5 NV12 NV12 NV12 NV12 NV12 X NV12 NV12 SYS SYS SYS PXB NODE NODE 32-63,96-127 1 N/A
GPU6 NV12 NV12 NV12 NV12 NV12 NV12 X NV12 SYS SYS SYS NODE PXB PXB 32-63,96-127 1 N/A
GPU7 NV12 NV12 NV12 NV12 NV12 NV12 NV12 X SYS SYS SYS NODE PXB PXB 32-63,96-127 1 N/A
NIC0 PXB PXB NODE NODE SYS SYS SYS SYS X NODE NODE SYS SYS SYS
NIC1 NODE NODE PXB PXB SYS SYS SYS SYS NODE X PIX SYS SYS SYS
NIC2 NODE NODE PXB PXB SYS SYS SYS SYS NODE PIX X SYS SYS SYS
NIC3 SYS SYS SYS SYS PXB PXB NODE NODE SYS SYS SYS X NODE NODE
NIC4 SYS SYS SYS SYS NODE NODE PXB PXB SYS SYS SYS NODE X PIX
NIC5 SYS SYS SYS SYS NODE NODE PXB PXB SYS SYS SYS 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

上方 参数 解释:

从你提供的 nvidia-smi topo -m 输出看,你的系统有 8 张 GPU 卡,它们之间通过 NV12 互联,这说明 每对 GPU 间都有 12 条 NVLink 直连通道,属于目前非常高规格的连接方式。


✅ 你的系统支持极佳的 GPU 间 P2P 通信

解释如下:

  • NV12 表示两张GPU之间通过 12条 NVLink 通道互连,属于 NVIDIA NVSwitch 架构的一部分。
  • NVLink 是 NVIDIA 专为 GPU 高速互联设计的技术,远高于传统 PCIe 带宽和延迟。
  • 你的输出中 GPU0~GPU7 之间全部为 NV12,说明这些 GPU 构成一个 NVLink 全互连拓扑(full mesh)P2P 通信性能极高
  • 这是典型的 HGX A100 服务器结构,通常用于 AI 训练、HPC 超算等场景。

NUMA信息也说明系统为对称架构

  • GPU0~GPU3 属于 NUMA 节点 0(Affinity: 0-31,64-95
  • GPU4~GPU7 属于 NUMA 节点 1(Affinity: 32-63,96-127

这通常意味着双路CPU,每个CPU挂载4张GPU,通过 NVSwitch 实现GPU间的高速互通。


小结

项目状态
GPU间P2P✅ 全部支持(NV12)
通信方式NVLink 12路互联
架构类型多GPU NVSwitch
适合场景大模型训练、多卡推理、深度学习训练等

✅ 建议

你可以在 CUDA 或深度学习框架(如 PyTorch、TensorFlow)中放心使用多卡训练,不需要担心 GPU 间的数据传输瓶颈。

如需验证程序中是否使用了 P2P,可在 PyTorch 中使用:

1
torch.cuda.device(0).can_access_peer(1)  # True

如果你要进一步优化多GPU训练性能,还可以设置环境变量:

1
NCCL_P2P_LEVEL=NVL  # 强制NCCL使用NVLink

需要帮助配置多卡训练或 NCCL 参数优化,也可以继续问我。

从你提供的 nvidia-smi topo -m 输出看,你的系统有 8 张 GPU 卡,它们之间通过 NV12 互联,这说明 每对 GPU 间都有 12 条 NVLink 直连通道,属于目前非常高规格的连接方式。


✅ 你的系统支持极佳的 GPU 间 P2P 通信

解释如下:

  • NV12 表示两张GPU之间通过 12条 NVLink 通道互连,属于 NVIDIA NVSwitch 架构的一部分。
  • NVLink 是 NVIDIA 专为 GPU 高速互联设计的技术,远高于传统 PCIe 带宽和延迟。
  • 你的输出中 GPU0~GPU7 之间全部为 NV12,说明这些 GPU 构成一个 NVLink 全互连拓扑(full mesh)P2P 通信性能极高
  • 这是典型的 HGX A100 服务器结构,通常用于 AI 训练、HPC 超算等场景。

NUMA信息也说明系统为对称架构

  • GPU0~GPU3 属于 NUMA 节点 0(Affinity: 0-31,64-95
  • GPU4~GPU7 属于 NUMA 节点 1(Affinity: 32-63,96-127

这通常意味着双路CPU,每个CPU挂载4张GPU,通过 NVSwitch 实现GPU间的高速互通。


小结

项目状态
GPU间P2P✅ 全部支持(NV12)
通信方式NVLink 12路互联
架构类型多GPU NVSwitch
适合场景大模型训练、多卡推理、深度学习训练等

✅ 建议

你可以在 CUDA 或深度学习框架(如 PyTorch、TensorFlow)中放心使用多卡训练,不需要担心 GPU 间的数据传输瓶颈。

如需验证程序中是否使用了 P2P,可在 PyTorch 中使用:

1
torch.cuda.device(0).can_access_peer(1)  # True

如果你要进一步优化多GPU训练性能,还可以设置环境变量:

1
NCCL_P2P_LEVEL=NVL  # 强制NCCL使用NVLink

需要帮助配置多卡训练或 NCCL 参数优化,也可以继续问我。

gpu机器中nvidia-fabricmanager-550服务是干嘛的

Fabric Manager 是 NVIDIA 提供的一个系统守护进程服务,主要用于支持 NVSwitch/NVLink 架构的多GPU通信和管理,特别是在 A100、H100 等数据中心级别的 GPU 系统中(如 NVIDIA HGX 平台)。


🔧 Fabric Manager 是什么?

Fabric Manager 是 NVIDIA GPU 驱动的一部分,主要用于:

✅ 管理和启用 NVSwitch(GPU互联交换芯片)

  • NVSwitch 是一种高速交换芯片,用于连接多个 GPU,实现类似“网络交换机”一样的互联。
  • Fabric Manager 会负责发现、初始化、配置这些 NVSwitch,让多GPU之间可以 共享内存、进行高速P2P通信

✅ 支持统一内存空间(如 Multi-Instance GPU)

  • 在 A100/H100 上,Fabric Manager 协助构建一个大的统一虚拟 GPU 内存空间(Unified Virtual Address Space, UVA)。
  • 这样可以让多个 GPU 像一个整体一样运行,比如模型并行、大模型训练。

✅ 保证 GPU 拓扑感知通信正常

  • 确保 GPU 拓扑(如 NVLink、NVSwitch 互联关系)能正确暴露给如 NCCL、CUDA 等框架。

🖥 你在哪些情况下需要 Fabric Manager?

场景是否需要 Fabric Manager
多GPU无NVSwitch互联(如两张 3090)❌ 不需要
使用 A100/H100 HGX平台,有 NVSwitch✅ 必须启用
需要 Multi-Instance GPU(MIG)✅ 必须启用
运行 NCCL 跨卡通信(在 NVSwitch 架构上)✅ 建议启用

📦 如何查看 Fabric Manager 是否运行?

1
systemctl status nvidia-fabricmanager

正常运行状态应为:

1
2
3
● nvidia-fabricmanager.service - NVIDIA Fabric Manager Daemon
Loaded: loaded (/lib/systemd/system/nvidia-fabricmanager.service; enabled)
Active: active (running)

如果未启动,可使用:

1
2
sudo systemctl start nvidia-fabricmanager
sudo systemctl enable nvidia-fabricmanager

🧩 与 GPU 驱动的关系

  • Fabric Manager 是 GPU 驱动包的一部分(在 A100/H100 平台驱动安装时可选)。
  • 安装方式一般是:
1
sudo apt install nvidia-fabricmanager-<driver_version>

例如:

1
sudo apt install nvidia-fabricmanager-550

✅ 小结

属性说明
服务名称nvidia-fabricmanager
所属平台A100/H100 + NVSwitch 架构
是否必需如果你用的是 NVSwitch 互联(如 HGX),必须启用
作用管理 GPU 互联拓扑、启用 NVSwitch、支持统一内存、MIG、多GPU通信

如果你当前服务器是 8x A100 并且 nvidia-smi topo -m 显示 NV12,那么你应该启用了 Fabric Manager,它在后台负责这些 NVLink 和 NVSwitch 的配置工作。

如果你想我帮你检查当前 Fabric Manager 的状态或是否需要配置,我也可以帮你确认。