通过交换机连接多台 DGX Spark

搭建一个通过交换机互联的 DGX Spark 集群

基本理念

配置四个 DGX Spark 系统,通过 QSFP 交换机使用 200Gbps QSFP 连接实现高速节点间通信。此设置通过建立网络连接和配置 SSH 身份验证,支持跨多个 DGX Spark 节点的分布式工作负载。

您将完成的任务

在本剧本中,您将使用 QSFP 线缆和 QSFP 交换机物理连接四个 DGX Spark 设备,配置用于集群通信的网络接口,并在节点之间建立无密码 SSH,以创建功能齐全的分布式计算环境。同样的设置可以扩展到通过同一交换机连接的更多 DGX Spark 设备。

开始之前需要了解的内容

  • 基本了解分布式计算概念

  • 使用网络接口配置和 netplan

  • 具有 SSH 密钥管理经验

  • 具备配置您计划使用的带管理 QSFP 网络交换机的基本知识和经验。请参阅说明手册:
    • 了解如何连接交换机以管理端口和功能

    • 了解如何启用/ 禁用 QSFP 端口并在交换机上创建软件桥接器

    • 了解如何在端口上手动配置链路速度,并根据需要禁用自动协商

预备知识

  • 四个 DGX Spark 系统 (这些说明适用于连接交换机的任意数量的 DGX Spark 设备)

  • QSFP 交换机,至少 4 个 QSFP56-DD 端口 (每个端口至少 200Gbps)

  • 用于从交换机到设备的 200Gbps 连接的 QSFP 线缆。使用推荐线缆或类似设备。
    • 每个 Spark 一根线缆

    • 如果交换机有 400Gbps 端口,您也可以使用分支线缆将它们分割成两个 200Gbps 端口

  • 所有系统均可使用 SSH 访问

  • 在所有系统上执行 Root 或 sudo 访问: sudo whoami

  • 在所有系统上使用相同的用户名

  • 将所有系统升级到最新的操作系统和固件。请参阅 DGX Spark 文档
     https://docs.nvidia.com/dgx/dgx-spark/os-and-component-update.html

辅助文件

可以找到此剧本的所有必需文件 GitHub 上

时间和风险

  • 时长2 小时 (包括验证)

  • 风险级别:中等 – 涉及网络重新配置
  • 回滚:可以通过删除 netplan 配置或 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 或用户界面提供某种形式的管理接口。请参阅文档并连接到管理界面。确保交换机上的端口已启用。要连接四个 Spark,您需要确保交换机配置为为每个 DGX Spark 提供 200Gbps 连接。如果尚未完成,请参阅概述本使用手册所需的先验知识和预备知识。

第 3 步:物理硬件连接

使用每个 Spark 系统上的一个 CX7 端口连接 DGX Spark 系统和交换机 ( QSFP56-DD/ QSFP56 端口) 之间的 QSFP 线缆。建议在所有 Spark 系统上使用相同的 CX7 端口,以便更轻松地进行网络配置,并避免 NCCL 测试失败。本使用手册使用了第二个端口 (离以太网端口较远的端口) 。这应建立高速节点间通信所需的 200Gbps 连接。您将在所有四个火花上看到类似下面的输出。在本示例中,显示为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。

第 4 步:1. 验证协商后的链路速度

通过自动协商,链路速度可能不会默认为 200Gbps。如需确认,请对所有 Spark 运行以下命令,并检查速度是否显示为 200000Mb/s。如果低于该值,则需要在交换机端口配置中手动将链路速度设置为 200Gbps,并禁用自动协商。请参阅交换机的手册/ 文档以禁用自动协商,并手动将链路速度设置为 200Gbps (例如。基于 200G 的 CR4)

输出示例:

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

第 5 步:网络接口配置

注意:

只需一根 QSFP 线缆即可实现全带宽。

