MultimodalFlow
← 返回博客

双节点 NVIDIA DGX Spark 组集群:200GbE 看起来很快,但 NCCL 才说明真相

DGX SparkNCCLRDMAvLLM多节点200GbERoCE分布式推理大模型ConnectX-7

最近我测试了双节点 NVIDIA DGX Spark 集群,目标是通过高速 QSFP / ConnectX-7 直连端口跑通大模型推理,并判断这套互联方案能否支撑 vLLM 实际服务。简短结论:物理链路表现优秀,但对 LLM 推理真正有意义的数字,并不是规格表上那个。


测试环境

两台 NVIDIA DGX Spark,通过 QSFP / ConnectX-7 高速端口直连:

节点IP
dgxse01192.168.10.1
dgxse02192.168.10.2

两台节点的 RDMA 接口配置:

配置项
网络接口enp1s0f0np0
RDMA 设备rocep1s0f0
GID 索引3

目标负载:通过 vLLM + Ray 分布式后端推理 Qwen3.5-122B-A10B-FP8


第一步:确认物理链路

在测试 RDMA 或 NCCL 之前,先确认 QSFP 链路以满速完成协商:

ethtool enp1s0f0np0 | grep -E "Speed|Link detected"

结果:

Speed: 200000Mb/s
Link detected: yes

200GbE 确认。这只说明物理层健康——对于 NCCL 应用层能达到多少带宽,这一步完全不说明任何问题。


第二步:原始 RDMA 带宽

接下来用 ib_write_bw 测量原始 RDMA 写带宽,这是 InfiniBand / RoCE 链路最常用的基准测试工具。

dgxse01(服务端):

ib_write_bw -d rocep1s0f0 -F --report_gbits -s 1048576 -q 8 -b

dgxse02(客户端):

ib_write_bw -d rocep1s0f0 -F --report_gbits -s 1048576 -q 8 -b 192.168.10.1

结果:

BW average: ~197 Gb/s

换算成 GB/s:197 / 8 ≈ 24.6 GB/s

在 RDMA 层,两台 Spark 之间的连接健康,非常接近 200GbE 理论上限。


第三步:NCCL All-Reduce 带宽

原始 RDMA 带宽是必要条件,但不是充分条件。vLLM 这类框架使用 NCCL 进行 GPU 间集合通信——NCCL 集合带宽与点对点 RDMA 带宽是两回事。

我用 nccl-tests 测量了跨两节点的 all_reduce_perf

cd /opt/nccl-tests
mpirun --allow-run-as-root -np 2 \
  -H 192.168.10.1:1,192.168.10.2:1 \
  --bind-to none \
  --map-by slot \
  --mca oob_tcp_if_include enp1s0f0np0 \
  --mca btl_tcp_if_include enp1s0f0np0 \
  -x NCCL_SOCKET_IFNAME=enp1s0f0np0 \
  -x NCCL_IB_DISABLE=0 \
  -x NCCL_IB_HCA=rocep1s0f0 \
  -x NCCL_IB_GID_INDEX=3 \
  -x NCCL_IB_TC=106 \
  -x NCCL_IB_PCI_RELAXED_ORDERING=1 \
  /opt/nccl-tests/build/all_reduce_perf -b 8M -e 4G -f 2 -g 1

结果:

Avg bus bandwidth: ~10.2 GB/s

约为原始 RDMA 带宽的 40%。NCCL 日志显示走的是正确路径:

NCCL INFO NET/IB
GID 3
devName=rocep1s0f0

NCCL 没有回退到 TCP Socket,确实在用 NET/IB。带宽下降不是配置错误导致的。


第四步:NCCL Send/Recv 带宽

vLLM 的流水线并行(Pipeline Parallelism)依赖的是点对点 send/recv,而非 all-reduce。我单独测试了这一路径:

