(大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第三章:【实践】环境搭建:驱动与基础组件(以 Mellanox/NVIDIA 为例)
本章详细介绍了搭建高性能网络环境的关键步骤,以Mellanox/NVIDIA网卡为例。首先强调选择官方MLNX_OFED驱动的重要性,详细指导驱动下载、安装与验证流程。随后讲解如何检查核心服务状态,使用ibstat等工具验证RDMA功能。针对InfiniBand网络,重点说明子网管理器OpenSM的配置与启动,这是IB网络正常运行的核心组件。通过本章实践,读者将获得一个基础链路畅通、可供上层应用使
第三章:【实践】环境搭建:驱动与基础组件(以 Mellanox/NVIDIA 为例)
理论的探讨到此为止,现在是动手实践的时刻。高性能网络的搭建如同建造一座大厦,地基的稳固与否直接决定了上层建筑的高度和稳定性。在本章中,这个“地基”就是正确的驱动安装、核心服务的运行,以及针对InfiniBand或RoCE的专属基础配置。我们将以Mellanox/NVIDIA ConnectX系列网卡(目前AI集群的绝对主流)为蓝本,详细拆解每一步操作,并点出其中最容易被忽视的重难点和“陷阱”。
完成本章后,你将拥有一个被操作系统正确识别、基础链路已经打通、并准备好进行上层应用(如NCCL)通信的RDMA环境。
3.1 实践起点:安装 OFED (OpenFabrics Enterprise Distribution) 驱动
你的高性能网卡,无论是工作在IB模式还是RoCE模式,都需要一个特殊的驱动程序包来释放其RDMA潜能。这个驱动包就是OFED。
-
什么是OFED?
OFED (OpenFabrics Enterprise Distribution) 是一个开源的软件包集合,它包含了驱动程序(内核模块)、用户空间库(如libibverbs,librdmacm)、诊断工具(如ibv_devinfo,ibdiagnet)以及管理服务,是Linux系统中使用RDMA技术的标准软件栈。 -
【重难点】选择正确的OFED版本:MLNX_OFED vs. Inbox Drivers
这是一个新手必须搞清楚的第一个关键决策点。- Inbox Drivers (内核自带驱动): 主流的Linux发行版(如Ubuntu, CentOS/RHEL)的内核中已经内置了一套基本的OFED驱动。
- 优点: 无需额外安装,开箱即用,对于简单的RDMA功能验证可能足够。
- 缺点(致命): 版本通常比较陈旧,可能不支持你最新款网卡的所有高级特性(例如硬件卸载、高级拥塞控制算法),性能优化不足,并且缺乏NVIDIA官方提供的丰富诊断工具和实用程序。
- MLNX_OFED (NVIDIA官方驱动包): 这是NVIDIA(前Mellanox)官方发布的、专门为其ConnectX系列网卡优化过的OFED驱动包。
- 优点:
- 性能最优: 包含了针对其硬件的最新性能优化和bug修复。
- 特性最全: 支持所有最新的硬件功能和协议增强。
- 工具最丰富: 附带了大量独有的、功能强大的管理和调试工具,如
mlxconfig,mstflint等,这些对于后续的配置和排错至关重要。 - 官方支持: 能够获得NVIDIA官方的技术支持。
- 缺点: 需要手动从NVIDIA官网下载并安装,安装过程比使用inbox驱动稍复杂。
- 优点:
实践结论: 对于任何生产环境或追求极致性能的AI训练集群,永远选择并安装与你的硬件和操作系统版本相匹配的最新稳定版MLNX_OFED驱动。使用内核自带驱动可能会让你在后续的性能调优和问题排查中陷入困境。
- Inbox Drivers (内核自带驱动): 主流的Linux发行版(如Ubuntu, CentOS/RHEL)的内核中已经内置了一套基本的OFED驱动。
-
安装MLNX_OFED实践步骤:
- 下载驱动: 访问NVIDIA官网的网络部分,根据你的网卡型号(如ConnectX-6 Dx)、操作系统(如Ubuntu 22.04)和架构(x86_64)选择并下载正确的MLNX_OFED ISO文件或tar包。
- 卸载旧驱动(如果存在): 如果系统之前安装过其他版本的OFED,最好先彻底卸载以避免冲突。MLNX_OFED包内通常带有卸载脚本。
- 安装依赖: 确保系统安装了编译内核模块所需的基本工具,如
gcc,make,kernel-devel等。# 以基于Debian/Ubuntu的系统为例 sudo apt-get update sudo apt-get install -y build-essential dkms # 以基于RHEL/CentOS的系统为例 sudo yum groupinstall -y "Development Tools" sudo yum install -y kernel-devel-$(uname -r) - 执行安装: 解压下载的驱动包,并以root权限运行其自带的安装脚本。
# 假设驱动包已解压到 ./MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu22.04-x86_64 cd ./MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu22.04-x86_64 sudo ./mlnxofedinstall --with-nvmf --with-rdma-val --all--with-nvmf: 安装NVMe over Fabrics目标驱动,适用于存储网络。--with-rdma-val: 安装RDMA验证工具集(rping等)。--all: 安装所有软件包,这是最省事的选择,确保所有工具都可用。
- 重启或重载服务: 安装完成后,脚本通常会提示你重启系统或重启
openibd服务。强烈建议直接重启服务器,以确保所有新的内核模块都已正确加载,并且系统处于一个干净的状态。sudo reboot
3.2 关键组件:驱动装完后,必须检查的核心服务和工具
重启服务器后,我们需要立即验证驱动是否安装成功,以及RDMA的核心服务是否已正常运行。
-
检查
openibd服务状态openibd(或在较新系统中被rdma-core服务取代) 是一个管理RDMA设备状态和加载相应模块的守护进程。它是所有RDMA功能的基础。systemctl status openibd或者
systemctl status rdma一个健康的输出应该包含
active (exited)或active (running),并且日志中没有任何明显的错误信息。● openibd.service - openibd - configure Mellanox devices Loaded: loaded (/usr/lib/systemd/system/openibd.service; enabled; vendor preset: disabled) Active: active (exited) since Mon 2025-11-03 10:30:00 CST; 2h ago Process: 1234 ExecStart=/etc/init.d/openibd start (code=exited, status=0/SUCCESS) Main PID: 1234 (code=exited, status=0/SUCCESS)如果服务
failed,你需要使用journalctl -u openibd查看详细日志,定位失败原因,通常与内核模块编译失败或固件问题有关。 -
使用
ibstat和ibv_devinfo深入检查
在第一章我们已经用ibv_devinfo做了初步探查。现在,在MLNX_OFED安装后,我们再次使用它和它的兄弟命令ibstat进行更深入的验证。ibstat输出示例:
CA 'mlx5_0' CA type: ConnectX-6 Number of ports: 1 Firmware version: 20.32.1010 Hardware version: 0 Node GUID: 0xec0d9a0300625a94 System image GUID: 0xec0d9a0300625a94 Port 1: State: Active Physical state: LinkUp Rate: 200 (NDR) Base lid: 3 LMC: 0 SM lid: 1 Capability mask: 0x199194a8 Port GUID: 0xec0d9a0300625a95 Link layer: InfiniBand关键检查点:
- CA type: 必须与你的物理网卡型号(如ConnectX-6)匹配。
- Firmware version: 记录下固件版本。有时性能问题或bug需要通过升级固件来解决。
- State: Active 和 Physical state: LinkUp: 这是最重要的状态指示。
LinkUp表示物理连接正常(网线插好了),Active表示链路已经初始化并准备好通信。 - Rate: 显示了当前的链路速率。例如
200表示 200Gb/s (NDR)。如果速率不符合预期(例如200G的卡只跑在100G),需要检查线缆、光模块和交换机端口配置。 - Link layer: 明确显示当前端口是在
InfiniBand还是Ethernet模式下工作。
3.3 【重难点-IB】:启动和配置 Subnet Manager (OpenSM)
如果你正在搭建一个InfiniBand网络,那么现在就到了整个IB网络能否“活过来”的关键一步:启动子网管理器 (OpenSM)。
-
OpenSM 的角色回顾
OpenSM是IB网络的大脑。没有它,节点之间虽然有物理连接,但互相不知道对方的存在,也不知道如何将数据包路由过去。OpenSM负责发现所有节点、分配地址(LID)、计算路由表并下发到交换机,让整个Fabric(网络结构)形成一个有机的整体。 -
在哪里运行 OpenSM?
OpenSM是一个软件,可以运行在任何连接到IB网络的节点上。常见选择有:- 在IB交换机上运行: 许多IB交换机(尤其是管理型交换机)内置了运行OpenSM的功能。这是最简单、最可靠的选择,因为交换机通常是7x24小时在线的。
- 在专用的管理服务器上运行: 在一台连接到IB网络的服务器上启动OpenSM服务。
- 在某个计算节点上运行: 不推荐在生产环境中这样做,因为如果该节点重启或关闭,整个IB网络都会瘫痪(直到SM在别处启动)。
实践建议: 为了高可用性(HA),最佳实践是在两个不同的地方(例如两台核心交换机,或一台交换机加一台管理服务器)同时运行OpenSM。它们会自动协商,一个作为主(Master)SM,另一个作为备(Standby)SM。当主SM失效时,备SM会立即接管,保证网络不中断。
-
启动和验证 OpenSM
假设我们在mgmt-node-01这台管理服务器上启动OpenSM。-
启动服务:
sudo systemctl start opensm sudo systemctl enable opensm # 设置开机自启 -
【实践笔记】如何确认 OpenSM 正常运行?
仅仅systemctl start成功是不够的,你必须确认它确实在正常工作。-
第一步:检查日志 (
/var/log/opensm.log)
这是排查OpenSM问题的首要信息来源。一个健康的启动日志末尾应该有类似这样的信息:Nov 03 10:35:00 248311 [EC0D9A0300625A94] 0x01 -> OpenSM 5.8.MLNX20221115.00325d running Nov 03 10:35:00 248313 [EC0D9A0300625A94] 0x01 -> OpenSM: SUBNET UP看到
SUBNET UP就意味着SM已经成功初始化并扫描了一遍网络。 -
第二步:使用
ibnetdiscover查看网络拓扑
这个命令会主动扫描整个IB网络,并以树状结构打印出它发现的所有设备。这是验证所有节点和交换机是否都被SM正确识别的权威工具。ibnetdiscover一个包含2台交换机和4个计算节点的简单拓扑输出可能如下:
vendid=0x2c9 devid=0x1017 sysimgguid=0x248a070300996f50 switchguid=0x248a070300996f50(248a070300996f50) Switch 36 "S-248a070300996f50" # "MQM8700" base port 0 lid 1 lmc 0 [1] "S-248a070300996f51"[1] # "MQM8700" lid 2 40xNDR [31] "gpu-node-01"[1](ec0d9a0300625a94) # "mlx5_0" lid 3 1xNDR [32] "gpu-node-02"[1](ec0d9a0300ab4cde) # "mlx5_0" lid 4 1xNDR vendid=0x2c9 devid=0x1017 sysimgguid=0x248a070300996f51 switchguid=0x248a070300996f51(248a070300996f51) Switch 36 "S-248a070300996f51" # "MQM8700" base port 0 lid 2 lmc 0 [1] "S-248a070300996f50"[1] # "MQM8700" lid 1 40xNDR [25] "gpu-node-03"[1](7cfe9003003c2a3e) # "mlx5_0" lid 5 1xNDR [26] "gpu-node-04"[1](7cfe9003001b9f7a) # "mlx5_0" lid 6 1xNDR如何解读:
Switch: 代表一台IB交换机,后面跟着它的GUID和LID。[port]: 方括号内的数字是交换机的物理端口号。"hostname"[port](guid): 代表一个计算节点(HCA),显示了主机名、网卡端口号和GUID。lid: Local ID,由SM分配的子网内唯一地址。
如果你的某个节点没有出现在这里,那么问题通常在于:1. 物理线缆连接问题;2. 该节点上的驱动或服务 (openibd) 未正常运行;3. 交换机端口被禁用了。
-
第三步:使用
ibnodes快速列出所有计算节点ibnetdiscover的输出很详细但有时过于冗长。ibnodes提供了一个更简洁的视图,只列出网络中的计算节点(CAs)和交换机(SWs)。ibnodes输出示例:
Ca : 0xec0d9a0300625a94 ports 1 "gpu-node-01" Ca : 0xec0d9a0300ab4cde ports 1 "gpu-node-02" Ca : 0x7cfe9003003c2a3e ports 1 "gpu-node-03" Ca : 0x7cfe9003001b9f7a ports 1 "gpu-node-04" Switch : 0x248a070300996f50 ports 36 "S-248a070300996f50" enhanced port 0 lid 1 Switch : 0x248a070300996f51 ports 36 "S-248a070300996f51" enhanced port 0 lid 2这个列表是确认所有计算节点都已成功加入IB网络的最终凭证。
-
-
3.4 【重难点-RoCE】:启用 RoCE 模式 (mlxconfig)
与IB不同,RoCE的“大脑”是分布式的,即每台以太网交换机的路由和转发表。因此,服务器端没有类似OpenSM的中心控制器需要启动。但是,有一个至关重要的、且仅需执行一次的步骤:确保你的网卡被配置为在以太网模式下工作,而不是默认的InfiniBand模式。
现代NVIDIA ConnectX网卡是“多功能”的,它们的物理端口(通常是QSFP类型)既可以连接到IB交换机跑IB协议,也可以连接到以太网交换机跑RoCE。你必须明确告诉网卡固件它应该工作在哪种模式下。这个任务由MLNX_OFED包提供的mlxconfig工具完成。
-
检查当前网卡模式
首先,你需要找到你的网卡的设备名。这通常在/dev/mst/目录下。# 列出所有Mellanox/NVIDIA设备 ls /dev/mst/ # 假设我们找到 mt4125_pciconf0 # 查询该设备的配置 sudo mlxconfig -d /dev/mst/mt4125_pciconf0 q在输出的大量参数中,找到
LINK_TYPE_P1和LINK_TYPE_P2(如果你的卡是双端口的)。Device type: ConnectX-6 ... Configurations: Next Boot ... LINK_TYPE_P1 IB(1) LINK_TYPE_P2 IB(1) ...IB(1): 表示端口1当前被配置为InfiniBand模式。ETH(2): 表示端口1当前被配置为Ethernet模式。
-
切换到RoCE (Ethernet) 模式
如果当前模式是IB(1),你需要将其改为ETH(2)。# 将第一个端口设置为Ethernet模式 sudo mlxconfig -d /dev/mst/mt4125_pciconf0 s LINK_TYPE_P1=2执行后,工具会提示配置已更改,但需要重启或重置才能生效。
-
【实践陷阱】配置生效需要重启!
这是新手最常犯的错误。mlxconfig修改的是网卡固件中的非易失性配置。这个配置只在网卡上电初始化时被读取。因此,执行完mlxconfig命令后,你必须对服务器进行一次彻底的冷启动(reboot)。仅仅重载驱动或重启openibd服务是无效的。重启后,再次运行
mlxconfig -d /dev/mst/mt4125_pciconf0 q,你应该能看到LINK_TYPE_P1已经变成了ETH(2)。
3.5 快速验证:如何确认 IB/RoCE 链路状态
在完成了上述所有配置后,我们需要最后一步的快速验证,以确保从服务器A到服务器B的链路是真正通畅的。
-
IB环境验证:
iblinkinfoiblinkinfo是一个极其有用的工具,它可以显示你的服务器端口直接连接到了哪台交换机的哪个端口。这对于物理拓扑的验证和故障排查非常宝贵。iblinkinfo输出示例:
CA: gpu-node-01 HCA-1: 0xec0d9a0300625a95 3 1[ ] ==( 4X 50.0 Gbps Active/ LinkUp)==> 2 31[ ] "S-248a070300996f50" (switch)如何解读:
CA: gpu-node-01 HCA-1: 表示正在查看gpu-node-01这台主机的第一个HCA。3 1[ ]:3是本机的LID,1是端口号。==( 4X 50.0 Gbps Active/ LinkUp)==>: 显示链路速率(200G NDR)、状态。2 31[ ]:2是它所连接的设备的LID,31是该设备上的端口号。"S-248a070300996f50" (switch): 明确告诉你它连接到了LID为2、GUID为...6f50的交换机上。
-
RoCE环境验证:
ethtool
对于RoCE,因为网卡工作在以太网模式,所以我们使用标准的Linux工具ethtool来检查链路状态。假设你的RoCE网卡在系统中显示为ens1f0np0。ethtool ens1f0np0输出示例:
Settings for ens1f0np0: Supported ports: [ FIBRE ] Supported link modes: ... 200000baseCR4/Full ... Supported pause frame use: Symmetric Supports auto-negotiation: Yes Supported FEC modes: [ RS ] Advertised link modes: ... 200000baseCR4/Full ... Advertised pause frame use: Symmetric Advertised auto-negotiation: Yes Advertised FEC modes: [ RS ] Speed: 200000Mb/s Duplex: Full Port: FIBRE PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: Unknown Supports Wake-on: d Wake-on: d Link detected: yes关键检查点:
Speed: 200000Mb/s: 速率是否符合预期?Duplex: Full: 必须是全双工。Link detected: yes: 最重要的指标,表示物理链路已连通。如果为no,请检查线缆、光模块和交换机端口。
-
跨平台最终验证:
ibv_devinfo
无论是在IB还是RoCE模式下,只要驱动和硬件正常,ibv_devinfo都应该能工作。在RoCE环境下,它的输出会略有不同:hca_id: mlx5_0 transport: Ethernet (1) <-- 注意这里 fw_ver: 20.32.1010 ... port: 1 state: PORT_ACTIVE (4) ... link_layer: Ethernet <-- 注意这里transport和link_layer都显示为Ethernet,且端口状态为PORT_ACTIVE,这最终确认了你的RoCE环境已在RDMA层面准备就绪。
本章小结:
我们完成了搭建高性能网络最基础也最关键的一步。我们学会了如何选择并安装正确的MLNX_OFED驱动,验证了核心服务和硬件状态。我们深入实践了IB网络的核心——OpenSM的配置与验证,并掌握了ibnetdiscover和ibnodes等关键诊断工具。同时,我们也攻克了RoCE配置中的第一个重难点——使用mlxconfig正确设置网卡模式。最后,我们通过iblinkinfo和ethtool对最终的链路状态进行了确认。
至此,我们的服务器已经拥有了通往高性能网络的“入口”。然而,对于RoCE来说,真正的挑战才刚刚开始。下一章,我们将进入RoCE的“命门”——无损网络的配置,这也是整个RoCE技术栈中最复杂、最关键的一环。
(大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 其它章节 链接
以下是目前找到的全部章节,点击章节标题即可跳转阅读,可直接访问:
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第一章:导论 - 为什么标准以太网(TCP/IP)“喂不饱” GPU?
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第二章:技术选型对比:InfiniBand vs. RoCE (v1/v2)
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第三章:【实践】环境搭建:驱动与基础组件(以 Mellanox/NVIDIA 为例)
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第四章:【实践】RoCE 的“命门”:无损网络配置 (PFC & ECN)
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第五章:【实践】基准性能测试:你搭的环境真的“快”吗?
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第六章:【重难点】性能调优(上):系统与网卡参数
- (大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 第七章:性能调优(下):协议与上层应用(K8s/PyTorch)
更多推荐
所有评论(0)