NVIDIA Fabric Manager 用户指南
概述
随着深度学习神经网络变得越来越复杂,其规模和复杂度持续膨胀,导致在合理时间内训练这些网络所需的算力呈指数级增长。为应对这一挑战,应用已转向多 GPU 实现。
NVIDIA® NVLink™ 是为连接多个 GPU 而推出的直接 GPU 间互连技术,可在服务器内扩展多 GPU 的输入/输出(IO)。为了进一步扩展性能并连接更多 GPU,NVIDIA 推出了 NVIDIA NVSwitch™,它将多条 NVLink 连接起来,以全部 NVLink 速率提供 GPU 间的全互联(all-to-all)通信。
本文档为基于 NVSwitch 的单节点 HGX 和 DGX 系统提供 Fabric Manager 的搭建指南、不同虚拟化模型、高可用模式及其他细节。
文档历史
| 版本 | 日期 | 作者 | 变更说明 |
|---|---|---|---|
| 0.1 | 2019 年 10 月 25 日 | SB | 首个 Beta 版本 |
| 0.2 | 2020 年 3 月 23 日 | SB | 更新错误处理与裸机模式 |
| 0.3 | 2020 年 5 月 11 日 | YL | 用新的 API 信息更新共享 NVSwitch API 章节 |
| 0.4 | 2020 年 7 月 7 日 | SB | 更新多实例 GPU(MIG)互操作与高可用细节 |
| 0.5 | 2020 年 7 月 17 日 | SB | 更新以非 root 身份运行的说明 |
| 0.6 | 2020 年 8 月 3 日 | SB | 基于 NVIDIA® CUDA® 仓库更新安装说明,并更新 SXid 错误细节 |
| 0.7 | 2021 年 1 月 26 日 | GT, CC | 增加 NVIDIA 虚拟 GPU(vGPU)多租户虚拟化模式 |
| 0.8 | 2021 年 3 月 19 日 | SB | 更新高可用章节,以反映近期 GPU 排除选项的变更 |
| 0.9 | 2022 年 10 月 19 日 | YL, SB, GT | 增加 NVIDIA® DGX™ H100 和 NVIDIA HGX™ H100 内容 |
| 1.0 | 2023 年 1 月 20 日 | YL | 更新 DGX H100 和 NVIDIA HGX H100 的 GPU 模块 ID |
| 1.1 | 2023 年 6 月 23 日 | SB | 增加日志轮转选项;更新 NVIDIA HGX H100 的 NVLink® 拓扑信息;增加对 NVIDIA HGX A800 和 NVIDIA HGX H800 的支持说明 |
| 1.2 | 2023 年 7 月 7 日 | EK, PKS | 更新 D.4 非致命 NVSwitch SXid 错误;更新 D. 致命 NVSwitch SXid 错误;新增 D.9 GPU/VM/系统重置能力与限制 |
| 1.3 | 2023 年 10 月 3 日 | YL, SB | 更新 DGX H100 和 NVIDIA HGX H100 的共享 NVSwitch 双 GPU 分区;更新多项 FM 软件包细节、DGX H100 和 HGX H100 的 FM 服务重启注意事项、服务虚拟机内存要求 |
| 2.0 | 2024 年 2 月 16 日 | YL, SB | 增加 NVIDIA HGX B100 细节 |
| 2.1 | 2024 年 8 月 29 日 | SB | 针对 NVIDIA HGX B200 更新;同时修正了各 GPU 基板拓扑图 |
| 2.2 | 2024 年 10 月 2 日 | SB, NH | 针对 NVIDIA HGX B200 更新;更新全功能 PF 与受限 PF 用法的信息;更新 Systemd 脚本文件 |
| 2.3 | 2025 年 3 月 4 日 | SB, NH | 更新元软件包(meta-package)安装;更新 SXID 移除与 NVSDM 替代方案;更新组播按比例资源共享;更新 H800/H200/H20 支持细节 |
(表 1 ------ 文档历史)
基于 NVSwitch 的系统
多年来,NVIDIA 推出了四代 NVSwitch 及配套的 NVIDIA DGX™ 与 NVIDIA HGX™ 服务器系统。
NVIDIA DGX-2™ 和 NVIDIA HGX-2 系统由两块相同的 GPU 基板组成,每块基板上有 8 颗 NVIDIA V100 GPU 和 6 颗第一代 NVSwitch。每颗 V100 GPU 到同一基板上的每颗 NVSwitch 都有一条 NVLink 连接;两块 GPU 基板互连构成一套 16 GPU 系统。两块基板之间仅有的 NVLink 连接位于 NVSwitch 之间------一块基板上的每颗 NVSwitch 与另一块基板上的一颗 NVSwitch 相连,共计 8 条 NVLink 连接。
DGX A100 和 NVIDIA HGX A100 8-GPU 系统由一块 GPU 基板构成,板上有 8 颗 NVIDIA A100 GPU 和 6 颗第二代 NVSwitch。其 GPU 基板 NVLink 拓扑与第一代类似:每颗 A100 GPU 到同一基板上的每颗 NVSwitch 有两条 NVLink 连接。这一代支持连接两块 GPU 基板,基板间共计 16 条 NVLink 连接。
第三代 NVSwitch 用于 DGX H100 和 NVIDIA HGX H100 8-GPU 服务器系统。该服务器变体由一块 GPU 基板构成,板上有 8 颗 NVIDIA H100 GPU 和 4 颗 NVSwitch。其 NVLink 拓扑与上一代不同:每颗 GPU 有 4 条 NVLink 连接到其中两颗 NVSwitch,另有 5 条 NVLink 连接到剩余两颗 NVSwitch。这一代不支持用 NVLink 连接两块 GPU 基板。
DGX B200/B300、NVIDIA HGX B200/B300 8-GPU 和 NVIDIA HGX B100 8-GPU 系统采用第四代 NVSwitch 和 B200/B300、B100 GPU。其 GPU 基板 NVLink 拓扑包含 2 颗 NVSwitch ASIC 和 8 颗 B300/B200/B100 GPU,每颗 GPU 引出 9 条 NVLink 连接到 NVSwitch。与 DGX H100 和 HGX H100 一代相同,该基板不支持用 NVLink 连接两块 GPU 基板。
术语表
| 缩写 | 定义 |
|---|---|
| FM | Fabric Manager(互连结构管理器) |
| MMIO | 内存映射 IO(Memory Mapped IO) |
| VM | 虚拟机(Virtual Machine) |
| GPU 寄存器 | GPU MMIO 空间中的一个位置 |
| SBR | 二级总线复位(Secondary Bus Reset) |
| DCGM | NVIDIA 数据中心 GPU 管理器(Data Center GPU Manager) |
| NVML | NVIDIA 管理库(NVIDIA Management Library) |
| Service VM | 运行 NVIDIA NVSwitch 软件栈的特权虚拟机(服务虚拟机) |
| Access NVLink | GPU 与 NVSwitch 之间的 NVLink(接入链路) |
| Trunk NVLink | 两块 GPU 基板之间的 NVLink(干线链路) |
| SMBPBI | NVIDIA SMBus 信箱接口(SMBus Post-Box Interface) |
| vGPU | NVIDIA GRID 虚拟 GPU |
| MIG | 多实例 GPU(Multi-Instance GPU) |
| SR-IOV | 单根 IO 虚拟化(Single-Root IO Virtualization) |
| PF | 物理功能(Physical Function) |
| FC PF | 全功能物理功能(Full Capabilities Physical Function) |
| LPF | 受限物理功能(Limited Physical Function) |
| VF | 虚拟功能(Virtual Function) |
| GFID | GPU 功能标识(GPU Function Identification) |
| Partition(分区) | 允许进行 NVLink 点对点通信的一组 GPU |
| ALI | 自主链路初始化(Autonomous Link Initialization) |
| OFED | 开放 Fabrics 企业发行版驱动(Open Fabrics Enterprise Distribution Driver) |
| MOFED | Mellanox/NVIDIA 版 OFED 驱动包 |
| NVLSM | NVLink 子网管理器(NVLink Subnet Manager) |
| NVSDM | NVLink 交换设备管理器(NVLink Switch Device Manager) |
(表 2 ------ 术语表)
NVSwitch 核心软件栈
本节介绍 NVSwitch 核心软件栈的信息。
使用第四代之前 NVSwitch 的系统
用于 NVSwitch 管理的核心软件栈由一个 NVSwitch 内核驱动和一个名为 NVIDIA Fabric Manager(FM)的特权进程组成。内核驱动响应 FM 的请求,执行底层硬件管理。该软件栈还提供带内(in-band)和带外(out-of-band)监控方案,用于上报 NVSwitch 和 GPU 的错误与状态信息。
(图 1 ------ NVSwitch 核心软件栈。图中包含:第三方 GPU/NVSwitch 监控集成点、DCGM(GPU 与 NVSwitch 监控)、NVML(监控 API)、FM Lib 与 SDK(FM 开发包)、Fabric Manager 与 NVSwitch 审计工具(核心 FM 包)、GPU 驱动与 NVSwitch 驱动(NVIDIA 驱动包,内核态)、GPU、NVSwitch、BMC、带外监控等组件。)
使用第四代 NVSwitch 的系统
在第四代 NVSwitch 上,NVIDIA 实现了一套横跨 NVLink、InfiniBand 和以太网交换机的统一架构。这种架构一致性确保第四代 NVSwitch 与 NVIDIA 的 InfiniBand(IB)交换机共享相同的 IP 模块,重点在链路层和控制面。由于这一整合,FM 引入了一个新的控制面实体------NVLink 子网管理器(NVLSM)。SM(子网管理器)服务源自 NVIDIA IB 交换机,并做了有效管理 NVSwitch 所需的修改。
在高层面上,NVLSM 服务负责配置 NVSwitch 路由表,而 FM 负责 GPU 侧路由、NVLink 配置,并提供分区管理 API。FM 与 NVLSM 之间通过进程间通信(IPC)接口交互。该通信通道对初始化和配置互连结构至关重要,可确保 FM 与 NVLSM 之间的无缝协同。
注意:DGX B200/B300、NVIDIA HGX B200/B300 8-GPU 和 NVIDIA HGX B100 8-GPU 系统使用第四代 NVSwitch。
(图 2 ------ 基于第四代 NVSwitch 的系统。相比图 1,核心 FM 包中新增 NVLink Subnet Manager;驱动侧为 NVIDIA 驱动包(GPU 驱动)+ 内置 OFED 或 MOFED 包(OFED/MOFED 驱动),NVSwitch 经 CX7 NVSwitch 桥接设备管理。)
什么是 Fabric Manager?
FM 配置 NVSwitch 内存互连结构,使所有参与的 GPU 形成一个内存互连结构,并监控支撑该互连的 NVLink。在高层面上,FM 完成以下任务:
- 配置 NVSwitch 端口之间的路由(第四代之前的 NVSwitch);
- 在适用时设置 GPU 路由和端口映射;
- 与 GPU 驱动协同,初始化 GPU;
- 监控互连结构中的 NVLink 和 NVSwitch 错误;
- 在不支持基于自主链路初始化(ALI)的 NVLink 训练的系统(第一代和第二代 NVSwitch 系统)上,FM 还完成以下任务:
- 与 NVSwitch 驱动协同,初始化并训练 NVSwitch 到 NVSwitch 的 NVLink 互连;
- 与 GPU 驱动协同,初始化并训练 NVSwitch 到 GPU 的 NVLink 互连。
本用户指南概述 FM 的功能特性,面向系统管理员和基于 NVSwitch 的服务器系统用户。
什么是 NVLink 子网管理器?
NVLink 子网管理器(NVLSM)源自 IB 网络,包含对 NVSwitch 和 NVLink 进行编程的额外逻辑。在高层面上,NVLSM 为基于 NVSwitch 的系统提供以下功能:
- 发现 NVLink 网络拓扑;
- 为所有 GPU 和 NVSwitch 的 NVLink 端口分配本地标识符(LID);
- 计算并编程交换机转发表;
- 为 NVLink 分区编程分区键(PKEY);
- 监控 NVLink 互连结构的变化。
GPU 基板拓扑
以下章节介绍不同基板的 PCIe 拓扑,重点关注 GPU 和 NVSwitch,以及这些拓扑在主机系统上的呈现方式。
HGX-2 GPU 基板
(图 3 ------ 简化的 HGX-2 基板:8 颗 V100 GPU、6 颗 NVSwitch(NVS 1--6)、PCIe 交换机和 PCIe 重定时器,经 PCIe 上连至 CPU complexes。)
HGX-2 基板包含 8 颗 V100 GPU 和对应的 6 颗第一代 NVSwitch。从 PCIe 树的角度看,8 颗 GPU 和 6 颗 NVSwitch 会在主机系统的 PCIe 树上显示为 PCIe 设备。
示例如下:
$ lspci | grep -i nvidia
34:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
36:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
39:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
3b:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
57:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
59:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
5c:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
5e:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM3 32GB] (rev a1)
61:00.0 Bridge: NVIDIA Corporation Device 1ac2 (rev a1)
62:00.0 Bridge: NVIDIA Corporation Device 1ac2 (rev a1)
63:00.0 Bridge: NVIDIA Corporation Device 1ac2 (rev a1)
65:00.0 Bridge: NVIDIA Corporation Device 1ac2 (rev a1)
66:00.0 Bridge: NVIDIA Corporation Device 1ac2 (rev a1)
67:00.0 Bridge: NVIDIA Corporation Device 1ac2 (rev a1)
NVIDIA HGX A100 GPU 基板
(图 4 ------ 简化的 HGX A100 基板:8 颗 A100 GPU、6 颗第二代 NVSwitch、PCIe 交换机等。)
NVIDIA HGX A100 基板的 PCIe 拓扑与 HGX-2 基板类似:8 颗 A100 GPU 和对应的 6 颗第二代 NVSwitch。8 颗 GPU 和 6 颗 NVSwitch 会在主机系统的 PCIe 树上显示为 PCIe 设备。
示例如下:
$ lspci | grep -i nvidia
36:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
3b:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
41:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
45:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
59:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
5d:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
63:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
67:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
6d:00.0 Bridge: NVIDIA Corporation Device 1af1 (rev a1)
6e:00.0 Bridge: NVIDIA Corporation Device 1af1 (rev a1)
6f:00.0 Bridge: NVIDIA Corporation Device 1af1 (rev a1)
70:00.0 Bridge: NVIDIA Corporation Device 1af1 (rev a1)
71:00.0 Bridge: NVIDIA Corporation Device 1af1 (rev a1)
72:00.0 Bridge: NVIDIA Corporation Device 1af1 (rev a1)
NVIDIA HGX H100 GPU 基板
(图 5 ------ 简化的 NVIDIA HGX H100 基板:8 颗 H100 GPU、4 颗 NVSwitch(NVS 1--4)、PCIe 重定时器与 PCIe 交换机。)
NVIDIA HGX H100 基板的 PCIe 拓扑在主机系统的 PCIe 树上显示 8 颗 GPU 和 4 颗 NVSwitch 作为 PCIe 设备。
示例如下:
$ lspci | grep -i nvidia
07:00.0 Bridge: NVIDIA Corporation Device 22a3 (rev a1)
08:00.0 Bridge: NVIDIA Corporation Device 22a3 (rev a1)
09:00.0 Bridge: NVIDIA Corporation Device 22a3 (rev a1)
0a:00.0 Bridge: NVIDIA Corporation Device 22a3 (rev a1)
1b:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
43:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
52:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
61:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
9d:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
c3:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
d1:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
df:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
NVIDIA HGX B200/B300 GPU 基板
(图 6 ------ 简化的 NVIDIA HGX B200/B300 基板:8 颗 B200/B300 GPU、2 颗 NVSwitch(NVS 1--2),经 CX7 NVSwitch 桥接设备管理。)
在 NVIDIA HGX B300/B200/B100 基板的 PCIe 拓扑中,NVSwitch 不会在主机系统上被识别为 PCIe 设备。为管理 NVLink,NVSwitch 连接到一个 CX7 桥接设备。主机软件栈和控制面的访问经由该 CX7 桥接设备路由,并使用对应的内置 OFED 或 MOFED 驱动。
CX7 桥接设备集成在 GPU 基板中,包含两个物理端口。每个端口向主机系统暴露一个全功能物理功能(FC PF)和一个受限物理功能(LPF),共计 4 个 PF。这些 PF 分为以下两类:
- 受限 PF(LPF):用于系统中的特定任务。它们被 FM 和 NVLSM 用来配置和设置 NVSwitch、GPU 及 NVLink 路由信息;也被 NVIBDM、DCGM 等遥测代理用来监控和采集数据。用 FLR 复位该 PF 也会复位对应的 NVSwitch 设备。
- 全功能 PF(FC PF):提供设备管理级功能,例如发起 NVSwitch 设备复位、启用或禁用 NVSwitch 之间的链路。FC PF 对部分直通(partial pass-through)虚拟化场景很有价值------该场景下 GPU 和 NVSwitch 的子集被分配给租户 VM。但此类 PF 不支持 NVLink 控制面实体(如 FM 和 NVLSM),也不支持与遥测代理通信。
从硬件角度看,用于 NVLink 管理的 CX7 桥接设备与传统 CX7 网卡使用完全相同的硬件。生产阶段写入的 PCIe 重要产品数据(VPD)信息用于区分该 CX7 设备是用于 NVLink 管理的:
- 在 Linux 系统上,可以使用
vpddecode或lspci等标准工具访问 VPD 信息; - 在 Windows 主机系统上,运行
mstreg命令查询 VPD 信息。
为区分 LPF 和 FC PF,LPF 的 VPD 信息包含一个名为 SMDL 的厂商特定字段,其非零值定义为 SW_MNG。对于裸机、完全直通和共享 NVSwitch 部署,FM 服务单元文件中的预启动(prelaunch)脚本会运行并查询可用 CX7 设备的该 VPD 信息,然后填充 FM 和 NVLSM 所需的配置值,使这些通信实体能够访问相关设备。
但对于部分直通部署,还需要在 Hypervisor 层面执行额外步骤,以识别属于同一个 CX7 桥接设备端口的一对 PF。更多信息请参阅"虚拟化模型"章节。
NVIDIA HGX B300/B200/B100 基板的 PCIe 拓扑会在主机系统的 PCIe 树上显示 8 颗 GPU 和 4 个 CX7 设备作为 PCIe 设备。
示例如下:
$ lspci | grep -i -E 'nvidia|mella'
05:00.0 Infiniband controller: Mellanox Technologies MT2910 Family [ConnectX-7]
05:00.1 Infiniband controller: Mellanox Technologies MT2910 Family [ConnectX-7]
05:00.2 Infiniband controller: Mellanox Technologies MT2910 Family [ConnectX-7]
05:00.3 Infiniband controller: Mellanox Technologies MT2910 Family [ConnectX-7]
1b:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
43:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
52:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
61:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
9d:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
c3:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
d1:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
df:00.0 3D controller: NVIDIA Corporation Device 29bc (rev a1)
上述 lspci 命令输出中的 GPU 和 NVSwitch PCIe 设备 ID、产品 ID 信息仅作示例。实际值可能因系统配置中的具体产品和 GPU 变体而异。
Fabric Manager 快速上手
基本组件
本节介绍 FM 的基本组件。
Fabric Manager 服务
FM 的核心组件实现为一个独立的可执行文件,以 UNIX 守护进程方式运行。FM 安装包会安装所需的核心组件,并将该守护进程注册为 nvidia-fabricmanager 系统服务。
在 DGX-B200/B300、NVIDIA HGX-B200/B300、NVIDIA HGX-B100 及更新系统上,FM 包需要额外的 NVLSM 依赖来获取 SM 包以正常工作。FM 服务单元文件也已更新,会在适用时启动 NVLSM 进程。此时,FM systemd 服务状态会同时反映 FM 和 NVLSM 两个进程的状态,systemd 的 start、stop 等操作也会同时作用于两个进程。
软件开发套件(SDK)
FM 还提供一个共享库、一组 C/C++ API(SDK)以及对应的头文件。当 FM 运行在共享 NVSwitch 和 vGPU 多租户模式时,这些 API 用于与 FM 服务交互,以查询/激活/停用 GPU 分区。这些 SDK 组件通过单独的开发包安装(参见"共享 NVSwitch 虚拟化模型"和"vGPU 虚拟化模型"章节)。
支持的平台
本节介绍 FM 当前支持的产品和环境。
硬件架构
- x86_64
- aarch64
NVIDIA 服务器架构
- 使用 V100 GPU 和第一代 NVSwitch 的 DGX-2 和 NVIDIA HGX-2 系统;
- 使用 A100 GPU 和第二代 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统;
- 使用 A800 GPU 和第二代 NVSwitch 的 NVIDIA HGX A800 系统;
- 使用 H100 GPU 和第三代 NVSwitch 的 DGX H100 和 NVIDIA HGX H100 系统;
- 使用 H800 GPU 和第三代 NVSwitch 的 NVIDIA HGX H800 系统;
- 使用 H200 GPU 和第三代 NVSwitch 的 DGX H200 和 NVIDIA HGX H200 系统;
- 使用 H20 GPU 和第三代 NVSwitch 的 NVIDIA HGX H20 系统;
- 使用 B200/B300 GPU 和第四代 NVSwitch 的 DGX B200/B300 和 NVIDIA HGX B200/B300 系统;
- 使用 B100 GPU 和第四代 NVSwitch 的 NVIDIA HGX B100 系统。
注意:除非另有说明,NVIDIA HGX A800 的步骤与 NVIDIA HGX A100 相同。唯一区别是 GPU NVLink 的数量会因实际平台而异。
注意:除非另有说明,NVIDIA HGX H800、DGX H200、NVIDIA HGX H200、NVIDIA HGX H20 的步骤与 NVIDIA HGX H100 相同。唯一区别是 GPU NVLink 的数量可能因实际平台而异。
注意:除非另有说明,NVIDIA HGX B100 的步骤与 NVIDIA HGX B200/B300 相同。唯一区别是平台使用 B100 GPU 变体。
操作系统环境
FM 支持以下主流 Linux 发行版:
- RHEL/CentOS 7.x、RHEL/CentOS 8.x 和 RHEL/CentOS 9.x
- Ubuntu 18.04.x、Ubuntu 20.04.x、Ubuntu 22.04.x 和 Ubuntu 24.0x
注意:DGX B200/B300、NVIDIA HGX B200/B300 和 NVIDIA HGX B100 系统使用 B300/B200/B100 GPU 和第四代 NVSwitch,需要 v5.17 或更高版本的 Linux 内核。如果您的内核版本低于受支持版本,NVIDIA 提供了一份需要回合(backport)的内核补丁清单。
支持的部署模型
基于 NVSwitch 的系统可以部署为裸机服务器,或部署在虚拟化(完全直通、共享 NVSwitch 或 vGPU)多租户环境中。FM 支持这些部署模型。更多信息请参阅以下章节:
- 裸机模式
- 完全直通虚拟化配置
- 共享 NVSwitch 虚拟化配置
- 裸机与 vGPU 配置
其他 NVIDIA 软件包
要运行 FM 服务,目标系统必须包含兼容的 NVIDIA 数据中心 GPU 驱动,自 R450 版本起。
在 DGX B200/B300、NVIDIA HGX B200/B300 和 NVIDIA HGX B100 系统上,还需要 OFED 或 MOFED 驱动。此外,系统需要安装 libibumad3 和 infiniband-diags 软件包。例如在 Ubuntu 系统上:
apt-get install libibumad3apt-get install infiniband-diag
注意:初始化过程中,FM 服务会检查当前加载的内核驱动栈版本是否兼容;如果加载的驱动栈版本不兼容,将中止该过程。
安装
关于为 DGX 和 NVIDIA HGX 基于 NVSwitch 的系统安装和配置 FM 的更多信息,请参阅"裸机模式"章节。
管理 Fabric Manager 服务
本节介绍 FM 服务的管理方法。
启动 Fabric Manager
对于基于 Linux 的发行版,运行以下命令启动 FM:
sudo systemctl start nvidia-fabricmanager
停止 Fabric Manager
sudo systemctl stop nvidia-fabricmanager
查看 Fabric Manager 状态
sudo systemctl status nvidia-fabricmanager
设置 Fabric Manager 服务开机自启
sudo systemctl enable nvidia-fabricmanager
禁止 Fabric Manager 服务开机自启
sudo systemctl disable nvidia-fabricmanager
查看 Fabric Manager 系统日志
sudo journalctl -u nvidia-fabricmanager
Fabric Manager 启动选项
FM 支持以下命令行选项:
$ nv-fabricmanager -h
NVIDIA Fabric Manager
Runs as a background process to configure the NVSwitches to form
a single memory fabric among all participating GPUs.
Usage: nv-fabricmanager [options]
Options include:
[-h | --help]: 显示帮助信息
[-v | --version]: 显示 Fabric Manager 版本并退出
[-c | --config]: 指定控制所有配置选项的 FM 配置文件路径/名称
[-r | --restart]: 退出后重启 Fabric Manager。适用于共享 NVSwitch 和 vGPU 多租户模式
[-g | --fm-sm-mgmt-port-guid]: 用于控制流量的 Fabric Manager 与 NVLink 子网管理器管理端口 GUID
[-d | --database]: 指定 Fabric Manager 数据库引擎
FM 的大部分可配置参数和选项通过文本配置文件指定。FM 安装时会将默认配置文件复制到预定义位置,并默认使用该文件。要使用不同的配置文件位置,请使用 [-c | --config] 命令行参数。
注意 :在 Linux 安装中,默认 FM 配置文件位于
/usr/share/nvidia/nvswitch/fabricmanager.cfg。如果系统上的默认配置文件被修改过,FM 包更新时会提供合并/保留/覆盖选项来管理已有配置文件。[-d --database]选项不适用于单节点 HGX/DGX 系统,不应使用。
Fabric Manager 服务文件
本节介绍 FM 服务文件。
基于 Linux 的系统
在基于 Linux 的系统上,根据底层 GPU 基板变体的不同,FM 服务单元文件包含启动 FM 和 NVLSM 守护进程的逻辑。安装包通过 systemd 服务单元文件注册 FM 服务。要更改 FM 服务启动选项,请修改 /lib/systemd/system/nvidia-fabricmanager.service。
FM 服务单元文件调用默认安装在 /usr/bin/nv-fabricmanager-start.sh 的 nv-fabricmanager-start.sh 脚本。该脚本用于根据平台有选择地启动 FM 和 NVLSM 进程。
注意 :
systemd和nv-fabricmanager-start.sh脚本假定 PID 文件、二进制文件和配置文件位置均为默认安装路径。如果这些默认路径/文件被修改,必须同步修改服务单元文件和启动脚本。
以非 root 用户运行 Fabric Manager
在基于 Linux 的系统上,默认情况下 FM 和 NVLSM 服务需要管理员(root)权限来配置 GPU NVLink 和 NVSwitch 并支撑内存互连结构。不过,系统管理员和高级用户可以通过以下步骤,以非 root 账户运行 FM 和 NVLSM:
-
如果 FM 服务正在运行,先停止它。
-
通过调整以下目录/文件的访问权限,为 FM 提供对目标用户/用户组的访问:
/var/run/nvidia-fabricmanager------ 保存运行时信息的固定位置;/var/log/------ 保存 FM 日志文件的可配置位置;/usr/share/nvidia/nvswitch------ 互连拓扑文件的可配置位置。
以上目录/文件信息基于 FM 配置文件的默认选项。如果修改了默认配置值,请相应调整目录/文件信息。
-
为以下平台提供目录和文件访问权限:
-
NVIDIA HGX-2 / NVIDIA HGX-A100 / NVIDIA HGX-H100
NVIDIA 驱动会创建以下 proc 条目,默认权限为 root,需要将其读写权限改为目标用户/用户组:
/proc/driver/nvidia-nvlink/capabilities/fabric-mgmtFM 还需要访问以下设备节点文件:
/dev/nvidia-nvlink/dev/nvidia-nvswitchctl/dev/nvidia-nvswitchX(每个 NVSwitch 设备一个)/dev/nvidiactl/dev/nvidiaX(每个 GPU 设备一个)
默认情况下,这些设备节点文件由
nvidia-modprobe工具创建(该工具随 NVIDIA 数据中心 GPU 驱动包安装),并对所有用户开放访问权限。如果这些设备节点是手动创建或在nvidia-modprobe之外创建的,请为目标用户/用户组分配读写权限。 -
NVIDIA HGX-B200/B300
/dev/infiniband/umadX(每个 CX7 桥接设备端口一个)/dev/infiniband/issmX(每个 CX7 桥接设备端口一个)/sys/class/infiniband/mlx5_X/device/vpd------ 非 root 用户需要读取该 vpd 文件的读权限(systemctl 服务需要)。
-
-
(仅限 NVIDIA HGX-B200/B300 系统)为以下 NVLSM 目录和文件提供访问权限:
/var/log/------ NVLSM 临时文件的默认存储位置,会创建以下文件:nvlsm-subnet.lst、nvlsm.fdbs、nvlsm.mcfdbs、nvlsm-smdb.dump.tmp、nvlsm-virtualization.dump.tmp、nvlsm-routers.dump、nvlsm.log、nvlsm-activity.dump、nvlsm-unhealthy-ports.dump、nvlsm-perflog.json、nvlsm-perflog.backup.json
/var/cache/nvlsm------ NVLSM 存储状态信息的默认目录,以便重新加载并确保后续运行的一致性。该目录包含guid2lid文件。/usr/share/nvidia/nvlsm下的nvlsm.cfg------ 保存 NVLSM 配置信息的位置。systemd 服务会编辑 nvlsm.cfg 文件,使其指向nvidia-fabricmanager服务使用的cx port guid,以收发管理数据报。
-
NVIDIA 驱动会在驱动加载时创建/重建上述
/proc条目,因此每次驱动重载或系统启动后都需要重复步骤 1--4。- 当 FM 和 NVLSM 配置为 systemd 服务时,系统管理员必须编辑 FM 服务单元文件,指示 systemd 以特定用户/用户组运行 FM、NVLSM 和 FM 启动脚本。可在 FM 服务单元文件的
[Service]段中通过User=和Group=指令指定。 - 系统管理员必须确保在系统启动时 FM 服务启动之前,proc 条目及相关文件节点的权限已改为目标用户/用户组。
- 当 FM 和 NVLSM 配置为以特定用户/用户组运行时,
nvswitch-audit命令行工具也应使用同一用户/用户组账户启动。
- 当 FM 和 NVLSM 配置为 systemd 服务时,系统管理员必须编辑 FM 服务单元文件,指示 systemd 以特定用户/用户组运行 FM、NVLSM 和 FM 启动脚本。可在 FM 服务单元文件的
注意:系统管理员可以设置相应的 udev 规则,自动完成这些 proc 条目权限的修改。
Fabric Manager 配置选项
FM 使用的可配置参数和选项通过文本配置文件指定。本节介绍当前支持的可配置参数和选项。
注意:FM 配置文件在 FM 服务启动时读取。如果修改了任何选项,需重启 FM 服务才能使新设置生效。
日志相关配置项
本节介绍日志相关的配置项。
设置日志文件位置和名称
- 配置项 :
LOG_FILE_NAME=<value> - 支持的取值:日志的完整路径/文件名字符串,最大长度 255。
- 默认值 :
LOG_FILE_NAME=/var/log/fabricmanager.log
设置日志级别
- 配置项 :
LOG_LEVEL=<value> - 支持的取值 :
0:禁用所有日志;1:日志级别设为 CRITICAL 及以上;2:日志级别设为 ERROR 及以上;3:日志级别设为 WARNING 及以上;4:日志级别设为 INFO 及以上。
- 默认值 :
LOG_LEVEL=4
设置日志文件追加行为
- 配置项 :
LOG_APPEND_TO_LOG=<value> - 支持的取值 :
0:不追加到现有日志文件,覆盖现有日志文件;1:每次 FM 服务启动时追加到现有日志文件。
- 默认值 :
LOG_APPEND_TO_LOG=1
设置日志文件大小
- 配置项 :
LOG_FILE_MAX_SIZE=<value> - 支持的取值:期望的最大日志文件大小(MB)。达到指定大小后,FM 将停止向该日志文件写入更多日志。
- 默认值 :
LOG_FILE_MAX_SIZE=1024
将日志重定向到 Syslog
- 配置项 :
LOG_USE_SYSLOG=<value> - 支持的取值 :
0:使用指定的日志文件存储 FM 日志;1:将 FM 日志重定向到syslog,而非基于文件的日志。
- 默认值 :
LOG_USE_SYSLOG=0
日志轮转设置
- 配置项 :
LOG_MAX_ROTATE_COUNT=<value> - 支持的取值 :
0:不做日志轮转。日志文件达到LOG_FILE_MAX_SIZE指定的大小后停止记录;- 非零 :当前日志文件达到单文件大小上限后进行轮转。FM 日志总大小为
LOG_FILE_MAX_SIZE×(LOG_MAX_ROTATE_COUNT+ 1)。达到该阈值后,最旧的日志文件将被清除。
- 默认值 :
LOG_MAX_ROTATE_COUNT=3
注意:FM 日志为明文格式。为排查现场问题,NVIDIA 建议以 INFO 级别启用日志运行 FM 服务。
运行模式相关配置项
本节仅适用于共享 NVSwitch 和 vGPU 多租户部署。
Fabric Manager 运行模式
- 配置项 :
FABRIC_MODE=<value> - 支持的取值 :
0:以裸机或完全直通虚拟化模式启动 FM;1:以共享 NVSwitch 多租户模式启动 FM(详见"共享 NVSwitch 虚拟化模型");2:以 vGPU 多租户模式启动 FM(详见"vGPU 虚拟化模型")。
- 默认值 :
FABRIC_MODE=0
注意 :虽然仍支持
SHARED_FABRIC_MODE,但建议改用FABRIC_MODE。
Fabric Manager 重启模式
- 配置项 :
FABRIC_MODE_RESTART=<value> - 支持的取值 :
0:启动 FM 并完成初始化序列;1:启动 FM 并执行共享 NVSwitch 或 vGPU 多租户模式的弹性/重启序列。该选项等价于--restart命令行参数,可在不修改 FM 进程命令行参数的情况下启用共享 NVSwitch 或 vGPU 多租户模式弹性。关于 FM 弹性流程的更多信息,请参阅"Fabric Manager 弹性"章节。
- 默认值 :
FABRIC_MODE_RESTART=0
注意 :虽然仍支持
SHARED_FABRIC_MODE_RESTART配置项,但建议改用FABRIC_MODE_RESTART。
Fabric Manager API 接口
- 配置项 :
FM_CMD_BIND_INTERFACE=<value> - 支持的取值:在共享 NVSwitch 和 vGPU 多租户操作中,供 FM SDK/API 监听、并供 Hypervisor 与运行中的 FM 实例通信的网络接口。
- 默认值 :
FM_CMD_BIND_INTERFACE=127.0.0.1
Fabric Manager API TCP 端口
- 配置项 :
FM_CMD_PORT_NUMBER=<value> - 支持的取值:在共享 NVSwitch 和 vGPU 多租户操作中,供 Hypervisor 通过 FM SDK/API 与运行中的 FM 实例通信的 TCP 端口号。
- 默认值 :
FM_CMD_PORT_NUMBER=6666
Fabric Manager 域套接字接口
- 配置项 :
FM_CMD_UNIX_SOCKET_PATH=<value> - 支持的取值:在共享 NVSwitch 和 vGPU 多租户操作中,替代 TCP/IP 套接字、供 FM SDK/API 监听并与运行中的 FM 实例通信的 UNIX 域套接字路径。
- 默认值 :
FM_CMD_UNIX_SOCKET_PATH=<空值>
Fabric Manager 状态
- 配置项 :
STATE_FILE_NAME=<value> - 支持的取值:指定用于保存 FM 状态的文件名,以便在崩溃或正常退出后重启 FM。仅在启用共享 NVSwitch 或 vGPU 多租户模式时有效。
- 默认值 :
STATE_FILE_NAME=/tmp/fabricmanager.state
注意:该值仅在 DGX A100、HGX A100、DGX H100、HGX H100 基于 NVSwitch 的系统上有效。
杂项配置项
本节介绍杂项配置项。
禁止 Fabric Manager 守护进程化
- 配置项 :
DAEMONIZE=<value> - 支持的取值 :
0:不守护进程化,以普通进程运行 FM;1:以 UNIX 守护进程运行 FM。
- 默认值 :
DAEMONIZE=1
Fabric Manager 通信套接字接口
- 配置项 :
BIND_INTERFACE_IP=<value> - 支持的取值:用于监听 FM 内部通信/IPC 的网络接口,应为有效的 IPv4 地址。
- 默认值 :
BIND_INTERFACE_IP=127.0.0.1
注意:仅在 DGX A100、HGX A100、DGX H100 和 HGX H100 基于 NVSwitch 的系统上有效。
Fabric Manager 通信 TCP 端口
- 配置项 :
STARTING_TCP_PORT=<value> - 支持的取值:FM 内部通信/IPC 的起始 TCP 端口号,取值范围为 0 到 65535。
- 默认值 :
STARTING_TCP_PORT=16000
注意:仅在 DGX A100、HGX A100、DGX H100 和 HGX H100 基于 NVSwitch 的系统上有效。
Fabric Manager 通信的 Unix 域套接字
- 配置项 :
UNIX_SOCKET_PATH=<value> - 支持的取值:使用 Unix 域套接字而非 TCP/IP 套接字进行 FM 内部通信/IPC。空值表示不使用 Unix 域套接字。
- 默认值 :
UNIX_SOCKET_PATH=<空值>
注意:仅在 DGX A100、HGX A100、DGX H100 和 HGX H100 基于 NVSwitch 的系统上有效。
Fabric Manager 与子网管理器通信的套接字
- 配置项 :
FM_SM_IPC_INTERFACE=<value> - 支持的取值 :
- IPv4:
address:port - IPv6:
address:port - Unix:
//套接字文件绝对路径
- IPv4:
- 默认值 :
FM_SM_IPC_INTERFACE=/var/run/nvidia-fabricmanager/fm_sm_ipc.socket
控制流量的管理端口 GUID
- 配置项 :
FM_SM_MGMT_PORT_GUID=<value> - 支持的取值:从 CX 设备查询到的 U64 位数值,用于允许 FM 与底层 NVSwitch 通信。如果底层系统是 HGX B200/B300 且检测到用于 NVLink 互连管理的 CX 桥接设备,该信息将由 FM 服务启动脚本填充。如果同时提供了 FM 二进制文件的命令行参数和 fabricmanager.cfg 配置文件选项,命令行优先。
- 默认值 :
FM_SM_MGMT_PORT_GUID=0x0
Fabric Manager 系统拓扑文件位置
- 配置项 :
TOPOLOGY_FILE_PATH=<value> - 支持的取值:指定 FM 拓扑文件目录路径信息的配置选项。
- 默认值 :
TOPOLOGY_FILE_PATH=/usr/share/nvidia/nvswitch
注意:该拓扑文件配置选项不适用于 DGX B200/B300、NVIDIA HGX B200/B300 及更新的基于 NVSwitch 的系统。
高可用模式相关配置项
本节介绍高可用模式相关的配置项。
初始化失败时控制 Fabric Manager 行为
- 配置项 :
FM_STAY_RESIDENT_ON_FAILURES=<value> - 支持的取值 :
0:发生 NVSwitch 和 GPU 配置失败、典型软件错误等时,FM 服务将终止;1:发生 NVSwitch 和 GPU 配置失败、典型软件错误等时,FM 服务保持运行。但此时系统处于未初始化状态,CUDA 应用启动将失败。
- 默认值 :
FM_STAY_RESIDENT_ON_FAILURES=0
GPU 接入 NVLink 故障模式
- 配置项 :
ACCESS_LINK_FAILURE_MODE=<value> - 支持的取值:发生接入 NVLink 故障(GPU 到 NVSwitch 的 NVLink)时可用的高可用选项。关于支持的取值和行为,请参阅"支持的高可用模式"章节。
- 默认值 :
ACCESS_LINK_FAILURE_MODE=0
NVSwitch 干线 NVLink 故障模式
- 配置项 :
TRUNK_LINK_FAILURE_MODE=<value> - 支持的取值:发生干线链路故障(GPU 基板之间 NVSwitch 到 NVSwitch 连接)时可用的高可用选项。关于支持的取值和行为,请参阅"支持的高可用模式"章节。
- 默认值 :
TRUNK_LINK_FAILURE_MODE=0
NVSwitch 故障模式
- 配置项 :
NVSWITCH_FAILURE_MODE=<value> - 支持的取值:发生 NVSwitch 故障时可用的高可用选项。关于支持的取值和行为,请参阅"支持的高可用模式"章节。
- 默认值 :
NVSWITCH_FAILURE_MODE=0
Fabric Manager 服务停止或终止时的 CUDA 作业
- 配置项 :
ABORT_CUDA_JOBS_ON_FM_EXIT=<value> - 支持的取值 :
0:FM 服务停止或退出时,不中止正在运行的 CUDA 作业。新的 CUDA 作业启动将失败并报cudaErrorSystemNotReady错误;1:FM 服务停止或退出时,中止所有正在运行的 CUDA 作业。新的 CUDA 作业启动将失败并报cudaErrorSystemNotReady错误。
注意:该配置项在 DGX H100、NVIDIA HGX H100 及更新的基于 NVSwitch 的系统上无效,仅适用于裸机和完全直通虚拟化模型。
- 默认值 :
ABORT_CUDA_JOBS_ON_FM_EXIT=1
NVLink 子网管理器快速上手
本章介绍 NVLSM 的相关信息。
NVLink 子网管理器配置
NVLink 子网管理器(NVLSM)的配置选项和参数在 nvlsm.conf 文件中指定,默认从 /usr/share/nvidia/nvswitch/ 目录加载。
补充说明:
- 可以覆盖 nvlsm.conf 的内容,但错误的覆盖会导致互连管理失败;
- 如果某项配置未在 SM 配置文件中指定,SM 将使用默认值;
- 下文讨论的选项是对配置文件的补充,允许用户控制 NVLink 子网管理器的某些运行行为。
使用下述选项配置该文件时,请确保保留原配置文件内容。
要使用不同的配置文件,可通过 [-F <path> | --config <path>] 命令行参数运行 NVLSM。配置文件格式为 <key> <value>。
例如,要将 NVLSM 绑定到端口 GUID 为 0x0001 的 IB 端口,NVLSM 配置文件应包含以下行:
guid 0x0001
注意:NVLSM 配置文件在 NVLSM 服务启动时读取。如果修改了任何配置选项,需重启 FM 服务才能使新设置生效(该过程会同时重启 FM 和 NVLSM)。
配置 NVLink 子网管理器端口
该选项通过设置端口 GUID 值来控制 NVLSM 绑定的端口。该信息由作为 FM systemd 服务一部分运行的 FM 服务启动脚本填充。
- 配置项 :
guid <value> - 支持的取值:IB 端口 GUID。
配置 NVLink 子网管理器守护进程模式
该选项控制 nvlsm 以守护进程模式运行。
- 配置项 :
daemon <value> - 支持的取值 :
True:NVLSM 以守护进程模式启动;False:NVLSM 以前台进程模式启动。
- 默认值 :
daemon false
配置 NVLink 子网管理器加载 Fabric Manager GRPC 插件
要配置 NVLSM 加载用于 NVLSM→FM 通信的插件,使用以下插件配置:
- 配置项 :
plugin_name grpc_mgr
配置 GRPC 插件属性
NVLSM GRPC 插件的配置通过 NVLSM 的 plugin_options 参数传递,需指定插件名称、插件参数及其取值。
- 配置项 :
plugin_options [<插件名> <插件参数> <值>]
要配置 GRPC 插件监听地址,设置 GRPC 插件的 grpc_server_address 参数。以下示例配置 GRPC 插件监听 /var/run/nvidia-fabricmanager/fm_sm_ipc.socket 这个 UNIX 域套接字文件路径:
plugin_options grpc_mgr --grpc_server_address unix:/var/run/nvidia-fabricmanager/fm_sm_ipc.socket
设置日志文件位置和名称
- 配置项 :
log_file <value> - 支持的取值:日志的完整路径/文件名字符串,最大长度 256。
- 默认值 :
log_file /var/log/opensm.log
设置日志级别
该选项为标志位字段,控制日志详细程度。
- 配置项 :
log_flags <value> - 支持的位标志 :
- 0x01:ERROR(错误消息)
- 0x02:INFO(基本消息,量少)
- 0x04:VERBOSE(额外的信息性消息,中等量)
- 0x08:DEBUG(诊断信息,量大)
- 0x10:FUNCS(函数进入/退出,量极大)
- 0x20:FRAMES(转储所有 SMP 和 GMP 帧)
- 0x40:ROUTING(转储 FDB 路由信息)
- 0x80:SYS(除 NVLSM 日志外,同时以 LOG_INFO 级别写入 syslog)
- 默认值 :
log_flags 0x3
将日志重定向到 Syslog
该选项为标志位,控制写入 Syslog 的消息详细程度。
- 配置项 :
syslog_log_flags <value> - 支持的位标志 :
- 0x01:ERROR(错误消息)
- 0x02:INFO(基本消息,量少)
- 0x04:VERBOSE(额外的信息性消息,中等量)
- 0x08:DEBUG(诊断信息,量大)
- 0x10:FUNCS(函数进入/退出,量极大)
- 默认值 :
syslog_log_flags 0x0
设置日志文件追加行为
该选项决定跨多个 NVLSM 会话追加日志,还是在启动时截断现有日志文件。
- 配置项 :
accum_log_file <value> - 支持的取值 :
- TRUE:累积日志文件;
- FALSE:NVLSM 启动时截断日志文件。
- 默认值 :
accum_log_file TRUE
裸机模式
基于 NVSwitch 的 DGX 和 NVIDIA HGX 服务器系统的默认软件配置是将系统作为裸机运行,用于 AI、机器学习等工作负载。本章介绍支持裸机配置的 FM 安装要求。
Fabric Manager 软件包
每个 FM 发行版包含以下软件包:
- 核心 Fabric Manager (
nvidia-fabricmanager-<版本>):包含核心独立 FM 服务进程、服务单元文件和拓扑文件等必要组件。裸机场景只需安装此包。 - Fabric Manager SDK 与库 (
nvidia-fabricmanager-devel-<版本>):devel 包包含 FM 共享库及相关头文件。在实现共享 NVSwitch 和 vGPU 多租户虚拟化模型时,此包必不可少。
安装 Fabric Manager
本节介绍 FM 的安装方法。
在基于 NVSwitch 的 DGX 服务器系统上
作为受支持的 DGX OS 软件包安装的一部分,所有基于 NVSwitch 的 DGX 系统都预装了 FM 服务。该服务在操作系统启动时启用并启动,默认安装配置支持裸机模式。
在基于 NVSwitch 的 NVIDIA HGX 服务器系统上
在基于 NVSwitch 的 NVIDIA HGX 系统上,需要手动安装 FM 服务,以配置 NVLink 和 NVSwitch 内存互连结构、支撑统一内存互连。FM 包可通过 NVIDIA CUDA 网络仓库获取。
使用第四代之前 NVSwitch 的系统
对于使用第四代之前 NVSwitch 的系统,使用以下安装说明。这里的"第四代之前"指 DGX B200/B300、NVIDIA HGX B200/B300 8-GPU 和 NVIDIA HGX B100 8-GPU 之前的一代。关于设置系统包管理器并从所需 CUDA 网络仓库下载软件包的更多信息,请参阅《NVIDIA 驱动安装快速入门指南》。
-
Debian 和 Ubuntu 系发行版:
sudo apt-get install cuda-drivers-fabricmanager-<driver-branch> -
Red Hat Enterprise Linux 8 和 9 系发行版:
sudo dnf module install nvidia-driver:<driver-branch>/fm -
SUSE Linux 系发行版:
sudo zypper install cuda-drivers-fabricmanager-<driver-branch>
注意 :上述命令中的
<driver-branch>应替换为所需的 NVIDIA 认证数据中心驱动分支号(例如 450)。
使用第四代 NVSwitch 的系统
DGX B200/B300、NVIDIA HGX B200/B300 8-GPU 和 NVIDIA HGX B100 8-GPU 系统使用第四代 NVSwitch(基于 NVIDIA NVLink5 协议),需要额外的 NVLSM 服务来配置 NVLink 和 NVSwitch。因此需要通过不同的软件包安装来获取所需组件。关于设置系统包管理器并从所需 CUDA 网络仓库下载软件包的更多信息,请参阅《NVIDIA 驱动安装快速入门指南》。
-
Debian 和 Ubuntu 系发行版:
sudo apt-get install -V nvidia-open-<driver-branch> sudo apt-get install -V nvlink5-<driver-branch>例如:
sudo apt-get install -V nvidia-open-570 sudo apt-get install -V nvlink5-570 -
Red Hat Enterprise Linux 8 和 9 系发行版:
sudo dnf module install nvidia-driver-<driver-branch>-open sudo dnf install nvlink-<driver-branch>例如:
sudo dnf module install nvidia-driver-570-open sudo dnf install nvlink-570
注意 :在基于 NVSwitch 的 NVIDIA HGX 系统上,如果使用单独软件包而非元软件包(meta package)安装,请在安装 FM 之前先安装兼容的 NVIDIA 数据中心 GPU 驱动。安装过程中,FM 服务单元文件(
nvidia-fabricmanager.service)会被复制到 systemd,但系统管理员必须手动启用并启动 FM 服务。
最低 NVIDIA 驱动 / Fabric Manager 版本
各平台的 NVIDIA 数据中心 GPU 驱动包最低版本如下:
- NVIDIA HGX-2 和 NVIDIA HGX A100 系统:450.xx 版本;
- NVIDIA HGX H100 系统:525.xx 版本;
- NVIDIA HGX B200/B300 和 NVIDIA HGX B100 系统:570.xx 版本。
FM 的默认安装模式和配置文件选项支持裸机模式。
初始化 NVSwitch 和 NVLink
NVIDIA GPU 和 NVSwitch 内存互连结构是 PCIe 端点设备,需要 NVIDIA 内核驱动才能使用。在不支持 ALI 的 DGX-2、NVIDIA HGX-2、DGX A100 和 NVIDIA HGX A100 系统上,系统启动后,NVLink 连接在 NVIDIA 内核驱动加载后由 FM 配置启用。如果在 FM 完成系统初始化之前启动应用,或 FM 初始化系统失败,CUDA 初始化将失败并报 cudaErrorSystemNotReady 错误。
在支持基于 ALI 的 NVLink 训练的 DGX H100、NVIDIA HGX H100 及更新系统上,NVLink 在 GPU 和 NVSwitch 硬件层面完成训练,无需 FM 参与。要启用 NVLink 点对点支持,GPU 必须向 NVLink 互连结构注册。如果某 GPU 注册失败,它将失去 NVLink 点对点能力,仅可用于非点对点场景。CUDA 初始化过程将在 GPU 完成向 NVLink 互连结构的注册后开始。
GPU 互连注册状态通过 NVML API 以及 nvidia-smi -q 命令输出暴露。参见以下 nvidia-smi 命令输出。
GPU 正在注册时的互连状态输出:
nvidia-smi -q -i 0 | grep -i -A 2 Fabric
Fabric
State : In Progress
Status : N/A
GPU 成功注册后的互连状态输出:
nvidia-smi -q -i 0 | grep -i -A 2 Fabric
Fabric
State : Completed
Status : Success
FM 和 NVLSM 在基于 NVSwitch 的系统功能中扮演关键角色,这些功能通常在系统启动或工作负载激活时触发。一般情况下无需间歇性重启服务,但如果因工作流要求或作为 GPU 复位操作的一部分而必须重启,请完成以下步骤(适用于 DGX H100、NVIDIA HGX H100 及更新系统),以确保系统恢复到一致状态:
- 停止所有 CUDA 应用和 GPU 相关服务:
- 停止所有正在使用 GPU 的 CUDA 应用和服务(如 DCGM);
nvidia-persistenced服务可以保持运行。
- 停止 FM 服务。
- 运行
nvidia-smi -r命令复位 GPU。 - 重启 FM 服务并恢复其功能。
- 恢复第 1 步中停止的服务。
- 按需启动 CUDA 应用。
注意:系统管理员可以设置 GPU 应用启动器服务(如 SSHD、Docker 等)在 FM 服务启动之后再启动。关于设置服务依赖关系和启动顺序的更多信息,请参阅所用 Linux 发行版的手册。不支持通过 CX 接口使用 InfiniBand 工具。
运行时 NVSwitch 和 GPU 错误
当 NVSwitch 端口或 GPU 产生运行时错误时,相关信息会被记录到操作系统的内核日志或事件日志中。NVSwitch 的错误报告以 SXid 前缀记录,GPU 的错误报告由 NVIDIA 驱动以 Xid 前缀记录。
NVSwitch SXid 错误使用以下报告格式:
<nvidia-nvswitchX: SXid (PCI:<switch_pci_bdf>): <SXid值>, <Fatal 或 Non-Fatal>, <链路号> <错误描述>
<用于进一步排查的原始错误信息>
以下是 SXid 错误日志示例:
[...] nvidia-nvswitch3: SXid (PCI:0000:c1:00.0): 28006, Non-fatal, Link 46 MC TS crumbstore MCTO (First)
[...] nvidia-nvswitch3: SXid (PCI:0000:c1:00.0): 28006, Severity 0 Engine instance 46 Sub-engine instance 00
[...] nvidia-nvswitch3: SXid (PCI:0000:c1:00.0): 28006, Data {0x00140004, 0x00100000, 0x00140004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}
GPU Xid 错误使用以下报告格式:
NVRM: GPU at PCI:<gpu_pci_bdf>: <gpu_uuid>
NVRM: GPU Board Serial Number: <gpu_serial_number>
NVRM: Xid (PCI:<gpu_pci_bdf>): <Xid值>, <原始错误信息>
以下是 Xid 错误日志示例:
[...] NVRM: GPU at PCI:0000:34:00: GPU-c43f0536-e751-7211-d7a7-78c95249ee7d
[...] NVRM: GPU Board Serial Number: 0323618040756
[...] NVRM: Xid (PCI:0000:34:00): 45, Ch 00000010
根据严重程度(致命与非致命)和受影响端口的不同,SXid 和 Xid 错误可能中止现有 CUDA 作业并阻止新 CUDA 作业启动。下一节介绍 SXid 和 Xid 错误的潜在影响及对应的恢复流程。
NVSwitch SXid 错误
本节介绍 NVSwitch SXid 错误。
非致命 SXid 错误
非致命 SXid 仅供参考,FM 不会终止正在运行的 CUDA 作业,也不会阻止新 CUDA 作业启动。现有 CUDA 作业应能继续运行,但根据错误类型,CUDA 作业可能出现性能下降、短时间无法推进等问题。
致命 SXid 错误
当致命 SXid 错误发生在连接 GPU 与 NVSwitch 的 NVSwitch 端口上时,相应错误会传播到 GPU。该 GPU 上运行的 CUDA 作业将被中止,GPU 可能报告 Xid 74 和 Xid 45 错误。FM 服务会在其日志文件和 syslog 中记录对应的 GPU 索引和 PCI 总线信息。系统管理员必须执行以下恢复流程,清除错误状态后才能将该 GPU 用于后续 CUDA 工作负载:
- 使用 NVIDIA 系统管理接口(
nvidia-smi)命令行工具复位指定的 GPU 以及受影响工作负载中所有参与的 GPU。详情请参阅nvidia-smi的-r或--gpu-reset选项及单 GPU 复位操作。如果问题仍然存在,重启系统或重新上电。
当致命 SXid 错误发生在连接两块 GPU 基板的 NVSwitch 端口上时,FM 将中止所有正在运行的 CUDA 作业并阻止新 CUDA 作业启动。作为中止 CUDA 作业的一部分,GPU 还会报告 Xid 45 错误。FM 服务会在其日志文件和 syslog 中记录相应错误信息。
- 为清除错误状态并成功启动后续 CUDA 作业,系统管理员必须完成以下恢复流程:
- 复位所有 GPU 和 NVSwitch;
- 停止 FM 服务;
- 停止所有正在使用 GPU 的应用;
- 使用
nvidia-smi命令行工具的-r或--gpu-reset选项复位所有 GPU 和 NVSwitch,不要 使用-i或--id选项; - 复位完成后,重新启动 FM 服务;
- 如果问题仍然存在,重启系统或重新上电。
注意:基于 NVSwitch 驱动的 SXid 致命/非致命错误报告机制不适用于 DGX B200/B300 和 NVIDIA HGX B200/B300 系统。
DGX B200/B300 和 NVIDIA HGX B200/B300 系统上的 NVSwitch 错误
NVSwitch SXID 错误不再适用于 DGX B200/B300 和 NVIDIA HGX B200/B300 系统。DCGM 现在通过名为 NVIDIA Switch Device Manager(NVSDM)的库获取 NVSwitch 相关错误。从 NVSwitch 获取的遥测计数器包括:
- 端口计数器(Port counters)
- ASIC 计数器(ASIC counters)
更多信息请参阅 NVOnline:1115699。
GPU Xid 错误
GPU Xid 消息表示发生了一般性 GPU 错误,可能指示以下类型之一的问题:
- 硬件问题;
- NVIDIA 软件问题;
- 用户应用问题。
当 GPU 遇到 Xid 错误时,该 GPU 上运行的 CUDA 作业通常会被中止。更多信息请参阅"NVSwitch SXid 错误"中的 GPU 复位流程。
在 DGX H100 和 NVIDIA HGX H100 系统上,FM 不再监控和记录 GPU 错误;NVIDIA 驱动会继续在 syslog 中监控和记录 GPU 错误。
与多实例 GPU(MIG)的互操作
多实例 GPU(MIG)可将一颗 NVIDIA A100、H100 或 B200/B300 GPU 划分为多个独立的 GPU 实例。这些实例同时运行,各自拥有独立的显存、缓存和流式多处理器。但是,启用 MIG 模式后,GPU NVLink 将被禁用(或不被使用),GPU 将失去 NVLink 点对点(P2P)能力。成功禁用 MIG 模式后,GPU NVLink 会重新启用,GPU NVLink P2P 能力随之恢复。
在基于 NVSwitch 的 DGX 和 NVIDIA HGX 系统上,FM 服务与 GPU MIG 实例互操作。在这些系统上,要在禁用 MIG 模式后成功恢复 GPU NVLink 点对点能力,FM 服务必须处于运行状态。在 DGX A100 和 NVIDIA HGX A100 系统上,启用 MIG 模式时对应的 GPU 侧 NVLink 和 NVSwitch 侧 NVLink 会停止训练,禁用 MIG 模式时会重新训练。而在 DGX H100、NVIDIA HGX H100 及更新系统上,GPU NVLink 在 MIG 模式下保持激活状态。
虚拟化模型
基于 NVSwitch 的系统支持多种模型,在多租户环境中隔离 NVLink 互连。在虚拟化环境中,VM 工作负载通常不可信,必须彼此隔离,并与主机或 Hypervisor 隔离。用于维持这种隔离的交换机不能由不可信的 VM 直接控制,必须由可信软件控制。
本章概览支持的虚拟化模型。
支持的虚拟化模型
基于 NVSwitch 的系统支持以下虚拟化模型:
- 完全直通(Full Passthrough)
- GPU 和 NVSwitch 内存互连结构(交换机)直通给访客 OS;
- 易于部署,对 Hypervisor/主机 OS 的改动最小;
- 双 GPU 和四 GPU VM 的 NVLink 带宽有所降低;
- 对于 DGX H100、NVIDIA HGX H100、DGX H200、NVIDIA HGX H200 和 NVIDIA HGX H20 系统,由于底层物理 NVLink 拓扑的原因,4 GPU VM 会经历不对称的 GPU NVLink 带宽;
- 对于 DGX B200/B300 和 NVIDIA HGX B200/B300 系统,由于系统只有 2 颗 NVSwitch,只能支持两个 2 GPU VM;
- 对于 1、2 或 4 GPU VM,需要额外的 Hypervisor 配置来禁用连接到其他 NVSwitch 子集的 GPU NVLink。
- 共享 NVSwitch 多租户模式
- 仅 GPU 直通给访客;
- NVSwitch 内存互连结构由名为服务虚拟机(Service VM)的专用可信 VM 管理;
- NVSwitch 内存互连结构由访客 VM 共享,但对访客不可见;
- 需要与 Hypervisor 最紧密的集成;
- 双 GPU 和四 GPU VM 可获得完整带宽;
- 访客 VM 与服务 VM 之间无需直接通信;
- 这是推荐选项------该模型支持 1、2、4 和 8 GPU VM,且在所有代际的 HGX 和 DGX 系统上 NVLink 能力一致。
- vGPU 多租户模式
- 仅 SR-IOV GPU VF 直通给访客;
- GPU PF 和 NVSwitch 内存互连结构由 vGPU 主机管理;
- NVSwitch 内存互连结构由所有访客 VM 共享,但对访客不可见;
- 双 GPU 和四 GPU VM 可获得完整带宽;
- 该模式与 vGPU 软件栈紧密耦合。
Fabric Manager SDK
FM 提供一个共享库、一组 C/C++ API(SDK)及对应的头文件。当 FM 运行在共享 NVSwitch 和 vGPU 多租户模式时,该库和 API 用于与 FM 交互,以查询、激活和停用 GPU 分区。
所有 FM 接口 API 定义、库、示例代码及相关数据结构定义都以单独的开发包(RPM/Debian)交付。要编译本用户指南中的示例代码,请安装该开发包。
数据结构
c
// FM 支持的最大 GPU/互连分区数量
#define FM_MAX_FABRIC_PARTITIONS 64
// FM 支持的最大 GPU 数量
#define FM_MAX_NUM_GPUS 16
// FM 支持的每个 NVLink 设备的最大端口数
#define FM_MAX_NUM_NVLINK_PORTS 64
// fmConnect() 的连接选项
typedef struct
{
unsigned int version;
char addressInfo[FM_MAX_STR_LENGTH];
unsigned int timeoutMs;
unsigned int addressIsUnixSocket;
} fmConnectParams_v1;
typedef fmConnectParams_v1 fmConnectParams_t;
// VF PCI 设备信息
typedef struct
{
unsigned int domain;
unsigned int bus;
unsigned int device;
unsigned int function;
} fmPciDevice_t;
// 存储属于某互连分区的一颗 GPU 的信息
typedef struct
{
unsigned int physicalId;
char uuid[FM_UUID_BUFFER_SIZE];
char pciBusId[FM_DEVICE_PCI_BUS_ID_BUFFER_SIZE];
unsigned int numNvLinksAvailable;
unsigned int maxNumNvLinks;
unsigned int nvlinkLineRateMBps;
} fmFabricPartitionGpuInfo_t;
// 存储一个互连分区的信息
typedef struct
{
fmFabricPartitionId_t partitionId;
unsigned int isActive;
unsigned int numGpus;
fmFabricPartitionGpuInfo_t gpuInfo[FM_MAX_NUM_GPUS];
} fmFabricPartitionInfo_t;
// 存储所有受支持互连分区的信息
typedef struct
{
unsigned int version;
unsigned int numPartitions;
unsigned int maxNumPartitions;
fmFabricPartitionInfo_t partitionInfo[FM_MAX_FABRIC_PARTITIONS];
} fmFabricPartitionList_v2;
typedef fmFabricPartitionList_v2 fmFabricPartitionList_t;
// 存储所有已激活互连分区 ID 的信息
typedef struct
{
unsigned int version;
unsigned int numPartitions;
fmFabricPartitionId_t partitionIds[FM_MAX_FABRIC_PARTITIONS];
} fmActivatedFabricPartitionList_v1;
typedef fmActivatedFabricPartitionList_v1 fmActivatedFabricPartitionList_t;
// 存储存在故障 NVLink 的 NVSwitch 或 GPU 的信息
typedef struct
{
char uuid[FM_UUID_BUFFER_SIZE];
char pciBusId[FM_DEVICE_PCI_BUS_ID_BUFFER_SIZE];
unsigned int numPorts;
unsigned int portNum[FM_MAX_NUM_NVLINK_PORTS];
} fmNvlinkFailedDeviceInfo_t;
// 存储存在故障 NVLink 的 NVSwitch 和 GPU 列表
typedef struct
{
unsigned int version;
unsigned int numGpus;
unsigned int numSwitches;
fmNvlinkFailedDeviceInfo_t gpuInfo[FM_MAX_NUM_GPUS];
fmNvlinkFailedDeviceInfo_t switchInfo[FM_MAX_NUM_NVSWITCHES];
} fmNvlinkFailedDevices_v1;
typedef fmNvlinkFailedDevices_v1 fmNvlinkFailedDevices_t;
/**
* 存储不受支持互连分区信息的结构体
*/
typedef struct
{
fmFabricPartitionId_t partitionId; //!< 用于引用该分区的唯一 ID
unsigned int numGpus; //!< 该分区中的 GPU 数量
unsigned int gpuPhysicalIds[FM_MAX_NUM_GPUS]; //!< 分配给该分区的每颗 GPU 的 physicalId
} fmUnsupportedFabricPartitionInfo_t;
/**
* 存储所有不受支持互连分区信息的结构体
*/
typedef struct
{
unsigned int version; //!< 版本号,使用 fmFabricPartitionList_version
unsigned int numPartitions; //!< 不受支持分区的总数
fmUnsupportedFabricPartitionInfo_t partitionInfo[FM_MAX_FABRIC_PARTITIONS]; /*!< 每个不受支持分区的详细信息 */
} fmUnsupportedFabricPartitionList_v1;
typedef fmUnsupportedFabricPartitionList_v1 fmUnsupportedFabricPartitionList_t;
#define fmUnsupportedFabricPartitionList_version1 MAKE_FM_PARAM_VERSION(fmUnsupportedFabricPartitionList_v1, 1)
#define fmUnsupportedFabricPartitionList_version fmUnsupportedFabricPartitionList_version1
注意 :在 DGX H100、NVIDIA HGX H100 及更新系统上,GPU 物理 ID(physical ID)信息与
nvidia-smi -q输出返回的 GPU 模块 ID(Module ID)信息取值相同。上报分区信息时,UUID、PCI 设备(BDF)等 GPU 信息为空。Hypervisor 软件栈应使用 GPU 物理 ID 信息来关联分区中的 GPU,并将这些 GPU 分配给对应分区的访客 VM。
初始化 Fabric Manager API 接口
初始化 FM API 接口库:
fmReturn_t fmLibInit(void)
参数
无
返回值
FM_ST_SUCCESS ------ FM API 接口库已正确初始化
FM_ST_IN_USE ------ FM API 接口库已处于初始化状态
FM_ST_GENERIC_ERROR ------ 发生了一般性的未指明错误
关闭 Fabric Manager API 接口
关闭 FM API 接口库以及通过 fmConnect() 建立的远程连接:
fmReturn_t fmLibShutdown(void)
参数
无
返回值
FM_ST_SUCCESS ------ FM API 接口库已正确关闭
FM_ST_UNINITIALIZED ------ 接口库未处于初始化状态
连接到运行中的 Fabric Manager 实例
连接到一个运行中的 FM 实例(该实例作为系统服务启动,或由系统管理员手动启动)。后续 API 将使用该连接与运行中的 FM 实例交换信息。
fmReturn_t fmConnect(fmConnectParams_t *connectParams, fmHandle_t *pFmHandle)
参数
connectParams
要连接的远程主机引擎的有效 IP 地址。如果 ipAddress 指定为
x.x.x.x,将尝试连接到 FM_CMD_PORT_NUMBER 指定的默认端口;
如果 ipAddress 指定为 x.x.x.x:yyyy,将尝试连接到 yyyy 指定的
端口。要连接到以 Unix 域套接字启动的 FM 实例,请在
addressInfo 成员中填写套接字路径,并设置 addressIsUnixSocket
标志。
pfmHandle
Fabric Manager API 接口的抽象句柄,用于后续 API 调用
返回值
FM_ST_SUCCESS ------ 成功连接到 FM 实例
FM_ST_CONNECTION_NOT_VALID ------ 无法联系到 FM 实例
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ pFmHandle 为 NULL,或 IP 地址/格式无效
FM_ST_VERSION_MISMATCH ------ 提供的参数版本不匹配
断开与 Fabric Manager 实例的连接
fmReturn_t fmDisconnect(fmHandle_t pFmHandle)
参数
pfmHandle
fmConnect 返回的句柄
返回值
FM_ST_SUCCESS ------ 成功断开与 FM 实例的连接
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ pFmHandle 不是有效句柄
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
获取受支持分区的列表
查询基于 NVSwitch 的系统中受支持的(静态)GPU 互连分区列表:
fmReturn_t fmGetSupportedFabricPartitions(fmHandle_t pFmHandle, fmFabricPartitionList_t *pFmFabricPartition)
参数
pFmHandle
fmConnect() 返回的句柄
pFmFabricPartition
指向 fmFabricPartitionList_t 结构体的指针。成功时,受支持的
(静态)分区信息列表将填充到该结构体中。
返回值
FM_ST_SUCCESS ------ 成功查询受支持分区列表
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
FM_ST_NOT_CONFIGURED ------ Fabric Manager 正在初始化,无数据
FM_ST_VERSION_MISMATCH ------ 提供的参数版本不匹配
激活 GPU 分区
在基于 NVSwitch 的系统中激活一个受支持的 GPU 互连分区:
注意:此 API 仅在共享 NVSwitch 多租户模式下受支持。
fmReturn_t fmActivateFabricPartition(fmHandle_t pFmHandle, fmFabricPartitionId_t partitionId)
参数
pFmHandle
fmConnect() 返回的句柄
partitionId
要激活的分区 ID
返回值
FM_ST_SUCCESS ------ 成功激活分区
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效或分区 ID 不受支持
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
FM_ST_NOT_CONFIGURED ------ Fabric Manager 正在初始化,无数据
FM_ST_IN_USE ------ 指定分区已激活,或其中的 GPU 正被其他分区使用
使用虚拟功能(VF)激活 GPU 分区
在 vGPU 虚拟化模式下,使用 vGPU 虚拟功能(VF)激活一个可用的 GPU 互连分区:
fmReturn_t fmActivateFabricPartitionWithVFs(fmHandle_t pFmHandle, fmFabricPartitionId_t partitionId, fmPciDevice_t *vfList, unsigned int numVfs)
参数
pFmHandle
fmConnect() 返回的句柄
partitionId
要激活的分区 ID
vfList
与分区中物理 GPU 关联的 VF 列表。传递给此调用的 VF 顺序很
重要------尤其对于迁移/挂起/恢复兼容性,每次激活该分区时都应
使用相同的顺序。
numVfs
VF 数量
返回值
FM_ST_SUCCESS ------ 成功激活分区
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效或分区 ID 不受支持
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
FM_ST_NOT_CONFIGURED ------ Fabric Manager 正在初始化,无数据
FM_ST_IN_USE ------ 指定分区已激活,或其中的 GPU 正被其他分区使用
注意:重要提示------启动 vGPU VM 之前必须调用此 API,即使只有一个 vGPU 分区。如果对应 GPU 上启用了 MIG 模式,多 vGPU 分区激活将失败。
停用 GPU 分区
当 FM 运行在共享 NVSwitch 或 vGPU 多租户模式时,停用先前激活的 GPU 互连分区:
fmReturn_t fmDeactivateFabricPartition(fmHandle_t pFmHandle, fmFabricPartitionId_t partitionId)
参数
pFmHandle
fmConnect() 返回的句柄
partitionId
要停用的分区 ID
返回值
FM_ST_SUCCESS ------ 成功停用分区
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效或分区 ID 不受支持
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
FM_ST_NOT_CONFIGURED ------ Fabric Manager 正在初始化,无数据
FM_ST_UNINITIALIZED ------ 指定分区未激活
重启 Fabric Manager 后设置已激活分区列表
在 FM 重启后,向 FM 发送当前已激活互连分区的列表:
注意:如果 FM 重启时没有任何活动分区,则必须以分区数为零调用此接口。
fmReturn_t fmSetActivatedFabricPartitions(fmHandle_t pFmHandle, fmActivatedFabricPartitionList_t *pFmActivatedPartitionList)
参数
pFmHandle
fmConnect() 返回的句柄
pFmActivatedPartitionList
当前已激活互连分区的列表
返回值
FM_ST_SUCCESS ------ FM 状态已用活动分区信息更新
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
获取存在故障 NVLink 的设备列表
查询 FM 初始化过程中发现的存在故障 NVLink 的所有 GPU 和 NVSwitch:
注意 :当 FM 运行在共享 NVSwitch 或 vGPU 多租户弹性重启(
--restart)模式时,不支持此 API。
fmReturn_t fmGetNvlinkFailedDevices(fmHandle_t pFmHandle, fmNvlinkFailedDevices_t *pFmNvlinkFailedDevices)
参数
pFmHandle
fmConnect() 返回的句柄
pFmNvlinkFailedDevices
存在故障 NVLink 的 GPU 或 NVSwitch 设备列表
返回值
FM_ST_SUCCESS ------ 成功查询存在故障 NVLink 的设备列表
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
FM_ST_NOT_CONFIGURED ------ Fabric Manager 正在初始化,无数据
FM_ST_VERSION_MISMATCH ------ 提供的参数版本不匹配
注意 :在 DGX H100、NVIDIA HGX H100 及更新系统上,NVLink 通过 ALI 特性在 GPU 和 NVSwitch 硬件层面完成训练,无需 FM 协调。在这些系统上,FM 对此 API 将始终返回
FM_ST_SUCCESS和空列表。
获取不受支持分区的列表
当 FM 运行在共享 NVSwitch 或 vGPU 多租户模式时,查询所有不受支持的互连分区:
fmReturn_t fmGetUnsupportedFabricPartitions(fmHandle_t pFmHandle,
fmUnsupportedFabricPartitionList_t *pFmUnupportedFabricPartition)
参数
pFmHandle
fmConnect() 返回的句柄
pFmUnupportedFabricPartition
系统上不受支持互连分区的列表
返回值
FM_ST_SUCCESS ------ 成功查询不受支持分区列表
FM_ST_UNINITIALIZED ------ FM 接口库尚未初始化
FM_ST_BADPARAM ------ 输入参数无效
FM_ST_GENERIC_ERROR ------ 发生了未指明的内部错误
FM_ST_NOT_SUPPORTED ------ 请求的特性不受支持或未启用
FM_ST_NOT_CONFIGURED ------ Fabric Manager 正在初始化,无数据
FM_ST_VERSION_MISMATCH ------ 提供的参数版本不匹配
注意 :在 DGX H100、NVIDIA HGX H100 及更新系统上,此 API 将始终返回
FM_ST_SUCCESS和空的不受支持分区列表。
完全直通虚拟化模型
基于 NVSwitch 的系统支持的第一种虚拟化模型是 GPU 和 NVSwitch 内存互连结构(交换机)的直通设备分配。系统支持 16、8、4、2 和 1 GPU 的 VM,每种 VM 规模对应预定义的 GPU 和 NVSwitch 子集。
一个 GPU 和 NVSwitch 的子集称为一个系统分区。不重叠的分区可以混合搭配------例如,在配备两块 GPU 基板的 NVSwitch 系统上,可以同时支持一个 8 GPU VM、一个 4 GPU VM 和若干 2 GPU VM。16 GPU 和 8 GPU 的 VM 没有带宽损失;更小的 VM 则因使用专用交换机实现隔离而有一定的带宽折损。
(图 7 ------ 双 GPU 虚拟机中的软件栈(完全直通模型)。)
支持的虚拟机配置
本节表格给出虚拟机配置信息。
| VM GPU 数 | NVSwitch 数 | 每 GPU NVLink | 每 NVSwitch NVLink | 约束 |
|---|---|---|---|---|
| 16 | 12 | 6/6 | 16/18 | 无 |
| 8 | 6 | 6/6 | 8/18 | 每块 GPU 基板出一组 8 颗 GPU |
| 4 | 3 | 3/6 | 4/18 | 每块 GPU 基板出两组 4 颗 GPU |
| 2 | 1 | 1/6 | 2/18 | 每块 GPU 基板出四组 2 颗 GPU |
| 1 | 0 | 0/6 | 0/18 | 无 |
(表 3 ------ DGX-2 和 NVIDIA HGX-2 系统设备分配)
| VM GPU 数 | NVSwitch 数 | 每 GPU NVLink | 每 NVSwitch NVLink | 约束 |
|---|---|---|---|---|
| 16 | 12 | 12/12 | 32/36 | 无 |
| 8 | 6 | 12/12 | 16/36 | 每块 GPU 基板出一组 8 颗 GPU |
| 4 | 3 | 6/12 | 6/36 | 每块 GPU 基板出两组 4 颗 GPU |
| 2 | 1 | 2/12 | 4/36 | 每块 GPU 基板出四组 2 颗 GPU |
| 1 | 0 | 0/12 | 0/36 | 无 |
(表 4 ------ DGX A100 和 NVIDIA HGX A100 系统设备分配)
| VM GPU 数 | NVSwitch 数 | 每 GPU NVLink | 每 NVSwitch NVLink | 约束 |
|---|---|---|---|---|
| 8 | 4 | 18/18 | 其中两颗 NVSwitch 为 32/64,另两颗为 40/64 | 无 |
| 1 | 0 | 0/18 | 0/64 | 需要禁用 GPU NVLink |
(表 5 ------ DGX H100 和 NVIDIA HGX H100 系统设备分配)
注意:DGX H200、NVIDIA HGX H200 和 NVIDIA HGX H20 系统适用与 H100 相同的 VM 配置、NVLink 拓扑和 NVSwitch 分配。NVIDIA HGX H800 系统适用相同的分配,但 8 GPU VM 的 GPU NVLink 总数为 8 条。
| VM GPU 数 | NVSwitch 数 | 每 GPU NVLink | 每 NVSwitch NVLink | 约束 |
|---|---|---|---|---|
| 8 | 2(间接)------实际直通的设备是 CX7 桥接设备 | 18/18 | 72/72 | 对于 DGX B200/B300 和 HGX B200/B300,不是直接直通 NVSwitch,而是直通 CX7 桥接设备。更多信息见后续章节 |
| 1 | 0 | 0/18 | 0/64 | 需要禁用 GPU NVLink |
(表 6 ------ DGX B200/B300 和 NVIDIA HGX B200/B300 系统设备分配)
16 GPU 虚拟机
要求如下:
- 所有可用的 GPU 和 NVSwitch 均分配给该访客 VM;
- NVSwitch 和 GPU 上没有禁用的 NVLink 互连;
- 要支持 16 GPU 分区,系统必须配备两块 GPU 基板。
8 GPU 虚拟机
要求如下:
- 每个 VM 有 8 颗 GPU,且同一基板上的 NVSwitch(DGX A100 和 NVIDIA HGX A100 为 6 颗,DGX H100 和 NVIDIA HGX H100 为 4 颗)必须分配给该访客 VM;
- 每颗 GPU 的所有 NVLink 互连均启用;
- 如果系统有两块 GPU 基板,则有两个可用的系统分区,可创建两个 8 GPU VM;否则只有一个可用分区;
- 禁用 GPU 基板之间的所有 NVLink 连接。
4 GPU 虚拟机
要求如下:
- 如果支持该配置,每个 VM 获得 4 颗 GPU 和 3 颗交换机;
- 如表 5 所述,每颗 GPU 仅启用部分 NVLink 互连;
- 如果系统配备两块 GPU 基板,系统上有 4 个可用分区;单基板系统有 2 个可用分区;
- 禁用 GPU 基板之间的所有 NVLink 连接。
2 GPU 虚拟机
要求如下:
- 如果支持该配置,每个 VM 获得 2 颗 GPU 和 1 颗 NVSwitch;
- 每颗 GPU 同样仅启用部分 NVLink 互连;
- 如果系统配备两块 GPU 基板,系统上有 8 个可用分区;单基板系统有 4 个可用分区;
- 禁用 GPU 基板之间的所有 NVLink 连接。
单 GPU 虚拟机
要求如下:
- 每个 VM 有 1 颗 GPU,无交换机;
- 如果系统配备两块 GPU 基板,系统上有 16 个可用分区;单基板系统有 8 个可用分区;
- 禁用 GPU 基板之间的所有 NVLink 连接。
其他要求
- Hypervisor 需要维护分区配置,包括每个分区中每颗 GPU 和每颗交换机上需要阻断哪些 NVLink 连接;
- Hypervisor 需要对 NVSwitch 实现 MMIO 过滤;
- Hypervisor 需要精细控制为 GPU 和交换机配置的 IOMMU 映射;
- 多于一颗 GPU 的访客 VM 需要运行 NVSwitch 核心软件栈,包括用于配置交换机和 NVLink 连接的 NVIDIA 驱动和 FM。
Hypervisor 操作流程
Hypervisor 通过以下步骤启动、关闭和重启访客 VM:
- 启动访客 VM:
- 选择一个未使用的 GPU 和交换机分区;
- 复位分区中的 GPU 和交换机;
- 通过执行指定的 MMIO 配置,阻断每颗 GPU 上被禁用的 NVLink 连接;
- 通过配置 MMIO 拦截,阻断每颗交换机上被禁用的 NVLink 连接;
- 避免在 GPU 和交换机之间配置 IOMMU 映射;
- 确保交换机不能被访客 VM 控制的任何其他 PCIe 设备访问:
- 这样交换机就无法绕过为 CPU 实施的 MMIO 限制;
- GPU 不需要被其他 GPU 或交换机访问;
- GPU 需要能被第三方设备访问,以支持 NVIDIA GPUDirect™ RDMA;
- 避免额外的 GPU 复位,启动访客 VM。
- 关闭访客 VM,并复位属于该分区的 GPU 和交换机。
- 重启访客 VM。
- 重复步骤 1a 至 1f,但此时分区已被选定。
NVIDIA HGX B200/B300 系统的额外步骤
在 NVIDIA HGX B200/B300 系统中,NVSwitch 不显示为 PCIe 设备------它们位于 CX7 桥接设备之后,对应的 4 个 CX7 设备物理功能(PF)必须直通给访客 VM。FM 和 NVLSM 服务通过该 CX7 桥接设备配置底层 NVSwitch、NVLink 和 GPU。
要从其他传统 CX7 网卡设备中识别出目标 CX7 桥接设备,可使用以下机制之一:
- 使用固定 PCIe BDF 分配:CX7 桥接设备是 GPU 基板的一部分。如果 GPU 基板的 PCIe 资源是静态分配的,这 4 个 PF 功能将始终保持不变。
- 通过 VPD 信息查询 :与传统 CX7 设备相比,CX7 桥接设备具有不同的 VPD 信息。使用
lspci -vvs或vpddecode命令查询 VPD 信息,即可识别出需要的 4 个 PF 功能。
监控错误
NVSwitch、GPU 和 NVLink 错误对访客 VM 可见。可使用以下方法之一让 Hypervisor 监控相同项目:
- 带内监控:在访客 VM 上运行 NVIDIA 数据中心 GPU 管理器(DCGM),或使用 NVIDIA 管理库(NVML)API 进行 GPU 专项监控;
- 带外监控:使用基于 GPU 和 NVSwitch SMBus 信箱接口(SMBPBI)的带外(OOB)命令。
限制
- NVSwitch 错误对访客 VM 可见;
- Windows 仅支持单 GPU VM。
共享 NVSwitch 虚拟化模型
本章介绍共享 NVSwitch 虚拟化模型。
软件栈
下图展示了共享 NVSwitch 虚拟化模型的软件栈。
图 6:共享 NVSwitch 软件栈
与完全直通模型相比,主要区别在于:
-
Fabric Manager 和 NVIDIA 驱动运行在服务虚拟机(service VM)上。
-
客户服务虚拟机(guest VM)运行一个轻量级驱动,而不运行完整的 NVIDIA 驱动。
-
服务 VM 和客户 VM 之间通过一套内部库 / 传输层进行交互。该接口不会暴露给客户 VM 中的应用。
客户 VM 与服务 VM 的交互
本图展示了客户 VM 与服务 VM 之间的交互流程。
图 7:共享 NVSwitch 模型中的 GPU 激活
-
管理员向服务 VM 中的 Fabric Manager 发出为指定一组 GPU 激活分区的请求。
-
Fabric Manager 在 NVSwitch 硬件上设置所需的 NVLink 路由。
-
管理员为某个客户 VM 分配属于该已激活分区的一组 GPU(GPU 和 NVSwitch VF BAR)。
-
当客户 VM 启动时,客户驱动会验证这些 GPU 的 NVLink 连接是否可用。
-
客户驱动向服务 VM 中的驱动发起 GPU 初始化序列。
-
服务 VM 驱动返回成功或失败状态。
-
如果状态为成功,客户 VM 中的应用就可以开始通过 NVLink 在多 GPU 之间进行 P2P CUDA IPC 操作。
准备服务虚拟机
本节介绍如何准备服务虚拟机。
操作系统镜像
服务 VM 应安装支持 NVIDIA vGPU 软件的 Linux 操作系统。NVIDIA vGPU 软件包含一个 KVM 的 QEMU 分支,用于在 Hypervisor 上创建和管理虚拟机。请参考相应的 vGPU 文档以获取受支持 Linux 操作系统列表的完整信息。
资源需求
创建服务 VM 时应满足以下资源需求:
| 组件 | 资源 |
|---|---|
| CPU | 2 个 vCPU |
| 内存 | 4 GB |
| 磁盘 | 4 GB 可用磁盘空间 |
| 网络接口 | 1 个虚拟网络接口(virtio 类型) |
| 显示 | 无(无头模式) |
| 设备 | 所有 GPU(PF)、所有 NVSwitch(PF) |
表 7:服务 VM 资源需求
所有 GPU 和 NVSwitch 设备都必须分配给服务 VM。
NVIDIA 软件包
服务 VM 上需要安装以下软件包:
-
数据中心版 NVIDIA GPU 驱动
-
NVIDIA Fabric Manager 服务
-
nvidia-fabricmanager-dev 软件包(包含 SDK 头文件、示例和库)
Fabric Manager 配置文件修改
-
将
FABRIC_MODE配置项设置为1。 -
重启 Fabric Manager 服务:
$ sudo systemctl restart nvidia-fabricmanager。
Fabric Manager 组播(NVLink SHARP)资源分配
在 DGX H100、NVIDIA HGX H100、DGX B200 和 NVIDIA HGX B200 等共享 NVSwitch 系统上运行工作负载时,NVLink SHARP 组播槽位在多 GPU VM 之间的分配如下:
| 多 GPU VM | 组播槽位分配 |
|---|---|
| 8 GPU | 100% |
| 4 GPU | 50% |
| 2 GPU | 25% |
| 1 GPU | 0 |
在激活分区之前,可以使用 FM_CMD_GET_MULTIPART_ID_LIST Fabric Manager API 从 Fabric Manager 查询槽位分配信息。
其他 NVIDIA 软件包
注意:服务 VM 上不安装 CUDA 工具包和 CUDA 示例。
准备客户虚拟机
本节介绍如何准备客户虚拟机。
操作系统镜像
客户 VM 应安装支持 NVIDIA vGPU 软件的 Linux 操作系统。请参考相应的 vGPU 文档以获取受支持操作系统列表的完整信息。
资源需求
资源需求取决于客户需求。GPU 设备将作为 VF BAR 分配给客户 VM。
NVIDIA 软件包
客户 VM 需要以下 NVIDIA 软件包:
-
NVIDIA vGPU 客户驱动
-
CUDA 工具包
Fabric Manager 配置文件修改
-
将
FABRIC_MODE配置项设置为1。 -
无需重启服务。
示例:分区激活 / 停用程序
c
/* fm_part.c */
/* nvlink partition activation/deactivation */
/* fmCmdHandler helps connecting to FM instance and sending
* command requests */
#include "fmCmdHandler.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
fmReturn_t fmReturn;
fmHandle_t fmHandle;
unsigned int numSupportedPartitions;
fmFabricPartitionList_t partitionList = {0};
fmFabricPartitionId_t partitionId = 0;
int i = 0, activate = -1;
if (argc != 3) {
printf("Usage: <binary> <partition id> <1 for activation 0 for deactivation>\n");
return -1;
}
partitionId = atoi(argv[1]);
activate = atoi(argv[2]);
/* check partition is 0 or 1*/
if (activate < 0 || activate > 1) {
printf("Pass 1 for activation and 0 for deactivation of a partition\n");
return -1;
}
/* initialize the FM library */
fmReturn = fmLibInit();
if (fmReturn != FM_RET_SUCCESS) {
printf("Error in fmLibInit %d\n", fmReturn);
return -1;
}
/* connect to the FM instance */
fmReturn = fmConnect((char*)"127.0.0.1", &fmHandle);
if (fmReturn != FM_RET_SUCCESS) {
printf("Error connecting to FM instance %d\n", fmReturn);
return -1;
}
/* get a list of partitions supported on the system */
fmReturn = fmGetSupportedFabricPartitions(fmHandle, &partitionList);
if (fmReturn != FM_RET_SUCCESS) {
printf("Error getting supported partitions %d\n", fmReturn);
return -1;
}
/* Iterate through supported partitions and print partition id,
number of devices */
numSupportedPartitions = partitionList.numPartitions;
for (i = 0; i < numSupportedPartitions; i++) {
printf("Partition ID: %d Num devices: %d\n",
partitionList.partitionInfo[i].partitionId,
partitionList.partitionInfo[i].numGpus);
}
/* Activate/deactivate a partition specified by the user */
if (activate) {
fmReturn = fmActivateFabricPartition(fmHandle, partitionId);
} else {
fmReturn = fmDeactivateFabricPartition(fmHandle, partitionId);
}
if (fmReturn != FM_RET_SUCCESS) {
printf("Error in partition Activation/deactivation: %d\n", fmReturn);
return -1;
}
/* Disconnect from FM instance */
fmDisconnect(fmHandle);
return 0;
}
使用以下命令编译上述程序:
gcc -I /usr/local/cuda/include fm_part.c -o fm_part -L /usr/lib/x86_64-linux-gnu -lnvfm
运行示例($ ./fm_part 1 1):
-
第一个参数:分区 ID。传入
$ ./fm_part 1 1将在 DGX A100/HGX A100 系统上激活分区 1。 -
第二个参数:1 表示激活,0 表示停用。
服务 VM 与客户 VM 生命周期
本节介绍服务 VM 与客户 VM 的生命周期。
启动 VM
-
启动服务 VM。
-
检查 Fabric Manager 服务的状态:
$ systemctl status nvidia-fabricmanager。 -
使用示例 C 程序激活分区。
-
启动客户 VM。
停止 VM
-
确保客户 VM 上没有正在运行的 GPU 工作负载。
-
停止客户 VM。
-
使用示例程序停用分区。
-
停止服务 VM。
服务 VM 重新启动
-
建议不要在任何客户 VM 正在运行时重启服务 VM。
-
如果 Fabric Manager 服务崩溃,它将在默认 10 次尝试内尝试自动重启(请参考
START_RESTART_TIMEOUT配置项以修改默认行为)。 -
在服务 VM 完全重启之前,客户 VM 上的 CUDA 应用将无法运行。
-
正在运行的 CUDA 应用可能会失败,并伴随诸如
Xid 45之类的错误,需要重新启动。 -
如果没有客户 VM 正在运行,则必须遵循「停止 VM」流程,然后按照「启动 VM」流程启动 VM。
nvswitch-audit 工具
NVIDIA 提供了一个内部工具(nvswitch-audit)供 Hypervisor 管理员验证共享 NVSwitch 配置。该工具随 Fabric Manager 开发包一起提供,可用于:
-
检查 GPU 与 NVSwitch 之间的 NVLink 连接状态。
-
查询 GPU 分区状态。
-
验证客户 VM 之间的隔离性。
在共享 NVSwitch 模型中,访问(access)端口必须配置正确的共享和路由配置,路由设置应遵守 Hypervisor 指定的分区策略。
注意:该工具仅在服务 VM 中可用,仅用于验证目的,不用于修改任何配置。
运行方式:
$ nvswitch-audit [options]
选项说明:
-
-h:显示帮助信息。 -
-m:显示系统中所有已连接 GPU 的可达性矩阵(reachability matrix),表示 NVSwitch 上配置的访问 / 中继(trunk)端口掩码。 -
-r:验证 NVSwitch 上配置的访问 / 中继端口掩码路由是否有效,即端到端路由是否存在。 -
-t:验证 NVSwitch 路由配置是否符合 NVIDIA 共享 NVSwitch 参考分区设计。 -
-i:验证多租户隔离性,即属于一个客户 VM 的 GPU 是否无法与属于另一个客户 VM 的 GPU 通信。
以下是在 DGX A100 系统上执行 nvswitch-audit -m 的输出示例,显示了 8 个 GPU 的可达性矩阵:
GPU Reachability Matrix
==============================================================
GpuId 0 1 2 3 4 5 6 7
--------------------------------------------------------------
0 - 1 1 1 1 1 1 1
1 1 - 1 1 1 1 1 1
2 1 1 - 1 1 1 1 1
3 1 1 1 - 1 1 1 1
4 1 1 1 1 - 1 1 1
5 1 1 1 1 1 - 1 1
6 1 1 1 1 1 1 - 1
7 1 1 1 1 1 1 1 -
==============================================================
上述矩阵表示 GPU 0 到 7 之间相互可达(1 表示可达)。如果显示 0,则表示对应的 GPU 之间不可达。
限制
-
DGX B200、NVIDIA HGX B200 和 NVIDIA HGX B300 系统不支持共享 NVSwitch 虚拟化模型。这些系统应使用完全直通虚拟化模型。
-
不支持 FM 与 NVLSM 同时启用(两个实例不应配置为同时运行)。
vGPU 虚拟化模型
vGPU 虚拟化模型通过在受支持的 GPU 上启用 SR-IOV 并将一个 VF(或一组 VF)分配给 VM,从而支持 VF 直通。
-
GPU 的 NVLink 同一时间只能分配给一个 VF。
-
不支持属于不同 VM 或分区的 GPU 之间的 NVLink P2P。
有关受支持的 vGPU 功能、特性和配置的更多信息,请参阅《Virtual GPU Software User Guide》(虚拟 GPU 软件用户指南)。
软件栈
在 vGPU 虚拟化模型中:
-
NVSwitch 软件栈(FM 和交换芯片驱动)运行在 vGPU 主机上。
-
与裸机模式一样,物理 GPU 和 NVSwitch 由 vGPU 主机拥有和管理。
-
GPU 和 NVSwitch 的 NVLink 作为 FM 初始化的一部分完成训练和配置。
-
交换芯片路由表初始化为禁止 GPU 间通信的状态。
注意:基于第一代 NVSwitch 的系统(如 DGX-2 和 NVIDIA HGX-2)不支持基于 vGPU 的部署模型。
图 9:vGPU 软件栈
准备 vGPU 主机
本节介绍如何准备 vGPU 主机。
操作系统镜像
有关受支持的操作系统、Hypervisor 列表以及 vGPU 主机驱动软件的安装和配置信息,请参阅《Virtual GPU Software User Guide》。
NVIDIA 软件包
除了 NVIDIA vGPU 主机驱动软件外,vGPU 主机镜像还必须安装以下 NVIDIA 软件包:
-
FM 软件包
-
FM SDK 软件包
注意:这两个软件包的版本必须与驱动软件包版本相同。
Fabric Manager 配置文件修改
要支持 vGPU 虚拟化,请通过将 FM 配置项 FABRIC_MODE=2 来以 vGPU 虚拟化模式启动 FM 服务。
注意:在 FM 服务启动之前,NVSwitch 必须绑定到 nvidia.ko。在 DGX A100 和 NVIDIA HGX A100 系统上,所有 GPU 也必须在 FM 服务启动之前绑定到 nvidia.ko。
在 vGPU 虚拟化模式下,FM 支持弹性(resiliency)特性:当 FM 在 vGPU 主机上正常或异常退出后,处于活动状态的客户 VM 上的 GPU 之间仍可继续转发 NVLink 流量。为支持该特性,FM 使用 /tmp/fabricmanager.state 文件保存某些元数据信息。如需使用其他位置 / 文件存储该信息,请修改 FM 配置文件项 STATE_FILE_NAME 为新的路径和文件名。
默认情况下,FM 使用基于 TCP/IP 回环地址(127.0.0.1)的套接字接口进行通信。如需改用 Unix 域套接字,请修改 FM 配置文件选项 FM_CMD_UNIX_SOCKET_PATH 和 UNIX_SOCKET_PATH 为新的 Unix 域套接字名称。
Fabric Manager 共享库和 API
有关用于管理 vGPU 分区生命周期的 API 列表,请参阅「Fabric Manager SDK」章节。
Fabric Manager 弹性
有关 vGPU 虚拟化模式下 FM 弹性的更多信息,请参阅「弹性」章节。
vGPU 分区
有关 vGPU 虚拟化模型默认支持的分区,请参阅「GPU 分区」章节。
客户虚拟机生命周期管理
客户 VM 生命周期概述如下:
-
系统上电启动。
-
vGPU 主机驱动加载。
-
启用 SR-IOV。
-
FM 以 vGPU 虚拟化模式初始化。
-
NVLink 完成训练。
-
使用选定的 SR-IOV VF 激活分区。
-
启用 vGPU 的 VM 使用第 2 步选定的 VF 完成其生命周期。该生命周期可能包括启动、重启、关机、挂起、恢复和迁移等操作。
-
停用分区。
以下各节将更详细地介绍这些步骤。
激活分区并启动虚拟机
在激活分区并启动 vGPU VM 之前,必须先在物理 GPU 上启用 SR-IOV VF。
启动客户 VM 时,Hypervisor 必须执行以下操作:
-
选择一个可用的、包含客户 VM 所需 GPU 数量的 GPU 分区,并选择将在这些 GPU 上使用的 VF。
-
使用
fmActivateFabricPartitionWithVFs()API,请求 FM 以选定的一组 VF 激活该 GPU 分区。 -
使用选定的 VF 启动客户 VM。
注意:启动 vGPU VM 之前始终需要先激活分区,即使 VM 只使用一个 vGPU 也不例外。分区激活时与分配给 VM 时所用的 VF 顺序必须保持一致,以确保正确的挂起、恢复和迁移操作。
有关启用 SR-IOV VF 以及将 VF 分配给 VM 的更多信息,请参阅《Installing and Configuring the NVIDIA GPU Manager for Red Hat Linux KVM》。
停用分区
请勿在 VM 正在分区内的 GPU 上运行时停用分区。
停用分区的步骤:
-
关闭当前正在该分区中运行的客户 VM。
-
使用
fmDeactivateFabricPartition()API 请求 FM 停用该分区。
迁移虚拟机
仅支持在 GPU 数量、GPU 类型和 NVLink 拓扑完全相同的分区之间进行 VM 迁移。
更多信息请参阅《Migrating a VM Configured with vGPU》。
验证 GPU 路由
「验证 GPU 路由」中提到的 nvswitch-audit 命令行工具也可用于验证 vGPU 模式下的 NVSwitch 路由信息。建议在每次 VM 分区的激活和停用周期中定期运行该工具,以验证 GPU 可达性矩阵。
错误处理
有关 FM 初始化、分区和硬件特定错误及其处理方式的信息,请参阅「错误处理」章节。
客户虚拟机 GPU 错误
当客户 VM 处于活动状态时,GPU 运行时错误将像 Xid 错误一样记录在 vGPU 主机的 syslog 中。在 DGX A100 和 NVIDIA HGX A100 系统上,此环境不支持需要重新训练的 GPU NVLink 错误,必须完成客户 VM 的关机和启动流程才能恢复。
GPU 重置
如果 GPU 产生运行时错误或收到 Xid NVLink 错误,系统管理员可以清除相应的错误状态并通过 GPU 重置操作恢复 GPU。该操作必须在使用该 GPU 的 VM 关闭且相应分区停用之后 ,从 vGPU 主机发起。更多信息请参阅 nvidia-smi 命令行工具文档。
与 MIG 的互操作性
NVIDIA A100 和 NVIDIA HGX A100 上基于 MIG 的 vGPU 无法使用 NVLink。FM 的 vGPU 虚拟化模式仍可与 MIG 特性互操作,以支持部分 GPU 以 MIG 模式运行的使用场景。
在启动 Fabric Manager 服务之前启用 MIG
如果在 FM 启动之前在 GPU 上启用了 MIG,FM 将从其可用分区列表中移除包含处于 MIG 模式 GPU 的 GPU 分区。这些 GPU 分区将不可用于部署 VM。要在 GPU 上禁用 MIG 模式后重新启用分区,需要重启系统。
在启动 Fabric Manager 服务之后启用 MIG
在启动 FM 服务之后、且在包含该 GPU 的分区被激活之前,可以在任意 GPU 上启用 MIG 功能。
注意:即使 GPU 处于 MIG 模式,激活 GPU 分区也会返回成功。
在 DGX A100 和 NVIDIA HGX A100 系统上,如果分区中的某个 GPU 处于 MIG 模式,则激活多 GPU 分区将失败。在 DGX H100 和 NVIDIA HGX H100 系统上该流程将成功。
支持的高可用模式
FM 提供多种高可用模式(降级模式)配置,允许系统管理员在基于 NVSwitch 的系统出现硬件故障(如 GPU 故障、NVSwitch 故障、NVLink 连接故障等)时设置合适的策略。借助该特性,系统管理员可以在等待更换故障 GPU、基板等硬件期间,保留一部分可用 GPU 继续使用。
DGX A100、NVIDIA HGX A100 与 DGX H100、NVIDIA HGX H100 系统的行为有所不同(更多信息请参阅「错误处理」章节)。
常用术语
-
GPU Access NVLink(GPU 接入 NVLink):GPU 与 NVSwitch 之间的 NVLink 连接。
-
GPU Access NVLink 故障:GPU 与 NVSwitch 之间连接发生的故障。故障可能源于 GPU/NVSwitch 引脚故障、GPU 基板的机械故障或类似问题。
-
Trunk NVLink(中继 NVLink):连接两块 GPU 基板的链路。Trunk NVLink 仅存在于 NVSwitch 之间,通过 NVLink 桥接 PCB 和连接器传输。
-
Trunk NVLink 故障:发生在两块 GPU 基板托盘之间的中继 NVLink 故障。该故障可能源于背板连接器引脚损坏或类似问题。
-
NVSwitch 故障:被归类为 NVSwitch 内部故障的故障。该故障可能表现为 NVSwitch 未出现在 PCIe 总线上、发生 DBE 错误或类似问题。
-
GPU 故障:GPU 发生故障。该故障可能源于 NVLink 连接问题、PCIe 故障或类似问题。
注意:这些高可用模式及其对应的基于 NVSwitch 系统的动态重配置,是针对 FM 初始化期间检测到的错误而应用的。系统初始化完成后或 GPU 作业运行期间发生的运行时错误不会触发这些高可用模式策略。
GPU Access NVLink 故障
本节介绍 GPU Access NVLink 故障。
Fabric Manager 配置项
GPU Access NVLink 故障模式由以下配置项控制:
ACCESS_LINK_FAILURE_MODE=<value>
裸机行为
-
ACCESS_LINK_FAILURE_MODE=0在该模式下,FM 将发生 Access NVLink 故障的 GPU 从 NVSwitch 路由中移除,并配置其余 GPU 构成一个内存 fabric。发生 Access NVLink 故障的 GPU 将失去与其他 GPU 的 NVLink P2P 能力。故障 GPU 对 NVIDIA 软件栈(如 CUDA、NVML、NVIDIA-SMI 等)仍然可见,可用于非 NVLink 工作负载。
-
ACCESS_LINK_FAILURE_MODE=1在该模式下,如果系统有两块 GPU 基板且 GPU Access NVLink 跨基板连接,FM 将禁用对应的 NVSwitch 及其成对的 Trunk NVLink。这会将整个 fabric 的 NVLink P2P 带宽降至 5/6。如果某个 GPU 到多个 NVSwitch 的 Access NVLink 均发生故障,该选项会将此 GPU 从 NVSwitch 路由配置中移除并禁用其 NVLink P2P 能力。
-
此流程可使其余 GPU 保持完整的 NVLink P2P 带宽。
-
如果多个 GPU Access NVLink 故障指向同一个 NVSwitch,该 NVSwitch 将被禁用。
-
该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
-
共享 NVSwitch 与 vGPU 虚拟化行为
-
ACCESS_LINK_FAILURE_MODE=0在该模式下,FM 将发生 Access NVLink 故障的 GPU 从当前支持的 GPU 分区列表中移除。图 10 展示了双基板系统中一个 GPU 发生 Access NVLink 故障时的影响。故障 GPU 仍可用于单 GPU 分区。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
图 10:GPU Access NVLink 故障时的共享 NVSwitch 与 vGPU 分区
-
ACCESS_LINK_FAILURE_MODE=1在共享 NVSwitch 模式下,所有 GPU 分区均可用,但分区在整个 fabric 上的可用带宽将降至 5/6。如果一个 GPU 上有多条 Access NVLink 故障,该 GPU 将被移除,可用 GPU 分区将按前述方式调整。故障 GPU 仍可用于单 GPU 分区。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
注意:vGPU 多租户模式目前不支持
ACCESS_LINK_FAILURE_MODE=1配置。
Trunk NVLink 故障
本节介绍 Trunk NVLink 故障。
Fabric Manager 配置项
Trunk NVLink 故障模式由以下 FM 配置文件项控制:
TRUNK_LINK_FAILURE_MODE=<value>
注意:此选项仅适用于配备两块 GPU 基板的系统。
裸机行为
-
TRUNK_LINK_FAILURE_MODE=0在该模式下,当发生 Trunk NVLink 故障时,FM 将中止并使系统保持未初始化状态,所有 CUDA 应用启动都将失败并返回
cudaErrorSystemNotReady状态。但是,当FM_STAY_RESIDENT_ON_FAILURES=1时,将启用「带错误继续运行」选项,FM 服务继续运行,CUDA 应用启动将失败并返回cudaErrorSystemNotReady状态。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。 -
TRUNK_LINK_FAILURE_MODE=1在该模式下,如果某个 NVSwitch 存在一条或多条 Trunk NVLink 故障,该 NVSwitch 将与其对端 NVSwitch 一起被禁用。这会将整个 fabric 的可用带宽降至 5/6。如果多个 NVSwitch 存在 Trunk NVLink 故障,FM 将回退到
TRUNK_LINK_FAILURE_MODE=0行为。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
共享 NVSwitch 与 vGPU 虚拟化行为
-
TRUNK_LINK_FAILURE_MODE=0在该模式下,FM 将使用到 Trunk NVLink 的 GPU 分区从当前支持的 GPU 分区列表中移除,因此 16 GPU 分区和跨基板的 8 GPU 分区将被移除。其余分区将以完整 NVLink 带宽运行。该选项支持在一对相连的 NVSwitch 上发生不限数量的 Trunk NVLink 故障。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
-
TRUNK_LINK_FAILURE_MODE=1在共享 NVSwitch 模式下,GPU 分区将可用,但分区在整个 fabric 上的可用带宽将降至 5/6。当多条 Trunk NVLink 故障发生在同一对 NVSwitch 上时支持该选项。如果多条 Trunk NVLink 故障影响不同的 NVSwitch 对,FM 将回退到
TRUNK_LINK_FAILURE_MODE=0行为。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。注意:vGPU 多租户模式目前不支持
TRUNK_LINK_FAILURE_MODE=1配置。
NVSwitch 故障
本节介绍 NVSwitch 故障。
Fabric Manager 配置项
NVSwitch 故障模式由以下 FM 配置文件项控制:
NVSWITCH_FAILURE_MODE=<value>
裸机行为
-
NVSWITCH_FAILURE_MODE=0在该模式下,当发生 NVSwitch 故障时,FM 将中止并使系统保持未初始化状态,所有 CUDA 应用启动都将失败并返回
cudaErrorSystemNotReady状态。但是,当FM_STAY_RESIDENT_ON_FAILURES=1时,将启用「带错误继续运行」选项,FM 服务继续运行,CUDA 应用启动将失败并返回cudaErrorSystemNotReady状态。 -
NVSWITCH_FAILURE_MODE=1在该模式下,当发生 NVSwitch 故障时,该 NVSwitch 将与其对端 NVSwitch 一起被禁用。这会将整个 fabric 的可用带宽降至 5/6。如果发生多个 NVSwitch 故障,FM 将回退到
NVSWITCH_FAILURE_MODE=0。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
共享 NVSwitch 与 vGPU 虚拟化行为
-
NVSWITCH_FAILURE_MODE=0在该模式下,FM 将从故障 NVSwitch 所在基板上移除多 GPU 分区以及跨基板的 8 GPU 分区。在单基板系统中,仅支持单 GPU 分区。图 11 展示了 NVSwitch 故障时支持的分区。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。
图 11:NVSwitch 故障时的共享 NVSwitch 与 vGPU 分区
-
NVSWITCH_FAILURE_MODE=1在共享 NVSwitch 模式下,所有 GPU 分区均可用,但分区在整个 fabric 上的可用带宽将降至 5/6。如果发生多个 NVSwitch 故障,FM 将回退到
NVSWITCH_FAILURE_MODE=0行为。该模式仅在基于 NVSwitch 的 DGX A100 和 NVIDIA HGX A100 系统上有效。注意:vGPU 多租户模式目前不支持
NVSWITCH_FAILURE_MODE=1配置。
GPU 故障
本节介绍 GPU 故障。
裸机行为
FM 将忽略初始化失败、未出现在 PCI 总线上等情况的 GPU。FM 将在可用 GPU 之间建立路由并启用 NVLink P2P。
共享 NVSwitch 与 vGPU 虚拟化行为
FM 将继续初始化,并通过排除包含故障 GPU 的分区来调整当前支持的分区列表。图 12 展示了 GPU 缺失或初始化失败时支持的分区。
图 12:GPU 缺失或故障时的共享 NVSwitch 与 vGPU 分区
手动降级
手动降级可防止持续故障的 GPU、NVSwitch 或基板被 NVSwitch 系统软件栈枚举。根据故障组件的不同,系统管理员必须配置相应的操作。
GPU 排除
根据错误类型,某些 GPU 可能需要从系统中排除,以便 FM 能够成功初始化并配置其余 GPU 子集。基于上一代 GPU 的故障分析数据,建议将以下错误情况作为排除 GPU 的依据:
-
GPU 双比特 ECC 错误。
-
GPU 从 PCIe 总线上掉线。
-
GPU 无法在 PCIe 总线上枚举。
-
GPU 侧 NVLink 训练错误。
-
GPU 侧意外 XID。此类错误也可能由应用引发。
对于完全直通虚拟化,管理员必须识别应排除的 GPU。Hypervisor 必须确保不在已识别为排除候选的 GPU 上创建 VM。
GPU 排除流程
GPU 排除流程包括以下阶段:
-
运行中应用的错误处理。
-
诊断 GPU 故障。
-
修复错误。
每个阶段的具体步骤因系统运行在裸机模式还是虚拟化模式而异。以下各节分别介绍裸机和虚拟化平台的流程。
运行中应用的错误处理
GPU 在运行期间遇到的错误(如 GPU ECC 错误、GPU 掉线等)通过以下途径报告:
-
/var/log/syslog中的 XID 消息 -
DCGM
-
NVIDIA 管理库(NVML)
-
基于 GPU SMBPBI 的带外(OOB)命令
-
FM 日志文件
| 错误情况 | 运行中应用的错误特征 |
|---|---|
| GPU 双比特错误 | GPU 驱动输出 XID 48 |
| GPU 从 PCIe 总线掉线 | GPU 驱动输出 XID 79 |
| GPU 无法在总线上枚举 | 应用(CUDA 应用或 nvidia-smi 查询)看不到该 GPU |
| GPU 侧 NVLink 训练错误 | FM 向 /var/log/syslog 输出错误 |
| GPU 侧错误 | GPU 驱动输出其他 XID。此类错误也可能由应用引发。 |
表 8:错误情况与特征
诊断 GPU 故障
系统管理员可以编写自己的 GPU 监控 / 健康检查脚本来查找错误痕迹。此过程需要至少查询上述来源之一(syslog、NVML API 等)以收集必要数据。
DCGM 包含一个排除建议脚本,系统管理员可调用该脚本收集 GPU 错误信息。该脚本查询 DCGM 被动监控所收集的信息,以确定自上次 DCGM 守护进程启动以来是否发生了可能需要排除 GPU 的情况。作为执行的一部分,该脚本会调用一个验证测试,以确定运行已知良好的应用时是否产生了意外的 XID。用户可以阻止该验证测试运行,仅监控被动信息。
注意:DCGM 排除建议脚本代码仅供参考,系统管理员可根据需要扩展或编写自己的监控 / 健康检查脚本。有关排除建议脚本的更多信息(如其位置和支持的选项),请参阅 NVIDIA DCGM 文档。
带内 GPU 排除机制
基于 NVSwitch 系统上的 GPU 内核驱动可以配置为忽略一组 GPU,即使这些 GPU 已在 PCIe 总线上枚举。要排除的 GPU 通过内核模块参数以 GPU 唯一标识符(GPU UUID)指定。在识别系统中的 GPU 排除候选后,GPU 内核模块驱动将阻止应用使用该 GPU。如果某个 GPU UUID 在排除候选列表中,但在运行时未检测到该 UUID(因为该 UUID 属于不在本系统上的 GPU,或 GPU 板的 PCIe 枚举失败),则该 GPU 不被视为已排除。
可以通过在文件系统中使用 .conf 文件指定模块参数,使排除候选 GPU 列表在重启后保持持久。排除机制针对特定 GPU 而非基板上的物理位置。因此,如果某个 GPU 在排除候选列表中,之后被新 GPU 替换,新 GPU 将对系统可见,无需更新排除候选列表。反之,如果某个 GPU 已在系统上被排除,将其插入不同的 PCIe 插槽仍会阻止其对应用可见,除非更新排除候选列表。
更新 GPU 排除候选列表需要系统管理员手动干预。
内核模块参数
要排除的候选 GPU UUID 集合通过一个内核模块参数指定,该参数由一组以逗号分隔的 GPU UUID 组成。
- 可以在加载内核模块
nvidia.ko时指定内核参数:
insmod nvidia.ko NVreg_ExcludedGpus=uuid1,uuid2...
- 要使 GPU UUID 持久化,也可以使用
/etc/modprobe.d中的nvidia.conf文件指定排除候选 GPU UUID 集合:
options nvidia NVreg_ExcludedGpus=uuid1, uuid2...
将 GPU 添加到排除候选列表是系统管理员必须手动完成的步骤。
注意:先前支持的 NVreg_GpuBlacklist 模块参数选项已弃用,并将在未来版本中移除。
从排除候选列表中添加 / 移除 GPU
要从排除候选列表中添加或移除 GPU,系统管理员必须完成以下步骤:
-
如果 conf 文件不存在,为 NVIDIA 内核模块参数创建一个 conf 文件。
-
完成以下任务之一:
-
将要排除的 GPU 的 UUID 添加到 .conf 文件中。
-
从列表中移除该 GPU 的 UUID。
-
重启系统,以更新的模块参数加载内核驱动。
列出已排除的 GPU
已排除的 GPU 在 CUDA 应用中不可见,也无法通过 nvidia-smi -q 或 NVML 的基本查询看到。本节介绍如何识别 GPU 是否已被排除(例如,GPU 的 UUID 在排除候选列表中且 GPU 在系统中被检测到)。
nvidia-smi
可以使用新命令 nvidia-smi -B 或 nvidia-smi --list-excluded-gpus 获取已排除 GPU 的列表。
Procfs
procfs 条目 /proc/driver/nvidia/gpus/<PCI_ID>/information 可以指示 GPU 是否已被排除。
带外
更多信息请参阅《NVIDIA GPU SMBus Post-Box Interface (SMBPBI)》文档。
运行 GPU 排除脚本
本节介绍系统管理员在各种系统配置上运行 GPU 监控健康检查或 DCGM 排除建议脚本的推荐流程。
裸机和 vGPU 配置
系统管理员将在与应用程序相同的操作系统实例中运行裸机和 vGPU 虚拟化配置。
系统管理员遵循的一般流程如下:
-
定期对系统中的所有 GPU 和 NVSwitch 运行健康检查脚本或 DCGM 排除建议脚本。
-
(可选)监控系统日志,以触发健康检查脚本或 DCGM 排除建议脚本的运行。
-
根据健康检查或排除建议脚本的输出,将 GPU UUID 添加到排除候选列表。
-
如果使用 DCGM 排除建议脚本,请使用新的预期 GPU 数量更新排除建议脚本的定期运行配置。
-
重启系统,以更新的模块参数加载内核驱动。
完全直通虚拟化配置
虚拟化配置的主要区别在于 GPU 内核驱动留给客户 VM。因此,GPU 诊断和修复阶段的执行必须由 Hypervisor 通过 VM 配置机制完成。
Hypervisor 遵循的一般流程如下:
-
客户 VM 结束运行,将一组 GPU 和交换芯片的控制权交还给 Hypervisor。
-
Hypervisor 调用一个受 Hypervisor 信任的特殊测试 VM。
-
测试 VM 中应安装完整的 NVIDIA NVSwitch 核心软件栈,包括 GPU 驱动和 FM。
-
在该测试 VM 上运行健康检查脚本或 DCGM 排除建议脚本。
-
根据健康检查或排除建议脚本的输出,将 GPU UUID 添加到 Hypervisor 可读的数据库中。
-
Hypervisor 关闭测试 VM。
-
为防止该 GPU 被分配给未来的 VM 请求,Hypervisor 读取数据库,识别要排除的候选,并更新其资源分配机制。
更换 GPU 板后,为使 GPU 重新可用,Hypervisor 更新数据库。
共享 NVSwitch 虚拟化配置
在共享 NVSwitch 虚拟化配置中,系统管理员可以在专用测试 VM 中运行 GPU 健康检查脚本或 DCGM 排除建议脚本;在 DGX A100 和 NVIDIA HGX A100 系统上,也可以在 GPU 分区激活后立即在服务 VM 中运行。
在专用测试 VM 上运行 GPU 健康检查的流程:
-
客户 VM 完成运行,将分区中 GPU 的控制权交还给 Hypervisor。
-
共享 NVSwitch 客户 VM 关机流程完成后,再次激活同一个 GPU 分区。
-
Hypervisor 在这些 GPU 上调度一个受信任的特殊测试 VM。
-
在该测试 VM 上运行健康检查脚本或 DCGM 排除建议脚本。
-
根据健康检查或排除建议脚本的输出,将 GPU UUID 添加到 Hypervisor 可读的数据库中。
-
如果分区激活 / 停用周期持续失败,Hypervisor 可以考虑将该分区的所有 GPU UUID 添加到数据库中。
-
健康检查完成后,关闭测试 VM。
-
Hypervisor 读取数据库以识别排除候选,并将相应的 GPU 分区从其当前支持的分区中移除。
-
Hypervisor 的资源分配机制确保受影响的 GPU 分区不会被激活。
-
当服务 VM 重启时,Hypervisor 可以选择不将已排除的 GPU 绑定到服务 VM。这样,FM 将调整其当前支持的 GPU 分区。
-
更换 GPU 板后,Hypervisor 更新数据库使 GPU 重新可用,并以全部 GPU 重启服务 VM,重新启用之前禁用的 GPU 分区。
在 DGX A100 和 NVIDIA HGX A100 系统的服务 VM 上运行 GPU 健康检查的流程:
-
在共享 NVSwitch 分区激活流程中,
fmActivateFabricPartition()调用返回成功。 -
在 Hypervisor 分离 / 解绑分区中的 GPU 之前,在服务 VM 中对这些 GPU 运行所需的健康检查脚本或 DCGM 排除建议脚本。
-
根据健康检查或排除建议脚本的输出,将 GPU UUID 添加到 Hypervisor 可读的数据库中。
-
当健康检查失败时,Hypervisor 使用
fmDeactivateFabricPartition()执行分区停用流程,并推迟相应客户 VM 的启动。 -
如果分区激活 / 停用周期持续失败,Hypervisor 可以考虑将该分区的 GPU UUID 添加到数据库中。
-
Hypervisor 读取数据库以识别排除候选,并将相应的 GPU 分区从其当前支持的分区中移除。
-
Hypervisor 的资源分配机制确保受影响的 GPU 分区不会被激活。
-
服务 VM 重启后,Hypervisor 可以选择不将已排除的 GPU 绑定到服务 VM。这样,FM 将调整其当前支持的 GPU 分区。
更换 GPU 板后,Hypervisor 更新数据库使 GPU 重新可用,并以这些 GPU 重启服务 VM,重新启用之前禁用的 GPU 分区。
NVSwitch 排除
在 DGX A100 和 NVIDIA HGX A100 系统上,如果某个 NVSwitch 持续故障,系统管理员可以显式排除该 NVSwitch。
带内 NVSwitch 排除
与 GPU 排除功能类似,基于 NVSwitch 系统上的 NVSwitch 内核驱动可以配置为忽略某个 NVSwitch,即使该 NVSwitch 已在 PCIe 总线上枚举。如果 NVSwitch 排除候选在系统中,NVSwitch 内核模块驱动将阻止应用使用该 NVSwitch。如果某个 NVSwitch UUID 在排除候选列表中,但在运行时未检测到该 UUID(因为该 UUID 属于不在本系统上的 NVSwitch,或 NVSwitch 的 PCIe 枚举失败),则该 NVSwitch 不被视为已排除。
在配备两块 GPU 基板的 NVIDIA HGX A100 系统上,如果显式排除某个 NVSwitch,FM 将同时手动排除其跨 Trunk NVLink 的对端 NVSwitch。该行为可通过 NVSWITCH_FAILURE_MODE 高可用配置文件项进行配置。
内核模块参数
- 要将候选 NVSwitch UUID 指定为内核模块参数,运行以下命令:
insmod nvidia.ko NvSwitchExcludelist=<NVSwitch_uuid>
- 要使 NVSwitch UUID 持久化,使用
/etc/modprobe.d中的 nvidia.conf 文件指定 UUID:
options nvidia NvSwitchExcludelist=<NVSwitch_uuid>
系统管理员可以从 FM 日志文件中获取 NVSwitch UUID,并将该 UUID 添加到排除候选列表中。
注意:先前支持的 NvSwitchBlacklist 模块参数选项已弃用,并将在未来版本中移除。
注意:在 DGX B200/B300 和 NVIDIA HGX B200/B300 系统上,NVSwitch 不受内核 NVSwitch 驱动模块控制,因此无法使用内核模块参数排除 NVSwitch。
带外 NVSwitch 排除
有关 NVSwitch 的更多信息,请参阅《SMBus Post Box Interface (SMBPBI)》。