
# 故障恢复机制
#### 场景描述
用户在创建训练作业时可以通过设置自动重启的方式[开启和查看高可用配置](https://support.huaweicloud.com/usermanual-standard-modelarts/modelarts_trouble_0003.html)，当训练作业所在节点故障或训练作业检查到异常时，系统会自动触发训练作业故障恢复机制，通过重启进程或重建作业等手段尝试恢复训练业务。不同恢复策略的及差异如[表1]所示。
#### 约束限制
1. 容错恢复主要是通过重启进程或重建作业恢复训练业务，为了避免丢失训练进度、浪费算力，开启此功能前请确认代码已适配断点续训，操作指导请参见[高可靠性前置准备：断点续训练](https://support.huaweicloud.com/usermanual-standard-modelarts/develop-modelarts-0023.html)。
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  - 作业支持断点续训  - 卡死重启保留故障时的容器环境，要求作业脚本可重入  - 无需备用机              |
      
   
 
#### 故障恢复开启方式
故障恢复配置请参考[开启和查看高可用配置](https://support.huaweicloud.com/usermanual-standard-modelarts/modelarts_trouble_0003.html)完成。
 #### 故障恢复环境变量
以下环境变量可判断作业是否发生过断点续训，主要用于训练脚本的可重入。
表2故障恢复环境变量 
| 变量名               | 说明                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|
| MA_SCHEDULE_CNT   | 训练作业整体被调度的次数，新下发的作业初始值1，每次重调度（含Job级与Pod级）恢复后，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来判断业务是否需要执行重新打开共享内存、跳过数据加载等流程。 |
   
以下环境变量可加速重调度执行的速度。
表3故障恢复环境变量-续 
| 变量名                                          | 说明                                                                                                                                     |
|:---|:---|
| MA_FAILOVER_TERMINATION_GRACE_PERIOD_SECONDS | 当设置为正整数N时，可以在N秒后将容器结束阶段的卷卸载步骤设置为异步执行，从而有效降低大规模作业的重调度恢复时间，建议在SFSTurbo存储为主的场景配置为10。 默认值：-1。 |
   
 #### 原地恢复
NPU训练作业在运行过程中可能会发生芯片故障，部分芯片故障可通过系统修复或复位进行自愈。对此类可自愈的芯片故障，系统强制停止容器中的用户进程，容器本身不销毁保留运行环境，在所有业务进程终止后尝试NPU芯片自愈，如果芯片故障清除恢复正常则所有容器重新运行训练作业启动命令。原地恢复的过程中不涉及资源调度，仅在原容器中重启训练作业。原地恢复过程如下图所示：
图1原地恢复   
![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002631266408.png "点击放大")
**触发场景：**
NPU芯片发生可自愈故障。
**约束：**
- 作业定期保存CKPT。
- 作业支持断点续训。
- 原地恢复保留故障时的容器环境，要求作业脚本可重入，通常需要用户跳过**数据下载、数据预处理步骤，删除和重建同名共享内存** 等。可通过[故障恢复环境变量]中的MA_PROC_START_CNT判断是否发生过原地恢复。
**降级策略**
- 芯片自愈存在自愈失败的场景，当自愈失败时原地恢复同时失败，此时会将该节点隔离，降级到[隔离式Job重调度]
- 一次训练过程中，同一节点同一芯片24小时内连续3次出现相同故障码，此时会将该节点隔离，降级到[隔离式Job重调度]
- 一次训练过程中，同一节点同一芯片24小时内连续3次出现相同故障码，且是80C98002或80CB8002这类由用户输入引发的芯片故障，此时不隔离节点，只执行重调度。
![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/note_3.0-zh-cn.png)
**NPU芯片故障码说明：**
- [《Atlas A3 中心推理和训练硬件 25.3.RC1 健康管理故障定义》](https://support.huawei.com/enterprise/zh/doc/EDOC1100523646?idPath=23710424|251366513|254884019|261408772|252764743)
- [《Atlas A2 中心推理和训练硬件 25.3.RC1 健康管理故障定义》](https://support.huawei.com/enterprise/zh/doc/EDOC1100523660?idPath=23710424|251366513|254884019|261408772|252764743)
- [《Atlas 中心训练服务器 25.3.RC1 健康管理故障定义》](https://support.huawei.com/enterprise/zh/doc/EDOC1100523664?idPath=23710424|251366513|254884019|261408772|252764743)
**可自愈故障**：通常是故障定义中故障级别"次要""重要"的故障码，"提示"级别不需要处理，"紧急"级别无法自愈。
**用户侧引发故障：**算子异常或输入的数据导致NPU芯片发生故障，通常需要排查CANN版本、算子实现以及数据正确性。
 #### 无条件Job级重调度
训练过程中可能会碰到预期外的情况导致训练失败，且无法及时重启训练作业，导致训练周期长，而无条件Job重调度可以避免这类问题，提高训练成功率和提升作业的稳定性。无条件Job重调度是在作业异常结束退出码非0时，将用户作业涉及到的所有Pod终止，并将Job实例完全重建，其过程如下图所示：
图2无条件Job级重调度   
![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002631266406.png "点击放大")
**触发场景：**
- [原地恢复]中用户输入引发的降级。
- 作业失败中断，且退出码非0。
- [Pod重调度]失败降级。
  ![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/warning_3.0-zh-cn.png)
  在作业被驱逐的场景下，目前不支持触发"无条件Job级重调度"，作业状态将变为失败，建议优先排查软件代码相关问题。
  ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002661745527.png "点击放大")
  
  
**约束：**
- 作业定期保存CKPT。
- 作业支持断点续训。
- 作业异常时业务能够中断退出，且作业退出码非0。如果作业异常时业务无法中断一直处于运行状态，则无法触发Job重调度。
**降级策略**
连续3次触发无条件Job重调度后，第4次再次出现同样的问题，且中间未发生显式的节点故障和芯片故障，系统默认用户侧代码存在异常，作业将被终止并设置为失败状态。
 #### 隔离式Job重调度
隔离式Job重调度是在无条件Job重调度策略基础上，如果作业异常时发现节点故障，则在调度前先隔离故障节点，其过程如下图所示：
图3隔离式Job重调度   
![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002631266400.png "点击放大")
**触发场景：**
- [原地恢复]中非用户输入引发降级。
- 节点发生故障。
**约束：**
- 作业定期保存CKPT。
- 作业支持断点续训。
**降级策略**
无。
 #### Pod重调度
相比于[隔离式Job重调度]直接删除重建整个Job，Pod重调度中会保留现有的Job实例不变，在调度前先隔离故障节点，且仅重新创建故障Pod。
图4Pod重调度   
![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002661625589.png "点击放大")
**触发场景：**
- [原地恢复]中非用户输入引发的降级。
- 节点发生故障。
**约束：**
- 作业定期保存CKPT。
- 作业支持断点续训。
- Pod重调度保留正常实例的容器环境，要求作业脚本可重入，通常需要用户**跳过数据下载或预处理步骤，删除并重建同名共享内存**等。
**降级策略**
Pod重调度失败时，由于已经隔离过节点，降级到**[无条件Job级重调度]**。
 #### 卡死重启
当长稳的训练作业正常运行一段时间后，如果训练作业没有硬件故障，出现卡死时，通常重启训练作业即可恢复正常。但由于训练作业卡死时无法自动结束容器，因此无法直接触发[Job级重调度]，只能设置作业卡死重启。当训练作业设置为作业卡死重启时，ModelArts会在作业运行过程中检测到卡死状态时，强制停止容器中的用户进程，容器本身不销毁保留运行环境，并在进程停止后重新运行训练作业启动命令。作业卡死重启的过程中不涉及资源调度，仅在原容器中重启训练作业。
卡死检测的规则请参见[卡死检测](https://support.huaweicloud.com/usermanual-standard-modelarts/modelarts_trouble_0108.html#ZH-CN_TOPIC_0000002661745279__section510241332215)，卡死重启过程如下图所示：
图5卡死重启   
![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002661625591.png "点击放大")
**触发场景：**
- 系统检测到NPU作业或GPU作业发生卡死。
**约束：**
- 作业定期保存CKPT。
- 作业支持断点续训。
- 卡死重启保留故障时的容器环境，要求作业脚本可重入，通常涉及**数据下载、数据预处理、创建同名共享内存**等业务逻辑。
**降级策略**
连续3次触发卡死重启后，系统自动将作业终止并置为失败。
