前言分布式训练这条路你迟早要走到。模型大到一张卡放不下的时候就得把模型或者数据切分到多张卡上让它们并行算最后把结果汇总起来。这个汇总的动作就是集合通信要干的事。昇腾CANN作为昇腾异构计算架构HCCLHuawei Collective Communications Library就是专门干这个的——它是昇腾NPU上的集合通信库负责多卡、多机之间的梯度同步、参数广播这些事。很多人第一次接触HCCL是在跑分布式训练脚本的时候碰到报错然后发现需要安装这个库。但它到底是怎么工作的、为什么它能让多卡训练跑得更快、它的性能瓶颈通常在哪里这些问题的答案并不显然。性能数据以下是02_HCCL在昇腾NPU上的典型性能数据。这些数据是基于公开社区讨论和典型测试场景的概括性描述。配置性能表现备注昇腾NPU默认配置基准性能-优化后配置提升明显具体数值因场景而异性能差异主要取决于任务特性、数据规模、配置参数等因素。建议在实际环境中测试验证。使用前 vs 使用后昇腾NPU的效率对比以下是02_HCCL在昇腾NPU上使用前后的典型效率对比。这些数据是基于公开社区讨论和典型测试场景的概括性描述。指标使用前使用后提升默认实现基准优化后有提升具体数值因场景而异因场景而异待实测效率提升主要来源于昇腾NPU的向量计算、融合算子、内存优化等特性。实际提升幅度需要结合具体场景和配置进行测试。一、HCCL在CANN中的定位HCCL在昇腾软件栈里的位置可以用下面这个层级来看应用框架层PyTorch、TensorFlow、MindSpore等 ↓ 分布式训练框架Horovod、PyTorch DDP、DeepSpeed等 ↓ 集合通信库HCCL ↓ NPU驱动与固件 ↓ 昇腾NPU硬件达芬奇架构HCCL的上游是分布式训练框架——你写的分布式训练脚本调用的torch.distributed.all_reduce()之类的接口在昇腾NPU后端上最终会落到HCCL的实现上。HCCL的下游是NPU驱动它通过驱动提供的通信接口在多个NPU之间传递数据。这个位置决定了HCCL的核心职责高效地在多个NPU之间传递数据让分布式训练的通信开销尽可能小。为什么这件事重要因为分布式训练的加速比往往不是由计算决定的而是由通信决定的。你有8张NPU理想情况下训练速度应该是单卡的8倍但实际上可能只有4倍、甚至2倍——剩下的性能去哪了很大一部分耗在了卡与卡之间的梯度同步上。HCCL要做的就是让这个同步尽可能快。二、HCCL的核心能力HCCL提供了一组集合通信原语Collective Communication Primitives每个原语对应一种多卡数据交互的模式。2.1 AllReduce梯度同步的核心AllReduce是分布式训练中用得最多的原语。它的作用是把多张卡上的梯度加起来然后把求和结果广播回所有卡。importtorchimporttorch.distributedasdist# 初始化分布式环境dist.init_process_group(backendhccl,rankrank,world_sizeworld_size)# 每个进程有一个梯度张量gradienttorch.randn(1024,1024).npu()# 调用AllReduce把所有进程的gradient求和dist.all_reduce(gradient,opdist.ReduceOp.SUM)# AllReduce会把所有卡上的gradient加起来然后每张卡都拿到完整的求和结果。这是数据并行训练的核心操作。AllReduce的实现不是简单地每张卡都把数据发给主卡、主卡加完再发回来——那样主卡的带宽会成为瓶颈。HCCL用的是树形或环形AllReduce算法让数据在多个NPU之间并行流动带宽利用率高得多。2.2 Broadcast参数初始化Broadcast的作用是把一张卡上的数据广播给所有其他卡。典型场景是模型参数初始化——你在一张卡上初始化了模型参数需要把这些参数复制到其他所有卡上。# 在rank 0上初始化模型参数ifrank0:model_paramstorch.randn(1024,1024).npu()else:model_paramstorch.empty(1024,1024).npu()# 调用Broadcast把rank 0的参数广播给所有进程dist.broadcast(model_params,src0)# Broadcast保证所有卡上的模型参数完全一致这样每张卡计算的梯度才是可加的。2.3 AllGather分布式推理的参数收集AllGather的作用是每张卡上有一份数据的不同部分AllGather把所有部分收集起来让每张卡都拿到完整的数据。这个原语在分布式推理中用得比较多——比如你把一个大模型的层切分到多张卡上推理的时候需要把中间激活值收集起来传给下一层这时候就用AllGather。# 每张卡上有一部分隐藏状态hidden_statetorch.randn(256,1024).npu()# 每张卡上256个token的隐藏状态# 调用AllGather收集所有卡的隐藏状态gathered[torch.empty(256,1024).npu()for_inrange(world_size)]dist.all_gather(gathered,hidden_state)# AllGather之后gathered列表里包含了所有卡上的隐藏状态每张卡都拿到了完整的(batch_size, seq_len, hidden_dim)张量。2.4 ReduceScatter模型并行中的梯度分发ReduceScatter是AllReduce的一半——它把多张卡上的梯度加起来但不广播回所有卡而是把求和结果切分每张卡拿到一部分。这个原语在模型并行把模型的不同层放在不同卡上中用得比较多。三、HCCL的架构它是怎么做到这么快的HCCL的性能来自几个关键设计。3.1 拓扑感知的通信算法HCCL知道NPU之间的物理连接拓扑——哪些NPU在同一台机器上通过NVLink或者PCIe互联哪些NPU在不同机器上通过以太网或者InfiniBand互联。不同的物理连接带宽差异很大NVLink的带宽可以到600GB/s而以太网的带宽通常是100Gbps约12.5GB/s。HCCL会根据拓扑选择最优的通信算法。比如在同一台机器内的8张NPU之间做AllReduceHCCL会用环形算法让数据在8张卡之间并行流动跨机器的AllReduceHCCL会用树形算法减少跨机器的通信次数。3.2 流式通信Streaming Communication第二个关键是流式通信。传统的集合通信是同步的——你调用all_reduce()这个函数会阻塞直到所有卡都完成了梯度同步函数才返回。HCCL支持流式通信——你可以把通信操作提交给一个通信流让它跟计算流并行执行。这样你在算下一层的梯度的时候上一层的梯度同步就在后台跑了两者重叠起来整体性能就会好很多。# 启用流式通信示例概念实际API可能不同# 把通信流和计算流分开让它们并行执行compute_streamtorch.npu.Stream()comm_streamtorch.npu.Stream()# 计算流算第i层的梯度withtorch.npu.stream(compute_stream):lossmodel(data)loss.backward()# 算第i层的梯度# 通信流同步第i-1层的梯度跟上一条并行withtorch.npu.stream(comm_stream):dist.all_reduce(earlier_gradient,opdist.ReduceOp.SUM)# 计算和通信重叠整体时间接近max(计算时间, 通信时间)而不是两者相加。3.3 与NPU硬件的协同设计第三个关键是HCCL跟NPU硬件是协同设计的。NPU的达芬奇架构里有一些专门的硬件单元负责通信加速——比如远程直接内存访问RDMA引擎可以直接从一块NPU的显存读数据写到另一块NPU的显存不需要CPU参与。HCCL把这些硬件加速能力充分地用起来了。这是它比通用集合通信库比如MPI的AllReduce在NPU上快的重要原因——通用库不知道NPU上有这些专用硬件HCCL知道。四、HCCL与其他仓库的关系HCCL在CANN生态里不是孤立的它跟几个仓库有紧密的关系。4.1 HCCL与hcomm的关系hcomm是HCCL的高层封装提供了一些更友好的接口。如果你直接用HCCL的C接口写起来比较麻烦hcomm把这些接口封装成了更易用的C接口还加了一些常用的通信模式比如分层的AllReduce先在机器内做Reduce再做机器间的AllReduce。4.2 HCCL与框架适配层的关系PyTorch的torch.distributed后端在昇腾NPU上是通过HCCL实现的。你调用dist.all_reduce()的时候PyTorch会把这个调用转发给HCCL的后端实现。这个转发层就是框架适配层在做的事。4.3 HCCL与runtime的关系HCCL的底层实现依赖runtime提供的通信接口。runtime封装了NPU驱动的细节给上层提供一个统一的通信API。HCCL调用runtime的接口来在NPU之间传递数据。五、效率对比使用HCCL优化前后的性能差异为了直观展示HCCL的价值下面给出一个典型的大模型分布式训练场景8卡NPUAscend 910中的效率对比。这些数据是基于公开社区讨论和典型测试场景的概括性描述。优化项目使用HCCL优化前使用HCCL优化后效果AllReduce延迟1GB梯度较高逐卡点对点传输带宽利用率低显著降低环形/树形算法带宽利用率高通常3-5倍提升分布式训练扩展效率8卡vs 1卡较低通信成为瓶颈扩展效率低显著提高通信优化扩展效率提升通常80-95%扩展效率计算通信重叠效率无计算和通信串行执行有效提升流式通信两者并行通常20-40%总时间减少跨机器通信带宽利用率较低通用TCP/IP通信显著提高RDMA加速零拷贝通常2-4倍带宽提升这些提升的来源主要是三点。第一拓扑感知的算法让数据传输的路径最短、带宽利用率最高——同样的数据量HCCL能用更少的传输次数、更高的并行度完成。第二流式通信让计算和通信重叠起来本来要串行的两个操作变成了并行整体时间自然就少了。第三硬件加速RDMA让数据传输的延迟更低尤其是在跨机器通信的时候效果更明显。六、使用HCCL从安装到跑通第一个分布式训练如果你要在昇腾NPU上跑分布式训练下面这些步骤是你要走的。6.1 环境准备先确认你的机器上装了CANN。HCCL是CANN的一部分装CANN的时候会自动装上HCCL。# 检查HCCL是否安装python-cimport torch; print(torch.npu.is_available())# 如果这个返回True说明NPU可用HCCL通常也已经安装了。6.2 写一个简单的分布式训练脚本下面是一个最小可运行的例子——在2张NPU上做数据并行训练。importtorchimporttorch.nnasnnimporttorch.distributedasdist# 初始化分布式环境dist.init_process_group(backendhccl,rankrank,world_size2)# 定义模型modelnn.Linear(1024,512).npu()modelnn.parallel.DistributedDataParallel(model)# DDP会自动在反向传播的时候做AllReduce把梯度同步到所有卡上。# 训练循环forepochinrange(10):# 前向outputmodel(input.npu())lossnn.functional.mse_loss(output,target.npu())# 反向DDP会自动做AllReduceloss.backward()# 更新参数optimizer.step()optimizer.zero_grad()6.3 启动分布式训练# 在2张NPU上启动训练torchrun--nproc_per_node2train.py# torchrun会自动设置rank、world_size这些环境变量然后启动多个进程每个进程对应一张NPU。七、常见问题与调试HCCL用起来不难但调试起来有时会比较麻烦。下面列几个常见的问题。7.1 通信挂起Hang这是最常见的问题。通信挂起通常发生在不同进程调用的集合通信原语不匹配——比如进程0调用了all_reduce()但进程1调用了reduce()两者对不上所有进程都会无限等待。调试方法在调用集合通信原语之前加一个屏障barrier确认所有进程都到达了同一位置。dist.barrier()# barrier会让所有进程在这里等待直到所有进程都到达这一行。如果有进程没到达说明它在这之前就报错了。dist.all_reduce(gradient,opdist.ReduceOp.SUM)7.2 性能不如预期如果你发现加了更多NPU训练速度没有相应提升问题通常在通信上。可以用HCCL的调试工具看一下通信时间占比。# 启用HCCL性能分析概念示例# 实际API请参考HCCL官方文档importhccl hccl.enable_profiling(/tmp/hccl_profile)# 性能分析报告会告诉你时间花在了计算上还是通信上。如果通信时间占比高说明通信成为瓶颈需要调整通信算法或者增加计算通信重叠。八、HCCL的当前状态与社区参与HCCL是CANN中比较核心的仓库之一目前在atomgit.com/cann/hccl上可以看到它的源代码。代码主要是C和C写的通信算法的实现在algorithms/目录下跟NPU驱动对接的部分在driver/目录下。社区里关于HCCL的讨论比较高频的话题是在新的NPU硬件比如Ascend 950上HCCL的性能有没有得到充分优化通常是驱动和HCCL的协同优化问题在很端大规模的集群比如1024张NPU上HCCL的扩展性如何这是HPC领域的硬核问题涉及通信算法的理论下界能不能支持新的集合通信原语比如AllToAll在专家并行中用得比较多总结HCCL不是那种光鲜的、用户直接能看到的模块——它躲在分布式训练框架的底层默默干着梯度同步的脏活累活。但它是让昇腾NPU能做大规模分布式训练的关键基础设施。把HCCL理解成昇腾NPU上的MPI是准确的但要记住它的实现是针对NPU硬件特性定制的这是它跟通用通信库最核心的差异。仓库链接https://atomgit.com/cann/hccl
昇腾CANN集合通信库HCCL深度解析:分布式训练性能优化与多机多卡通信实战完整技术指南
发布时间:2026/6/9 22:00:19
前言分布式训练这条路你迟早要走到。模型大到一张卡放不下的时候就得把模型或者数据切分到多张卡上让它们并行算最后把结果汇总起来。这个汇总的动作就是集合通信要干的事。昇腾CANN作为昇腾异构计算架构HCCLHuawei Collective Communications Library就是专门干这个的——它是昇腾NPU上的集合通信库负责多卡、多机之间的梯度同步、参数广播这些事。很多人第一次接触HCCL是在跑分布式训练脚本的时候碰到报错然后发现需要安装这个库。但它到底是怎么工作的、为什么它能让多卡训练跑得更快、它的性能瓶颈通常在哪里这些问题的答案并不显然。性能数据以下是02_HCCL在昇腾NPU上的典型性能数据。这些数据是基于公开社区讨论和典型测试场景的概括性描述。配置性能表现备注昇腾NPU默认配置基准性能-优化后配置提升明显具体数值因场景而异性能差异主要取决于任务特性、数据规模、配置参数等因素。建议在实际环境中测试验证。使用前 vs 使用后昇腾NPU的效率对比以下是02_HCCL在昇腾NPU上使用前后的典型效率对比。这些数据是基于公开社区讨论和典型测试场景的概括性描述。指标使用前使用后提升默认实现基准优化后有提升具体数值因场景而异因场景而异待实测效率提升主要来源于昇腾NPU的向量计算、融合算子、内存优化等特性。实际提升幅度需要结合具体场景和配置进行测试。一、HCCL在CANN中的定位HCCL在昇腾软件栈里的位置可以用下面这个层级来看应用框架层PyTorch、TensorFlow、MindSpore等 ↓ 分布式训练框架Horovod、PyTorch DDP、DeepSpeed等 ↓ 集合通信库HCCL ↓ NPU驱动与固件 ↓ 昇腾NPU硬件达芬奇架构HCCL的上游是分布式训练框架——你写的分布式训练脚本调用的torch.distributed.all_reduce()之类的接口在昇腾NPU后端上最终会落到HCCL的实现上。HCCL的下游是NPU驱动它通过驱动提供的通信接口在多个NPU之间传递数据。这个位置决定了HCCL的核心职责高效地在多个NPU之间传递数据让分布式训练的通信开销尽可能小。为什么这件事重要因为分布式训练的加速比往往不是由计算决定的而是由通信决定的。你有8张NPU理想情况下训练速度应该是单卡的8倍但实际上可能只有4倍、甚至2倍——剩下的性能去哪了很大一部分耗在了卡与卡之间的梯度同步上。HCCL要做的就是让这个同步尽可能快。二、HCCL的核心能力HCCL提供了一组集合通信原语Collective Communication Primitives每个原语对应一种多卡数据交互的模式。2.1 AllReduce梯度同步的核心AllReduce是分布式训练中用得最多的原语。它的作用是把多张卡上的梯度加起来然后把求和结果广播回所有卡。importtorchimporttorch.distributedasdist# 初始化分布式环境dist.init_process_group(backendhccl,rankrank,world_sizeworld_size)# 每个进程有一个梯度张量gradienttorch.randn(1024,1024).npu()# 调用AllReduce把所有进程的gradient求和dist.all_reduce(gradient,opdist.ReduceOp.SUM)# AllReduce会把所有卡上的gradient加起来然后每张卡都拿到完整的求和结果。这是数据并行训练的核心操作。AllReduce的实现不是简单地每张卡都把数据发给主卡、主卡加完再发回来——那样主卡的带宽会成为瓶颈。HCCL用的是树形或环形AllReduce算法让数据在多个NPU之间并行流动带宽利用率高得多。2.2 Broadcast参数初始化Broadcast的作用是把一张卡上的数据广播给所有其他卡。典型场景是模型参数初始化——你在一张卡上初始化了模型参数需要把这些参数复制到其他所有卡上。# 在rank 0上初始化模型参数ifrank0:model_paramstorch.randn(1024,1024).npu()else:model_paramstorch.empty(1024,1024).npu()# 调用Broadcast把rank 0的参数广播给所有进程dist.broadcast(model_params,src0)# Broadcast保证所有卡上的模型参数完全一致这样每张卡计算的梯度才是可加的。2.3 AllGather分布式推理的参数收集AllGather的作用是每张卡上有一份数据的不同部分AllGather把所有部分收集起来让每张卡都拿到完整的数据。这个原语在分布式推理中用得比较多——比如你把一个大模型的层切分到多张卡上推理的时候需要把中间激活值收集起来传给下一层这时候就用AllGather。# 每张卡上有一部分隐藏状态hidden_statetorch.randn(256,1024).npu()# 每张卡上256个token的隐藏状态# 调用AllGather收集所有卡的隐藏状态gathered[torch.empty(256,1024).npu()for_inrange(world_size)]dist.all_gather(gathered,hidden_state)# AllGather之后gathered列表里包含了所有卡上的隐藏状态每张卡都拿到了完整的(batch_size, seq_len, hidden_dim)张量。2.4 ReduceScatter模型并行中的梯度分发ReduceScatter是AllReduce的一半——它把多张卡上的梯度加起来但不广播回所有卡而是把求和结果切分每张卡拿到一部分。这个原语在模型并行把模型的不同层放在不同卡上中用得比较多。三、HCCL的架构它是怎么做到这么快的HCCL的性能来自几个关键设计。3.1 拓扑感知的通信算法HCCL知道NPU之间的物理连接拓扑——哪些NPU在同一台机器上通过NVLink或者PCIe互联哪些NPU在不同机器上通过以太网或者InfiniBand互联。不同的物理连接带宽差异很大NVLink的带宽可以到600GB/s而以太网的带宽通常是100Gbps约12.5GB/s。HCCL会根据拓扑选择最优的通信算法。比如在同一台机器内的8张NPU之间做AllReduceHCCL会用环形算法让数据在8张卡之间并行流动跨机器的AllReduceHCCL会用树形算法减少跨机器的通信次数。3.2 流式通信Streaming Communication第二个关键是流式通信。传统的集合通信是同步的——你调用all_reduce()这个函数会阻塞直到所有卡都完成了梯度同步函数才返回。HCCL支持流式通信——你可以把通信操作提交给一个通信流让它跟计算流并行执行。这样你在算下一层的梯度的时候上一层的梯度同步就在后台跑了两者重叠起来整体性能就会好很多。# 启用流式通信示例概念实际API可能不同# 把通信流和计算流分开让它们并行执行compute_streamtorch.npu.Stream()comm_streamtorch.npu.Stream()# 计算流算第i层的梯度withtorch.npu.stream(compute_stream):lossmodel(data)loss.backward()# 算第i层的梯度# 通信流同步第i-1层的梯度跟上一条并行withtorch.npu.stream(comm_stream):dist.all_reduce(earlier_gradient,opdist.ReduceOp.SUM)# 计算和通信重叠整体时间接近max(计算时间, 通信时间)而不是两者相加。3.3 与NPU硬件的协同设计第三个关键是HCCL跟NPU硬件是协同设计的。NPU的达芬奇架构里有一些专门的硬件单元负责通信加速——比如远程直接内存访问RDMA引擎可以直接从一块NPU的显存读数据写到另一块NPU的显存不需要CPU参与。HCCL把这些硬件加速能力充分地用起来了。这是它比通用集合通信库比如MPI的AllReduce在NPU上快的重要原因——通用库不知道NPU上有这些专用硬件HCCL知道。四、HCCL与其他仓库的关系HCCL在CANN生态里不是孤立的它跟几个仓库有紧密的关系。4.1 HCCL与hcomm的关系hcomm是HCCL的高层封装提供了一些更友好的接口。如果你直接用HCCL的C接口写起来比较麻烦hcomm把这些接口封装成了更易用的C接口还加了一些常用的通信模式比如分层的AllReduce先在机器内做Reduce再做机器间的AllReduce。4.2 HCCL与框架适配层的关系PyTorch的torch.distributed后端在昇腾NPU上是通过HCCL实现的。你调用dist.all_reduce()的时候PyTorch会把这个调用转发给HCCL的后端实现。这个转发层就是框架适配层在做的事。4.3 HCCL与runtime的关系HCCL的底层实现依赖runtime提供的通信接口。runtime封装了NPU驱动的细节给上层提供一个统一的通信API。HCCL调用runtime的接口来在NPU之间传递数据。五、效率对比使用HCCL优化前后的性能差异为了直观展示HCCL的价值下面给出一个典型的大模型分布式训练场景8卡NPUAscend 910中的效率对比。这些数据是基于公开社区讨论和典型测试场景的概括性描述。优化项目使用HCCL优化前使用HCCL优化后效果AllReduce延迟1GB梯度较高逐卡点对点传输带宽利用率低显著降低环形/树形算法带宽利用率高通常3-5倍提升分布式训练扩展效率8卡vs 1卡较低通信成为瓶颈扩展效率低显著提高通信优化扩展效率提升通常80-95%扩展效率计算通信重叠效率无计算和通信串行执行有效提升流式通信两者并行通常20-40%总时间减少跨机器通信带宽利用率较低通用TCP/IP通信显著提高RDMA加速零拷贝通常2-4倍带宽提升这些提升的来源主要是三点。第一拓扑感知的算法让数据传输的路径最短、带宽利用率最高——同样的数据量HCCL能用更少的传输次数、更高的并行度完成。第二流式通信让计算和通信重叠起来本来要串行的两个操作变成了并行整体时间自然就少了。第三硬件加速RDMA让数据传输的延迟更低尤其是在跨机器通信的时候效果更明显。六、使用HCCL从安装到跑通第一个分布式训练如果你要在昇腾NPU上跑分布式训练下面这些步骤是你要走的。6.1 环境准备先确认你的机器上装了CANN。HCCL是CANN的一部分装CANN的时候会自动装上HCCL。# 检查HCCL是否安装python-cimport torch; print(torch.npu.is_available())# 如果这个返回True说明NPU可用HCCL通常也已经安装了。6.2 写一个简单的分布式训练脚本下面是一个最小可运行的例子——在2张NPU上做数据并行训练。importtorchimporttorch.nnasnnimporttorch.distributedasdist# 初始化分布式环境dist.init_process_group(backendhccl,rankrank,world_size2)# 定义模型modelnn.Linear(1024,512).npu()modelnn.parallel.DistributedDataParallel(model)# DDP会自动在反向传播的时候做AllReduce把梯度同步到所有卡上。# 训练循环forepochinrange(10):# 前向outputmodel(input.npu())lossnn.functional.mse_loss(output,target.npu())# 反向DDP会自动做AllReduceloss.backward()# 更新参数optimizer.step()optimizer.zero_grad()6.3 启动分布式训练# 在2张NPU上启动训练torchrun--nproc_per_node2train.py# torchrun会自动设置rank、world_size这些环境变量然后启动多个进程每个进程对应一张NPU。七、常见问题与调试HCCL用起来不难但调试起来有时会比较麻烦。下面列几个常见的问题。7.1 通信挂起Hang这是最常见的问题。通信挂起通常发生在不同进程调用的集合通信原语不匹配——比如进程0调用了all_reduce()但进程1调用了reduce()两者对不上所有进程都会无限等待。调试方法在调用集合通信原语之前加一个屏障barrier确认所有进程都到达了同一位置。dist.barrier()# barrier会让所有进程在这里等待直到所有进程都到达这一行。如果有进程没到达说明它在这之前就报错了。dist.all_reduce(gradient,opdist.ReduceOp.SUM)7.2 性能不如预期如果你发现加了更多NPU训练速度没有相应提升问题通常在通信上。可以用HCCL的调试工具看一下通信时间占比。# 启用HCCL性能分析概念示例# 实际API请参考HCCL官方文档importhccl hccl.enable_profiling(/tmp/hccl_profile)# 性能分析报告会告诉你时间花在了计算上还是通信上。如果通信时间占比高说明通信成为瓶颈需要调整通信算法或者增加计算通信重叠。八、HCCL的当前状态与社区参与HCCL是CANN中比较核心的仓库之一目前在atomgit.com/cann/hccl上可以看到它的源代码。代码主要是C和C写的通信算法的实现在algorithms/目录下跟NPU驱动对接的部分在driver/目录下。社区里关于HCCL的讨论比较高频的话题是在新的NPU硬件比如Ascend 950上HCCL的性能有没有得到充分优化通常是驱动和HCCL的协同优化问题在很端大规模的集群比如1024张NPU上HCCL的扩展性如何这是HPC领域的硬核问题涉及通信算法的理论下界能不能支持新的集合通信原语比如AllToAll在专家并行中用得比较多总结HCCL不是那种光鲜的、用户直接能看到的模块——它躲在分布式训练框架的底层默默干着梯度同步的脏活累活。但它是让昇腾NPU能做大规模分布式训练的关键基础设施。把HCCL理解成昇腾NPU上的MPI是准确的但要记住它的实现是针对NPU硬件特性定制的这是它跟通用通信库最核心的差异。仓库链接https://atomgit.com/cann/hccl