首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 NCCL 检查 2 台 DGX Spark 协同合作

用 NCCL 检查 2 台 DGX Spark 协同合作

作者头像
GPUS Lady
发布2026-07-13 15:03:26
发布2026-07-13 15:03:26
290
举报
文章被收录于专栏:GPUS开发者GPUS开发者

前面《 小白教程:两台 NVIDIA GB10 系统如何互》已经带着大家用 QSFP 网线连接两台 DGX Spark 设备,本文就进一步用 NVIDIA 的 NCCL(全名 NVIDIA Collective Communications Library,集合通信库)来确认两台机器直接的协作方式。

大部分只处理单节点操作的人对 NCCL 比较陌生,因此一开始还是得花点时间说明一下 NCCL 的内容与用途。

NCCL:GPU 集群的"高速交通指挥系统"

想象一下这样的场景:你要组织1000个人同时完成一份拼图,每个人手里都有部分碎片。如果大家各自为政、互相等待,效率会极低。但如果有一个专业的指挥中心,统一调度每个人的碎片传递路线,确保大家互不拥堵、快速交换,整个任务就能高效完成。

NCCL 扮演的正是这样的角色—它是NVIDIA开发的通信库,专门负责协调多个GPU之间的数据传输,让它们像一个整体一样协同工作。


一、解决了什么问题?

单个GPU算力再强也有上限。训练ChatGPT这样的千亿参数大模型,需要成百上千个GPU同时计算。但问题来了:每个GPU只负责模型的一部分,计算过程中必须频繁交换数据—比如梯度同步、参数广播等。如果通信效率低下,GPU大部分时间都在"等待收件",算力再强也是浪费。

NCCL的使命就是让GPU之间的通信更快、更智能、更透明。开发者不需要关心底层是NVLink、PCIe还是InfiniBand,NCCL会自动选择最优路径。


二、核心技术:聪明地"找路"和高效地"传货"

1. 先摸清路况,再规划路线

NCCL启动时会像导航软件一样扫描硬件拓扑:GPU之间是通过什么连接的?是超高速的NVLink,还是普通的PCIe?跨节点走的是InfiniBand还是以太网?根据这些信息,NCCL自动规划出最优通信路径,优先选择带宽最高、延迟最低的路线。

2. 根据货物大小选择运输方式

NCCL内置了多种通信算法:

  • 环形算法:适合传输大批量数据,所有GPU排成一个环,数据沿环流转,带宽利用率极高。好比用传送带批量运送货物。
  • 树形算法:适合小批量数据或一对多广播,通信步数少,延迟低。好比快递分拣中心,层层分发效率更高。

NCCL会根据数据量和GPU数量动态切换算法,无需人工干预。

3. 零拷贝:数据不经CPU"中转"

传统通信方式中,数据要从GPU显存拷贝到内存,再交给网卡发送——多了一道CPU参与的环节,速度慢且浪费算力。NCCL借助GPUDirect RDMA技术,让数据直接从GPU显存传输到网卡,再直接到达对端GPU显存,全程绕过CPU和内存。这就像货物从仓库直接上高速公路,不再经过中转站装卸,速度大幅提升。


三、实际应用场景

数据并行训练:这是最常见的场景。每个GPU持有完整模型,处理不同数据。每轮计算结束后,所有GPU通过NCCL的AllReduce操作同步梯度,保证模型更新一致。PyTorch的DDP(分布式数据并行)默认就使用NCCL作为通信后端。

大模型并行训练:GPT-4、Llama 3等千亿参数模型需要将模型切分到多个GPU上。Tensor Parallelism(层内切分)依赖NCCL做高频AllReduce通信,Pipeline Parallelism(层间切分)依赖NCCL做点对点传输。

超大规模集群扩展:在DGX SuperPOD等万卡集群中,NCCL支持多轨通信(每个GPU绑定独立网卡端口),避免拥塞,保证线性扩展能力。


四、总结

对普通开发者来说,NCCL就像一个"隐形引擎"——安装好驱动、调用标准API即可,它自动处理所有通信细节。但了解它的工作原理,可以帮助你在遇到分布式训练性能瓶颈时,通过调整环境变量、检查拓扑配置等手段快速定位问题。

一句话概括:没有NCCL,多GPU只是各自为战;有了NCCL,多GPU才真正成为一个整体。 它是现代AI基础设施中不可或缺的底层支柱。

在两台 DGX Spark 安装 NCCL

要执行这个步骤之前,先确认你已经安装《 小白教程:两台 NVIDIA GB10 系统如何互联》一文内去配置要两台 DGX Spark,并且设置好两边的互相 SSH 免密码登录,才能顺利完成下面任务。

1. 确认两台直接的连线:

在两台机器上都执行以下指令,确认连线与 IP 配置:

代码语言:javascript
复制
# 检查本机网口的连接状况
ibdev2netdev
# 检查网口的 IP
ip -brief addr show | grep en

会出现类似下面的内容,如果 Up 数量不对称、或 IP 显示有问题,请自行检查问题。

2. 安装 NCCL 库(在两台机器上都安装)
代码语言:javascript
复制
## 安装依赖库
sudo apt-get update && sudo apt-get install -y libopenmpi-dev
## 下载代码
git clone -b v2.28.9-1 https://github.com/NVIDIA/nccl.git ~/nccl/
cd ~/nccl/
## 编译
make -j src.build NVCC_GENCODE="-gencode=arch=compute_121,code=sm_121"
## 设定环境变量
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"
## 启动环境变量
source ~/.bashrc
3. 安装 NCCL 测试范例(在两台机器上都安装)
代码语言:javascript
复制
## Clone and build NCCL tests
git clone https://github.com/NVIDIA/nccl-tests.git ~/nccl-tests/
cd ~/nccl-tests/
make MPI=1
4. 执行测试

这边比较容易混乱的是网口编号与 IP 的使用。从上面检测中,显示左边节点的 “Up” 网口编号为 enp1s0f0np、右边节点的编号为 enp1s0f1np1,用 NIC 变量处理两个节点的网口编号:

代码语言:javascript
复制
## 配置 Up 网口编号
export NIC="enp1s0f0np0"          # 右边节点为 enp1s0f1np1
export IP_NODE1="192.168.100.10"  # 左边节点 Up 的 IP
export IP_NODE2="192.168.100.11"  # 右边节点 Up 的 IP
export UCX_NET_DEVICES=${NIC}
export NCCL_SOCKET_IFNAME=${NIC}
export OMPI_MCA_btl_tcp_if_include=${NIC}
  • 执行跨节点 all_gather 性能测试,使用更大的缓冲区。指令如下
代码语言:javascript
复制
mpirun -np 2 -H ${IP_NODE1}:1,${IP_NODE2}: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

执行结果如下:

好了,这就表示正常执行,用 QSFP 线连接两台 DGX Spark 系统,并且调通 NCCL 库,后面就可以试试用两台设备去执行一些任务,例如模型优化、科学计算等等应用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NCCL:GPU 集群的"高速交通指挥系统"
  • 在两台 DGX Spark 安装 NCCL
    • 1. 确认两台直接的连线:
    • 2. 安装 NCCL 库(在两台机器上都安装)
    • 3. 安装 NCCL 测试范例(在两台机器上都安装)
    • 4. 执行测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档