
前言分布式深度学习训练中梯度同步是决定扩展效率的关键瓶颈。当模型参数量达到数十亿级别时多设备之间的集合通信开销往往成为制约训练吞吐量的核心因素。CANNCompute Architecture for Neural Networks是华为昇腾AI处理器的基础软件栈而HCCLHuawei Collective Communication Library作为CANN的重要组成部分承担着昇腾NPU之间高速数据传输的职责。2025年11月30日华为正式开源了HCCL仓库为研究者和工程师提供了深入理解昇腾通信机制的窗口。HCCL不仅实现了AllReduce、Broadcast、AllGather、ReduceScatter、AlltoAll等标准的集合通信原语还提供了Ring、Mesh、Recursive Halving-Doubling等多种通信算法选项支持HCCS、RoCE、PCIe等物理链路并同时兼容单算子执行模式和图模式两种运行方式。本文以AllReduce为核心标尺系统对比Ring AllReduce和Recursive Halving-Doubling两种算法在昇腾NPU多卡拓扑上的实现差异深入分析不同物理链路特性对算法效能的影响并探讨HCCL与HCOMM之间的控制面与数据面分离设计。AllReduce的数学抽象与问题定义AllReduce是分布式训练中最常用的集合通信操作之一其数学定义为给定N个参与节点每个节点i持有一个长度为L的向量XiAllReduce的目标是让所有节点最终获得同一个归约结果该结果是所有节点输入向量的逐元素归约。以求和为例最终每个节点得到的结果向量Y满足Y[j] sum_{i1}^{N} Xi[j]对所有元素位置j均成立。这个操作在深度学习训练中的典型使用场景是梯度平均每个计算设备计算出一份本地梯度向量所有设备通过AllReduce将梯度求和后再取平均值作为下一轮迭代的模型更新依据。从通信复杂度的角度来看AllReduce的时间成本由两个主要因素决定数据量和通信拓扑结构。假设每个节点需要传输的数据量为D节点之间的带宽为B通信延迟为L那么一个朴素的两阶段AllReduce实现先归约到根节点再广播到所有节点在P个节点的系统中需要约2(P-1)乘以(D/B L)的时间。更高效的算法通过重叠计算与通信、合理安排数据分片来降低通信瓶颈。HCCL仓库中重点实现的Ring AllReduce和Recursive Halving-Doubling两种算法分别代表了针对不同数据规模和硬件拓扑的最优选择策略。在昇腾NPU的硬件环境中P个NPU通常通过HCCSHuawei Cache Coherent System或RoCERDMA over Converged Ethernet高速互联。以Ascend 910为代表的昇腾AI处理器单芯片包含多个AI Core通过HCCS总线可以构建8卡或16卡的紧耦合拓扑。在多机场景下跨服务器的RoCE网络成为节点间通信的主要通路。物理链路的带宽和延迟特性差异直接影响算法选择HCCS链路的带宽远高于RoCE且延迟极低因此适合大批量数据的长距离传输RoCE链路的带宽相对较低但覆盖面广适合跨机通信或者小数据量的广播操作。理解这些物理约束是深入掌握HCCL算法实现的前提。Ring AllReduce带宽最优的环形流水线Ring AllReduce算法的核心思想是将P个参与节点组织成一个逻辑环每个节点只与环上的两个邻居直接通信。数据被切分为P个块每个节点负责归约一个数据块并将该块沿着环传递直到所有数据块都完成归约并传播到所有节点。这个算法的通信步骤数与节点数量P成正比但关键在于每个步骤中所有P个节点同时参与传输形成了流水线式的并行数据传输使得总通信时间与节点数量解耦主要由数据总量和单链路带宽决定。具体而言假设P个节点形成一个编号为0到P-1的环数据向量被划分为P个等长的块。在reduce-scatter阶段每个节点i将自己的第i块数据发送给节点(i1) mod P同时从节点(i-1) mod P接收数据并与本地块进行归约。这个过程循环P-1次后每个节点持有了所有节点对应块的归约结果。在all-gather阶段每个节点将自己的归约结果块发送给(i1) mod P同时从(i-1) mod P接收其他节点的数据。这个过程同样循环P-1次后所有节点都拥有了完整的归约结果。两个阶段加起来每个节点发送和接收的数据总量均为2D(P-1)/P。在HCCL的实现中Ring AllReduce充分利用了昇腾NPU的HCCS高速链路特性。HCCS总线提供了节点之间点对点的DMADirect Memory Access能力支持大块数据的零拷贝传输。在Ascend 910的8卡拓扑中HCCS环形连接的每跳带宽几乎无损耗使得Ring AllReduce的流水线能够以接近物理链路极限的速率运行。对于大梯度张量如百GB级别的模型参数梯度Ring AllReduce的分块策略能够有效避免单节点的带宽瓶颈将通信压力分散到环上的所有链路。从代码实现的角度HCCL中的Ring AllReduce涉及几个关键的数据结构和函数路径。通信域的初始化建立了节点之间的邻居关系映射这一步通过HCCL的通信域管理接口完成。算法选择模块会根据通信域的拓扑信息和数据大小自动决定是否采用Ring算法。以下是HCCL中Ring AllReduce核心执行路径的伪代码展示展示了reduce-scatter和all-gather两个阶段的流水线结构// hccl_algo_ring.cpp - Ring AllReduce核心循环voidRingAllReduce(constRankInfoself,constRankInfo ring[],constvoid*send_buf,void*recv_buf,size_t elem_count,HcclDataType dtype,HcclReduceOp op,HcclComm comm){size_t blkelem_count/rank_num;size_t idxself.id;// reduce-scatter阶段P-1轮归约for(size_t step0;steprank_num-1;step){size_t src(idx-step-1rank_num)%rank_num;size_t dst(idx1)%rank_num;size_t seg(idx-steprank_num)%rank_num;// 从上游邻居接收数据到临时缓冲区HCOMM_SendRecv(hcomm,send_ptr,blk*sizeof(T),ring[dst],recv_ptr,blk*sizeof(T),ring[src]);// 将接收到的数据与本地对应段归约for(size_t i0;iblk;i){recv_ptr[i]reduce_op(recv_ptr[i],local_ptr[i]);}}// all-gather阶段P-1轮广播for(size_t step0;steprank_num-1;step){size_t src(idx-step-1rank_num)%rank_num;size_t dst(idx1)%rank_num;// 将本地的完整归约结果发送给下游邻居HCOMM_Send(hcomm,local_ptr,elem_count/rank_num*sizeof(T),ring[dst]);if(step0){size_t rcv_seg(idx-steprank_num)%rank_num;HCOMM_Recv(hcomm,seg_ptr,blk*sizeof(T),ring[src]);}}}这段代码展示的是Ring AllReduce的经典两阶段执行模型reduce-scatter通过P-1轮环形传递让每个节点获得一个完整分片的归约结果all-gather再通过P-1轮反向传递将所有分片聚合为完整向量。关键在于每轮通信中所有P个节点同时收发实现了带宽的完全利用。Ring AllReduce的优势在昇腾NPU上体现得尤为明显。当使用HCCS链路连接的多块NPU进行通信时环形拓扑天然适配了HCCS的交换式互联结构。以8卡服务器为例每块NPU同时通过HCCS与相邻的两块NPU通信8条HCCS链路全部参与数据传输总有效带宽接近单链路带宽的8倍。这种带宽线性扩展的特性使得Ring AllReduce成为昇腾NPU大模型训练场景的首选方案。然而Ring AllReduce也存在固有的局限性。每轮通信中所有节点必须同步等待数据到达才能推进这种同步特性在节点数量较多时会导致流水线停顿的概率增加。此外Ring AllReduce的通信步骤数为2(P-1)在节点数量P较小时可以忽略不计但当P扩展到数十甚至上百个节点时通信延迟的累积会变得显著。更重要的是Ring AllReduce的reduce-scatter阶段需要每个节点同时作为发送方和接收方这种对称的双向通信在某些硬件拓扑下可能导致路由冲突。Recursive Halving-Doubling短消息场景的延迟优势Recursive Halving-Doubling算法简称RHD是一种基于递归二分思想的AllReduce实现其设计目标是在消息长度较短时最小化端到端通信延迟。与Ring AllReduce的线性流水线不同RHD算法通过log2§轮通信完成所有节点的归约每轮的通信数据量逐轮减半通信伙伴的数量逐轮翻倍。这种对数级别的通信步骤数使得RHD在小消息场景下具有显著的延迟优势。RHD算法的执行分为halving阶段和doubling阶段两个部分。假设有P个节点编号为0到P-1数据向量被划分为P个等长块。在halving阶段节点i将自己的数据发送给节点i XOR 2^k第k轮的幂次同时从同一个伙伴节点接收数据并进行归约。经过log2§轮halving后每个节点持有了所有节点数据的归约结果但由于每轮只传输数据的一半所以halving阶段结束后每个节点只持有完整的归约结果的一半。在doubling阶段节点将结果数据逐次翻倍地发送给伙伴节点并接收对方的数据进行拼接同样经过log2§轮后所有节点都获得了完整的归约结果。RHD算法的通信延迟分析揭示了其核心优势。在每轮通信中节点传输的数据量为D/2^k第k轮通信步骤数为log2§。因此总通信时间为log2§乘以(D/B L)其中D为数据总量L为链路延迟。与Ring AllReduce的总通信时间相比RHD的总通信量约为Ring的一半但在延迟主导的场景下消息长度D较小时log2§步骤远少于2(P-1)步骤使得RHD的总延迟远低于Ring AllReduce。具体的数值对比可以帮助理解当P8时Ring AllReduce需要14个通信步骤而RHD仅需要6个通信步骤3轮halving加3轮doubling。当消息长度较小使得链路延迟L成为主要因素时RHD的对数级步骤优势会转化为显著的性能优势。HCCL中RHD算法的实现需要仔细处理节点编号与通信伙伴的映射关系。在昇腾NPU的实际部署中节点编号并非总是从0到P-1的连续整数可能存在复杂的映射关系这要求算法实现必须正确计算每轮的伙伴节点ID。以下代码展示了RHD算法的核心通信逻辑// hccl_algo_rhd.cpp - Recursive Halving-Doubling实现voidRecursiveHalvingDoubling(constRankInfoself,constvoid*send_buf,void*recv_buf,size_t elem_count,HcclDataType dtype,HcclReduceOp op,HcclComm comm){size_t nrank_num;size_t cntelem_count;size_t rankself.id;void*tmpwork_buf;// halving阶段log2(n)轮每轮传输数据量减半for(size_t k1;kn;k1){size_t partnerrank^k;size_t offset(rank/k)*k%(n/k1?n:n);size_t seg_off(rank(k-1))*cnt;size_t seg_cntcnt/k;if(rankk){// 低编号节点发送低位数据HCOMM_Send(hcomm,(char*)send_bufseg_off,seg_cnt*type_size,rank_tbl[partner]);// 接收高位数据并归约HCOMM_Recv(hcomm,tmp,seg_cnt*type_size,rank_tbl[partner]);reduce_kernel(tmp,send_bufseg_off,seg_cnt);cnt/2;}else{// 高编号节点发送高位数据HCOMM_Send(hcomm,(char*)send_bufseg_off,seg_cnt*type_size,rank_tbl[partner]);HCOMM_Recv(hcomm,tmp,seg_cnt*type_size,rank_tbl[partner]);reduce_kernel(tmp,send_bufseg_off,seg_cnt);cnt/2;}}// doubling阶段log2(n)轮每轮传输数据量翻倍for(size_t kn/2;k1;k1){size_t partnerrank^k;size_t seg_off(rank/k)*k%(n/k1?n:n);size_t seg_cntcnt;HCOMM_Send(hcomm,(char*)send_bufseg_off,seg_cnt*type_size,rank_tbl[partner]);HCOMM_Recv(hcomm,tmp,seg_cnt*type_size,rank_tbl[partner]);memcpy((char*)send_bufseg_off,tmp,seg_cnt*type_size);cnt*2;}}这段代码的核心在于异或运算XOR用于计算通信伙伴节点ID这在RHD算法中是标准做法。halving阶段从最低位开始逐位翻转每次翻倍传输数据量减半doubling阶段则反向进行每次减半传输数据量翻倍最终拼接出完整的归约结果。两阶段各需要log2(n)轮通信总共2乘log2(n)轮。在昇腾NPU的硬件环境中RHD算法对物理链路的利用率与Ring AllReduce有着本质区别。由于RHD在每轮通信中只涉及一半的节点对每对节点互为通信伙伴因此单轮的并发度低于Ring AllReduce。但RHD的总传输数据量更小halving阶段总共传输约D/2 D/4 D/8 …约等于Ddoubling阶段同样总共约D而Ring AllReduce的总传输数据量约为2D。这意味着在小数据量场景下RHD的总传输量优势足以抵消其并发度不足的劣势。RHD算法在昇腾NPU上的一个重要约束来自网络拓扑适配。当节点通过RoCE网络跨机互联时RHD的递归二分模式可能导致某些通信步骤跨越多跳路由。例如在两机各8卡的16卡场景下如果RoCE交换机的拓扑不完全对称RHD中的某些节点对可能经过较长的网络路径。HCCL的算法选择器在做出路由决策时会综合考虑节点间的物理距离、链路类型和跳数选择最适合当前拓扑的通信算法。Ascend950的AIVAICPU通信引擎与图模式Ascend950是华为推出的面向大规模训练场景的AI处理器集群方案其通信架构引入了AIVAI Vector Engine和AICPUAI Control Processor的双引擎设计为集合通信提供了更为灵活的硬件支持。2026年4月Ascend950的通信算子正式支持图模式这一更新对HCCL的整体执行效率产生了深远影响。理解AIV和AICPU在通信中的角色分工以及图模式对通信流水线的优化机制是掌握昇腾通信栈演进的必要环节。AIV是昇腾AI处理器中的向量计算单元专门负责大规模张量数据的并行运算。在集合通信的场景中AIV承担了数据归约Reduce操作的核心计算任务当多块NPU的数据汇聚到某一节点时AIV负责执行逐元素的加法、乘法、最大值等归约运算。AIV的优势在于其SIMDSingle Instruction Multiple Data向量化能力可以在一个指令周期内完成多个数据元素的归约计算这使得软件层面的归约操作几乎不构成性能瓶颈。AICPU则负责通信的控制平面工作包括通信原语的调度、内存地址的管理、传输请求的发起和完成事件的处理。在传统模式下集合通信的操作由主控CPU逐条下发指令每次通信操作都伴随着控制指令的往返开销。这种模式在通信量较大时影响可控但在短消息通信或高频率通信场景下控制开销可能远超实际数据传输的时间。AICPU通过预取通信指令、批量提交传输请求、异步处理完成事件等方式有效降低了控制平面的开销。图模式是昇腾通信算子在2026年4月引入的重要特性其核心思想是将多个通信操作组合为一个计算图统一调度执行。在传统的单算子模式下每个集合通信操作如AllReduce都是独立的执行单元驱动层需要分别发起和管理每个操作的通信流程。图模式则允许用户将一连串通信操作预先编排为有向无环图DAG系统根据数据依赖关系和硬件拓扑自动安排执行顺序实现跨算子的通信与计算重叠。图模式对Ring AllReduce和RHD两种算法的影响各有不同。对于Ring AllReduce而言reduce-scatter和all-gather两个阶段之间存在数据依赖关系但在图模式下可以将这两个阶段之间的数据传递操作与前一阶段的收尾计算重叠执行从而减少空闲等待时间。对于RHD算法图模式的优势体现在多组RHD通信之间的流水线编排上当一组RHD的doubling阶段与下一组RHD的halving阶段不存在数据依赖时两者可以并行执行充分利用硬件的并发通信能力。HCCL在图模式下的执行路径涉及算子图的构建和调度。以下代码片段展示了HCCL图模式下的通信原语注册过程// hccl_graph_api.cpp - 图模式通信原语注册HcclResultHcclGraphAddAllReduce(HcclGraphHandle graph,constvoid*send_buf,void*recv_buf,size_t elem_count,HcclDataType dtype,HcclReduceOp op,constchar*tag,HcclComm comm,HcclGraphNode*node){HcclGraphNodeDesc desc{};desc.op_typeHCCL_OP_ALLREDUCE;desc.send_bufsend_buf;desc.recv_bufrecv_buf;desc.countelem_count;desc.dtypedtype;desc.opop;desc.commcomm;desc.alg_tagtag;// 算法标签影响调度优先级// 将原语描述加入计算图returnGraphAddNode(graph,desc,node);}HcclResultHcclGraphBuild(HcclGraphHandle graph){// 分析节点间的依赖关系构建DAGGraphAnalyzeDeps(graph);// 根据拓扑信息进行通信调度优化GraphScheduleOptimize(graph,topo_info);// 生成底层通信任务列表GraphCodegen(graph,task_list);returnHCCL_SUCCESS;}这段代码展示了图模式的核心API设计用户通过HcclGraphAddAllReduce将通信原语添加到计算图中通过tag字段可以指定算法偏好或关联标签图构建阶段由GraphAnalyzeDeps分析数据依赖、GraphScheduleOptimize根据拓扑优化调度、GraphCodegen生成底层任务序列。三步分离的设计使得图模式具有良好的扩展性和可配置性。2026年5月HCCL进一步支持了静态库的链接方式这意味着用户可以将HCCL的通信能力静态嵌入到训练框架中省去了运行时动态加载的开销。静态库方式对于容器化部署和嵌入式场景尤为重要它消除了对动态链接库的依赖提升了库的加载速度并使得通信库的版本与训练框架的版本可以独立管理和升级。结合图模式的静态库构建用户可以获得一个零依赖、高性能、可预测的通信运行时环境。HCCL与HCOMM的关系控制面与数据面分离深入理解HCCL的技术架构不能不提及HCCL与HCOMM之间的关系。HCCL和HCOMM并非两个独立运作的通信库而是构成了昇腾集合通信栈的两个层次分别负责算法策略和底层传输。这种控制面与数据面的分离设计是HCCL能够在多种硬件拓扑和通信场景下保持高效性和可扩展性的关键所在。HCCL层位于整个通信栈的上部主要职责包括集合通信算法的实现与选择、集合操作的端到端流程管理、以及与上层深度学习框架的对接。当用户在PyTorch或MindSpore等框架中调用分布式训练接口时框架底层通过HCCL的API发起AllReduce等集合通信请求。HCCL层接收请求后根据当前通信域的拓扑信息、硬件能力描述符和数据大小通过内部的算法选择器决定使用Ring、Mesh还是RHD等算法。这个决策过程涉及对网络带宽、延迟、节点数量和消息长度的综合评估。HCOMM层则位于通信栈的底部负责最底层的点对点数据传输。HCOMM的全称是Huawei Communication基础库它封装了对HCCS、RoCE和PCIe等物理链路的统一访问接口。在Ring AllReduce中HCCL计算出的reduce-scatter步骤需要调用HCOMM的点对点Send/Recv接口来完成实际的数据传输在RHD中每轮的伙伴节点间通信同样通过HCOMM完成。HCOMM提供了DMA传输能力允许数据直接从GPU或NPU的设备内存传输到网络无需经过主机内存中转这种零拷贝路径对于大块数据的传输效率至关重要。HCOMM层的关键设计在于传输抽象的统一性。尽管HCCS、RoCE和PCIe这三种物理链路的特性差异巨大——HCCS提供超低延迟的片间互联RoCE提供跨机的RDMA能力PCIe提供异构设备间的直连通信——但HCOMM向上提供的编程接口是统一的。这种抽象使得HCCL的算法层无需关心底层链路的差异只需调用标准的Send/Recv或RMARemote Memory Access原语。HCOMM在内部负责根据目标地址自动选择最合适的物理链路、处理拥塞控制、管理传输完成事件等底层细节。从架构分层的角度来看HCCL与HCOMM的关系类似于TCP/IP协议栈中运输层与应用层的关系。HCOMM类似于运输层提供可靠的数据传输服务但不关心数据的语义HCCL类似于应用层基于运输层服务构建高层的集合通信语义。这种分层设计的一个直接好处是HCCL可以在不修改算法逻辑的情况下透明地利用HCOMM新支持的物理链路。例如当昇腾NPU引入新的互联技术时HCCL无需改动即可直接获益因为所有的链路适配都在HCOMM层完成。在实际部署中这种分层架构也带来了可维护性和调试方面的优势。当通信性能出现问题时工程师可以分别定位是在HCCL层算法选择不当、集合操作编排不合理还是HCOMM层物理链路故障、传输带宽不足。HCCL提供了详细的通信剖析接口用户可以获取每次集合通信的时间分解算法准备时间、数据分片时间、实际传输时间等子项。当传输时间异常偏高时问题可能出在HCOMM层的链路质量上当时间主要消耗在算法准备阶段时则可能需要调整HCCL的算法选择策略。效率对比基于前述章节对Ring AllReduce和Recursive Halving-Doubling两种算法在昇腾NPU多卡拓扑上实现差异的系统分析以及HCCL与HCOMM分层架构的深入理解可以将两种算法的效率特性从多个维度进行综合对比。以下表格从通信步骤数、总传输量、延迟特性和物理链路适配四个方面对两种算法在昇腾NPU场景下的行为特征进行概括性描述。维度Ring AllReduceRecursive Halving-Doubling通信步骤数2(P-1)步与节点数P呈线性关系2乘log2§步与节点数P呈对数关系总传输量约2D每节点发送和接收各约2D/P约2Dhalving和doubling各约D延迟特性延迟随P线性增长大消息传输时带宽利用率高延迟随P对数增长小消息传输时总延迟低物理链路适配适配HCCS高带宽互联充分利用多链路并发适配RoCE跨机通信最小化跨跳路由次数在实际的大模型训练场景中算法选择并非一成不变。HCCL的算法选择器会根据通信域的拓扑信息自动进行权衡当检测到通信发生在同一服务器内的HCCS互联节点之间且数据量较大时默认选择Ring AllReduce以充分利用HCCS的高带宽和低延迟特性当检测到跨服务器的RoCE通信且数据量较小时自动切换到RHD以最小化通信步骤数和端到端延迟。这种自适应的算法选择机制使得用户无需手动指定算法即可获得接近最优的通信性能。对于混合链路拓扑部分节点通过HCCS互联部分通过RoCE跨机连接的场景HCCL支持分层聚合策略在HCCS域内通过Ring AllReduce完成本地节点的梯度归约在RoCE域内通过优化的跨机通信原语完成全局归约。这种两级聚合的设计避免了跨HCCS链路传输大量数据带来的带宽浪费同时利用RoCE的覆盖范围实现全局同步。结尾HCCL作为CANN软件栈中面向集合通信的核心组件通过对Ring AllReduce和Recursive Halving-Doubling两种算法的精心实现在昇腾NPU上构建了一套自适应的通信策略体系。Ring AllReduce以其对HCCS高带宽链路的天然适配成为大规模梯度同步场景下的主力算法Recursive Halving-Doubling以其对数级别的通信步骤数在短消息和跨机通信场景下提供了无可替代的延迟优势。HCCL与HCOMM的分离架构则为这套策略体系提供了坚实的底层基础设施使得上层算法可以专注于通信效率的优化而无需关心底层链路的复杂性。仓库URLhttps://atomgit.com/cann/hccl