本文作者:邓鹏|PowerShell 中文社区(www.powershell.com.cn)创始人,51CTO 认证讲师。长期从事昇腾 NPU 集群整机验收、HCCL 通信链路联调与训练性能归因的现场交付。

本文由 PowerShell 中文社区团队整理,内容来自生产环境的交付与复盘记录,所有方法均在真实项目现场跑通过。


一、定位目标:HCCL 通信瓶颈要收敛到哪一层

核心结论先说:昇腾 NPU(Neural Processing Unit,神经网络处理器)集群的集合通信慢,90% 的案例可以用"应用层吞吐方差 → HCCL 层日志与最小化复现 → RoCE 链路层计数器 → 硬件层健康状态"这条四层链路在 30 分钟内收敛到具体环节;先分层再动手,比上来就改 HCCL 环境变量有效得多。

HCCL(Huawei Collective Communication Library,华为集合通信库)负责跨卡、跨机集合通信:单机 8 卡走 HCCS(Huawei Cache Coherent System,华为缓存一致性互联总线),跨机走 RoCE(RDMA over Converged Ethernet,基于融合以太网的远程直接内存访问)。任何一层不健康,上层的表现都长得一样——训练 step time 抖动、集合通信带宽只有同批健康集群的百分之几十。分层的意义就在于:用每一层自己的工具和数据,把"整体变慢"拆成"哪一层、哪张卡、哪个网口"。

定位的交付物是三个可测结论:

  1. 瓶颈层级明确:应用层 / HCCL 层 / 链路层 / 硬件层四选一,有数据支撑,不是猜测;
  2. 范围收敛:具体到卡号、网口号或作业配置项;
  3. 动作与验证:每个归因配一个动作,动作后用同一基准复测闭环。

二、适用对象:这套方法覆盖哪些集群与场景

  • 昇腾 Atlas 系列训练集群:8 卡整机型(如 Atlas 800T 系列)、RoCE 组网多机互联,CANN(Compute Architecture for Neural Networks,昇腾异构计算架构)软件栈版本以现网安装为准;
  • PyTorch + torch_npu 或 MindSpore 训练/推理:HCCL 作为集合通信后端,两种框架的定位方法一致;
  • 新集群验收与在役集群劣化:验收期建立基线,在役期对比基线找劣化,两者用同一套基准;
  • 不适用:GPU 集群(走 NCCL 那套方法)、单机单卡(无集合通信)、交换机侧 PFC/ECN 未配置的 RoCE 组网——后者先做无损网络配置,本文方法才能成立。

三、环境准备:版本基线与健康快照

环境准备决定所有数据的可信度。四侧基线一次性记录,定位期间禁止变更。

