技术特性与价值
随着大模型预训练技术的发展,模型参数量以及数据量极速膨胀,因此在训练模型时将使用千卡甚至万卡规模的设备进行训练。与通用计算不同,AI分布式训练涉及到更多数量的硬件器件,同时其中任何一个器件的失效都有可能导致训练的中断。每次训练中断时故障器件的排除成为了运维人员在AI计算的首要难题,快速且精准地找到故障设备能够降低大量的训练成本。MindCluster针对昇腾设备集群提供了一套故障检测机制,能够秒级完成昇腾相关设备的故障检测与隔离,用户可以根据MindCluster上报的集群设备故障信息,排除集群中出现异常的设备。
图1 MindCluster故障检测架
关键能力
NPU芯片故障检测
芯片故障指的是NPU出现的基础软件类故障和芯片硬件类故障。MindCluster在集群的NPU节点部署Ascend Device Plugin组件,Ascend Device Plugin组件除了提供基础的设备发现和挂载功能外,还负责NPU相关故障的检测。
NPU内部具有故障检测机制,NPU故障后将故障事件通知到Ascend Device Plugin,Ascend Device Plugin对故障信息进行处理后对外上报该故障信息,这一过程将在1秒内完成。对外上报故障信息的接口当前主要以K8S的Configmap承载,将刷新故障信息到Configmap中,用户可以在深度学习平台的管理面或者业务容器挂载获取该节点的NPU故障信息。
图2 芯片故障上报流程
服务器故障检测
服务器故障指的是NPU所在AI服务器上除了NPU外的其他软硬件的故障信息。MindCluster在集群的NPU节点部署NodeD组件,NodeD组件提供服务器相关软硬件的故障检测,此外,MindCluster还复用了kubelet的节点健康检测能力,会基于NodeD和Kubelet获取服务器故障信息。
服务器心跳状态
Kubelet将定期与Api-Server发送心跳,当Api-Server发现某个节点的心跳丢失后,将把该节点的状态置为Not Ready,MindCluster将节点Not Ready的服务器检测为服务器不可用。
服务器硬件故障
针对服务器硬件故障,NodeD通过IPMI驱动向iBMC发送故障查询请求,iBMC将当前硬件告警信息响应给NodeD。NodeD收集硬件告警信息后,将节点硬件状态对外上报信息。
服务器DPC共享存储故障
针对共享存储服务DPC,NodeD将基于DPC服务的过程记录信息检测DPC存储服务的故障,检测故障后将该信息对外上报
图3 服务器故障检测上报流程
参数面网络检测
NPU的参数面网络故障包括ROCE网络相关故障和灵衢总线设备故障。参数面网络出现故障时,通常将导致训练任务中断或者训练任务性能劣化。
ROCE网络故障,在昇腾A2、A3系列产品上,ROCE网口是NPU上直出,因此NPU具有其直出的ROCE网络的故障检测机制,ROCE故障后将故障事件通知到Ascend Device Plugin。
灵衢总线设备故障,灵衢总线设备当前仅在昇腾A3系列产品上使用,灵衢总线设备驱动将检测对应的灵衢总线设备的故障信息,灵衢网络故障后将故障事件通知到Ascend Device Plugin。
Ascend Device Plugin对故障信息进行处理后对外上报该故障信息,这一过程将在1秒内完成。对外上报故障信息的接口当前主要以K8S的Configmap承载,将刷新故障信息到Configmap中,用户可以在深度学习平台的管理面或者业务容器挂载获取该节点的NPU故障信息。Ascend Device Plugin对故障信息进行处理后对外上报该故障信息。
图4 参数面故障检测流程
快速部署
安装Ascend Device Plugin组件
操作步骤
将Ascend Device Plugin软件包解压目录下的执行容器构建命令,tag为版本号。
docker build --no-cache -t ascend-k8sdeviceplugin:{tag} ./执行以下命令查看镜像和版本号是否正确。
docker images | grep k8sdeviceplugin将Ascend Device Plugin软件包解压目录下的YAML文件,拷贝到K8s管理节点上任意目录。
如不修改组件启动参数,可跳过本步骤。否则,根据实际情况修改Ascend Device Plugin的启动参数。启动参数请参见可执行./device-plugin -h查看参数说明。
根据需要使用的故障处理模式,修改Ascend Device Plugin组件的启动YAML。
...containers:- image: ascend-k8sdeviceplugin:v7.1.RC1name: device-plugin-01resources:requests:memory: 500Micpu: 500mlimits:memory: 500Micpu: 500mcommand: [ "/bin/bash", "-c", "--"]args: [ "device-plugin-useAscendDocker=true-volcanoType=true # 重调度场景下必须使用Volcano-autoStowing=true # 是否开启自动纳管开关,默认为true;设置为false代表关闭自动纳管,当芯片健康状态由unhealthy变为healthy后,不会自动加入到可调度资源池中;关闭自动纳管,当芯片参数面网络故障恢复后,不会自动加入到可调度资源池中。该特性仅适用于Atlas 训练系列产品-listWatchPeriod=5 # 设置健康状态检查周期,范围[3,1800],单位为秒-logFile=/var/log/mindx-dl/devicePlugin/devicePlugin.log-logLevel=0" ]securityContext:privileged: truereadOnlyRootFilesystem: true...
在K8s管理节点上各YAML对应路径下执行以下命令,启动Ascend Device Plugin。
以Atlas 训练系列产品、Atlas A2 训练系列产品、Atlas A3 训练系列产品或Atlas 800I A2 推理服务器、A200I A2 Box 异构组件的节点等为例,执行下列启动命令。
kubectl apply -f device-plugin-volcano-v{version}.yaml启动示例如下:
serviceaccount/ascend-device-plugin-sa createdclusterrole.rbac.authorization.K8s.io/pods-node-ascend-device-plugin-role createdclusterrolebinding.rbac.authorization.K8s.io/pods-node-ascend-device-plugin-rolebinding createddaemonset.apps/ascend-device-plugin-daemonset created
在任意节点执行以下命令,查看组件是否启动成功。
kubectl get pod -n kube-system回显示例如下,出现Running表示组件启动成功。
NAME READY STATUS RESTARTS AGE...ascend-device-plugin-daemonset-d5ctz 1/1 Running 0 11s...
安装NodeD
操作步骤
将NodeD软件包解压目录下的执行容器构建命令,tag为版本号。
执行以下命令查看镜像和版本号是否正确。
docker images | grep noded将NodeD软件包解压目录下的YAML文件,拷贝到K8s管理节点上任意目录。
如不修改组件启动参数,可跳过本步骤。否则,请根据实际情况修改YAML文件中NodeD的启动参数。启动参数请可执行./noded -h查看参数说明。
在管理节点的YAML所在路径,执行以下命令,启动NodeD。
启动请执行以下命令。
kubectl apply -f noded-v{version}.yaml启动示例如下:
serviceaccount/noded createdclusterrole.rbac.authorization.k8s.io/pods-noded-role createdclusterrolebinding.rbac.authorization.k8s.io/pods-noded-rolebinding createddaemonset.apps/noded created
执行以下命令,查看组件是否启动成功。
kubectl get pod -n mindx-dl回显示例如下,出现Running表示组件启动成功。
NAME READY STATUS RESTARTS AGE...noded-fd6t8 1/1 Running 0 74s...
快速使用
以参数面网络故障中的ROCE故障为例,本节以Atlas 800T A2产品ROCE网卡故障为例介绍如何构造故障以及如何检测故障。
故障构造
以root用户登录计算节点, 查看网卡状态。
hccn_tool -i {device_id} -link -g回显实例如下所示时,网卡状态为健康。
link status: UP执行以下命令构造网卡故障。
hccn_tool -i 0 -link -s down回显实例如下所示时,命令执行成功。
[WARNING] This link down command will result in the loss of the IPv6 address, continue?(y/n)yCmd executed successfully!
再次查询网卡状态,回显为:
故障上报与查询
以root用户登录K8S Master节点, 查看device-plugin上报到configmap中的故障信息。
kubectl describe cm -n kube-system mindx-dl-deviceinfo-{node_name}故障信息如下所示,可以查询到该故障的故障NPU、故障码和故障级别等信息。
Name: mindx-dl-deviceinfo-{node_name}Namespace: kube-systemLabels: mx-consumer-cim=trueAnnotations: <none>Data====Description:----The field[xxx.com/xxx] is sunset. Volcano has the ability to maintain the usage status of chips on its own, and can temporarily use this field by configuring the Volcano parameter 'self-maintain-available-card'DeviceInfoCfg:----{"DeviceInfo":{"DeviceList":{"huawei.com/Ascend910":"","huawei.com/Ascend910-DPUUnhealthy":"","huawei.com/Ascend910-Fault":"[{\"fault_type\":\"CardNetworkUnhealthy\",\"npu_name\":\"Ascend910-0\",\"large_model_fault_level\":\"PreSeparateNPU\",\"fault_level\":\"PreSeparateNPU\",\"fault_handling\":\"PreSeparateNPU\",\"fault_code\":\"81078603\",\"fault_time_and_level_map\":{\"81078603\":{\"fault_time\":1776909232179,\"fault_level\":\"PreSeparateNPU\"}}},]","huawei.com/Ascend910-NetworkUnhealthy":"Ascend910-0","huawei.com/Ascend910-Recovering":"","huawei.com/Ascend910-Unhealthy":"Ascend910-0,Ascend910-1,Ascend910-2,Ascend910-3,Ascend910-4,Ascend910-5,Ascend910-6,Ascend910-7"},"UpdateTime":1776909265},"SuperPodID":-1,"ServerIndex":1023,"CheckCode":"ed8f111131a04e17222e222347f73c3eeaeff611d27263ce8b66caae77858310"}ManuallySeparateNPU:----UpgradeFaultReason:----{"Ascend910-0":[{"upgrade_time":1776909232179,"fault_code":"81078603","fault_level":"PreSeparateNPU","upgrade_type":"FaultDuration"}]}BinaryData====Events: <none>
用户可通过监控每个节点的故障configmap信息获取每个节点的故障信息从而完成对应的运维工作。