news 2026/9/18 3:56:07

HCCL故障定位思路:三阶段定界、多级检索关键字与故障码体系详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HCCL故障定位思路:三阶段定界、多级检索关键字与故障码体系详解

HCCL故障定位思路:三阶段定界、多级检索关键字与故障码体系详解

【免费下载链接】hccl集合通信库(Huawei Collective Communication Library,简称HCCL)是基于昇腾AI处理器的高性能集合通信库,为计算集群提供高性能、高可靠的通信方案项目地址: https://gitcode.com/cann/hccl

本篇技术文章基于 HCCL 用户指南中的《定位思路》文档展开,系统讲解昇腾集群上 HCCL 通信故障的定位方法论:如何借助故障码体系与 CANN 日志完成快速定界,如何依据"通信域初始化、参数面建链、通信算子执行"三大阶段划分排查路径,以及如何运用 HCCL 多级检索关键字、算子级入参日志与环境变量生效值查询等手段锁定根因。读完后,你将掌握一套从"看到报错"到"定位根节点"的完整故障诊断工作流,并了解各诊断能力在 HCCL 源码中的实现落点。

一、定位前必须掌握的基础认知

在开始故障定位之前,需要先建立两个基础认知。

故障码覆盖大部分常见问题。HCCL 的故障码(EI****/EJ****)覆盖了大部分常见故障场景。如果报错中未包含故障码信息,或故障码为EI9999,则可能是较为少见的故障场景或 HCCL 内部问题,此时需要基于实际的 CANN 日志和代码进行分析;如果仍无法解决,应联系技术支持。

大集群需要定位"根节点"。对于没有清晰首报错的问题(尤其是大集群),需要梳理每个 rank 的行为,通过 rank 之间的依赖关系找到根节点——即真正先出错的 rank,其余 rank 往往只是"被等待方超时"。面对这个难题,HCCL 提供了建链根节点定位能力和集群心跳能力,并会在对应的常见问题章节中给出诊断结果,相关原理可参见 建链失败定位思路 与 集群心跳机制。

此外需要注意该定位方法文档的适用边界:

  • 文档中对 HCCL 实现机制的描述,仅用于解释各类故障模式的机理,辅助分析故障现象和定位原因;若运行机制方面的内容与运行机制对应介绍文档不符,请优先参考运行机制文档;
  • 部分 CANN 日志示例会随版本更新而调整,用户可重点关注日志中的关键信息,如有较大差异,请以实际日志信息为准;
  • 当业务发生 HCCL 异常时,CANN 日志中会有 HCCL 组件的报错日志;若在 CANN 日志中没有发现 HCCL 组件的报错日志,需排查是否有其他组件的报错信息;若无任何报错,则要注意训练脚本本身有无异常、是否存在 core dump 或进程卡住等情况。

二、故障诊断相关环境变量

故障定位依赖的关键环境变量共有四个,它们决定了 HCCL 在异常场景下的上报行为与可观测性。

2.1 HCCL_CONNECT_TIMEOUT 与 HCCL_EXEC_TIMEOUT

HCCL_CONNECT_TIMEOUT 和 HCCL_EXEC_TIMEOUT 分别控制 HCCL 在建链阶段执行阶段的超时时间。官方建议HCCL_CONNECT_TIMEOUT 配置的时间小于 HCCL_EXEC_TIMEOUT,以保证在复杂场景下能够正确上报首报错信息,从而区分"异常业务进程被阻塞"的原因是本端还是远端。

这一点在定位大集群问题时尤为关键:如果执行超时时间配置得过短,算子执行阶段的超时会先于建链阶段的超时触发,首报错就会指向执行阶段,误导排查方向。

2.2 HCCL_ENTRY_LOG_ENABLE:算子级入参记录

HCCL_ENTRY_LOG_ENABLE 是 HCCL 的算子级入参记录开关(默认关闭)。当集群行为一致性问题无法通过其他手段锁定异常原因时,可以开启此环境变量,记录不同 rank 上的集合通信行为,通过卡间横向比对辅助找到行为差异的引入点。

