NCCL拓扑优化大揭秘:性能提升不止10%!
在大规模分布式训练中,NCCL的拓扑发现和建模至关重要。它能帮助建立硬件感知的通信优化,充分利用异构带宽,避免通信瓶颈,直接影响训练性能和扩展性。
NCCL初始化时的拓扑流程主要负责系统拓扑发现、路径建模、设备亲和性设置、通信通道构建、特性检测与初始化。新媒网了解到,这是NCCL多GPU通信的基础。
具体流程包括:
- 系统拓扑构建:
ncclTopoGetSystem
自动探测或解析XML,构建NCCL内部的系统拓扑结构,涵盖CPU、GPU、PCIe、NIC、NVLink等。 - 通信路径计算:
ncclTopoComputePaths
基于拓扑结构,计算所有GPU与NIC之间的最短或最优通信路径,综合考虑带宽、跳数等因素。 - 拓扑精简:
ncclTopoTrimSystem
移除不可达的GPU、未用到的NIC,精简拓扑,提高效率。 - 路径重算: 再次运行
ncclTopoComputePaths
,确保路径信息在修剪后的拓扑中依然准确。 - 搜索结构初始化:
ncclTopoSearchInit
为后续的通信算法(如Ring、Tree、CollNet等)初始化搜索辅助结构。 - 拓扑打印:
ncclTopoPrint
输出最终的系统拓扑,便于调试和分析。 - CPU亲和性设置: 将当前线程绑定到本地GPU最近的NUMA节点,保证主机内存分配的局部性。
- CollNet支持检测: 检测当前环境和硬件是否支持CollNet(多节点高效集合通信)。
- NVLS支持检测: 检测并初始化NVLS(NVIDIA NVLink Switch)支持。
在NCCL拓扑中,有三个关键概念:节点(node)、链路(link)和路径(path)。
节点(node): 系统中的一个硬件组件,是NCCL拓扑的基本单元。常见的节点类型包括GPU、NIC、CPU、PCI、NVS(NVSwitch)以及NET。其中,NIC通常指的是物理网卡,例如Mellanox或Broadcom的PCIe网卡;NET通常是指网络端点,例如NIC上的一个网络端口,一个NIC可以有多个物理端口。
链路(link): 表示两个节点之间的直接物理连接。链路类型包括LOC(Local自环连接)、NVL(NVLink连接,包括GPU与GPU之间或者GPU与NVSwitch之间)、PCI(PCIe连接,比如GPU与NIC之间的PCIe通道)、SYS(系统总线连接,比如NUMA节点间的QPI/UPI/Infinity Fabric等)以及NET(通过网络设备,如以太网、IB或RoCE进行互联)。
路径(path): 表示从一个节点到另一个节点的通信路径,可以经过多个链路。
常见的8 GPU服务器拓扑通常包括:2个CPU(CPU之间通过QPI连接);每个CPU下有2个PCIe Switch;每个PCIe Switch下连接2个GPU、2个NIC和一些NVMe;8个GPU通过NVLink + NVSwitch实现全互联。
在GPU通过NIC通信时,可以选择直接使用8个物理PCIe Switch,或者将一个物理PCIe Switch虚拟化为两个逻辑Virtual PCIe Switch。
IBM Power9服务器中,Power9芯片会与GPU直接通过NVLink连接。
NVIDIA从Hopper架构开始推出了Grace架构,例如GH200以及后续的GB200。GH200的架构中,Grace CPU与GPU之间可以通过NVLink C2C连接,而GPU与GPU之间依旧可以通过NVLink连接。
Superpod中,常见的NVL72将NVLink + NVSwitch全互联的范围进一步扩展到单个机柜甚至多个机柜内。例如,DGX GB200 NVL72将其扩展到一个机柜的72个B200 GPU。
NCCL拓扑构建的入口函数为ncclTopoGetSystem
,包含以下主要部分:
初始化xmlTopo文件: 如果指定了
NCCL_TOPO_FILE
,则从中加载;否则尝试从默认路径加载;如果都没有加载成功,则创建相应节点。GPU自动检测: 遍历所有通信证中的Rank,筛选出和当前进程处于同一个Host的所有GPU,获取PCI Bus ID,创建对应的XML节点,并设置属性(
keep
、rank
、gdr
)。NIC自动检测: 优先处理CollNet网络设备,通过
collNetGetProperties
获取每个NIC的属性(pciPath
、名称、速率、port、guid、最大连接数、gdr支持等),使用ncclTopoFillNet
填充XML文件并设置节点属性。补充常规网络设备,通过comm->ncclNet->devices
获取常规网络设备属性,使用ncclTopoFillNet
填充XML文件并设置节点属性。MNNVL信息补全: NCCL在启用MNNVL(Multi-Node NVLink Clique)功能时,对多节点NVLink拓扑信息的收集与融合。为整个clique分配一个足够大的共享内存,每个相关rank都有对应空间。使用
bootstrapIntraNodeAllGather
进行所有rank的XML结构同步。分配一块新的区域存放融合后的clique拓扑。遍历所有rank,依次融合到clique的XML结构中,形成全局的clique拓扑。释放原有XML拓扑。Dump XML拓扑: 如果配置了
NCCL_TOPO_DUMP_FILE
,将XML拓扑保存到文件中。根据XML生成NCCL拓扑: 调用
ncclTopoGetSystemFromXml
生成NCCL拓扑。
ncclTopoGetSystemFromXml
主要包含8个步骤:
初始化
ncclTopoSystem
结构。查找系统顶层节点“system”。
遍历system节点下所有子节点,查找并调用
ncclTopoAddCpu
添加<cpu>
节点(包括<pic>
和<nic>
)。设置本地Host的systemId:
systemId
用于唯一标识当前进程所在的Host(或NUMA域)在整个多节点拓扑中的位置。在多机多卡场景下,systemId
能帮助NCCL管理和区分不同主机的硬件资源,实现跨主机的高效通信和调度。添加NVLink拓扑连接: 调用
ncclTopoAddNvLinks
递归添加NVLink连接,建立GPU-GPU、GPU-CPU、GPU-NVS等NVLink拓扑。添加C2C拓扑连接: 调用
ncclTopoAddC2c
递归解析C2C(CPU-to-CPU或GPU-to-CPU)连接信息,并建立相应的链路。拓扑结构优化与补全:
ncclTopoFlattenBcmSwitches
将BCM Gen4/Gen5 PCIe交换芯片的多级结构“扁平化”,避免多级结构影响路径搜索。ncclTopoConnectCpus
将同一系统下的所有CPU节点互联,建模NUMA节点之间的系统总线。ncclTopoSortSystem
对整个系统的拓扑进行排序,优化后续遍历和搜索效率。
ncclTopoAddCpu
用于将一个CPU节点(通常对应一个NUMA节点)及其下属的PCI、NIC子节点递归添加到NCCL内部的系统拓扑结构中。该函数解析XML拓扑描述文件中的<cpu>
节点,提取NUMA id、架构、厂商、亲和性等属性,创建并初始化NCCL拓扑中的CPU节点,并递归添加其下挂的PCI设备、NIC设备等,为后续NCCL通信路径建模和优化提供准确的硬件结构基础。
该函数执行以下步骤:
- 获取NUMA节点编号: 从XML节点读取
numaid
属性,确定该CPU节点的NUMA id。 - 获取systemId: 通过Host哈希等信息,确定该CPU节点属于哪个物理Host。
- 创建CPU节点: 在NCCL拓扑结构中创建一个新的CPU节点,唯一id由
systemId
和numaId
组合而成。 - 设置CPU亲和性(affinity): 如果XML中有
affinity
属性,则解析为CPU亲和性掩码,记录该NUMA节点可用的CPU Core集合。 - 设置CPU架构、厂商和型号: 读取并设置CPU架构(如x86_64、arm64、ppc64)。如果是x86架构,还会进一步读取厂商(Intel、AMD)和型号(如Skylake、Broadwell)等信息。
- 递归处理子节点: 如果是
<pci>
节点,递归调用ncclTopoAddPci
,将PCI设备(如GPU、PCIe Switch、NIC等)挂到该CPU节点下;如果是<nic>
节点,查找或创建NIC节点,并与CPU节点建立PCI链路,然后递归添加NIC下的网络设备。
ncclTopoAddPci
用于递归解析XML拓扑文件中的<pci>
节点,将PCI设备(包括PCIe Switch、GPU、NIC等)及其下属设备添加到NCCL内部的系统拓扑结构中,并建立相应的链路。该函数支持多层级PCIe结构,能自动识别并处理GPU、NIC等特殊设备,并递归处理其下属节点,为NCCL拓扑建模提供完整的PCIe层次结构。
该函数执行以下步骤:
解析设备类型和BusId: 读取
<pci>
节点的class
属性,确定设备类型(PCI、GPU、NIC、NVS等)。读取busid
属性,转为唯一的64位BusId。处理GPU子节点: 如果该PCI设备下有
<gpu>
子节点,则将其视为GPU设备,创建GPU节点(ncclTopoCreateNode
),并递归设置其属性(ncclTopoAddGpu
,如rank、sm、dev、gdr等)。处理NIC子节点: 如果该PCI设备下有
<nic>
子节点,则将其视为NIC设备,合并多端口NIC(忽略sub device id),保证同一物理NIC只建一个节点,创建NIC节点,并递归添加其下属网络设备(ncclTopoAddNic
)。处理普通PCI设备(如PCIe Switch): 如果是普通PCI设备(如PCIe Switch),则创建节点,并递归处理其所有子PCI设备,解析并组合vendor/device/subsystem_vendor/subsystem_device字段,唯一标识该PCI设备。
建立连接: 如果本节点有效,则根据
link_width
和link_speed
属性,计算PCIe链路带宽(单位GB/s),在本节点和父节点之间建立双向PCI链路(ncclTopoConnectNodes
)。
ncclTopoAddNvLinks
函数的作用是递归解析XML拓扑描述中的NVLink连接信息,并在NCCL内部拓扑结构中建立GPU-GPU、GPU-CPU、GPU-NVS等NVLink链路。
判断节点类型: 如果当前XML节点是 "nvlink",说明需要添加一条 NVLink 连接。如下图红框中所示节点。
定位本地GPU节点: 通过
parentBusId
和systemId
计算出本地GPU的唯一ID,并在系统拓扑中查找对应的GPU节点。获取NVLink连接目标类型和目标节点: 读取“tclass”属性,判断目标类型(GPU、CPU或NVS)。如果目标是GPU,则根据
target
属性找到目标GPU节点;如果目标是CPU,则查找与本地GPU最近的CPU节点;如果目标是NVS(NVSwitch),则查找或创建NVS节点。建立NVLink连接: 计算NVLink带宽(根据GPU计算能力和NVLink数量),在本地GPU和目标节点之间建立NVLink链路(双向或单向,取决于目标类型)。
递归处理子节点: 如果当前节点不是
<nvlink>
,则递归处理其所有子节点,继续查找和添加NVLink连接。
ncclTopoAddC2c
的作用是递归解析XML拓扑描述中的C2C(CPU-to-CPU或GPU-to-CPU)连接信息,并在NCCL内部拓扑结构中建立相应的链路。
- 处理c2c节点: 通过
parentBusId
和systemId
计算出本地GPU的唯一ID,并在系统拓扑中查找对应的GPU节点。读取该连接的count
(链路数量)和bw
(单链路带宽),计算总带宽c2cBw
。查找与该GPU最近的CPU节点(NUMA归属)。在GPU和CPU之间建立双向的NVL类型链路(没有c2c链路,依然是NVLink),带宽为c2cBw
。 - 递归处理子节点: 如果当前节点不是 "c2c",则递归处理其所有子节点。如果当前节点是
<cpu>
,则更新systemId
(用于多主机场景)。获取当前节点的busid
属性,作为后续递归的父busId
。对每个子节点递归调用ncclTopoAddC2c
,传递合适的busId
和systemId
。
ncclTopoFlattenBcmSwitches
的作用是将Broadcom(BCM)Gen4/Gen5 PCIe交换芯片的两级(多级)结构“扁平化”,简化为单层结构。该函数通过识别并合并这些多级结构,把所有下挂设备直接连接到顶层交换芯片节点,消除中间多余的“子交换芯片”节点。
遍历所有PCI类型节点:
- 通过
getBcmGen
函数判断当前节点是否为BCM Gen4/Gen5芯片。 - 查找所有子交换芯片:遍历当前交换芯片的所有链路,找出所有下挂的、同型号的子交换芯片节点,记录这些子交换芯片的id,并从父交换芯片的链路中移除对这些子交换芯片的连接。
- 将所有子交换芯片下挂的设备提升到父交换芯片下:对每一个子交换芯片,遍历其所有链路,把所有下挂设备(除了父交换芯片本身)都直接连接到父交换芯片。同时,把这些设备指向子交换芯片的链路改为指向父交换芯片。
- 删除子交换芯片节点:从系统中移除这些已经被“吸收”的子交换芯片节点。
- 标记父交换芯片已处理:修改父交换芯片的device字段,防止后续重复处理。
- 重启遍历:由于节点数组发生变化,从头开始遍历,直到所有可合并的结构都被处理完。
ncclTopoConnectCpus
的作用是在NCCL拓扑系统中,将同一物理主机(systemId
相同)下的所有CPU节点两两互联,为每对CPU节点之间建立一条系统总线(SYS)类型的链路,并设置合适的带宽。
ncclTopoSortSystem
的主要作用是对NCCL内部的系统拓扑结构进行排序和规范化,以便后续遍历、路径搜索和调度更加高效和一致。
ncclTopoConnectNodes
函数用于在NCCL拓扑结构中为两个node之间建立一条链路(link),并设置链路类型(如NVLink、PCI、NET等)和带宽(bw)。如果链路已存在,则聚合带宽;否则新建链路。所有链路会按照带宽从高到低排序,便于后续路径选择和优化。
新媒网跨境认为,深入理解NCCL的拓扑建模机制,有助于优化分布式训练的通信效率,提升整体训练性能。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。

Amazon Kindle Paperwhite 16GB (newest model) – Our fastest Kindle ever, with new 7" glare-free display and weeks of battery life – Black
$ 135.99

Blink Mini 2 (newest model) — Home Security & Pet Camera with HD video, color night view, motion detection, two-way audio, and built-in spotlight — 1 camera (White)
$ 39.99

Ring Rechargeable Quick Release Battery Pack
$ 33.42

Blink Video Doorbell (newest model) – Head-to-toe HD view, two-year battery life, and simple setup. Sync Module Core included – System (Black)
$ 69.99

Amazon Echo Dot (newest model), Vibrant sounding Alexa speaker, Great for bedrooms, dining rooms and offices, Charcoal
$ 49.99

评论(0)