第三章:【实践】环境搭建:驱动与基础组件(以 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
    这是一个新手必须搞清楚的第一个关键决策点。

    1. Inbox Drivers (内核自带驱动): 主流的Linux发行版(如Ubuntu, CentOS/RHEL)的内核中已经内置了一套基本的OFED驱动。
      • 优点: 无需额外安装,开箱即用,对于简单的RDMA功能验证可能足够。
      • 缺点(致命): 版本通常比较陈旧,可能不支持你最新款网卡的所有高级特性(例如硬件卸载、高级拥塞控制算法),性能优化不足,并且缺乏NVIDIA官方提供的丰富诊断工具和实用程序。
    2. MLNX_OFED (NVIDIA官方驱动包): 这是NVIDIA(前Mellanox)官方发布的、专门为其ConnectX系列网卡优化过的OFED驱动包。
      • 优点:
        • 性能最优: 包含了针对其硬件的最新性能优化和bug修复。
        • 特性最全: 支持所有最新的硬件功能和协议增强。
        • 工具最丰富: 附带了大量独有的、功能强大的管理和调试工具,如 mlxconfig, mstflint 等,这些对于后续的配置和排错至关重要。
        • 官方支持: 能够获得NVIDIA官方的技术支持。
      • 缺点: 需要手动从NVIDIA官网下载并安装,安装过程比使用inbox驱动稍复杂。

    实践结论: 对于任何生产环境或追求极致性能的AI训练集群,永远选择并安装与你的硬件和操作系统版本相匹配的最新稳定版MLNX_OFED驱动。使用内核自带驱动可能会让你在后续的性能调优和问题排查中陷入困境。

  • 安装MLNX_OFED实践步骤:

    1. 下载驱动: 访问NVIDIA官网的网络部分,根据你的网卡型号(如ConnectX-6 Dx)、操作系统(如Ubuntu 22.04)和架构(x86_64)选择并下载正确的MLNX_OFED ISO文件或tar包。
    2. 卸载旧驱动(如果存在): 如果系统之前安装过其他版本的OFED,最好先彻底卸载以避免冲突。MLNX_OFED包内通常带有卸载脚本。
    3. 安装依赖: 确保系统安装了编译内核模块所需的基本工具,如 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)
      
    4. 执行安装: 解压下载的驱动包,并以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: 安装所有软件包,这是最省事的选择,确保所有工具都可用。
    5. 重启或重载服务: 安装完成后,脚本通常会提示你重启系统或重启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 查看详细日志,定位失败原因,通常与内核模块编译失败或固件问题有关。

  • 使用 ibstatibv_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: ActivePhysical 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网络的节点上。常见选择有:

    1. 在IB交换机上运行: 许多IB交换机(尤其是管理型交换机)内置了运行OpenSM的功能。这是最简单、最可靠的选择,因为交换机通常是7x24小时在线的。
    2. 在专用的管理服务器上运行: 在一台连接到IB网络的服务器上启动OpenSM服务。
    3. 在某个计算节点上运行: 不推荐在生产环境中这样做,因为如果该节点重启或关闭,整个IB网络都会瘫痪(直到SM在别处启动)。

    实践建议: 为了高可用性(HA),最佳实践是在两个不同的地方(例如两台核心交换机,或一台交换机加一台管理服务器)同时运行OpenSM。它们会自动协商,一个作为主(Master)SM,另一个作为备(Standby)SM。当主SM失效时,备SM会立即接管,保证网络不中断。

  • 启动和验证 OpenSM
    假设我们在mgmt-node-01这台管理服务器上启动OpenSM。

    1. 启动服务:

      sudo systemctl start opensm
      sudo systemctl enable opensm  # 设置开机自启
      
    2. 【实践笔记】如何确认 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_P1LINK_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环境验证:iblinkinfo
    iblinkinfo 是一个极其有用的工具,它可以显示你的服务器端口直接连接到了哪台交换机的哪个端口。这对于物理拓扑的验证和故障排查非常宝贵。

    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      <-- 注意这里
    

    transportlink_layer 都显示为Ethernet,且端口状态为PORT_ACTIVE,这最终确认了你的RoCE环境已在RDMA层面准备就绪。

本章小结:
我们完成了搭建高性能网络最基础也最关键的一步。我们学会了如何选择并安装正确的MLNX_OFED驱动,验证了核心服务和硬件状态。我们深入实践了IB网络的核心——OpenSM的配置与验证,并掌握了ibnetdiscoveribnodes等关键诊断工具。同时,我们也攻克了RoCE配置中的第一个重难点——使用mlxconfig正确设置网卡模式。最后,我们通过iblinkinfoethtool对最终的链路状态进行了确认。

至此,我们的服务器已经拥有了通往高性能网络的“入口”。然而,对于RoCE来说,真正的挑战才刚刚开始。下一章,我们将进入RoCE的“命门”——无损网络的配置,这也是整个RoCE技术栈中最复杂、最关键的一环。

(大模型训练)高性能网络(InfiniBand/RoCE) 详细学习笔记 其它章节 链接

以下是目前找到的全部章节,点击章节标题即可跳转阅读,可直接访问:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