在源码层面,该开关由环境变量解析模块 ParseEntryLogEnable 解析(仅接受01,非法取值会回退默认值并打印告警),解析结果通过 GetExternalInputHcclEnableEntryLog 对外提供。以 AllReduce 为例,AllReduceEntryLog 会在开关打开(或强制记录)时,通过HCCL_RUN_INFO打印形如Entry-HcclAllReduce: tag[...], sendBuf[...], recvBuf[...], count[...], dataType[...], streamId[...], deviceId[...]的入参日志;对于 AllToAllV 等携带变长数组参数的算子,src/common/hccl_common.h 中的 PrintEntryArrayLog 会按 rank 区间分片打印 u64 数组,以规避 512 字节栈缓冲截断。这一实现细节说明:开启该开关后,日志体积会随 rank 数增长,建议在定位行为不一致问题时按需开启。

2.3 HCCL_DEBUG_CONFIG:模块级日志开关

HCCL_DEBUG_CONFIG 是 HCCL 模块级日志开关,进行算子开发调试时可以通过此配置分析算子内部的算法选择、任务编排等日志信息。需要注意的是,该环境变量仅支持以下产品:

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品

2.4 HCCL_DFS_CONFIG:高级故障探测

HCCL_DFS_CONFIG 是 HCCL 的高级故障探测配置能力,详见环境变量说明,建议保持默认值。

三、HCCL 相关日志说明

HCCL 的日志信息会记录在 CANN 日志中,CANN 的相关日志说明可参考官方《日志参考》文档。HCCL 的日志分布有以下规律:

  • debug 目录:HCCL 报错时,会在 CANN 日志的 debug 目录下打印关键的故障信息;同时在使用部分训练框架的业务场景下,HCCL 也会在业务日志中打印关键的报错信息;
  • run 目录:HCCL 在 CANN 日志的 run 目录下会默认记录一些关键运行日志,如通信域的初始化与析构(默认打印)、通信算子的下发(需开启HCCL_ENTRY_LOG_ENABLE)等。

3.1 通信域初始化日志

通信域初始化时会打印如下关键日志:

Entry-HcclGetRootInfo:rootInfo[0x7fffcd65f130], deviceLogicId[0] Entry-HcclCommInitRootInfoConfigInner:ranks[16], rank[0], rootinfo: host ip[127.10.0.1] port[60000] nicDeploy[1] identifier[group_name_0], deviceLogicId[0]

各字段含义:

字段含义
ranks通信域大小
rank当前 rank 在通信域内的 rank 编号
rootinforoot 节点的信息
identifier通信域名

3.2 通信域析构日志

Entry-HcclCommDestroy: op_base comm destroy begin

该日志可作为判断某 rank 是否正常进入通信域销毁流程的依据。

3.3 通信算子下发日志(需开启 HCCL_ENTRY_LOG_ENABLE)

Entry-HcclAllReduce: tag[AllReduce_127.10.0.1%eth1_30000_0_1736576907435382], sendBuf[0x12e7bf550000], recvBuf[0x12e7bf550000], count[531260224], dataType[float32], op[sum], localRank[0], streamId[5],comm[0x331c9c00], deviceLogicId[0]

各字段含义:

字段含义
tag通信算子标识符
sendBuf输入数据地址指针
recvBuf输出数据地址指针
count数据量
dataType数据类型
opreduce 计算类型
localRank本端 rank 号
streamId通信算子执行流
comm通信域指针
deviceLogicId通信算子下发的设备逻辑 ID

横向比对不同 rank 上同一通信域的算子下发日志(tag、count、streamId 是否一致),是定位"集群行为不一致"类问题最常用的手段。

3.4 快速检索关键字:Communicator Key Info 与 LocalRank Key Info

为了方便快速检索和识别通信域及本端的相关信息,HCCL 提供了两个快速检索关键字:Communicator Key InfoLocalRank Key Info

例如执行grep -r "Communicator Key Info"可得到如下信息:

run/plog/plog-858941_20251210195327204.log:[INFO] HCCL(858941,all_reduce_test):2025-12-10-19:53:28.131.350 [hccl_communicator_attrs.cc:327] [858941][Communicator Key Info]identifier[127.0.0.1%enp_60000_0_1765367607599032] rankSize[8] serverNum[1] moduleNum[1] superPodNum[0] multiModuleDiffDeviceNumMode[0] multiSuperPodDiffServerNumMode[0]

通信域关键信息字段:

  • identifier:通信域名
  • rankSize:通信域大小
  • serverNum:通信域内节点数
  • moduleNum:通信域内模组个数
  • superPodNum:通信域内超节点个数
  • multiModuleDiffDeviceNumMode:是否模组间卡数不一致
  • multiSuperPodDiffServerNumMode:是否超节点间节点数不一致

