部署两套 DGX Spark 系统

将两台 Spark 设备互联,并将其配置用于推理和微调。

基本概念

I部署两套 DGX Spark 系统,使用 200GbE QSFP 直连接口实现高速节点间通信。通过建立必要的网络连接和配置 SSH 认证,该设置支持在多个 DGX Spark 节点上运行分布式工作负载。

您将完成

您将使用 QSFP 线缆物理连接两台 DGX Spark 设备并配置集群通信网络接口,进而建立节点间免密 SSH 连接以创建完备的分布式计算环境。

前置知识

您将使用 QSFP 线缆物理连接两台 DGX Spark 设备并配置集群通信网络接口,进而建立节点间免密 SSH 连接以创建完备的分布式计算环境。

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

  • 具备网络接口与 netplan 配置经验

  • 具备 SSH 密钥管理经验

先决条件

您将使用 QSFP 线缆物理连接两台 DGX Spark 设备并配置集群通信网络接口,进而建立节点间免密 SSH 连接以创建完备的分布式计算环境。

  • 两台 DGX Spark 系统

  • 一根 QSFP 线缆,用于两设备间的 200GbE 直连

  • 两台系统均可使用 SSH 访问

  • 两台系统具备root或 sudo 权限: sudo whoami

  • 两台系统的用户名相同

辅助文件

可在 GitHub 上找到该指南的所有必需文件

时间和风险

您将使用 QSFP 线缆物理连接两台 DGX Spark 设备并配置集群通信网络接口,进而建立节点间免密 SSH 连接以创建完备的分布式计算环境。

  • 时长:1 小时 (含验证时间)

  • 风险级别:中 – 涉及网络重新配置

  • 还原方式:通过删除 netplan 配置或 IP地址分配可撤销网络变更

第 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 线缆连接两台 DGX Spark 系统,可使用每台设备上任意的QSFP接口。此举可建立节点间高速通信所需的200GbE直连链路。两台节点连接后,将显示如下输出(示例中显示为“Up”状态的接口为 enp1s0f1np1/enP2p1s0f1np1——每个物理端口对应两个名称)。

# Check QSFP interface availability on both nodes
nvidia@dxg-spark-1:~$ ibdev2netdev
roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Down)
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up)
rocep1s0f0 port 1 ==> enp1s0f0np0 (Down)
rocep1s0f1 port 1 ==> enp1s0f1np1 (Up)

注意:

若所有接口均未显示为“Up”,请检查QSFP线缆连接,重启系统后重试。显示为“Up”状态的接口取决于连接两台节点时所使用的物理端口。每个物理端口对应两个名称(例如enp1s0f1np1与enP2p1s0f1np1为同一物理端口)。请忽略enP2p1s0f0np0和enP2p1s0f1np1,仅使用 enp1s0f0np0和enp1s0f1np1 进行识别。

第 3 步 - 网络接口配置

选择一个选项来设置网络接口。注意选项 1 和 2 互斥。

注意:

仅需一根QSFP线缆即可实现全带宽连接。当连接两根QSFP线缆时,必须为全部四个接口分配IP地址才能获得完整带宽。以下方案一仅适用于单根QSFP线缆连接的情况。 

选项 1:自动分配 IP (仅适用于单根 QSFP 线缆连接)

在两个 DGX Spark 节点上使用 netplan 配置网络接口,以实现自动链路本地寻址:

# Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
  version: 2
  ethernets:
    enp1s0f0np0:
      link-local: [ ipv4 ]
    enp1s0f1np1:
      link-local: [ ipv4 ]
EOF

# Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml

# Apply the configuration
sudo netplan apply

选项 2:使用 netplan 配置文件手动分配 IP 地址。

在节点 1 执行:

# Create the netplan configuration file
sudo tee /etc/netplan/40-cx7.yaml > /dev/null <<EOF
network:
  version: 2
  ethernets:
    enp1s0f0np0:
      addresses:
        - 192.168.100.10/24
      dhcp4: no
    enp1s0f1np1:
      addresses:
        - 192.168.200.12/24
      dhcp4: no
    enP2p1s0f0np0:
      addresses:
        - 192.168.100.14/24
      dhcp4: no
    enP2p1s0f1np1:
      addresses:
        - 192.168.200.16/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:
    enp1s0f0np0:
      addresses:
        - 192.168.100.11/24
      dhcp4: no
    enp1s0f1np1:
      addresses:
        - 192.168.200.13/24
      dhcp4: no
    enP2p1s0f0np0:
      addresses:
        - 192.168.100.15/24
      dhcp4: no
    enP2p1s0f1np1:
      addresses:
        - 192.168.200.17/24
      dhcp4: no
