昇腾社区首页
中文
注册

HCCL_OP_RETRY_ENABLE

功能描述

此环境变量用于配置是否开启HCCL算子的重执行特性。重执行是指当通信算子执行报SDMA或者RDMA CQE类型的错误时,HCCL会尝试重新执行此通信算子。

在集群环境中,可能会存在硬件闪断的情况,此时通信算子会执行报错,通过此环境变量开启HCCL的重执行特性,可以更好地避免由于硬件闪断造成的通信中断,提升通信稳定性。

通过此环境变量,开发者可以在Server内、Server间、超节点间三个物理层级的通信域中配置是否开启重执行特性,每个层级支持配置两种状态:开启或关闭。

配置方法如下:

export HCCL_OP_RETRY_ENABLE="L0:0, L1:1, L2:1"
  • L0代表通信域的物理范围为Server内通信域,取值为0表示此通信域内的task不开启重执行,取值为1表示此通信域内的task开启重执行,默认值为0。
  • L1代表通信域的物理范围为Server间通信域,取值为0表示此通信域内的task不开启重执行,取值为1表示此通信域内的task开启重执行,默认值为0。

    注意:task范围包括此通信域中的Server间通信以及Server内通信。

  • L2代表通信域的物理范围为超节点间通信域,取值为0表示此通信域内的task不开启重执行,取值为1表示此通信域内的task开启重执行,默认值为0。

    注意:task的范围包括此通信域中的Server内通信、Server间通信以及超节点间通信。

    L2配置为“1”时,超节点间通信支持某一Device网卡故障时使用备用Device网卡进行通信,备用网卡为属于同一NPU中的另一个Die网卡。
    • 如果通信域的创建方式为“基于ranktable”创建通信域,需要开发者在ranktable文件中通过“backup_device_ip”参数配置备用网卡。
    • 如果通信域的创建方式为“基于root节点广播方式”创建通信域,会自动将同一NPU下的两个Die互为备用网卡,无需开发者手工配置。

    关于通信域创建方式的详细介绍可参见HCCL集合通信库用户指南中的“通信功能开发 > 通信域管理”章节。

    1. 如果通信过程中发生了借轨(假设某个NPU的Die0网卡故障,启用了备用的Die1网卡),原Die0的网卡流量也会通过Die1网卡收发,导致Die1的流量增大,总体性能会由于物理带宽减半、端口冲突导致下降。
    2. 开启借轨通信功能时,建议一个NPU的两个Die分配给同一个训练或推理任务。

      如果同一个NPU的两个Die分给两个不同的训练或推理任务,一个任务发生故障,会借用另一个任务的网卡,两个任务均会发生一定程度的性能下降。

    3. 同一通信域内,仅支持发生一次借轨,且不支持回切。

      如下图所示,“图示一”中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流程。

  1. 通信算法的编排展开位置在Device的AI CPU计算单元,重执行特性仅在AI CPU调度模式下使能,需要通过环境变量HCCL_OP_EXPANSION_MODE设置。
    export HCCL_OP_EXPANSION_MODE="AI_CPU"
  2. 通信算子的输入内存在执行过程中不能存在被污染的风险。

    一个集合通信算子是一系列任务的组合,HCCL重执行以通信算子为粒度,从算子的输入内存开始将一个通信算子的系列任务重新执行一遍。若通信算子的输入内存在执行过程中存在被污染的风险,则可能会造成重执行失败。

    输入内存存在被污染风险的场景示例如下:
    • 示例1:PyTorch的AllReduce算子,其入参tensor即作为算子的输入,又作为算子的输出。在算子的通信过程中,部分结果写入后,tensor内容就会发生变化,如果在污染的input上重新执行一遍,会得到错误的计算结果。
    • 示例2:PyTorch的ReduceScatter/AllGather算子,输入与输出进行了内存复用(如使用了inplace操作),此种场景也不支持重执行。
  3. HCCL重执行会自动进行一系列的条件判断,确认当前出错算子是否能够重执行,所以重执行会有一定的概率失败。HCCL重执行时会进行如下几种条件判断:
    • 判断故障发生时是否所有rank都停在同一个通信算子。若不同的rank停在不同的通信算子上,则不能重执行。如下图所示,故障点A不能重执行,故障点B可以重执行。

    • 判断Host侧socket网络通信是否正常。重执行时会使用Host侧socket通信进行通信域中各卡状态的协商,如果socket网络故障,则无法进行重执行。
    • 确保故障的链路已恢复,例如路由收敛成功,光模块闪断恢复成功或者借用备用网卡通信成功等。如果故障的链路无法恢复,再次执行通信任务仍然会失败,当重执行次数超过设置的最大重传次数后(可参见环境变量HCCL_OP_RETRY_PARAMS),重执行失败。

    若不满足HCCL重执行场景,日志中会出现ERROR错误打印,关键字为“can not retry”。

支持的型号

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

异常处理

若开启重执行特性后,出现"[OpRetryConnection][RecvAckTag] Recv unmatched ack"的错误,可能是由于HCCL通信时使用的默认端口被占用,导致HCCL连接了错误的Server,解决方法如下:

  1. 使用“sysctl -w net.ipv4.ip_local_reserved_ports”命令预留HCCL使用的默认端口60000-60015,避免端口被操作系统随机分配。
    sysctl -w net.ipv4.ip_local_reserved_ports=60000-60015
  2. 如果前一种方法仍出现该错误,那么建议使用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