故障发现

断点续训中故障发现功能是通过Ascend Device Plugin组件实现的。Ascend Device Plugin作为设备状态的监测组件,支持获取具体的设备故障。设备故障的故障码获取有轮询和订阅两种模式,故障码根据处理策略划分为六类。下文将分别介绍故障码的获取逻辑,以及故障码的类型判定逻辑。

获取故障码

故障码支持通过轮询和订阅两种方式获取。订阅可以连续的监测芯片上报的故障,而轮询只能在特定的时间点获取当时的芯片状态,对于快速恢复的故障可能存在遗漏。系统默认优先使用订阅方式获取故障码。当前环境的驱动不支持订阅接口时,会自动使用轮询方式获取。

服务启动后,使用轮询接口,查询一次芯片的故障状态,作为芯片的初始状态。当芯片产生故障被Ascend Device Plugin识别并恢复后,会再次初始化芯片状态。手动复位芯片时,某些情况下订阅接口不会返回故障恢复信息,需要再手动重启Ascend Device Plugin,以便服务获取到最新的芯片状态,如果未手动重启,则大约5分钟后订阅接口自动降级为轮询,识别故障恢复后再升级为订阅接口。

Volcano收集了内部的芯片故障、芯片网络故障、节点故障,将其作为对外的信息放在K8s的configmap中,以供外部查询和使用。

查询命令为kubectl describe cm -n volcano-system vcjob-fault-npu-cm,命令回显的参数说明见表1

表1 回显参数说明

参数名

描述

fault-node

节点维度的故障信息

NodeName

节点名称

FaultDeviceList

故障列表

- fault_type

故障类型对象,对象包含fault_type、npu_name、large_model_fault_level、fault_level和fault_code等5个字段

  • NodeUnhealthy:节点故障
  • CardUnhealthy:芯片故障
  • CardNetworkUnhealthy:芯片网络故障

- npu_name

故障的芯片名称,节点故障时为空

- large_model_fault_level

大模型的故障处理类型

  • NotHandleFault:不做处理
  • PreSeparateNPU:预隔离芯片,根据训练任务实际运行情况判断是否重调度
  • SeparateNPU:隔离芯片,执行重调度

- fault_level

普通的故障处理类型,节点故障时取值为空

  • NotHandleFault:不做处理
  • RestartRequest:需要重新执行推理请求
  • RestartBusiness:需要重新执行训练任务
  • FreeRestartNPU:直接复位芯片并重新执行业务
  • RestartNPU:直接复位芯片并重新执行业务
  • SeparateNPU:隔离芯片

- fault_code

故障码,由英文逗号拼接而成的字符串

  • Disconnected:芯片网络不连通故障。
  • heartbeatTimeOut:节点心跳丢失故障

FaultTasks

任务维度的故障信息列表,包含Reason字段

- Reason

故障原因,字段就是故障列表下的五个字段组成的字符串

判定故障码类别

当一个芯片有多种故障时,芯片的处理方式按照最严重的类型来处理。

故障码和故障的处理类型对应关系,在配置文件faultCode.json中。下载的软件包中包含该文件,制作镜像时请保留该文件。faultCode.json为系统配置文件,请勿随意修改,否则可能会导致系统故障处理功能出错。故障码按照处理方式分为六类,如表2中所示。

表2 普通的故障处理说明

故障处理类型

说明

NotHandleFault

不做处理。

RestartBusiness

需要重新执行训练任务。

RecoverRestartBusiness

待芯片故障恢复后,再重新执行训练任务。

FreeRestartNPU

芯片空闲时,复位芯片并重新执行业务。

RestartNPU

直接复位芯片并重新执行业务。

SeparateNPU

隔离芯片。