EOF

# Set appropriate permissions
sudo chmod 600 /etc/netplan/40-cx7.yaml

# Apply the configuration
sudo netplan apply

选项 3:使用 netplan 配置文件手动分配 IP 地址。

注意:

使用此选项后,重启系统时分配给接口的 IP 会改变。

首先,识别可用且处于启动状态的网络端口:

# Check network port status
ibdev2netdev

输出示例:

roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Down)
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up)
rocep1s0f0 port 1 ==> enp1s0f0np0 (Down)
rocep1s0f1 port 1 ==> enp1s0f1np1 (Up)

使用输出中显示为“ ( Up) ”的界面。在本示例中,我们将使用 enp1s0f1np1。您可以忽略以前缀enP2p<...> 开头的接口 并仅使用 enp1<...> 。

在节点 1 上:

# Assign static IP and bring up interface.
sudo ip addr add 192.168.100.10/24 dev enp1s0f1np1
sudo ip link set enp1s0f1np1 up

对节点 2 重复相同的过程,但要使用 IP 192.168.100.11/24。确保使用 ibdev2netdev 命令确认正确的接口名称。

# Assign static IP and bring up interface.
sudo ip addr add 192.168.100.11/24 dev enp1s0f1np1
sudo ip link set enp1s0f1np1 up

您可以在每个节点上运行以下命令来验证两个节点上的 IP 分配:

# Replace enp1s0f1np1 with the interface showing as "(Up)" in your output, either enp1s0f0np0 or enp1s0f1np1
ip addr show enp1s0f1np1

第 4 步 - 设置免密 SSH 身份验证

选项 1:自动配置 SSH

在其中任一节点上 discover-sparks.sh 脚本,以自动发现节点并配置 SSH:

bash ./discover-sparks

预期输出与以下类似,其具有不同的 IP 和节点名称。首次运行脚本时,系统会提示您输入每个节点的密码。

Found: 169.254.35.62 (dgx-spark-1.local)
Found: 169.254.35.63 (dgx-spark-2.local)

Setting up bidirectional SSH access (local <-> remote nodes)...
You may be prompted for your password for each node.

SSH setup complete! Both local and remote nodes can now SSH to each other without passwords.

注意:

如果遇到任何错误,请按照下面的选项 2 手动配置 SSH 并调试问题。

选项 2:手动发现并配置 SSH

您需要找到已启动 CX-7 接口的 IP 地址。在两个节点上运行以下命令查询IP地址,并记录查询结果以供后续步骤使用。

  ip addr show enp1s0f0np0
  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。对节点 2 重复此过程。

在两个节点上运行以下命令以启用免密SSH:

# Copy your SSH public key to both nodes. Please 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>

第 5 步 - 验证多节点通信

测试基本的多节点功能:

# Test hostname resolution across nodes
ssh <IP for Node 1> hostname
ssh <IP for Node 2> hostname

第 6 步 - 清理和还原

警告:

这些步骤将重置网络配置。

# Rollback network configuration (if using Option 1)
sudo rm /etc/netplan/40-cx7.yaml
sudo netplan apply

# Rollback network configuration (if using Option 2)
sudo ip addr del 192.168.100.10/24 dev enp1s0f0np0  # Adjust the interface name to the one you used in step 3.
sudo ip addr del 192.168.100.11/24 dev enp1s0f0np0  # Adjust the interface name to the one you used in step 3.
错误
原因
修复
错误 (Network unreachable)
未配置网络接口
验证 netplan 配置并运行
sudo netplan apply
SSH 身份验证失败
(SSH authentication failures )
SSH 密钥未正确分发
重新运行 ./discover-sparks 并输入密码

节点 2 在集群中不可见
(Node 2 not visible in cluster)

网络连接问题
验证 QSFP 线缆连接,检查 IP 配置

资源

DGX Spark 文档

DGX Spark 论坛