1. [主页](/)
2. [查看所有手册](/build-spark)

# 通过交换机连接多台 DGX Spark  

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

概述

在四台 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 线缆。使用[推荐线缆](https://marketplace.nvidia.com/en-us/enterprise/personal-ai-supercomputers/qsfp-cable-0-4m-for-dgx-spark/)或类似设备。

  - 

每个 Spark 一根线缆

  - 

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

- 

所有系统均可使用 SSH 访问

- 

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

- 

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

- 

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

## 辅助文件  

可以找到此剧本的所有必需文件 [GitHub 上](https://github.com/NVIDIA/dgx-spark-playbooks/blob/main/nvidia/multi-sparks-through-switch/)

- 

[discover-sparks.sh](https://github.com/NVIDIA/dgx-spark-playbooks/blob/main/nvidia/connect-two-sparks/assets/discover-sparks) 用于自动节点发现和 SSH 密钥分发的脚本

- 

[集群设置脚本](https://github.com/NVIDIA/dgx-spark-playbooks/blob/main/nvidia/multi-sparks-through-switch/assets/spark_cluster_setup)用于自动网络配置、验证和运行 NCCL 完整性测试

## 时间和风险  

- 

**时长：** 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 ==\&gt; enp1s0f0np0 (Down) rocep1s0f1 port 1 ==\&gt; enp1s0f1np1 (Up) roceP2p1s0f0 port 1 ==\&gt; enP2p1s0f0np0 (Down) roceP2p1s0f1 port 1 ==\&gt; 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 上](https://github.com/NVIDIA/dgx-spark-playbooks/blob/main/nvidia/multi-sparks-through-switch/assets/spark_cluster_setup)可自动执行以下操作：

1. 

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

2. 

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

3. 

验证多节点通信

4. 

运行 NCCL 带宽测试

**注意：**

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

按照以下步骤运行脚本：

Bash

Copied
 ![Copy](/packs/static/components/code-container/icons/copy-23a0700cd65362629d8c.svg &quot;Copy&quot;)Copy

    # 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 &quot;--run-setup&quot; argument

 ![Expand](/packs/static/components/code-container/icons/chevron-down-3bedf6eabfb8ef17ff14.svg)

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

Copied
 ![Copy](/packs/static/components/code-container/icons/copy-23a0700cd65362629d8c.svg &quot;Copy&quot;)Copy

    # Create the netplan configuration file sudo tee /etc/netplan/40-cx7.yaml \&gt; /dev/null \&lt;\&lt;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

 ![Expand](/packs/static/components/code-container/icons/chevron-down-3bedf6eabfb8ef17ff14.svg)

  

3. 

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

Bash

Copied
 ![Copy](/packs/static/components/code-container/icons/copy-23a0700cd65362629d8c.svg &quot;Copy&quot;)Copy

    # 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

 ![Expand](/packs/static/components/code-container/icons/chevron-down-3bedf6eabfb8ef17ff14.svg)

## 选项 2：自动关联本地 IP 分配  

在所有 DGX Spark 节点上使用 netplan 配置网络接口，以实现自动链路本地寻址：

    # Create the netplan configuration file sudo tee /etc/netplan/40-cx7.yaml \&gt; /dev/null \&lt;\&lt;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 \&gt; /dev/null \&lt;\&lt;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 \&gt; /dev/null \&lt;\&lt;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 \&gt; /dev/null \&lt;\&lt;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 \&gt; /dev/null \&lt;\&lt;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](https://github.com/NVIDIA/dgx-spark-playbooks/blob/main/nvidia/connect-two-sparks/assets/discover-sparks) 其中一个节点的脚本以自动发现和配置 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 \&lt;-\&gt; 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: \&lt;BROADCAST,MULTICAST,UP,LOWER\_UP\&gt; 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 \&lt;username\&gt;@\&lt;IP for Node 1\&gt; ssh-copy-id -i ~/.ssh/id\_rsa.pub \&lt;username\&gt;@\&lt;IP for Node 2\&gt; ssh-copy-id -i ~/.ssh/id\_rsa.pub \&lt;username\&gt;@\&lt;IP for Node 3\&gt; ssh-copy-id -i ~/.ssh/id\_rsa.pub \&lt;username\&gt;@\&lt;IP for Node 4\&gt;

## 第 6 步：验证多节点通信  

从头节点测试基本的多节点功能：

    # Test hostname resolution across nodes ssh \&lt;IP for Node 1\&gt; hostname ssh \&lt;IP for Node 2\&gt; hostname ssh \&lt;IP for Node 3\&gt; hostname ssh \&lt;IP for Node 4\&gt; 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 \&lt;IP for Node 1\&gt;:1,\&lt;IP for Node 2\&gt;:1,\&lt;IP for Node 3\&gt;:1,\&lt;IP for Node 4\&gt;:1 \ --mca plm\_rsh\_agent &quot;ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no&quot; \ -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. 

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

| 错误 | 原因 | 修复 |
| --- | --- | --- |
| &quot;Network unreachable&quot; errors | 未配置网络接口 | 验证 netplan 配置和 sudo netplan apply |
| SSH authentication failures | SSH 密钥未正确分发 | 重新运行 ./discover-sparks 并输入密码 |
| Nodes not visible in cluster | 网络连接问题 | 验证 QSFP 线缆连接情况，检查 IP 配置 |
| &quot;APT update&quot; 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 剧本配置所有节点 |

* * *

## 资源

 ![](https://developer.download.nvidia.com/icons/m48-misc-question-faq.svg)

### DGX Spark 用户性能指南

 ![](https://developer.download.nvidia.com/icons/m48-misc-question-faq.svg)

### DGX Spark 论坛