对于集群设置,所有 DGX SPARK:

  1. 应可供管理层访问 (例如。SSH 和运行命令)

  2. 应该能够访问互联网 (例如。下载模型/ 实用程序)

  3. 应该能够在 CX7 上使用 TCP/ IP 进行相互通信。以下步骤有助于进行配置。

建议使用以太网/ WiFi 网络进行管理和互联网流量,并与 CX7 网络保持隔离,以避免 CX7 带宽被用于非工作负载流量。

要使用交换机配置集群,所支持的方式需要在交换机上配置桥接器 (或使用默认桥接器) ,并通过交换机管理接口向其添加所有相关端口 (连接到 DGX Spark 的端口) 。

  1. 这样,所有端口都是集群网络配置所需的单层 2 域的一部分

  2. 某些交换机的限制是,硬件卸载只能在一个桥接器上启用,因此必须将所有端口都保留在一个桥接器上

完成为桥接器创建/ 添加端口后,您应已准备好在 DGX Spark 端配置网络。

4.1 集群网络配置脚本

我们创建了一个脚本 GitHub 上可自动执行以下操作:

  1. 为所有 DGX Spark 提供网络 IP 配置接口

  2. 在 DGX Spark 之间设置无密码身份验证

  3. 验证多节点通信

  4. 运行 NCCL 带宽测试

注意:

您可以在以下部分中使用该脚本,也可以继续执行手动配置。如果您使用该脚本,则可以跳过此使用手册中其余的设置部分。

按照以下步骤运行脚本:

Bash
# Clone the repository
git clone ${GITLAB_REPO_BASEURL}

# 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 互不兼容。

  1. 交换机上的 DHCP 服务器 (推荐,如果支持)

  2. 链路本地 IP 寻址 (所有节点上的 netplan 相同)

  3. 手动 IP 寻址 (每个节点上的 netplan 各不相同,但可提供更多的控制和确定性 IP)

选项 1:在交换机上配置 DHCP 服务器

  1. 使用足够大的子网在交换机上配置 DHCP 服务器,以便为所有 Spark 分配 IP。/ 24 子网在进行配置和未来进行任何扩展时应该非常适用。

  2. 在 DGX Spark 中配置UP CX7 接口,以使用 DHCP 获取 IP。例如。如果逻辑接口 enp1s0f1np1/enP2p1s0f1np1 为UP,则对所有 Spark 创建如下所示的 netplan。

    Bash
    # 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

  3. 使用足够大的子网在交换机上配置 DHCP 服务器,以便为所有 Spark 分配 IP。/ 24 子网在进行配置和未来进行任何扩展时应该非常适用。

    Bash
    # 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 步:运行测试和工作负载

现在,您的集群已设置为跨四个节点运行分布式工作负载。尝试运行。

注意:

只要使用手册要求在两个节点上运行命令,只需在所有四个节点上运行即可。 请确保调整在头节点上运行的 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

注意:

如果断开开关,请确保执行以下操作

  1. 重新启用自动协商,以避免日后在交换机用于不同目的时出现问题。

  2. 如果您使用交换机上的 DHCP 服务器配置为 Sparks 分配 IP,请删除该配置。

  3. 如果您创建了新桥接器,请将端口移回默认桥接器并删除新桥接器。

错误
原因
修复
"Network unreachable" errors
未配置网络接口
验证 netplan 配置和 sudo netplan apply
SSH authentication failures
SSH 密钥未正确分发
重新运行 ./discover-sparks 并输入密码
Nodes not visible in cluster
网络连接问题
验证 QSFP 线缆连接情况,检查 IP 配置
"APT update" errors (eg. E: The list of sources could not be read.)
APT 来源错误、来源冲突或密钥签名
查看 APT 和 Ubuntu 文档,修复 APT 源或密钥冲突
NCCL test failures (eg. libnccl.so.2: cannot open shared object file)
未在所有节点上完成 NCCL 配置
在运行 NCCL 测试之前,请确保按照 NCCL 剧本配置所有节点

资源

DGX Spark 用户性能指南

DGX Spark 论坛