HCCL_OP_RETRY_ENABLE
功能描述
此环境变量用于配置是否开启HCCL算子的重执行特性。重执行是指当通信算子执行报SDMA或者RDMA CQE类型的错误时,HCCL会尝试重新执行此通信算子。
在集群环境中,可能会存在硬件闪断的情况,此时通信算子会执行报错,通过此环境变量开启HCCL的重执行特性,可以更好地避免由于硬件闪断造成的通信中断,提升通信稳定性。
通过此环境变量,开发者可以在Server内、Server间、超节点间三个物理层级的通信域中配置是否开启重执行特性,每个层级支持配置两种状态:开启或关闭。
配置方法如下:
- L0代表通信域的物理范围为Server内通信域,取值为0表示此通信域内的task不开启重执行,取值为1表示此通信域内的task开启重执行,默认值为0。
- L1代表通信域的物理范围为Server间通信域,取值为0表示此通信域内的task不开启重执行,取值为1表示此通信域内的task开启重执行,默认值为0。
- L2代表通信域的物理范围为超节点间通信域,取值为0表示此通信域内的task不开启重执行,取值为1表示此通信域内的task开启重执行,默认值为0。
注意:task的范围包括此通信域中的Server内通信、Server间通信以及超节点间通信。
L2配置为“1”时,超节点间通信支持某一Device网卡故障时使用备用Device网卡进行通信,备用网卡为属于同一NPU中的另一个Die网卡。- 如果通信域的创建方式为“基于ranktable”创建通信域,需要开发者在ranktable文件中通过“backup_device_ip”参数配置备用网卡。
- 如果通信域的创建方式为“基于root节点广播方式”创建通信域,会自动将同一NPU下的两个Die互为备用网卡,无需开发者手工配置。
关于通信域创建方式的详细介绍可参见《HCCL集合通信库用户指南》中的“通信功能开发 > 通信域管理”章节。
- 如果通信过程中发生了借轨(假设某个NPU的Die0网卡故障,启用了备用的Die1网卡),原Die0的网卡流量也会通过Die1网卡收发,导致Die1的流量增大,总体性能会由于物理带宽减半、端口冲突导致下降。
- 开启借轨通信功能时,建议一个NPU的两个Die分配给同一个训练或推理任务。
如果同一个NPU的两个Die分给两个不同的训练或推理任务,一个任务发生故障,会借用另一个任务的网卡,两个任务均会发生一定程度的性能下降。
- 同一通信域内,仅支持发生一次借轨,且不支持回切。
如下图所示,“图示一”中rank0 -> rank1间通信链路故障,启用了备用链路,发生借轨,通信正常进行;若再发生“图示二”所示故障,则不再支持借轨,会报错退出。
另外开发者可以通过环境变量HCCL_OP_RETRY_PARAMS配置最大重执行的次数与重传间隔时间等信息。
- 开启重执行特性后会有一定的性能损失,针对
Atlas A3 训练系列产品/Atlas A3 推理系列产品 ,Server内默认为电互联,稳定性较高,所以建议Server内不开启HCCL重执行;Server间与超节点间,会经过光互联域,稳定性较低,建议开启HCCL重执行。 - 此环境变量在各个超节点上的配置需要保持一致,否则超节点间建链会超时。
- 若集群组网中既存在
Atlas A3 训练系列产品/Atlas A3 推理系列产品 又存在Atlas A2 训练系列产品 ,此环境变量推荐配置为"L0:0, 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="L0:0, L1:1, L2:1"
使用约束
开启HCCL重执行特性时,需要满足以下约束条件,约束条件不满足时重执行会失败,走常规无重执行的HCCL流程。
- 通信算法的编排展开位置在Device的AI CPU计算单元,重执行特性仅在AI CPU调度模式下使能,需要通过环境变量HCCL_OP_EXPANSION_MODE设置。
export HCCL_OP_EXPANSION_MODE="AI_CPU"
- 通信算子的输入内存在执行过程中不能存在被污染的风险。
一个集合通信算子是一系列任务的组合,HCCL重执行以通信算子为粒度,从算子的输入内存开始将一个通信算子的系列任务重新执行一遍。若通信算子的输入内存在执行过程中存在被污染的风险,则可能会造成重执行失败。
- HCCL重执行会自动进行一系列的条件判断,确认当前出错算子是否能够重执行,所以重执行会有一定的概率失败。HCCL重执行时会进行如下几种条件判断:
- 判断故障发生时是否所有rank都停在同一个通信算子。若不同的rank停在不同的通信算子上,则不能重执行。如下图所示,故障点A不能重执行,故障点B可以重执行。
- 判断Host侧socket网络通信是否正常。重执行时会使用Host侧socket通信进行通信域中各卡状态的协商,如果socket网络故障,则无法进行重执行。
- 确保故障的链路已恢复,例如路由收敛成功,光模块闪断恢复成功或者借用备用网卡通信成功等。如果故障的链路无法恢复,再次执行通信任务仍然会失败,当重执行次数超过设置的最大重传次数后(可参见环境变量HCCL_OP_RETRY_PARAMS),重执行失败。
若不满足HCCL重执行场景,日志中会出现ERROR错误打印,关键字为“can not retry”。
支持的型号
异常处理
若开启重执行特性后,出现"[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