昇腾社区首页
中文
注册
开发者
下载

建链失败定位思路

在调用通信算子时,HCCL会通过参数面网络基于TCP协议进行socket链接创建,以此来基于业务需要进行地址等信息交换,此时如果出现某种故障导致部分rank未调用到预期的通信算子,导致无法发起建链请求,或由于网络连通性、行为一致性问题导致无法响应彼此之间的建链请求,就会导致其他rank出现socket连接超时报错。

由于HCCL的算法和算子调用顺序的原因,建链超时会呈现在rank间有级联传递的情况,因此如果发现建链超时,需要优先找到故障点位置。

HCCL在参数面建链阶段提供了下文所述机制来辅助问题快速定位。

建链根节点定位机制

考虑到建链问题的级联传播问题,如rank0在和rank1建链等待超时,而rank1在和rank2建链等待超时,若此时rank1和rank2的建链由于网络或其他原因导致失败,在rank0上最终也会上报和rank1的建链超时报错,但失败的根因却在rank1和rank2之间。因此在集群中找到建链失败根节点位置是较为困难和繁琐的,HCCL会在业务上建链失败后立即启动故障探测链路,其主要的实现原理为:

图1 建链失败根节点定位原理图
  1. 每个rank在建链失败后会启动监听能够响应所有rank故障探测链路的server端。
  2. 向无法响应自己业务建链请求的远端发起故障探测链路connect请求。
  3. 如果远端无法响应自己的探测建链请求,则认为和远端的链路,或远端的业务进程存在问题,产生探测失败事件。并向已经在server端建立成功的其他链路发送扩散该事件。
  4. 如果远端建立起了探测链路,则接收对端发送的探测失败事件并进行转发。

这样,如果出现任何单点问题导致的建链失败,可以通过日志快速定位故障点的节点位置,并进行下一步的问题定位。详细的定位流程可参考建链超时(EI0006)

如果经过探测无任何事件,则很有可能是行为一致性问题,也就是每个rank均已进入建链阶段并响应其他rank的故障探测请求,但由于彼此调用的通信算子不一致导致链路互等超时,一般是由于集群行为一致性问题,请检查脚本、环境、版本、数据集等因素。如果需要参考通信算子的行为,可以通过建链失败报错日志中关键字“Alloc transports failed”中对应的tag信息推测算子行为,比如遍历每个rank的tag信息,如果16rank通信域内,15rank均为allgather,1个rank为AllReduce,则重点分析两个算子的调用逻辑差异。

针对建链超时场景,可快速判断是否为全量建链超时,若非全量建链超时,可先重点排查未上报建链超时报错的节点,可参考的命令为:

for i in *;do cd $i;pwd;grep -rnc "connection fail" | grep -v ":0" | wc -l; cd ..;done

一致性校验机制

HCCL在与对端成功创建socket链接后,会互相交换算子入参、CANN版本等信息并与本端的信息做校验,如果此时校验结果存在不一致的情况,则会在CANN日志及打屏日志中上报错误并返回错误码。详细问题定位流程可参考10.3.3参数一致性校验(EI0005)

单算子模式下,为了保证性能HCCL仅在每个通信域新类型或算法的算子被首次调用时才会触发建链,由于建链成功后才会进行一致性校验,因此此特性无法拦截所有的下发不一致问题。

报错阶段分析

HCCL在通信算子参数面建链阶段会有以下几个常见的报错阶段场景:

  • device网卡端口绑定失败,可通过以下命令排查是否有端口绑定失败问题,详细信息可参考参数面端口绑定失败(EJ0003)
    grep -rE "socket type\[(0|1)\].*Please check the port status and whether the port is being used by other process"
  • 参数面socket建链超时,可通过以下命令排查是否有参数面建链失败问题,详细信息可参考建链超时(EI0006)
    grep -r "wait socket establish timeout"
  • 通信算子一致性校验失败,可通过以下命令排查是否有一致性校验失败问题,详细信息可参考参数一致性校验(EI0005)
    grep -r "CMD information .* check fail"