基本思路
配置四个 DGX Spark 系统,通过 QSFP 交换机使用 200Gbps QSFP 连接进行高速节点间通信。此设置通过建立网络连接和配置 SSH 身份验证来实现跨多个 DGX Spark 节点的分布式工作负载。
你将完成什么
在此手册中,您将使用 QSFP 电缆和 QSFP 交换机物理连接四个 DGX Spark 设备,配置用于集群通信的网络接口,并在节点之间建立无密码 SSH,以创建功能齐全的分布式计算环境。相同的设置可以扩展到通过同一交换机连接的更多 DGX Spark 设备。
开始之前需要了解什么
- 对分布式计算概念的基本了解
- 使用网络接口配置和网络规划
- 具有 SSH 密钥管理经验
- 对配置您计划使用的托管 QSFP 网络交换机有基本的了解和经验。请参阅使用说明书:
- 了解如何连接到交换机以管理端口和功能
- 了解如何启用/禁用 QSFP 端口并在交换机上创建软件桥
- 了解如何在端口上手动配置链路速度并在需要时禁用自动协商
先决条件
- 四个 DGX Spark 系统(这些说明适用于与交换机连接的任意数量的 DGX Spark 设备)
- 具有至少 4 个 QSFP56-DD 端口(每个端口至少 200Gbps)的 QSFP 交换机
- QSFP 电缆用于从交换机到设备的 200Gbps 连接。使用 recommended cable 或类似的。
- 每台 Spark一根电缆
- 如果交换机有 400Gbps 端口,那么您还可以使用分支电缆将它们分成两个 200Gbps 端口
- 所有系统均可使用 SSH 访问
- 所有系统上的 root 或 sudo 访问权限:
sudo whoami - 所有系统上的用户名相同
- 将所有系统更新到最新的操作系统和固件。请参阅 DGX Spark 文档 https://docs.nvidia.com/dgx/dgx-spark/os-and-component-update.html
附属文件
此剧本所需的所有文件都可以在 GitHub 中找到
- 用于自动节点发现和 SSH 密钥分发的 discover-sparks.sh 脚本
- Cluster setup script 用于自动网络配置、验证和运行 NCCL 健全性测试
时间与风险
-
持续时间: 2 小时(包括验证)
-
风险级别: 中 - 涉及网络重新配置
-
回滚: 可以通过删除网络规划配置或 IP 分配来撤销网络更改
-
最后更新: 2026 年 3 月 19 日
- 首次发表
步骤 1. 确保所有四个系统上的用户名相同
在所有四个系统上检查并确保用户名相同:
## Check current username
whoami
如果用户名不匹配,请在所有四个系统上创建一个新用户(例如 nvidia)并使用新用户登录:
## Create nvidia user and add to sudo group
sudo useradd -m nvidia
sudo usermod -aG sudo nvidia
## Set password for nvidia user
sudo passwd nvidia
## Switch to nvidia user
su - nvidia
步骤 2. 交换机管理
大多数 QSFP 交换机通过 CLI 或 UI 提供某种形式的管理界面。参考文档并连接到管理界面。确保交换机上的端口已启用。要连接四个 Spark,您需要确保交换机配置为向每个 DGX Spark 提供 200Gbps 连接。如果尚未完成,请参阅本手册的 Overview,了解本手册所需的先验知识和先决条件。
步骤 3. 物理硬件连接
使用每个 Spark 系统上的一个 CX7 端口连接 DGX Spark 系统和交换机(QSFP56-DD/QSFP56 端口)之间的 QSFP 电缆。建议在所有 Spark 系统上使用相同的 CX7 端口,以便更轻松地进行网络配置并避免 NCCL 测试失败。在此剧本中,使用第二个端口(距离以太网端口较远的一个)。这应该建立高速节点间通信所需的 200Gbps 连接。您将在所有四台 Spark上看到如下所示的输出。在此示例中,显示为“Up”的接口是 enp1s0f1np1 和 enP2p1s0f1np1(每个物理端口有两个逻辑接口)。
输出示例:
## Check QSFP interface availability on all nodes
nvidia@dxg-spark-1:~$ ibdev2netdev
rocep1s0f0 port 1 ==> enp1s0f0np0 (Down)
rocep1s0f1 port 1 ==> enp1s0f1np1 (Up)
roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Down)
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up)
笔记
如果没有接口显示为“Up”,请检查 QSFP 电缆连接,重新启动系统并重试。
显示为“Up”的接口取决于您用于将节点连接到交换机的端口。每个物理端口有两个逻辑接口,例如,端口 1 有两个接口 - enp1s0f1np1 和 enP2p1s0f1np1。请忽略 enp1s0f0np0 和 enP2p1s0f0np0,仅使用 enp1s0f1np1 和 enP2p1s0f1np1。
步骤 3.1。验证协商的链接速度
自动协商的链路速度可能不会默认为 200Gbps。要进行确认,请在所有 Spark 上运行以下命令并检查速度是否显示为 200000Mb/s。如果显示小于该值,则需要在交换机端口配置中手动将链路速度设置为 200Gbps,并且应禁用自动协商。请参阅交换机的手册/文档以禁用自动协商并将链路速度手动设置为 200Gbps(例如 200G-baseCR4)
输出示例:
nvidia@dxg-spark-1:~$ sudo ethtool enp1s0f1np1 | grep Speed
Speed: 100000Mb/s
nvidia@dxg-spark-1:~$ sudo ethtool enP2p1s0f1np1 | grep Speed
Speed: 100000Mb/s
在交换机端口上设置正确的速度后。再次验证所有 DGX Spark 上的链接速度。
输出示例:
nvidia@dxg-spark-1:~$ sudo ethtool enp1s0f1np1 | grep Speed
Speed: 200000Mb/s
nvidia@dxg-spark-1:~$ sudo ethtool enP2p1s0f1np1 | grep Speed
Speed: 200000Mb/s
步骤 4. 网络接口配置
笔记
只需一根 QSFP 电缆即可实现全带宽。
对于集群设置,所有 DGX 都会触发:
- 应该可供管理访问(例如 SSH 和运行命令)
- 应该能够访问互联网(例如下载模型/实用程序)
- 应该能够使用 TCP/IP over CX7 相互通信。以下步骤可帮助进行配置。
建议使用以太网/WiFi 网络进行管理和互联网流量,并将其与 CX7 网络分开,以避免 CX7 带宽用于非工作负载流量。
使用交换机配置集群的受支持方法需要在交换机上配置网桥(或使用默认网桥),并通过交换机管理界面将所有感兴趣的端口(连接到 DGX Spark 的端口)添加到其中。
- 这样,所有端口都是集群网络配置所需的单个第 2 层域的一部分
- 某些交换机有限制,只能在一个网桥上启用硬件卸载,因此需要将所有端口保留在单个网桥中
完成创建/添加桥接端口后,您应该准备好在 DGX Spark 端配置网络。
4.1 集群网络配置脚本
我们创建了一个脚本 GitHub ,它可以自动执行以下操作:
- 所有 DGX Spark 的接口网络 IP 配置
- 在 DGX Sparks 之间设置无密码身份验证
- 验证多节点通信
- 运行 NCCL 带宽测试
笔记
您可以使用该脚本或继续以下部分中的手动配置。如果您使用该脚本,则可以跳过本手册中的其余设置部分。
使用以下步骤运行脚本:
## Clone the repository
git clone https://github.com/NVIDIA/dgx-spark-playbooks
## Enter the script directory
cd dgx-spark-playbooks/nvidia/multi-sparks-through-switch/assets/spark_cluster_setup
## Check the README.md in the script directory for steps to run the script and configure the cluster networking with "--run-setup" argument
4.2 手动集群网络配置
在这种情况下,您可以选择其中一个选项来将 IP 分配给 CX7 逻辑接口。选项 1、2 和 3 是互斥的。
- 交换机上的 DHCP 服务器(推荐,如果支持)
- 链接本地 IP 寻址(所有节点的网络规划都相同)
- 手动 IP 寻址(每个节点上的网络规划都不同,但提供更多控制和确定性 IP)
选项 1:在交换机上配置 DHCP 服务器
- 在交换机上配置 DHCP 服务器,其子网足够大,以便为所有 Spark 分配 IP。 /24 子网应该可以很好地进行配置和任何未来的扩展。
- 配置 DGX Spark 中的“UP”CX7 接口以使用 DHCP 获取 IP。例如。如果逻辑接口 enp1s0f1np1 / enP2p1s0f1np1 为“UP”,则在所有 Spark 上创建如下所示的网络规划。
## Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp1s0f1np1:
dhcp4: true
enP2p1s0f1np1:
dhcp4: true
EOF
## Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml
## Apply the configuration
sudo netplan apply
- 确认接口已分配 IP
## In this example, we are using interface enp1s0f1np1. Similarly check enP2p1s0f1np1.
nvidia@dgx-spark-1:~$ ip addr show enp1s0f1np1 | grep -w inet
inet 100.100.100.4/24 brd 100.100.100.255 scope global noprefixroute enp1s0f1np1
选项 2:自动链接本地 IP 分配
在所有 DGX Spark 节点上使用 netplan 配置网络接口,以实现自动链路本地寻址:
## Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp1s0f1np1:
link-local: [ ipv4 ]
enP2p1s0f1np1:
link-local: [ ipv4 ]
EOF
## Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml
## Apply the configuration
sudo netplan apply
选项 3:使用 netplan 配置文件手动分配 IP
在节点 1 上:
## Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp1s0f1np1:
addresses:
- 192.168.100.10/24
dhcp4: no
enP2p1s0f1np1:
addresses:
- 192.168.100.11/24
dhcp4: no
EOF
## Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml
## Apply the configuration
sudo netplan apply
在节点 2 上:
## Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp1s0f1np1:
addresses:
- 192.168.100.12/24
dhcp4: no
enP2p1s0f1np1:
addresses:
- 192.168.100.13/24
dhcp4: no
EOF
## Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml
## Apply the configuration
sudo netplan apply
在节点 3 上:
## Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp1s0f1np1:
addresses:
- 192.168.100.14/24
dhcp4: no
enP2p1s0f1np1:
addresses:
- 192.168.100.15/24
dhcp4: no
EOF
## Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml
## Apply the configuration
sudo netplan apply
在节点 4 上:
## Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp1s0f1np1:
addresses:
- 192.168.100.16/24
dhcp4: no
enP2p1s0f1np1:
addresses:
- 192.168.100.17/24
dhcp4: no
EOF
## Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml
## Apply the configuration
sudo netplan apply
步骤 5. 设置无密码 SSH 身份验证
选项 1:自动配置 SSH
从节点之一运行 DGX Spark discover-sparks.sh 脚本以自动发现和配置 SSH:
curl -O https://raw.githubusercontent.com/NVIDIA/dgx-spark-playbooks/refs/heads/main/nvidia/connect-two-sparks/assets/discover-sparks
bash ./discover-sparks
预期输出类似于以下内容,具有不同的 IP 和节点名称。您可能会看到每个节点最多有两个 IP,因为两个接口(例如 enp1s0f1np1 和 enP2p1s0f1np1)已分配 IP 地址。这是预期的结果,不会导致任何问题。第一次运行该脚本时,系统会提示您输入每个节点的密码。
Found: 169.254.35.62 (dgx-spark-1.local)
Found: 169.254.35.63 (dgx-spark-2.local)
Found: 169.254.35.64 (dgx-spark-3.local)
Found: 169.254.35.65 (dgx-spark-4.local)
Setting up bidirectional SSH access (local <-> remote nodes)...
You may be prompted for your password for each node.
SSH setup complete! All local and remote nodes can now SSH to each other without passwords.
笔记
如果遇到任何错误,请按照下面的选项 2 手动配置 SSH 并调试问题。
选项 2:手动发现和配置 SSH
您需要查找已启动的 CX-7 接口的 IP 地址。在所有节点上,运行以下命令来查找 IP 地址并记下它们以供下一步使用。
ip addr show enp1s0f1np1
输出示例:
## In this example, we are using interface enp1s0f1np1.
nvidia@dgx-spark-1:~$ ip addr show enp1s0f1np1
4: enp1s0f1np1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 3c:6d:66:cc:b3:b7 brd ff:ff:ff:ff:ff:ff
inet **169.254.35.62**/16 brd 169.254.255.255 scope link noprefixroute enp1s0f1np1
valid_lft forever preferred_lft forever
inet6 fe80::3e6d:66ff:fecc:b3b7/64 scope link
valid_lft forever preferred_lft forever
在此示例中,节点 1 的 IP 地址是 169.254.35.62。对其他节点重复该过程。
在所有节点上运行以下命令启用无密码 SSH:
## Copy your SSH public key to all nodes. Replace the IP addresses with the ones you found in the previous step.
ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<IP for Node 1>
ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<IP for Node 2>
ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<IP for Node 3>
ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<IP for Node 4>
步骤 6. 验证多节点通信
从头节点测试基本的多节点功能:
## Test hostname resolution across nodes
ssh <IP for Node 1> hostname
ssh <IP for Node 2> hostname
ssh <IP for Node 3> hostname
ssh <IP for Node 4> hostname
步骤 7. 运行测试和工作负载
现在,您的集群已设置为跨四个节点运行分布式工作负载。尝试运行 NCCL playbook。
笔记
无论剧本要求在两个节点上运行命令,只需在所有四个节点上运行它即可。
确保调整您在 头节点 上运行的 mpirun NCCL 命令以容纳 四个节点
NCCL 的 mpirun 命令示例:
## Set network interface environment variables (use your Up interface from the previous step)
export UCX_NET_DEVICES=enp1s0f1np1
export NCCL_SOCKET_IFNAME=enp1s0f1np1
export OMPI_MCA_btl_tcp_if_include=enp1s0f1np1
## Run the all_gather performance test across four nodes (replace the IP addresses with the ones you found in the previous step)
mpirun -np 4 -H <IP for Node 1>:1,<IP for Node 2>:1,<IP for Node 3>:1,<IP for Node 4>:1 \
--mca plm_rsh_agent "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
-x LD_LIBRARY_PATH=$LD_LIBRARY_PATH \
$HOME/nccl-tests/build/all_gather_perf
步骤 8. 清理和回滚
警告
这些步骤将重置网络配置。
## Rollback network configuration
sudo rm /etc/netplan/40-cx7.yaml
sudo netplan apply
笔记
如果断开开关,请确保执行以下操作
- 如果交换机用于不同目的,请重新启用自动协商以避免以后出现问题。
- 如果您使用交换机上的 DHCP 服务器配置为 Sparks 分配 IP,请删除该配置。
- 如果您创建了新网桥,请将端口移回默认网桥并删除新网桥。
| 症状 | 原因 | 使固定 |
|---|---|---|
| “网络无法访问”错误 | 网络接口未配置 | 验证 netplan 配置和 sudo netplan apply |
| SSH 身份验证失败 | SSH 密钥未正确分配 | 重新运行 ./discover-sparks 并输入密码 |
| 集群中节点不可见 | 网络连接问题 | 验证 QSFP 电缆连接,检查 IP 配置 |
| “APT 更新”错误(例如 E:无法读取源列表。) | APT 源错误、源冲突或签名密钥 | 检查 APT 和 Ubuntu 文档以修复 APT 源或密钥冲突 |
| NCCL 测试失败(例如 libnccl.so.2:无法打开共享对象文件) | 未在所有节点上完成 NCCL 配置 | 在运行 NCCL 测试之前,请确保按照 NCCL playbook 配置所有节点 |