基本思路
通过 200GbE 直连 QSFP 连接,为两台 DGX Spark 系统配置高速节点间通信。该配置通过建立网络连通性并配置 SSH 认证,使多台 DGX Spark 节点能够运行分布式工作负载。
你将完成的内容
你将使用一根 QSFP 线缆物理连接两台 DGX Spark 设备,为集群通信配置网络接口,并在节点之间建立免密 SSH,从而搭建一个可用的分布式计算环境。
开始前需要了解
- 对分布式计算概念有基本理解
- 了解网络接口配置和 netplan 的使用
- 具备 SSH 密钥管理经验
前置条件
- 两台 DGX Spark 系统
- 一根用于两台设备间直连 200GbE 的 QSFP 线缆
- 两台系统都可通过 SSH 访问
- 两台系统都具备 root 或 sudo 权限:
sudo whoami - 两台系统使用相同的用户名
相关文件
本 playbook 所需的所有文件都可在 GitHub 上找到
- discover-sparks.sh 脚本,用于自动发现节点并分发 SSH 密钥
时间与风险
-
耗时: 约 1 小时(包含验证)
-
风险等级: 中 - 涉及网络重新配置
-
回滚: 删除 netplan 配置或 IP 分配即可撤销网络更改
-
最后更新: 11/24/2025
- 文案小幅修订
第 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 步:物理硬件连接
在两台 DGX Spark 系统之间使用任意 QSFP 接口连接 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)
NOTE
如果所有接口都没有显示为 'Up',请检查 QSFP 线缆连接,重启系统后再试。
哪个接口显示为 'Up' 取决于你使用哪一个端口连接两台节点。每个物理端口有两个名称,例如 enp1s0f1np1 和 enP2p1s0f1np1 指的是同一个物理端口。请忽略 enP2p1s0f0np0 和 enP2p1s0f1np1,只使用 enp1s0f0np0 和 enp1s0f1np1。
第 3 步:配置网络接口
请选择一种方式来配置网络接口。选项 1 和选项 2 互斥。
NOTE
只使用一根 QSFP 线缆也可以达到满带宽。
当连接两根 QSFP 线缆时,必须为四个接口都分配 IP 地址,才能获得满带宽。
下方的选项 1 仅适用于连接了 1 根 QSFP 线缆的情况。
选项 1:自动分配 IP(仅在连接 1 根 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:通过命令行手动分配 IP
NOTE
使用此选项时,接口上的 IP 分配会在系统重启后丢失。
首先,确认哪些网络端口可用并处于 up 状态:
## 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
在其中一个节点上运行 DGX Spark 的 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.
NOTE
如果遇到任何错误,请按照下面的选项 2 手动配置 SSH,并借此排查问题。
选项 2:手动发现并配置 SSH
你需要找到处于 up 状态的 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 步:清理与回滚
WARNING
以下步骤会重置网络配置。
## 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 密钥未正确分发 | 重新运行 ./discover-sparks 并输入密码 |
| 集群中看不到节点 2 | 网络连接问题 | 检查 QSFP 线缆连接并核对 IP 配置 |