启用 RDMA
如果您不打算利用 ConnectX SmartNIC,请跳至下一节。
NVIDIA IGX Orin 开发者套件随附嵌入式 ConnectX 以太网适配器,以提供高级硬件卸载和加速。您还可以购买单独的 ConnectX 适配器并将其安装在其他系统上,例如 x86_64 工作站。
以下步骤是确保您的 ConnectX 可以用于融合以太网 RDMA (RoCE) 所必需的
1. 安装 MOFED 驱动程序
确保已安装 Mellanox OFED 驱动程序 23.10 或更高版本
cat /sys/module/mlx5_core/version
如果未安装或安装了旧版本,您应该从 MLNX_OFED 下载页面安装适当的版本,或使用以下脚本
# You can choose different versions/OS or download directly from the
# Download Center in the webpage linked above
MOFED_VERSION="24.07-0.6.1.0"
OS="ubuntu22.04"
MOFED_PACKAGE="MLNX_OFED_LINUX-${MOFED_VERSION}-${OS}-$(uname -m)"
wget --progress=dot:giga https://www.mellanox.com/downloads/ofed/MLNX_OFED-${MOFED_VERSION}/${MOFED_PACKAGE}.tgz
tar xf ${MOFED_PACKAGE}.tgz
sudo ./${MOFED_PACKAGE}/mlnxofedinstall
# add the --force flag to force uninstallation if necessary:
# sudo ./${MOFED_PACKAGE}/mlnxofedinstall --force
rm -r ${MOFED_PACKAGE}*
2. 加载 MOFED 驱动程序
确保驱动程序已加载
sudo lsmod | grep ib_core
如果没有任何显示,请运行以下命令
sudo /etc/init.d/openibd restart
3. 将板载链路层切换到以太网
ConnectX SmartNIC 可以在两种不同的模式(称为链路层)下运行
以太网 (ETH)
Infiniband (IB)
Holoscan 目前不支持 IB(因为它未经测试),因此 ConnectX 将需要使用 ETH 链路层。
要识别当前模式,请运行 ibstat
或 ibv_devinfo
并查找 Link Layer
值。在下面的示例中,mlx5_0
接口处于以太网模式,而 mlx5_1
接口处于 Infiniband 模式。不要注意始终为 InfiniBand
的 transport
值。
$ ibstat
CA 'mlx5_0'
CA type: MT4129
Number of ports: 1
Firmware version: 28.37.0190
Hardware version: 0
Node GUID: 0x48b02d0300ee7a04
System image GUID: 0x48b02d0300ee7a04
Port 1:
State: Down
Physical state: Disabled
Rate: 40
Base lid: 0
LMC: 0
SM lid: 0
Capability mask: 0x00010000
Port GUID: 0x4ab02dfffeee7a04
Link layer: Ethernet
CA 'mlx5_1'
CA type: MT4129
Number of ports: 1
Firmware version: 28.37.0190
Hardware version: 0
Node GUID: 0x48b02d0300ee7a05
System image GUID: 0x48b02d0300ee7a04
Port 1:
State: Active
Physical state: LinkUp
Rate: 100
Base lid: 0
LMC: 0
SM lid: 0
Capability mask: 0x00010000
Port GUID: 0x4ab02dfffeee7a05
Link layer: InfiniBand
如果在 ibstat
之后没有结果显示,并且 sudo lsmod | grep ib_core
返回如下结果
ib_core 425984 1 ib_uverbs
考虑运行以下命令或重新启动
sudo /etc/init.d/openibd restart
要切换链路层模式,有两种可能的选项
在 IGX Orin 开发者套件上,您可以通过 BIOS 切换该设置:请参阅 IGX Orin 文档。
在任何带有 ConnectX 的系统上(包括 IGX Orin 开发者套件),您可以从终端运行以下命令(这将需要重新启动)。
sudo ibdev2netdev -v
用于识别 ConnectX 的 PCI 地址(两个接口中的任何一个都可以使用),mlxconfig
用于应用更改。mlx_pci=$(sudo ibdev2netdev -v | awk '{print $1}' | head -n1) sudo mlxconfig -d $mlx_pci set LINK_TYPE_P1=ETH LINK_TYPE_P2=ETH
注意:
LINK_TYPE_P1
和LINK_TYPE_P2
分别用于mlx5_0
和mlx5_1
。您可以选择仅设置其中一个。您可以为以太网模式传递ETH
或2
,为 InfiniBand 传递IB
或1
。这是上述命令的输出
Device #1: ---------- Device type: ConnectX7 Name: P3740-B0-QSFP_Ax Description: NVIDIA Prometheus P3740 ConnectX-7 VPI PCIe Switch Motherboard; 400Gb/s; dual-port QSFP; PCIe switch5.0 X8 SLOT0 ;X16 SLOT2; secure boot; Device: 0005:03:00.0 Configurations: Next Boot New LINK_TYPE_P1 ETH(2) ETH(2) LINK_TYPE_P2 IB(1) ETH(2) Apply new Configuration? (y/n) [n] :
Next Boot
是预期在下次重新启动时使用的当前值,而New
是您将要设置以覆盖Next Boot
的值。使用
y
应用并在之后重新启动Applying... Done! -I- Please reboot machine to load new configurations.
4. 配置以太网接口的 IP 地址
首先,识别您的 ConnectX 接口的逻辑名称。在 ConnectX 上的接口之一中连接电缆将帮助您识别哪个端口是哪个端口(在下面的示例中,仅 mlx5_1
– 即 eth3
– 已连接)
$ sudo ibdev2netdev
mlx5_0 port 1 ==> eth2 (Down)
mlx5_1 port 1 ==> eth3 (Up)
对于没有实时源连接到 ConnectX QSFP 端口的 IGX Orin 开发者套件,添加 -v
可以向您显示哪个逻辑名称映射到每个特定端口
0005:03.00.0
是更靠近 PCI 插槽的 QSFP 端口0005:03.00.1
是更靠近 RJ45 以太网端口的 QSFP 端口
$ sudo ibdev2netdev -v
0005:03:00.0 mlx5_0 (MT4129 - P3740-0002 ) NVIDIA IGX, P3740-0002, 2-port QSFP up to 400G, InfiniBand and Ethernet, PCIe5 fw 28.37.0190 port 1 (DOWN ) ==> eth2 (Down)
0005:03:00.1 mlx5_1 (MT4129 - P3740-0002 ) NVIDIA IGX, P3740-0002, 2-port QSFP up to 400G, InfiniBand and Ethernet, PCIe5 fw 28.37.0190 port 1 (DOWN ) ==> eth2 (Down)
如果您连接了电缆,但它在 ibdev2netdev
的输出中未显示 Up/Down,您可以尝试解析 dmesg
的输出。下面的示例显示已插入 0005:03:00.1
,并且它与 eth3
关联
$ sudo dmesg | grep -w mlx5_core
...
[ 11.512808] mlx5_core 0005:03:00.0 eth2: Link down
[ 11.640670] mlx5_core 0005:03:00.1 eth3: Link down
...
[ 3712.267103] mlx5_core 0005:03:00.1: Port module event: module 1, Cable plugged
下一步是在您要使用的接口上设置静态 IP,以便您可以在 Holoscan 应用程序中引用它(例如,Emergent 相机,分布式应用程序…)。
首先,检查您是否已设置地址。在此示例中,我们将使用 eth3
接口用于 mlx5_1
ip -f inet addr show eth3
如果没有任何显示,或者您想更改地址,您可以通过网络管理器用户界面、CLI (nmcli
) 或其他 IP 配置工具设置 IP 和 MTU(最大传输单元)。在下面的示例中,我们使用 ip
(ifconfig
已过时) 将 eth3
接口配置为地址 192.168.1.1/24
和 MTU 9000
(即“巨型帧”),以发送有效负载大于标准大小 1500 字节的以太网帧
sudo ip link set dev eth3 down
sudo ip addr add 192.168.1.1/24 dev eth3
sudo ip link set dev eth3 mtu 9000
sudo ip link set dev eth3 up
如果您使用 LinkX 互连将 ConnectX 连接到另一个 ConnectX,请在另一个系统上执行相同的操作,IP 地址位于同一网段上。
例如,要与上面的 192.168.1.1/24
(/24
-> 255.255.255.0
子网掩码) 通信,请将您的另一个系统设置为 IP 地址在 192.168.1.2
和 192.168.1.254
之间,并使用相同的 /24
子网掩码。
仅在 NVIDIA 的 Quadro/工作站 GPU(而非 GeForce)上受支持。
按照以下说明启用 GPUDirect RDMA
在独立显卡上,GPUDirect RDMA 驱动程序名为 nvidia-peermem
,并与其余 NVIDIA 独立显卡驱动程序一起安装。
要启用将 GPUDirect RDMA 与 ConnectX SmartNIC(上节)一起使用,如果在 peermem 驱动程序之后安装了 MOFED 驱动程序,则需要执行以下步骤
nv_driver_version=$(modinfo nvidia | awk '/^version:/ {print $2}' | cut -d. -f1)
sudo dpkg-reconfigure nvidia-dkms-$nv_driver_version # or nvidia-dkms-${nv_driver_version}-server
手动加载 peermem 内核模块
sudo modprobe nvidia-peermem
运行以下命令以在启动期间自动加载它
echo nvidia-peermem | sudo tee -a /etc/modules
目前,IGX SW 1.0 DP 和 JetPack 6.0 DP 缺少 nvidia-p2p
内核,以支持 GPU Direct RDMA 支持。它们计划在各自的 GA 版本中发布。以下说明是在内核模块打包在 GA 版本中后加载内核模块。
在集成显卡上,GPUDirect RDMA 驱动程序名为 nvidia-p2p
。运行以下命令以手动加载内核模块
sudo modprobe nvidia-p2p
运行以下命令以在启动期间自动加载它
echo nvidia-p2p | sudo tee -a /etc/modules
以下说明描述了使用 Rivermax SDK 测试 GPUDirect 的步骤。这些说明使用的测试应用程序 generic_sender
和 generic_receiver
可以用作示例,以便开发自定义应用程序,这些应用程序使用 Rivermax SDK 来优化数据传输。
Rivermax 期望在其中查找许可证文件的 Linux 默认路径是 /opt/mellanox/rivermax/rivermax.lic
,或者您可以为环境变量 RIVERMAX_LICENSE_PATH
指定完整路径和文件名。
如果从上面的链接手动安装 Rivermax SDK,请注意无需按照 Rivermax 文档中的步骤安装 MLNX_OFED/MLNX_EN。
运行 Rivermax 示例应用程序需要两个系统,一个发送器和一个接收器,通过 ConnectX 网络适配器连接。如果使用两个开发者套件,则可以在每个系统上使用板载 ConnectX。但是,如果只有一个开发者套件可用,则预计需要使用另一个带有附加 ConnectX 网络适配器的系统。Rivermax 支持各种平台,包括 Linux 和 Windows,但这些说明假设另一个基于 Linux 的平台将用作发送器设备,而开发者套件用作接收器。
下面引用的 $rivermax_sdk
变量对应于 Rivermax SDK 软件包的安装路径。如果 Rivermax SDK 通过 SDK 管理器安装,则此路径将是
rivermax_sdk=$HOME/Documents/Rivermax/1.31.10
如果 Rivermax SDK 是通过手动下载安装的,请确保导出 SDK 的路径
rivermax_sdk=$DOWNLOAD_PATH/1.31.10
安装路径在 Rivermax 的未来版本中可能会有所不同。
确定每个系统使用的 ConnectX 设备的逻辑名称。这可以通过使用
lshw -class network
命令,找到 ConnectX 设备的product:
条目,并记下与该设备对应的logical name:
来完成。例如,开发者套件上的此输出显示使用enp9s0f01
逻辑名称的板载 ConnectX 设备(lshw
输出为了演示目的而缩短)。$ sudo lshw -class network *-network:0 description: Ethernet interface product: MT28908 Family [ConnectX-6] vendor: Mellanox Technologies physical id: 0 bus info: pci@0000:09:00.0 <b>logical name: enp9s0f0</b> version: 00 serial: 48:b0:2d:13:9b:6b capacity: 10Gbit/s width: 64 bits clock: 33MHz capabilities: pciexpress vpd msix pm bus_master cap_list ethernet physical 1000bt-fd 10000bt-fd autonegotiation configuration: autonegotiation=on broadcast=yes driver=mlx5_core driverversion=5.4-1.0.3 duplex=full firmware=20.27.4006 (NVD0000000001) ip=10.0.0.2 latency=0 link=yes multicast=yes resources: iomemory:180-17f irq:33 memory:1818000000-1819ffffff
以下说明将使用
enp9s0f0
逻辑名称用于ifconfig
命令,但这些名称应替换为通过此步骤确定的相应逻辑名称。在发送系统上运行
generic_sender
应用程序。a. 启动网络
$ sudo ifconfig enp9s0f0 up 10.0.0.1
b. 构建示例应用程序
$ cd ${rivermax_sdk}/apps $ make
e. 启动
generic_sender
应用程序$ sudo ./generic_sender -l 10.0.0.1 -d 10.0.0.2 -p 5001 -y 1462 -k 8192 -z 500 -v
给出
+############################################# | Sender index: 0 | Thread ID: 0x7fa1ffb1c0 | CPU core affinity: -1 | Number of streams in this thread: 1 | Memory address: 0x7f986e3010 | Memory length: 59883520[B] | Memory key: 40308 +############################################# | Stream index: 0 | Source IP: 10.0.0.1 | Destination IP: 10.0.0.2 | Destination port: 5001 | Number of flows: 1 | Rate limit bps: 0 | Rate limit max burst in packets: 0 | Memory address: 0x7f986e3010 | Memory length: 59883520[B] | Memory key: 40308 | Number of user requested chunks: 1 | Number of application chunks: 5 | Number of packets in chunk: 8192 | Packet's payload size: 1462 +**********************************************
在接收系统上运行
generic_receiver
应用程序。a. 启动网络
$ sudo ifconfig enp9s0f0 up 10.0.0.2
b. 从 Rivermax GitHub 仓库构建具有 GPUDirect 支持的
generic_receiver
应用程序。在按照 使用 CUDA 工具包支持进行构建的说明之前,将 此 PR 中的更改应用于文件generic_receiver/generic_receiver.cpp
。这已在 NVIDIA IGX Orin 开发者套件上使用 Rivermax 1.31.10 进行了测试。c. 从
build
目录启动generic_receiver
应用程序$ sudo ./generic_receiver -i 10.0.0.2 -m 10.0.0.2 -s 10.0.0.1 -p 5001 -g 0 ... Attached flow 1 to stream. Running main receive loop... Got 5877704 GPU packets | 68.75 Gbps during 1.00 sec Got 5878240 GPU packets | 68.75 Gbps during 1.00 sec Got 5878240 GPU packets | 68.75 Gbps during 1.00 sec Got 5877704 GPU packets | 68.75 Gbps during 1.00 sec Got 5878240 GPU packets | 68.75 Gbps during 1.00 sec ...
在 generic_sender
和 generic_receiver
进程都处于活动状态的情况下,接收器将每秒继续打印接收到的数据包统计信息。然后可以使用 <ctrl-c>
终止这两个进程。