更新时间:2026-02-06 GMT+08:00
分享

训练作业故障恢复

场景描述

用户在创建训练作业时可以通过设置自动重启的方式开启容错检查,当训练作业所在节点故障或训练作业检查到异常时,系统会自动触发训练作业故障恢复机制,通过重启进程或重建作业等手段尝试恢复训练业务。不同恢复策略的及差异如表1 不同恢复策略及差异所示。

约束限制

  1. 容错恢复主要是通过重启进程或重建作业恢复训练业务,为了避免丢失训练进度、浪费算力,开启此功能前请确认代码已适配断点续训,操作指导请参见设置断点续训练
  2. 不同恢复策略约束情况如下:
    表1 不同恢复策略及差异

    恢复策略

    策略说明

    应对的故障场景

    约束限制

    原地恢复

    过程中不涉及资源调度,仅在原容器中重启训练作业。

    • NPU芯片可自愈故障,以HBM多比特ECC为典型代表
    • 作业定期保存CKPT
    • 作业支持断点续训
    • 原地恢复保留故障时的容器环境,要求作业脚本可重入
    • 无需备用机

    无条件Job级重调度

    在作业异常结束退出码非0时,将用户作业涉及到的所有Pod终止,并将Job实例完全重建。

    • 偶现的软件故障或网络波动
    • 作业定期保存CKPT
    • 作业支持断点续训
    • 作业异常时业务能够中断退出,且作业退出码非0
    • 无需备用机

    隔离式Job重调度

    在无条件Job重调度策略基础上,如果作业异常时发现节点故障,则在调度前先隔离故障节点。

    • 所有NPU芯片故障
    • 节点故障
    • 作业定期保存CKPT
    • 作业支持断点续训
    • 需要健康备用机

    Pod重调度

    保留现有的Job实例不变,在调度前先隔离故障节点,且仅重新创建故障Pod。

    • 所有NPU芯片故障
    • 节点故障
    • 作业定期保存CKPT
    • 作业支持断点续训
    • Pod重调度部分实例保留故障时的容器环境,要求作业脚本可重入
    • 需要健康备用机

    卡死重启

    ModelArts会在作业运行过程中检测到卡死状态时,强制停止容器中的用户进程,容器本身不销毁保留运行环境,并在进程停止后重新运行训练作业启动命令。作业卡死重启的过程中不涉及资源调度,仅在原容器中重启训练作业。

    • ModelArts平台检测到训练作业卡死
    • 作业定期保存CKPT
    • 作业支持断点续训
    • 卡死重启保留故障时的容器环境,要求作业脚本可重入
    • 无需备用机

故障恢复开启方式

  • 控制台设置

    在创建训练作业时,用户可根据步骤六:高可用配置配置开启。

    自动重启:包含原地恢复、隔离式Job级重调度,其中原地恢复不占用“最大重启次数”

    无条件自动重启:包含无条件Job级重调度。

    作业卡死重启:包含卡死重启,卡死重启不占用“最大重启次数”

    图1 容错与恢复
  • API接口设置

    “自动重启”:通过API接口创建训练作业时,在“metadata”字段的“annotations”中传入“fault-tolerance/job-retry-num”,“fault-tolerance/job-retry-num”赋值为1~128之间的任意整数,表示开启自动重启并设置自动重启次数。

    “无条件自动重启”:赋值“fault-tolerance/job-retry-num”,并将“fault-tolerance/job-unconditional-retry”赋值为“true”

    “作业卡死重启”:赋值“fault-tolerance/job-retry-num”,并将“fault-tolerance/hang-retry”赋值为“true”

    “Pod重调度”:赋值“fault-tolerance/job-retry-num”“fault-tolerance/pod-retry-num”

    参数

    是否必选

    参数类型

    描述

    annotations

    Map<String,String>

    参数解释:训练作业高级功能配置。

    约束限制:可选取值如下:

    • "fault-tolerance/job-retry-num": "3"(故障自动重启次数)

    • "fault-tolerance/job-unconditional-retry": "true"(无条件重启)

    • "fault-tolerance/hang-retry": "true"(卡死重启)

    • "fault-tolerance/pod-retry-num": "3"(Pod重调度次数)
    {
        "kind": "job",
        "metadata": {
            "annotations": {
                "fault-tolerance/job-retry-num": "8",
                "fault-tolerance/job-unconditional-retry": "true",
               "fault-tolerance/hang-retry": "true",
                "fault-tolerance/pod-retry-num": "3"
            }
        }
    }

故障恢复环境变量

以下环境变量可判断作业是否发生过断点续训,主要用于训练脚本的可重入。

变量名

说明

MA_SCHEDULE_CNT

Task所在Pod被调度的次数,新下发的作业初始值1,每次重调度恢复后,MA_SCHEDULE_CNT会在原值基础上加1。

因此当MA_SCHEDULE_CNT>1时,说明当前容器已经执行过一次重调度恢复。

MA_PROC_START_CNT

当前Pod内用户脚本执行过的次数,新发下作业或重调度恢复后作业脚本启动时MA_PROC_START_CNT会重置到1。当每次发生原地恢复卡死重启后,再次执行用户脚本时会在MA_PROC_START_CNT原值基础上加1。

