在NVIDIA DGX Spark平台上对NVIDIA ConnectX-7 200G网卡配置教程

描述

在 NVIDIA DGX Spark 平台上对 NVIDIA ConnectX-7 200G 网卡进行配置时,会遇到“4 个逻辑端口”现象。理解背后的真相是后续所有配置的基础。本文将从此现象入手,逐步解析其原理,并提供从基础配置到深度性能验证的完整流程。

1理解“4 个逻辑端口”的真相

目前,在 DGX Spark 系统上配置 ConnectX-7(CX7)网卡时,会遇到一个常见问题:DGX Spark 只有两个物理端口,但在使用 ip-br a 或 ibdev2netdev 命令查看时, ConnectX-7 网卡显示为四个端口:

 

rocep1s0f0 port 1 ==> enp1s0f0np0 (Up)     物理端口1/路径A
rocep1s0f1 port 1 ==> enp1s0f1np1 (Up)     物理端口2/路径A
roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Up) 物理端口1/路径B
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up) 物理端口2/路径B

 

答案在于 GB10 芯片的 PCIe 限制与 Socket Direct 模式。

简单理解为:其无法为单个设备提供超过 x4 宽度的 PCIe 通道。因此为了实现 200 Gbps 的传输速率,将启用 ConnectX-7 的 socket 直通,把两条独立的 x4 PCIe 链路聚合起来,从而共同达到 200 Gbps 的带宽。

而 ConnectX-7 网卡在 Socket Direct 模式下,分别由 GB10 SoC 的两条独立 PCle x4 链路(我们称之为路径 A 和路径 B)驱动,所以会把每一个物理接口识别成两个 PCle 设备,进而对应两个逻辑接口。经由每个 PCle x4 的连接,只有 100 Gbps,无法满足 200 Gbps 的传输需求,所以对应下图中,在配置网络和构建流量时,要实现完整的 200 Gbps 带宽必须同时使用这两条链路(路径 A 和路径 B)——即使只用一个物理接口,也需确保两路流量都被激活。

端口

▲ 逻辑端口示意图

2025 丽台(上海)信息科技有限公司

本图片由丽台科技制作,如果您有任何疑问或需要使用此图片,请联系丽台科技(下同)

具体表现为:

路径 A -> 访问物理端口 1 (enp1s0f0np0)

路径 A -> 访问物理端口 2 (enp1s0f1np1)

路径 B -> 访问物理端口 1 (enP2p1s0f0np0)

路径 B -> 访问物理端口 2 (enP2p1s0f1np1)

这不是四个独立的物理网口,而是两个物理网口在操作系统层面被“镜像”为四条 PCIe 路径。为了充分利用硬件性能,必须正确配置并测试这四条路径。

2网络配置:连接两台 DGX Spark

下面将重点介绍连接两台 DGX Spark 时的手动静态 IP 分配。

2.1 确保两个系统上的用户名相同

此步骤旨在确保两台 DGX Spark 设备使用相同的用户名,以便后续操作(尤其是 SSH 免密登录和分布式任务调度)能够无缝进行。

注:用户可根据实际情况自行配置,无需严格遵循以下步骤。

2.1.1 检查当前用户名

在两台机器上分别运行:

 

whoami

 

如果两台都已经是 leadtek_dgx1,则无需操作,直接继续后续步骤。

如果任一系统用户名不同,请按以下步骤创建统一用户。

2.1.2 在两台系统上创建 leadtek_dgx1 用户(如不存在)

 

# 创建用户并设置主目录
sudo useradd -m leadtek_dgx1


# 将用户加入 sudo 组
sudo usermod -aG sudo leadtek_dgx1


# 设置密码
sudo passwd leadtek_dgx1


#切换到该用户
su - leadtek_dgx1

 

完成后,两台系统均以相同用户名 leadtek_dgx1 登录,便于后续 SSH 免密操作。

2.2 确认接口状态

确定所有网络端口均已连接(Up 状态):

 

leadtek_dgx1@spark-a83f:~$ ibdev2netdev
rocep1s0f0 port 1 ==> enp1s0f0np0 (Up)
rocep1s0f1 port 1 ==> enp1s0f1np1 (Up)
roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Up)
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up)
           

 

2.3 IP 地址规划

我们为 node1 和 node2 上的四个逻辑接口分别规划独立的子网,用于后续网络性能测试。

端口

▲ IP 地址规划

2.4 执行配置命令

在 node1 上执行:

 

# 物理端口1 / 路径A (192.168.10.0/24)/enp1s0f0np0
sudo ip addr add 192.168.10.10/24 dev enp1s0f0np0
sudo ip link set enp1s0f0np0 up


