Quick start (scripts)
If you just want a working setup fast, use the helper scripts from GitHub. They automate Steps 2-5 below. Complete Step 1 (network setup) first, then run everything from Node 1 (the launcher), passing each node's management IP (the address you SSH to):
# 1. Download the helper scripts.
curl -fsSL https://raw.githubusercontent.com/NVIDIA/dgx-spark-playbooks/refs/heads/main/nvidia/nccl/assets/setup.sh -o setup.sh
curl -fsSL https://raw.githubusercontent.com/NVIDIA/dgx-spark-playbooks/refs/heads/main/nvidia/nccl/assets/launch.sh -o launch.sh
# 2. Build NCCL v2.30.7-1 and the test suite on both nodes.
bash setup.sh <NODE_2_IP>
# 3. Run the all_gather test across both nodes.
# Assumes the Ethernet interface enP7s7. On Wi-Fi, prefix the command with
# MGMT_IFNAME=wlP9s9 (your Wi-Fi interface) and use Wi-Fi IPs. See Step 4.
bash launch.sh --topology direct <NODE_1_IP> <NODE_2_IP>
To understand what the scripts do — or to debug — follow the manual steps below.
Configure network connectivity
Follow the network setup instructions from the Connect two Sparks playbook to establish connectivity between your DGX Spark nodes.
This includes:
- Physical QSFP cable connection
- Network interface configuration (automatic or manual IP assignment)
- Passwordless SSH setup
- Network connectivity verification
Build NCCL with Blackwell support
Execute these commands on both nodes to build NCCL from source with Blackwell architecture support:
# Install dependencies and build NCCL
sudo apt-get update && sudo apt-get install -y libopenmpi-dev
git clone -b v2.30.7-1 https://github.com/NVIDIA/nccl.git ~/nccl/
cd ~/nccl/
make -j src.build NVCC_GENCODE="-gencode=arch=compute_121,code=sm_121"
# Set environment variables
export CUDA_HOME="/usr/local/cuda"
export MPI_HOME="/usr/lib/aarch64-linux-gnu/openmpi"
export NCCL_HOME="$HOME/nccl/build/"
export LD_LIBRARY_PATH="$NCCL_HOME/lib:$CUDA_HOME/lib64/:$MPI_HOME/lib:$LD_LIBRARY_PATH"
Build NCCL test suite
Compile the NCCL test suite on both nodes:
# Clone and build NCCL tests
git clone https://github.com/NVIDIA/nccl-tests.git ~/nccl-tests/
cd ~/nccl-tests/
make MPI=1
Confirm the CX-7 ports and note each node's management IP
# Check network port status
ibdev2netdev
Example output:
rocep1s0f0 port 1 ==> enp1s0f0np0 (Up)
rocep1s0f1 port 1 ==> enp1s0f1np1 (Down)
roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Up)
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Down)
For the test command you need each node's management IP (the regular Ethernet address you SSH to). Find it on each node with:
ip addr show enP7s7
Take note of the management IP for both nodes.
NOTE
These steps assume the wired Ethernet management interface (enP7s7). If
your nodes use Wi-Fi instead (no Ethernet), replace enP7s7 with your
Wi-Fi interface (e.g. wlP9s9 — confirm the name with ip -o link show) in
Step 5, and use each node's Wi-Fi IP as its management IP. All nodes must
use the same interface — either enP7s7 on every node or wlP9s9 on every
node, not a mix.
Run NCCL communication test
NOTE
Full bandwidth can be achieved with just one QSFP cable. When two QSFP cables are connected, all four interfaces must be assigned IP addresses to obtain full bandwidth.
Run these commands on Node 1 (the launcher); mpirun launches the test across all nodes over SSH. Replace the IP addresses and interface names with the ones you found in the previous step.
# Set network interface environment variables (use your management network interface)
export UCX_NET_DEVICES=enP7s7
export NCCL_SOCKET_IFNAME=enP7s7
export OMPI_MCA_btl_tcp_if_include=enP7s7
# Run the all_gather performance test across both nodes (replace the management IP addresses with the ones you found from the previous step)
mpirun -np 2 -H <management IP for Node 1>:1,<management IP for Node 2>: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
You can also test your NCCL setup with a larger buffer size to use more of your 200Gbps bandwidth.
# Set network interface environment variables (use your management network interface)
export UCX_NET_DEVICES=enP7s7
export NCCL_SOCKET_IFNAME=enP7s7
export OMPI_MCA_btl_tcp_if_include=enP7s7
# Run the all_gather performance test across both nodes
mpirun -np 2 -H <management IP for Node 1>:1,<management IP for Node 2>: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 -b 16G -e 16G -f 2
NOTE
The IP addresses in the mpirun command are followed by :1. For example, mpirun -np 2 -H 192.168.0.10:1,192.168.0.20:1
Cleanup and rollback
# Rollback network configuration (if needed)
rm -rf ~/nccl/
rm -rf ~/nccl-tests/
Next steps
Your NCCL environment is ready for multi-node distributed training workloads on DGX Spark. Now you can try running a larger distributed workload such as TRT-LLM or vLLM inference.