训练作业故障恢复
场景描述
用户在创建训练作业时可以通过设置自动重启的方式开启容错检查,当训练作业所在节点故障或训练作业检查到异常时,系统会自动触发训练作业故障恢复机制,通过重启进程或重建作业等手段尝试恢复训练业务。不同恢复策略的及差异如表1 不同恢复策略及差异所示。
约束限制
- 容错恢复主要是通过重启进程或重建作业恢复训练业务,为了避免丢失训练进度、浪费算力,开启此功能前请确认代码已适配断点续训,操作指导请参见设置断点续训练。
- 不同恢复策略约束情况如下:
表1 不同恢复策略及差异 恢复策略
策略说明
应对的故障场景
约束限制
过程中不涉及资源调度,仅在原容器中重启训练作业。
- NPU芯片可自愈故障,以HBM多比特ECC为典型代表
- 作业定期保存CKPT
- 作业支持断点续训
- 原地恢复保留故障时的容器环境,要求作业脚本可重入
- 无需备用机
在作业异常结束退出码非0时,将用户作业涉及到的所有Pod终止,并将Job实例完全重建。
- 偶现的软件故障或网络波动
- 作业定期保存CKPT
- 作业支持断点续训
- 作业异常时业务能够中断退出,且作业退出码非0
- 无需备用机
在无条件Job重调度策略基础上,如果作业异常时发现节点故障,则在调度前先隔离故障节点。
- 所有NPU芯片故障
- 节点故障
- 作业定期保存CKPT
- 作业支持断点续训
- 需要健康备用机
保留现有的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>
参数解释:训练作业高级功能配置。
约束限制:可选取值如下:
{ "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芯片自愈,如果芯片故障清除恢复正常则所有容器重新运行训练作业启动命令。原地恢复的过程中不涉及资源调度,仅在原容器中重启训练作业。原地恢复过程如下图所示:
触发场景:
NPU芯片发生可自愈故障。
约束:
- 作业定期保存CKPT。
- 作业支持断点续训。
- 原地恢复保留故障时的容器环境,要求作业脚本可重入,通常需要用户跳过数据下载、数据预处理步骤,删除和重建同名共享内存等。可通过容错恢复环境变量中的MA_PROC_START_CNT判断是否发生过原地恢复。
降级策略
- 芯片自愈存在自愈失败的场景,当自愈失败时原地恢复同时失败,此时会将该节点隔离,降级到隔离式Job重调度
- 一次训练过程中,同一节点同一芯片24小时内连续3次出现相同故障码,此时会将该节点隔离,降级到隔离式Job重调度
- 一次训练过程中,同一节点同一芯片24小时内连续3次出现相同故障码,且是80C98002或80CB8002这类由用户输入引发的芯片故障,此时不隔离节点,只执行重调度。
NPU芯片故障码说明:
- 《Atlas A3 中心推理和训练硬件 25.3.RC1 健康管理故障定义》
- 《Atlas A2 中心推理和训练硬件 25.3.RC1 健康管理故障定义》
- 《Atlas 中心训练服务器 25.3.RC1 健康管理故障定义》
可自愈故障:通常是故障定义中故障级别“次要”“重要”的故障码,“提示”级别不需要处理,“紧急”级别无法自愈。
用户侧引发故障:算子异常或输入的数据导致NPU芯片发生故障,通常需要排查CANN版本、算子实现以及数据正确性。
无条件Job级重调度
训练过程中可能会碰到预期外的情况导致训练失败,且无法及时重启训练作业,导致训练周期长,而无条件Job重调度可以避免这类问题,提高训练成功率和提升作业的稳定性。无条件Job重调度是在作业异常结束退出码非0时,将用户作业涉及到的所有Pod终止,并将Job实例完全重建,其过程如下图所示:
触发场景:
约束:
- 作业定期保存CKPT。
- 作业支持断点续训。
- 作业异常时业务能够中断退出,且作业退出码非0。如果作业异常时业务无法中断一直处于运行状态,则无法触发Job重调度。
降级策略
连续3次触发无条件Job重调度后,第4次再次出现同样的问题,且中间未发生显式的节点故障和芯片故障,系统默认用户侧代码存在异常,作业将被终止并设置为失败状态。
隔离式Job重调度
隔离式Job重调度是在无条件Job重调度策略基础上,如果作业异常时发现节点故障,则在调度前先隔离故障节点,其过程如下图所示:
触发场景:
- 原地恢复中非用户输入引发降级。
- 节点发生故障。
约束:
- 作业定期保存CKPT。
- 作业支持断点续训。
降级策略
无。
Pod重调度
相比于隔离式Job重调度直接删除重建整个Job,Pod重调度中会保留现有的Job实例不变,在调度前先隔离故障节点,且仅重新创建故障Pod。
触发场景:
- 原地恢复中非用户输入引发的降级。
- 节点发生故障。
约束:
- 作业定期保存CKPT。
- 作业支持断点续训。
- Pod重调度保留正常实例的容器环境,要求作业脚本可重入,通常需要用户跳过数据下载或预处理步骤,删除并重建同名共享内存等。
降级策略
Pod重调度失败时,由于已经隔离过节点,降级到无条件Job级重调度。
卡死重启
当长稳的训练作业正常运行一段时间后,如果训练作业没有硬件故障,出现卡死时,通常重启训练作业即可恢复正常。但由于训练作业卡死时无法自动结束容器,因此无法直接触发Job级重调度,只能设置作业卡死重启。当训练作业设置为作业卡死重启时,ModelArts会在作业运行过程中检测到卡死状态时,强制停止容器中的用户进程,容器本身不销毁保留运行环境,并在进程停止后重新运行训练作业启动命令。作业卡死重启的过程中不涉及资源调度,仅在原容器中重启训练作业。
卡死检测的规则请参见训练作业卡死检测,卡死重启过程如下图所示:
触发场景:
- 系统检测到NPU作业或GPU作业发生卡死。
约束:
- 作业定期保存CKPT。
- 作业支持断点续训。
- 卡死重启保留故障时的容器环境,要求作业脚本可重入,通常涉及数据下载、数据预处理、创建同名共享内存等业务逻辑。
降级策略
连续3次触发卡死重启后,系统自动将作业终止并置为失败。