# 物理端口2 / 路径A (192.168.11.0/24)/enp1s0f1np1
sudo ip addr add 192.168.11.10/24 dev enp1s0f1np1
sudo ip link set enp1s0f1np1 up


# 物理端口1 / 路径B (192.168.12.0/24)/enP2p1s0f0np0
sudo ip addr add 192.168.12.10/24 dev enP2p1s0f0np0
sudo ip link set enP2p1s0f0np0 up


# 物理端口2 / 路径B (192.168.13.0/24)/enP2p1s0f1np1
sudo ip addr add 192.168.13.10/24 dev enP2p1s0f1np1
sudo ip link set enP2p1s0f1np1 up


#ip -br a
enp1s0f0np0      UP             192.168.10.10/24 
enp1s0f1np1      UP             192.168.11.10/24 
enP2p1s0f0np0    UP             192.168.12.10/24 
enP2p1s0f1np1    UP             192.168.13.10/24 

 

在 node2 上执行:

 

# 物理端口1 / 路径A (192.168.10.0/24)/enp1s0f0np0
sudo ip addr add 192.168.10.11/24 dev enp1s0f0np0 
sudo ip link set enp1s0f0np0  up


# 物理端口1 / 路径A (192.168.11.0/24)/enp1s0f1np1
sudo ip addr add 192.168.11.11/24 dev enp1s0f1np1
sudo ip link set enp1s0f1np1 up


# 物理端口2 / 路径B (192.168.12.0/24)/enP2p1s0f0np0
sudo ip addr add 192.168.12.11/24 dev enP2p1s0f0np0
sudo ip link set enP2p1s0f0np0 up


# 物理端口2 / 路径B (192.168.13.0/24)/enP2p1s0f1np1
sudo ip addr add 192.168.13.11/24 dev enP2p1s0f1np1
sudo ip link set enP2p1s0f1np1 up


#ip -br a
enp1s0f0np0      UP             192.168.10.11/24 
enp1s0f1np1      UP             192.168.11.11/24 
enP2p1s0f0np0    UP             192.168.12.11/24 
enP2p1s0f1np1    UP             192.168.13.11/24 

 

2.5 设置无密码 SSH 身份验证

需要找到已启动的 ConnectX-7 接口的 IP 地址。在两个节点上,分别运行 ip addr show enp1s0f0np0:

 

#ip addr show enp1s0f0np0
  3: enp1s0f0np0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 4c47:7d40 brd ffffff:ff
    inet 192.168.10.10/24 scope global enp1s0f0np0
       valid_lft forever preferred_lft forever


#ip addr show enp1s0f0np0
3: enp1s0f0np0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 4c47:7d8f brd ffffff:ff
    inet 192.168.10.11/24 scope global enp1s0f0np0
       valid_lft forever preferred_lft forever

 

确定 node1 和 node2 IP:

 

node1: 192.168.10.10
node2: 192.168.10.11

 

在两个节点上分别运行以下命令以启用无密码 SSH:

 

ssh-copy-id -i ~/.ssh/id_rsa.pub leadtek_dgx1@192.168.10.10
ssh-copy-id -i ~/.ssh/id_rsa.pub leadtek_dgx1@192.168.10.11


ssh 192.168.10.10 hostname
ssh 192.168.10.11 hostname

 

3RDMA 带宽性能测试

配置完成后,我们使用 ib_write_bw 工具(来自 perftest-tools 包)来验证聚合带宽是否能达到 200 Gbps 的物理极限。

3.1 测试一:单物理端口聚合带宽(物理端口 1)

此测试的目标是验证单个物理端口(使用其对应的两条 PCIe 路径)是否能跑满 200 Gbps。

测试步骤:我们需要在两个节点上同时启动两个 ib_write_bw 实例,一个跑在物理端口 1/ 路径 A (192.168.10.x),一个跑在物理端口 1/ 路径 B(192.168.12.x)。

3.1.1 启动物理端口 1/ 路径 A (192.168.10.x)测试

在 node2 (服务端))终端 1 中运行:

 

ib_write_bw -d rocep1s0f0 -p 18511 --bind_source_ip=192.168.10.11 --report_gbits --run_infinitely -D 5

 

在 node1 (客户端) 终端 1 中运行:

 

ib_write_bw -d rocep1s0f0 -p 18511 --report_gbits --run_infinitely -D 5 192.168.10.11

 

观察到带宽结果:约 97 Gbit/s。

端口

▲ 测试结果截图

2025 丽台(上海)信息科技有限公司