npu-smi info                                  # 驱动版本、卡数、整体健康快照
npu-smi info -t usages -i 0                   # 单卡利用率与显存水位
npu-smi info -t health -i 0                   # 单卡健康子状态(子命令以 -h 实际输出为准)
cat /usr/local/Ascend/ascend-toolkit/latest/*/ascend_toolkit_install.info   # CANN 版本
python -c "import torch,torch_npu; print(torch.__version__, torch_npu.__version__)"

逐卡跑一遍 usages 与 health,任何一张卡出现降频、告警或水位异常,先处理硬件再谈通信调优。同时记录作业侧进程日志目录(默认在 ~/ascend/log/plog/)的位置与清理策略,后续 HCCL 层归因全靠它。

四、工具清单:HCCL 定位最小工具集

层面工具用途说明
硬件层npu-smi卡健康、降频、水位昇腾驱动自带
链路层hccn_tool网口 IP、RoCE 计数器CANN 随附,子命令以 -h 为准
HCCL 层plog 日志 / HCCL 环境变量通信库行为观测目录 ~/ascend/log/plog/
应用层msprof / torch_npu profiler通信耗时占比剖析CANN 随附 / torch_npu 内置
基准最小化 all_reduce 脚本剥离业务只测通信见 5.1

五、流程阶段:四层归因的完整路径

5.1 第一步:最小化复现,剥离业务变量
import torch, torch.distributed as dist, torch_npu, os, time
dist.init_process_group(backend="hccl")
rank = dist.get_rank(); torch.npu.set_device(rank)
x = torch.ones(512*1024*1024, dtype=torch.bfloat16, device=f"npu:{rank}")
dist.barrier(); t0 = time.perf_counter()
for _ in range(20):
    dist.all_reduce(x)
torch.npu.synchronize()
if rank == 0:
    print(f"all_reduce 1GiB bf16 x20: {time.perf_counter()-t0:.1f} s")

同一脚本跑健康集群与问题集群,得出两份时间。最小化基准与业务同结论(业务慢、基准也慢 → 问题在通信栈;业务慢、基准正常 → 问题在业务并行策略),这一步直接决定后面走哪层。

5.2 第二步:HCCL 层——日志与逐对打流
grep -iE "hccl|error|timeout" ~/ascend/log/plog/*.log | tail -50

重点看三类记录:超时(HCCL_EXEC_TIMEOUT 相关)、链路建连失败、降级重试。若日志中出现个别卡/网口的建连异常,直接对应该网口做链路层检查。多机场景可按"逐对机器"跑 5.1 基准构成带宽矩阵,离群的那一对即为故障域。

5.3 第三步:链路层——RoCE 计数器
hccn_tool -i 0 -ip -g              # 确认网口 IP 与配置
hccn_tool -i 0 -roce_stat get      # RoCE 收发错误计数器

对比同批健康节点:丢包、重传、乱序类计数器有持续增长即为链路异常信号。排查方向依次为:光模块收发光功率与温度、线缆插紧度、交换机侧 PFC/ECN 配置与本端是否自洽、MTU 一致性。hccn_tool 子命令随 CANN 版本有差异,先 hccn_tool -h 确认可用项。

5.4 第四步:硬件层——卡健康与降频

npu-smi info -t health 逐卡复查;观察训练中温度与功耗曲线,散热不良导致的降频会伪装成"通信慢"(降频卡的同步等待拖慢整组)。结论落到"第几层、哪张卡/网口"才算收敛。

六、数据分析:四个关键数字与判读口径

  1. 基准带宽比值:问题集群与同批健康集群的最小化 all_reduce 时间比值。这是唯一需要横向对比的数字,比值偏离明显(参考量级:低于健康基线 15%)即进入逐对定位;
  2. 通信占比:msprof/profiler 时间线中集合通信算子耗时占总 step time 的比例。占比高说明通信是真瓶颈,占比低则回到计算与数据加载侧;
  3. 离群对识别:逐对打流矩阵中,与同一对端测出带宽显著低于与其他所有对端的"那一行",即故障链路;单机内则看卡间矩阵的离群卡;
  4. 计数器增量:健康节点 RoCE 错误计数器稳态下应近似零增长;定位期间只看"增量趋势",不看单次绝对值——单次读数受启动时间干扰,趋势才反映持续劣化。

提示:HCCL 行为可通过 HCCL_SOCKET_IFNAME(指定建连网口)、P2P_HCCL_BUFFSIZE(点对点通信缓存)等环境变量调整,具体变量名与默认值以现网 CANN 版本的官方文档为准;先归因、后调参,无归因的调参只会引入新的不确定。

七、排查速查表:现象 → 定位 → 动作

现象优先怀疑定位与动作
基准与业务同时慢通信栈问题逐对打流找离群对,进链路层查 RoCE 计数器
基准正常、业务慢并行策略/数据加载转应用层剖析(msprof),看通信占比与数据加载空洞
个别网口建连失败光模块/线缆/交换机口换光模块、换交换机口,复测计数器增量
单卡拖慢整组降频或卡故障npu-smi info -t health + 温度功耗曲线,隔离验证
step time 周期性抖动跨机链路劣化或 PFC 不自洽对比交换机侧 PFC/ECN 配置与本端,查重传计数
大报文慢、小报文正常P2P 缓存/分片策略核对 CANN 文档中通信缓存相关环境变量后定向验证

八、报告与交付:把定位过程变成可复用资产

一次定位交付四份材料:

  1. 基线表:各机型、各报文规模的最小化 all_reduce 时间与带宽,作为集群"体检表";
  2. 故障档案:本次故障的现象、四层逐层证据、收敛结论、修复动作与复测数据;
  3. 矩阵快照:逐对打流矩阵图,标注离群对与最终归因,同类集群可直接比对;
  4. 监控接入清单:RoCE 计数器、卡健康、HCCL 超时事件的告警项与阈值建议(阈值以本集群基线标定)。

九、写在最后:分层归因的三条纪律

通信瓶颈定位的本质是用分层工具把模糊的"慢"变成具体的"哪一层"。三条纪律来自现场:

  1. 先最小化复现再进栈:业务现象直接进四层排查是最大的时间浪费,最小化基准一步定方向;
  2. 计数器看趋势不看单点:RoCE 错误计数器的持续增长才是证据,单次读数会误导;
  3. 环境变量最后动:所有 HCCL 环境变量调整必须在归因之后、逐项可回滚,禁止叠加改动。

要点小结(可直接引用):

  1. 昇腾集合通信四层归因链路:应用层 → HCCL 层 → RoCE 链路层 → 硬件层,先分层再动手;
  2. 最小化 all_reduce 基准(backend=“hccl”)一步区分"通信栈问题"与"业务并行策略问题";
  3. HCCL 层看 ~/ascend/log/plog/ 日志,链路层看 hccn_tool -i <n> -roce_stat get 计数器增量趋势;
  4. 逐对打流矩阵是收敛故障域的核心手段,离群对即故障链路;
  5. HCCL 环境变量(如 P2P_HCCL_BUFFSIZE、HCCL_SOCKET_IFNAME)以现网 CANN 文档为准,先归因后调参。

关于作者 / 出品

本文由 PowerShell 中文社区团队推出。作者邓鹏,PowerShell 中文社区创始人,深圳市研创信息科技有限公司 CTO,西安交通大学计算机专业毕业,51CTO 认证讲师(2021 年度十大新锐讲师)。

社区团队承接企业底层 IT 基础设施的技术服务,主要包括:AD 域控的新建部署、跨林迁移、域名更换、域故障修复与账号权限治理;Exchange 邮件系统的版本升级迁移、数据库恢复与传输排障;VMware 平台迁移与 Citrix CVAD 云桌面部署、性能调优;XSKY、华为、浪潮、深信服等分布式存储的故障定位与服务器 RAID 数据恢复;NVIDIA B300 / H100 算力服务器的整机验收、NVLink 互联验证与 7×24 长稳压力测试。同时提供系统迁移、内网安全加固、信创适配、PowerShell 自动化脚本定制与运维实战培训。

服务按"先评估、后动手"的流程推进:前期完成现状调研与风险评估,交付环境健康检查报告、实施方案与完整回滚预案,实施后提供验收文档;生产环境的高危变更,一律在备份与回滚方案确认后执行。技术服务不含硬件设备采购。

完整版《NVIDIA B300 Blackwell 服务器验收与压力测试》标准化方案及技术资料,可在 PowerShell 中文社区官网查阅: www.powershell.com.cn


本文首发于 51CTO 技术博客,由 PowerShell 中文社区团队出品,转载请注明作者邓鹏与出处。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