因此当MA_PROC_START_CNT>1 时,说明当前容器已经执行过一次用户脚本,如果业务流程中存在共享内存、数据加载等动作,可用MA_PROC_START_CNT来判断业务是否需要执行重新打开共享内存、跳过数据加载等流程。

以下环境变量可加速重调度执行的速度。

MA_FAILOVER_TERMINATION_GRACE_PERIOD_SECONDS

当设置为正整数N时,可以在N秒后将容器结束阶段的卷卸载步骤设置为异步执行,从而有效降低大规模作业的重调度恢复时间,建议在SFSTurbo存储为主的场景配置为10。

默认值:-1。

原地恢复

NPU训练作业在运行过程中可能会发生芯片故障,部分芯片故障可通过系统修复或复位进行自愈。对此类可自愈的芯片故障,系统强制停止容器中的用户进程,容器本身不销毁保留运行环境,在所有业务进程终止后尝试NPU芯片自愈,如果芯片故障清除恢复正常则所有容器重新运行训练作业启动命令。原地恢复的过程中不涉及资源调度,仅在原容器中重启训练作业。原地恢复过程如下图所示:

图2 原地恢复

触发场景:

NPU芯片发生可自愈故障。

约束:

  • 作业定期保存CKPT。
  • 作业支持断点续训。
  • 原地恢复保留故障时的容器环境,要求作业脚本可重入,通常需要用户跳过数据下载、数据预处理步骤,删除和重建同名共享内存等。可通过容错恢复环境变量中的MA_PROC_START_CNT判断是否发生过原地恢复。

降级策略

  • 芯片自愈存在自愈失败的场景,当自愈失败时原地恢复同时失败,此时会将该节点隔离,降级到隔离式Job重调度
  • 一次训练过程中,同一节点同一芯片24小时内连续3次出现相同故障码,此时会将该节点隔离,降级到隔离式Job重调度
  • 一次训练过程中,同一节点同一芯片24小时内连续3次出现相同故障码,且是80C98002或80CB8002这类由用户输入引发的芯片故障,此时不隔离节点,只执行重调度。

NPU芯片故障码说明:

可自愈故障:通常是故障定义中故障级别“次要”“重要”的故障码,“提示”级别不需要处理,“紧急”级别无法自愈。

用户侧引发故障:算子异常或输入的数据导致NPU芯片发生故障,通常需要排查CANN版本、算子实现以及数据正确性。

无条件Job级重调度

训练过程中可能会碰到预期外的情况导致训练失败,且无法及时重启训练作业,导致训练周期长,而无条件Job重调度可以避免这类问题,提高训练成功率和提升作业的稳定性。无条件Job重调度是在作业异常结束退出码非0时,将用户作业涉及到的所有Pod终止,并将Job实例完全重建,其过程如下图所示:

图3 无条件Job级重调度

触发场景:

约束:

  • 作业定期保存CKPT。
  • 作业支持断点续训。
  • 作业异常时业务能够中断退出,且作业退出码非0。如果作业异常时业务无法中断一直处于运行状态,则无法触发Job重调度。

降级策略

连续3次触发无条件Job重调度后,第4次再次出现同样的问题,且中间未发生显式的节点故障和芯片故障,系统默认用户侧代码存在异常,作业将被终止并设置为失败状态。

隔离式Job重调度

隔离式Job重调度是在无条件Job重调度策略基础上,如果作业异常时发现节点故障,则在调度前先隔离故障节点,其过程如下图所示:

图4 隔离式Job重调度

触发场景:

  • 原地恢复中非用户输入引发降级。
  • 节点发生故障。

约束:

  • 作业定期保存CKPT。
  • 作业支持断点续训。

降级策略

无。

Pod重调度

相比于隔离式Job重调度直接删除重建整个Job,Pod重调度中会保留现有的Job实例不变,在调度前先隔离故障节点,且仅重新创建故障Pod。

图5 Pod重调度

触发场景:

  • 原地恢复中非用户输入引发的降级。
  • 节点发生故障。

约束:

  • 作业定期保存CKPT。
  • 作业支持断点续训。
  • Pod重调度保留正常实例的容器环境,要求作业脚本可重入,通常需要用户跳过数据下载或预处理步骤,删除并重建同名共享内存等。

降级策略

Pod重调度失败时,由于已经隔离过节点,降级到无条件Job级重调度

卡死重启

当长稳的训练作业正常运行一段时间后,如果训练作业没有硬件故障,出现卡死时,通常重启训练作业即可恢复正常。但由于训练作业卡死时无法自动结束容器,因此无法直接触发Job级重调度,只能设置作业卡死重启。当训练作业设置为作业卡死重启时,ModelArts会在作业运行过程中检测到卡死状态时,强制停止容器中的用户进程,容器本身不销毁保留运行环境,并在进程停止后重新运行训练作业启动命令。作业卡死重启的过程中不涉及资源调度,仅在原容器中重启训练作业。

卡死检测的规则请参见训练作业卡死检测,卡死重启过程如下图所示:

图6 卡死重启

触发场景:

  • 系统检测到NPU作业或GPU作业发生卡死。

约束:

  • 作业定期保存CKPT。
  • 作业支持断点续训。
  • 卡死重启保留故障时的容器环境,要求作业脚本可重入,通常涉及数据下载、数据预处理、创建同名共享内存等业务逻辑。

降级策略

连续3次触发卡死重启后,系统自动将作业终止并置为失败。

相关文档