本文所有测试结果均由丽台科技实测得出,如果您有任何疑问或需要使用此测试结果,请联系丽台科技(下同)

3.1.2 保持物理端口 1/ 路径 A 通信,启动物理端口 1/ 路径 B (192.168.12.x)测试

在 node2 (服务端) 终端 2 中运行:

 

ib_write_bw -d roceP2p1s0f0 -p 18512 --bind_source_ip=192.168.12.11 --report_gbits --run_infinitely -D 5

 

在 node1 (客户端) 终端 2 中运行:

 

ib_write_bw -d roceP2p1s0f0 -p 18512 --report_gbits --run_infinitely -D 5 192.168.12.11

 

观察到带宽结果:约 92 Gbit/s。

端口

▲ 测试结果截图

测试结果(物理端口 1):

端口

▲ 测试结果截图

总带宽 = 路径 A 平均带宽 + 路径 B 平均带宽

总带宽 ≈ 92.5 + 92.5 = 185 Gbit/s

结论:测试结果验证了单个物理端口可以通过聚合其背后的两条 PCIe 路径,提供接近 200 Gbit/s 的理论带宽。

3.2 测试二:双物理端口带宽

此测试的目标是验证当两个物理端口(即所有四条 PCIe 路径)同时工作时,网卡的总吞吐能力。

测试步骤:保持 3.1 中的两个测试(物理端口 1 的 A、B 两条路径)持续运行,在两个节点上额外再启动两个 ib_write_bw 实例,分别对应物理端口 2 的两条路径。

3.2.1 启动物理端口 2/ 路径 A(192.168.11.x)

在 node2(服务端)终端 3 中运行:

 

ib_write_bw -d rocep1s0f1 -p 18513 --bind_source_ip=192.168.11.11 --report_gbits --run_infinitely -D 5

 

在 node1(客户端)终端 3 中运行:

 

ib_write_bw -d rocep1s0f1 -p 18513 --report_gbits --run_infinitely -D 5 192.168.11.11

 

3.2.2 启动物理端口 2/ 路径 B(192.168.13.x)

 node2(服务端)终端 4 中运行:

 

ib_write_bw -d roceP2p1s0f1 -p 18514 --bind_source_ip=192.168.13.11 --report_gbits --run_infinitely -D 5

 

 node1(客户端)终端 4 中运行:

 

ib_write_bw -d roceP2p1s0f1 -p 18514 --report_gbits --run_infinitely -D 5 192.168.13.11

 

端口

▲ 测试结果截图

测试结果:当所有四条链路并发运行时,观察到每条链路的带宽被平均分配。

每条路径带宽 ≈ 49 Gbit/s

总带宽 = ~49 + ~49 + ~49 + ~49 = 196 Gbit/s

结论:表明 ConnectX-7 网卡的总带宽约为 196 Gbit/s(接近 200G 目标)。无论流量是集中在单个物理端口(如测试 3.1),还是分散到两个物理端口(如测试 3.2),总吞吐量保持一致。

4NCCL 通信性能测试

在深度学习场景中,NCCL 是多机通信的关键。我们按照官方文档编译 nccl-tests 并进行 all_gather 和 all_reduce 测试。

4.1 安装依赖项并构建 NCCL

 

#安装依赖项并构建NCCL
sudo apt-get update && sudo apt-get install -y libopenmpi-dev
git clone -b v2.28.3-1 https://github.com/NVIDIA/nccl.git ~/nccl/
cd ~/nccl/
make -j src.build NVCC_GENCODE="-gencode=arch=compute_121,code=sm_121"
#设置环境变量
export CUDA_HOME="/usr/local/cuda"
export MPI_HOME="/usr/lib/aarch64-linux-gnu/openmpi"
export NCCL_HOME="$HOME/nccl/build/"
export LD_LIBRARY_PATH="$NCCL_HOME/lib:$CUDA_HOME/lib64/:$MPI_HOME/lib:$LD_LIBRARY_PATH"

 

4.2 构建 NCCL 测试套件

 

git clone https://github.com/NVIDIA/nccl-tests.git ~/nccl-tests/
cd ~/nccl-tests/
make MPI=1

 

4.3 All-Gather 带宽测试(单路径)

注意:此步骤仅选择物理端口 1 的一条路径(路径Aenp1s0f0np0)作为通信接口,以建立一个单路径基准。

 

# 仅指定物理端口1/路径A enp1s0f0np0 作为通信接口
export UCX_NET_DEVICES=enp1s0f0np0
export NCCL_SOCKET_IFNAME=enp1s0f0np0
export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0
#指定物理端口1/路径A的设备标识
export NCCL_IB_HCA=rocep1s0f0

 

