HCCL_OP_RETRY_ENABLE
功能描述
此环境变量用于配置是否开启HCCL算子的重执行特性。重执行是指当通信算子执行报
在集群环境中,可能会存在硬件闪断的情况,此时通信算子会执行报错,通过此环境变量开启HCCL的重执行特性,可以更好地避免由于硬件闪断造成的通信中断,提升通信稳定性。
通过此环境变量,开发者可以在Server间、超节点间两个物理层级的通信域中配置是否开启重执行特性,每个层级支持配置两种状态:开启或关闭。
配置方法如下:
- L1代表通信域的物理范围为Server间通信域,取值为0表示通信域内Server间通信task不开启重执行,取值为1表示通信域内Server间通信task开启重执行,默认值为1。
 
- L2代表通信域的物理范围为超节点间通信域,取值为0表示通信域内超节点间通信task不开启重执行,取值为1表示通信域内超节点间通信task开启重执行,默认值为0。
       L2配置为“1”时,超节点间通信支持某一Device网卡故障时使用备用Device网卡进行通信,备用网卡为属于同一NPU中的另一个Die网卡。
- 如果通信域的创建方式为“基于rank table创建通信域”,需要开发者在rank table文件中通过“backup_device_ip”参数配置备用网卡。
 - 如果通信域的创建方式为“基于root节点信息创建通信域”,会自动将同一NPU下的两个Die互为备用网卡,无需开发者手工配置。
 
关于通信域创建方式的详细介绍可参见《HCCL集合通信库用户指南》中的“通信功能开发 > 通信域管理”章节。
 
        - 为了确保借轨功能正常执行,需要满足如下条件:
           
- 备用网卡的通信链路正常。
 - 互为主备的Device均需在业务可见范围内。
             
例如,NPU1中包含Device0与Device1两个Die,互为主备,假设通过环境变量ASCEND_RT_VISIBLE_DEVICES指定了业务可见Device为Device0,Device1不对业务可见,则借轨功能无法执行。
 
 - 如果通信过程中发生了借轨(假设某个NPU的Die0网卡故障,启用了备用的Die1网卡),原Die0的网卡流量也会通过Die1网卡收发,导致Die1的流量增大,总体性能会由于物理带宽减半、端口冲突导致下降。
 - 开启借轨场景下,若NPU0的Die0网卡故障,会切换到其备用网卡Die1,由于两个NPU之间的通信要求本端与对端同时切换为备用网卡,因此NPU1也会从Die0切换为Die1,即“图示二”所示。但如果Die0与Die1之间本身就存在通信任务,此时借轨功能无法执行。
           图1 借轨场景示例
            - 开启借轨通信功能时,建议一个NPU的两个Die分配给同一个训练或推理任务。
           
如果同一个NPU的两个Die分给两个不同的训练或推理任务,一个任务发生故障,会借用另一个任务的网卡,两个任务均会发生一定程度的性能下降。
 - 同一NPU仅支持发生一次借轨,且不支持回切。
 
 
另外开发者可以通过环境变量HCCL_OP_RETRY_PARAMS配置最大重执行的次数与重传间隔时间等信息。
- 开启重执行特性后会有一定的性能损失,针对
Atlas A3 训练系列产品 /Atlas A3 推理系列产品 ,Server间与超节点间,会经过光互联域,稳定性较低,建议开启HCCL重执行。 - 此环境变量在各个超节点上的配置需要保持一致,否则超节点间建链会超时。
 - 若集群组网中既存在
Atlas A3 训练系列产品 /Atlas A3 推理系列产品 又存在Atlas A2 训练系列产品 ,此环境变量推荐配置为"L1:1, L2:0"。但需要注意,Atlas A3 训练系列产品 /Atlas A3 推理系列产品 与Atlas A2 训练系列产品 都存在的集群组网中,此环境变量仅在Atlas A3 训练系列产品 /Atlas A3 推理系列产品 的通信域内生效,在Atlas A2 训练系列产品 以及Atlas A3 训练系列产品 /Atlas A3 推理系列产品 与Atlas A2 训练系列产品 混合的通信域内不生效,因为Atlas A2 训练系列产品 不支持重执行特性。 
配置示例
export HCCL_OP_RETRY_ENABLE="L1:1, L2:0"
使用约束
开启HCCL重执行特性时,需要满足以下约束条件,约束条件不满足时重执行会失败,走常规无重执行的HCCL流程。
- 通信算法的编排展开位置在Device的AI CPU计算单元,重执行特性仅在AI CPU调度模式下使能,需要通过环境变量HCCL_OP_EXPANSION_MODE设置,非AI CPU调度模式下会走无重执行流程。
      