cd /opt/nccl-tests
mpirun --allow-run-as-root -np 2 \
  -H 192.168.10.1:1,192.168.10.2:1 \
  --bind-to none \
  --map-by slot \
  --mca oob_tcp_if_include enp1s0f0np0 \
  --mca btl_tcp_if_include enp1s0f0np0 \
  -x NCCL_SOCKET_IFNAME=enp1s0f0np0 \
  -x NCCL_IB_DISABLE=0 \
  -x NCCL_IB_HCA=rocep1s0f0 \
  -x NCCL_IB_GID_INDEX=3 \
  -x NCCL_IB_TC=106 \
  -x NCCL_IB_PCI_RELAXED_ORDERING=1 \
  /opt/nccl-tests/build/sendrecv_perf -b 8M -e 4G -f 2 -g 1

结果:

sendrecv_perf: ~9 GB/s

点对点性能和 all-reduce 几乎没有差距。在这套互联上,PP=2 不能保证比 TP=2 快。


第五步:理解 GDR 0

NCCL 日志中最关键的一行:

Connected all rings, use ring PXN 0 GDR 0

GDR 0 表示 NCCL 走的是 RDMA 网络路径,但未启用 GPUDirect RDMA。GPUDirect 未激活时,GPU 张量数据必须经过系统内存才能到达网卡——多了一次 PCIe 拷贝,而 ib_write_bw 的测试完全绕过了这一步。

这就是两者差距的根本原因:

层级带宽
ib_write_bw(原始 RDMA)~24.6 GB/s
NCCL all_reduce_perf~10.2 GB/s
NCCL sendrecv_perf~9 GB/s

ib_write_bw 测的是主机到主机的 RDMA,以满速运行。NCCL 传输的是 GPU 张量——在 GPUDirect 未启用的情况下,这是本质不同的数据路径。


第六步:vLLM 部署策略

Ray 正确识别了两节点:

Active nodes: 2
Total GPU:    2

Qwen3.5-122B-A10B-FP8 拆分到两台 Spark 上,有两种并行策略:

方案 A:张量并行(TP=2)

tensor-parallel-size: 2
pipeline-parallel-size: 1

每一层在两台机器上水平切分。每次前向传播都需要跨节点 all-reduce。~10.2 GB/s 的 all-reduce 带宽可以支撑 TP=2 运行,但对于 122B 模型,每层通信开销不可忽视。

方案 B:流水线并行(PP=2)

tensor-parallel-size: 1
pipeline-parallel-size: 2

每台机器负责连续的若干层,跨节点通信只发生在流水线阶段边界。我最初预期 PP=2 会明显占优,但实测 sendrecv_perf ~9 GB/s,与 all-reduce 几乎相同,优势并不显著。

务实建议: 两种方案都跑一遍,使用相同 prompt、相同上下文长度、相同输出长度,以实际 token/s 决定。


基线汇总

层级指标结果
物理层链路速度200GbE
物理层链路状态已连接
RDMAib_write_bw~197 Gb/s(~24.6 GB/s)
NCCL版本2.28.9
NCCL传输路径NET/IB(rocep1s0f0,GID 3)
NCCLGPUDirectGDR 0(未启用)
NCCLall_reduce_perf~10.2 GB/s
NCCLsendrecv_perf~9 GB/s
vLLMRay 节点2 节点,2 GPU

结论

双节点 DGX Spark 集群通过 200GbE / ConnectX-7 链路顺利组网。原始 RDMA 带宽表现优秀,接近 200GbE 理论上限。网络本身没有问题。

但核心结论很简单:

200GbE 不等于 NCCL 能跑到 25 GB/s。

大模型推理涉及四个不同的性能层次——物理链路速度、原始 RDMA 带宽、NCCL 集合带宽、vLLM 实际 token/s——相邻两层之间可以相差 2 到 3 倍。

在这套配置下,vLLM 实际可用的 GPU 通信带宽约为 9–10 GB/s,而非 25 GB/s。这才是真正的设计约束。针对两台 Spark 上的 122B FP8 模型,请在实际服务负载下分别测试 PP=2 和 TP=2,再决定并行策略。


测试时间:2026 年 6 月 19 日。NCCL 2.28.9,vLLM + Ray。模型:Qwen3.5-122B-A10B-FP8。