信息中"1"表示是,"0"表示否。从日志示例可见,该信息由通信属性模块(hccl_communicator_attrs.cc)在通信域建立时打印,一次检索即可拿到该 rank 所处通信域的完整拓扑画像。

例如执行grep -r "LocalRank Key Info"可得到如下信息:

run/plog/plog-858941_20251210195327204.log:[INFO] HCCL(858941,all_reduce_test):2025-12-10-19:53:28.131.357 [hccl_communicator_attrs.cc:330] [858941][LocalRank Key Info]userRank[6] hostIp[127.0.0.1] devicePhyId[6] server[127.0.0.1] deviceIp[0.0.0.0] superPodId[0] useSuperPodMode[0] isStandardCard[0]

本端关键信息字段:

  • userRank:通信域内的 Rank 号
  • hostIp:host 侧 IP
  • devicePhyId:物理 ID
  • server:节点信息
  • deviceIp:device 侧 IP
  • superPodId:超节点 ID
  • useSuperPodMode:是否为超节点模式
  • isStandardCard:是否为标卡场景

同样地,"1"表示是,"0"表示否。两个关键字配合使用,可以无需逐个翻日志就确认"这个 rank 属于哪个通信域、在哪个节点上、拓扑形态是否正常"。

3.5 查询环境变量实际生效值

如果想要查询已经配置成功的环境变量,其配置及实际生效值会被打印在 CANN 日志的 run/plog 目录下。

针对 Atlas A3/A2 训练与推理系列产品、Atlas 训练系列、Atlas 推理系列产品,可以通过检索HCCL_ENV关键字查询每个进程的环境变量实际生效值,例如执行:

grep -r "HCCL_ENV" run/plog/plog-xxx.log

命令执行后得到类似如下信息(从日志示例看,这些信息由环境变量解析模块externalinput.cc在进程启动初始化阶段统一打印,既包含set by default的默认值,也包含set by environment的用户配置值):

[INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.877 [externalinput.cc:598] [1595259][HCCL_ENV] HCCL_CONNECT_TIMEOUT set by default to [120]s [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.882 [externalinput.cc:558] [1595259][HCCL_ENV] HCCL_EXEC_TIMEOUT set by default to [1836]s [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.886 [externalinput.cc:663] [1595259][HCCL_ENV] HCCL_INTRA_PCIE_ENABLE set by default to [1], HCCL_INTRA_ROCE_ENABLE set by default to [0] [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.895 [externalinput.cc:833] [1595259][HCCL_ENV] HCCL_WHITELIST_DISABLE set by environment to [0] [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.912 [externalinput.cc:880] [1595259][HCCL_ENV] HCCL_IF_IP is not set [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.915 [externalinput.cc:936] [1595259][HCCL_ENV] HCCL_SOCKET_IFNAME set by default to [EmptyString] [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.917 [externalinput.cc:903] [1595259][HCCL_ENV] HCCL_SOCKET_FAMILY is not set and is used by default [AF_INET] [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.881.920 [externalinput.cc:865] [1595259][HCCL_ENV] HCCL_IF_BASE_PORT set by default to [60000] [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.882.148 [externalinput.cc:1736] [1595259][HCCL_ENV] HCCL_OP_RETRY_PARAMS is not set, default value MaxCnt is [1], HoldTime is [5000]ms, IntervalTime is [1000]ms [INFO] HCCL(1595259,alltoall_test):2026-01-06-15:38:29.882.180 [externalinput.cc:1800] [1595259][HCCL_ENV] HCCL_DEBUG_CONFIG is not set, debugConfig set by default to 0x0

(以上示例为节选,完整列表中还包括HCCL_RDMA_TCHCCL_RDMA_SLHCCL_RDMA_TIMEOUTHCCL_RDMA_RETRY_CNTHCCL_BUFFSIZEHCCL_DETERMINISTICHCCL_DIAGNOSE_ENABLEHCCL_ENTRY_LOG_ENABLEHCCL_INTER_HCCS_DISABLEHCCL_OP_EXPANSION_MODEHCCL_RDMA_QPS_PER_CONNECTIONHCCL_MULTI_QP_THRESHOLDHCCL_OP_RETRY_ENABLEHCCL_LOGIC_SUPERPOD_IDHCCL_RDMA_PCIE_DIRECT_POST_NOSTRICTHCCL_RDMA_QP_PORT_CONFIG_PATH等变量的生效值。)

针对Ascend 950PR/Ascend 950DT,则可通过检索关键字base_config查询当前已设置的环境变量:

[INFO] HCCL(229424,python3.8):2025-12-23-22:31:40.239.170[base_config.cc:33][229424][Init][EnvVarParam]Env config "HCCL_IF_IP" is not set. Default value is used. [INFO] HCCL(229424,python3.8):2025-12-23-22:31:40.239.166[base_config.cc:33][229424][Init][EnvVarParam]Env config "HCCL_CONNECT_TIMEOUT" is parsed.

这一步可以确认"你以为配置的环境变量,进程实际是否真的收到了",对多节点环境配置不一致类问题非常有用。

四、快速定位定界思路

HCCL 故障定位的主流程分为三步。

4.1 第一步:确认是否为 HCCL 相关的异常报错

  • HCCL 针对常见的报错场景,会在业务打屏日志中上报错误信息及故障信息。若在业务日志中存在EI****EJ****的故障码,则可根据对应的故障信息排查故障,或结合 CANN 日志中的报错信息到对应章节排查;故障码列表见本文 第六节。
  • 除了打屏的故障码信息,HCCL 在 CANN 日志中会打印 HCCL 组件的 ERROR 级别日志。因此若 CANN 日志中没有 HCCL 组件的报错日志,需排查是否有其他组件的报错信息;若无任何报错,则注意训练脚本本身有无异常、是否存在 core dump 或进程卡住等其他异常。

4.2 第二步:收集全量 CANN 日志

由于 HCCL 集合通信是通信域下全局的协同行为,某个节点上有 HCCL 异常报错,往往是因为在等待某个对端超时——报错节点未必是根因节点。此时需要结合对端的日志信息一起排查根因。因此,对 HCCL 问题的定位定界需要收集集群下所有节点的 CANN 日志,包括 debug 目录和 run 目录的日志。

4.3 第三步:确认当前报错阶段

HCCL 业务存在三个阶段:通信域初始化、参数面建链和通信算子执行。由于不同阶段使用的硬件资源、通信拓扑和同步方式有明显差异,因此可先确认当前 HCCL 报错所在的阶段,再根据不同阶段找到对应章节做进一步排查。

HCCL 在常见的报错场景增加了多级检索关键字,可以根据报错日志中的关键字快速识别当前报错阶段。多级检索关键字详见 第五节。例如如下日志表明在算子执行阶段发生了超时报错,且当前算子展开方式为 HOST 模式:

[ERROR] HCCL(858209,all_reduce_test):2025-12-10-19:52:32.589.097 [task_exception_handler.cc:27] [858274][TaskExecStage][Timeout][HOST]Task run failed, base information is streamID:[1740], taskID[23], tag[AllReduce_127.0.0.1%enp_60000_0_1765367469951573], AlgType(level 0-1-2):[fullmesh-ring-NHR].

注意:多级检索关键字功能仅在 CANN 8.5.0 版本及后续版本支持;对于不支持的版本或没有检索到关键字的场景,可根据其他方法判断当前报错阶段。

除了检索关键字,HCCL 提供了通信域创建接口和通信算子接口,且接口均为同步下发、异步执行,因此也可按以下接口行为场景判断阶段:

  • 若业务在调用通信域创建接口失败时,或在报错日志中有topoinforanktable关键字打印,可参考 通信域初始化阶段 章节进一步排查;
  • 若业务在调用通信算子接口失败时,或在报错日志中有transport关键字打印,可参考 参数面建链阶段 章节进一步排查;
  • 若业务创建通信域接口和通信算子下发均成功,而是在触发流同步时有 HCCL 的算子执行失败,或在报错日志中有TaskExceptionHandlerFFTS+ run failedTask run failed关键字打印,可参考 任务下发执行阶段 章节做进一步排查。

除此三个阶段的关键信息外,若业务打屏日志中有明确的错误码信息(如EI0001),可直接根据错误码在故障码表中找到对应章节,并进一步排查。

五、HCCL 多级检索关键字

以下表格汇总了 HCCL 报错日志中的多级检索关键字(一级关键字标识报错阶段,二级关键字标识具体故障场景):

一级关键字二级检索关键字故障场景
InitGroupStageEnvConfig通信域初始化阶段环境变量配置异常
RanktableConfig通信域初始化阶段 rankTable 文件读取失败
RanktableCheck通信域初始化阶段 rankTable 集群信息校验失败
RanktableDetect通信域初始化阶段集群信息探测失败
Resource通信域初始化节点资源初始化失败
InitChannelStageParameterConflict参数面建链阶段参数一致性校验失败
VersionConflict参数面建链阶段 HCCL 版本不一致校验失败
Timeout参数面建链阶段超时报错
TaskExecStageInvalidArgument算子执行阶段入参校验失败
Not Supported算子执行阶段不支持场景
Timeout算子执行阶段执行超时
RunFailed算子执行阶段执行失败
HeartbeatAbnormal算子执行阶段发现心跳异常事件

六、HCCL 相关故障码

故障码故障码说明
EI0001环境变量配置异常
EI0002通信算子执行超时
EI0003集合通信算子入参校验失败,请根据报错信息中的具体入参判断
EI0004rankTable 文件加载失败
EI0005参数一致性校验失败
EI0006通信算子参数面建链超时
EI0007资源初始化失败,请根据报错信息判断具体失败原因
EI0008HCCL 版本不一致,校验失败,请根据报错信息中的版本信息判断
EI0011QP 内存资源申请失败
EI0012算子执行时发生 SDMA 任务异常
EI0013算子执行时发生 ROCE CQE ERROR 异常
EI0014集群信息校验失败
EI0015通信域集群信息协商阶段超时
EI0019通信域创建阶段 server 节点端口绑定失败 或 参数面建链阶段端口绑定失败

七、实战排查路径小结

将上述能力组合起来,一次典型的 HCCL 故障排查可以按以下顺序执行:

  1. 看打屏日志:业务日志中是否出现EI****/EJ****故障码?有则直接对照 故障码表 跳转对应章节;
  2. 确认报错阶段:在 CANN 日志 debug 目录中检索一级关键字(InitGroupStage/InitChannelStage/TaskExecStage)或topoinforanktabletransportTask run failed等特征字,确定是通信域初始化、参数面建链还是算子执行阶段的问题;
  3. 收集全量日志:拉取集群所有节点的 CANN 日志(debug + run 目录),避免只看报错节点;
  4. 比对环境配置:用grep -r "HCCL_ENV" run/plog/逐节点核对超时、网络等关键变量的实际生效值,确认HCCL_CONNECT_TIMEOUT小于HCCL_EXEC_TIMEOUT
  5. 锁定行为差异:对行为不一致类问题,开启 HCCL_ENTRY_LOG_ENABLE 复现,用grep -r "Communicator Key Info"grep -r "LocalRank Key Info"确认各 rank 的通信域画像与算子下发入参,横向比对找出第一个出现偏差的 rank;
  6. 深挖根节点:对无清晰首报错的大集群问题,结合建链根节点定位能力与集群心跳机制,沿 rank 依赖关系回溯到首个异常 rank,再依据该 rank 的日志与源码级日志做深入分析。

掌握这套"故障码 → 阶段定界 → 全量日志 → 关键字比对 → 根节点回溯"的流程后,绝大多数 HCCL 通信问题都能在有限步骤内收敛到具体阶段与具体节点,再配合各阶段对应的专题排查文档完成最终定位。

【免费下载链接】hccl集合通信库(Huawei Collective Communication Library,简称HCCL)是基于昇腾AI处理器的高性能集合通信库,为计算集群提供高性能、高可靠的通信方案项目地址: https://gitcode.com/cann/hccl

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 3:55:53

MySQL启动报错:服务器退出未更新PID文件,一文讲透排查思路

“The server quit without updating PID file”,这句话我这些年见了太多次。有的是同事在测试环境卡了一下午,有的是生产环境凌晨三点被这条报错叫起来,还有的是刚装完MySQL,第一次启动就栽在这句话上。最气人的是,这…

作者头像 李华
网站建设 2026/9/18 3:55:37

编译原理期末复习:从词法分析到代码生成的冲刺指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 3:54:36

数据结构教案精讲:从章节地图到刷题与实验报告

简介:这是哈尔滨金融学院计算机系系统教研室编制的《数据结构》课程教案,面向信息管理专业学生,系统讲解数据结构核心概念与线性表、栈、队列、树、图等典型结构,尤其针对线性表的逻辑结构、顺序存储及基本操作(初始化…

作者头像 李华
网站建设 2026/9/18 3:53:36

帕塞瓦尔定理:工程师的跨域能量标尺与工程落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华