运行 all_gather 测试(单路径):

 

mpirun -np 2 -H 192.168.10.10:1,192.168.10.11:1 
  --mca plm_rsh_agent "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" 
  -x LD_LIBRARY_PATH 
  -x NCCL_IB_HCA 
  $HOME/nccl-tests/build/all_gather_perf -b 16G -e 16G -f 2

 

-x NCCL_DEBUG=INFO 可以加上此命令以查看详细日志。

测试结果:单路径下,All-Gather 操作的平均总线带宽达到 12.04 GB/s

端口

▲ 测试结果截图

4.4 All-Gather 带宽测试(双路径)

注意: 此步骤选择物理端口 1 的两条路径作为通信接口,以建立双链路。

 

#指定物理端口1/路径A和路径B enp1s0f0np0,enP2p1s0f0np0 作为通信接口
export UCX_NET_DEVICES=enp1s0f0np0,enP2p1s0f0np0
export NCCL_SOCKET_IFNAME=enp1s0f0np0,enP2p1s0f0np0
export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0,enP2p1s0f0np0


#指定两个路径的设备标识
export NCCL_IB_HCA=rocep1s0f0,roceP2p1s0f0


mpirun -np 2 -H 192.168.10.10:1,192.168.10.11:1 
  --mca plm_rsh_agent "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" 
  -x LD_LIBRARY_PATH 
  -x NCCL_IB_HCA 
  $HOME/nccl-tests/build/all_gather_perf -b 16G -e 16G -f 2

 

测试结果:双路径下,All-Gather 操作的平均总线带宽达到 22.68 GB/s

端口

▲ 测试结果截图

4.5 All-reduce 带宽测试(单路径)

注意:切换终端时,请勿忘记重新导入 4.1 节中设置的环境变量。

 

# 仅指定物理端口1/路径A enp1s0f0np0 作为通信接口
export UCX_NET_DEVICES=enp1s0f0np0
export NCCL_SOCKET_IFNAME=enp1s0f0np0
export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0
#指定物理端口1/路径A的设备标识
export NCCL_IB_HCA=rocep1s0f0
mpirun -np 2 
  -host 192.168.10.10:1,192.168.10.11:1 
  -x LD_LIBRARY_PATH 
  -x NCCL_IB_HCA 
  $HOME/nccl-tests/build/all_reduce_perf -b 1M -e 512M -f 2 -g 1

 

测试结果:在单路径 All-Reduce 测试中,512MB 大消息量下达到的 12.08 GB/s 总线带宽。

端口

▲ 测试结果截图

4.6 All-reduce 带宽测试(双路径)

 

# 指定物理端口1/路径A和路径B enp1s0f0np0,enP2p1s0f0np0 作为通信接口
export UCX_NET_DEVICES=enp1s0f0np0,enP2p1s0f0np0
export NCCL_SOCKET_IFNAME=enp1s0f0np0,enP2p1s0f0np0
export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0,enP2p1s0f0np0
#指定两个路径的设备标识


export NCCL_IB_HCA=rocep1s0f0,roceP2p1s0f0
mpirun -np 2 
  -host 192.168.10.10:1,192.168.10.11:1 
  -x LD_LIBRARY_PATH 
  -x NCCL_IB_HCA 
  $HOME/nccl-tests/build/all_reduce_perf -b 1M -e 512M -f 2 -g 1

 

测试结果:在双路径 All-Reduce 测试中,512MB 大消息量下达到的 18.02 GB/s 总线带宽。

端口

▲ 测试结果截图

5测试总结与分析

根据以上测试,可以得出以下关键结论:

 配置确认: DGX Spark 上的 ConnectX-7 网卡确实因 socket 直通呈现为 4 个逻辑接口。

硬件能力验证(ib_write_bw):原始带宽测试(ib_write_bw)结果(185-196 Gbit/s)表明,无论是通过单物理端口还是双物理端口,该网卡均能提供接近 200 Gbps 的聚合吞吐能力,符合硬件设计预期。

NCCL 性能分析:在单物理端口(双路径)上运行时,All-Gather 操作针对超大消息量实现了 22.68 GB/s 的平均总线带宽,展现了其在高并行通信场景下出色的数据聚合与分发吞吐能力。All-Reduce 测试中,512MB 大消息量下达到的 18.02 GB/s 总线带宽,是当前系统通信性能的真实峰值,反映了 NCCL 算法与硬件互联在高负载下的真实吞吐能力。

更多关于 DGX Spark 的使用指南、测试报告等,将在丽台科技公众号持续发布,敬请保持关注!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分