export HCCL_OP_EXPANSION_MODE="AI_CPU"
 - 基于rank table创建通信域的场景下,rank table中“host_ip”字段必须配置,否则重执行不生效,走无重执行流程。
 - 通信算子的输入内存在执行过程中不能存在被污染的风险。
      
一个集合通信算子是一系列任务的组合,HCCL重执行以通信算子为粒度,从算子的输入内存开始将一个通信算子的系列任务重新执行一遍。若通信算子的输入内存在执行过程中存在被污染的风险,可能会造成重执行失败、系统报错退出。
输入内存存在被污染风险的场景示例如下:- 开启零拷贝功能的场景:零拷贝功能开启后,ReduceScatter和AllReduce算子会修改用户的输入内存,因此这两类算子无法支持重执行。
 - 包含In-Place操作的场景:此场景下,算子的输入和输出共享同一块内存,例如PyTorch的ReduceScatter/AllGather算子,所以包含In-Place操作的场景也不支持重执行。
 - 图模式场景:在图模式下,通信可以直接在算子的输入输出上进行,例如PyTorch的AllReduce算子,其入参tensor即作为算子的输入,又作为算子的输出,在算子的通信过程中,部分结果写入后,tensor内容就会发生变化,如果在污染的input上重新执行一遍,会得到错误的计算结果。所以此场景也不支持重执行。
 
 - HCCL重执行会自动进行一系列的条件判断,确认当前出错算子是否能够重执行,所以重执行会有一定的概率失败,失败时系统会报错退出。
      
      
- 判断故障发生时是否所有rank都停在同一个通信算子。若不同的rank停在不同的通信算子上,则不能重执行。如下图所示,故障点A不能重执行,故障点B可以重执行。
 - 判断Host侧socket网络通信是否正常。重执行时会使用Host侧socket通信进行通信域中各卡状态的协商,如果socket网络故障,则无法进行重执行。
 - 确保故障的链路已恢复,例如路由收敛成功,光模块闪断恢复成功或者借用备用网卡通信成功等。如果故障的链路无法恢复,再次执行通信任务仍然会失败,当重执行次数超过设置的最大重传次数后(可参见环境变量HCCL_OP_RETRY_PARAMS),重执行失败。
 
 
       - 若Host侧调试日志中出现关键字为“[OpRetry]...timeout”的ERROR错误信息,说明HCCL重执行过程中Host侧socket通信异常,此时可以搜集通信域内所有节点的日志,进一步定位故障发生位置。
 - 若Host侧调试日志中出现关键字为“can not retry”的ERROR错误信息,说明当前场景不满足HCCL重执行条件。
 
Host侧应用程序产生的调试日志默认存储路径为:$HOME/ascend/log/debug/plog/。
 
支持的型号
异常处理
若开启重执行特性后,出现"[OpRetryConnection][RecvAckTag] Recv unmatched ack"的错误,可能是由于HCCL通信时使用的默认端口被占用,导致HCCL连接了错误的Server,解决方法如下:
- 使用“sysctl -w net.ipv4.ip_local_reserved_ports”命令预留HCCL使用的默认端口60000-60015,避免端口被操作系统随机分配。
      
sysctl -w net.ipv4.ip_local_reserved_ports=60000-60015
 - 如果前一种方法仍出现该错误,那么建议使用HCCL_IF_BASE_PORT环境变量修改HCCL使用的默认端口,同时使用“sysctl -w net.ipv4.ip_local_reserved_ports”命令预留指定的端口。
      
# 例如指定HCCL使用以17777端口开始的连续16个端口 export HCCL_IF_BASE_PORT=17777 # 预留以17777-17792共16个端口 sysctl -w net.ipv4.ip_local_reserved_ports=17777-17792
 

