平台适配
平台集成芯片故障发现功能的操作示例如下。
操作步骤
- 通过Device-Info ConfigMap获取芯片故障信息。Device-Info ConfigMap由MindCluster Ascend Device Plugin创建,每个计算节点均有一个Device-Info ConfigMap,记录该节点的芯片健康状态信息。
- 使用集群调度组件提供的MindCluster Volcano或者开源MindCluster Volcano(已经集成Ascend-volcano-plugin插件),可跳过该步骤。
- 不使用上述Volcano,且想要获取芯片健康状态信息做其它业务逻辑处理,可以通过K8s客户端获取Device-Info ConfigMap内容,代码示例如下。
import ( "v1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" ) // NodeDeviceInfo is device info configmap struct type NodeDeviceInfo struct { DeviceList map[string]string UpdateTime int64 } func getNodeDeviceInfoFromCM(kubeClient kubernetes.Interface, node *api.NodeInfo) (*NodeDeviceInfo, error) { cmData, getErr := util.GetConfigMapWithRetry(kubeClient, util.DevInfoNameSpace, util.DevInfoPreName+node.Name) if getErr != nil { klog.V(util.LogErrorLev).Infof("GetConfigMapWithRetry :%#v.", getErr) return nil, getErr } devInf := &NodeDeviceInfoWithDevPlugin{} data, ok := cmData.Data[util.DevInfoCMKey] if !ok { return nil, fmt.Errorf("%s device-info no %s", node.Name, util.DevInfoCMKey) } if unmarshalErr := json.Unmarshal([]byte(data), &devInf); unmarshalErr != nil { klog.V(util.LogInfoLev).Infof("convertToReSchedulerJobsMapFromCM Unmarshal: %#v.", unmarshalErr) return nil, unmarshalErr } if checkErr := checkNodeDeviceInfo(devInf); checkErr != nil { klog.V(util.LogInfoLev).Infof("checkNodeDeviceInfo failed :%#v.", checkErr) return nil, checkErr } return &devInf.DeviceInfo, nil }
- (可选)通过Reset-Info ConfigMap获取芯片故障信息。Reset-Info ConfigMap仅在使用优雅容错模式时需要创建,如未使用优雅容错,可以跳过该步骤。
- Reset-Info ConfigMap的主要作用是告知业务面故障芯片的RANK信息、故障信息及容错策略。业务面管理进程不断轮询Reset-Info ConfigMap,根据其中信息进行训练进程的重拉起。Reset-Info ConfigMap和训练任务一起创建,每个任务使用一个Reset-Info ConfigMap。创建训练任务时,需要在任务模板中创建Reset-Info ConfigMap,ConfigMap模板如下。
--- apiVersion: v1 kind: ConfigMap metadata: name: reset-config-mindx-dls-test # The value of JobName must be the same as the name attribute of the following job. The prefix reset-config- cannot be modified. namespace: vcjob # Name Space must be set to "vcjob" data: reset.json: | { "status":"initializing" } checkCode: ""
平台用户可在任务模板中添加以下内容,通过K8s客户端创建该ConfigMap,示例如下:
import v1 "k8s.io/api/core/v1" // CreateResetInfoCM create reset info config map func (ki *ClientK8s) CreateResetInfoCM(taskName string, namespace string, taskInfo *common.TaskResetInfo) (*v1.ConfigMap, error) { newTaskInfo := setTaskInfo(taskInfo) newTaskInfo.UpdateTime = time.Now().Unix() checkCode := common.MakeDataHash(newTaskInfo) var data []byte if data = common.MarshalData(newTaskInfo); len(data) == 0 { return nil, fmt.Errorf("marshal task reset data failed") } resetInfoCM := &v1.ConfigMap{ TypeMeta: oldCM.TypeMeta, ObjectMeta: oldCM.ObjectMeta, Data: map[string]string{ "reset.json": string(data), "checkCode": checkCode, }, } hwlog.RunLog.Debugf("create reset info cm: %s/%s.", resetInfoCM.Namespace, resetInfoCM.Name) return ki.CreateConfigMap(resetInfoCM) }
- 业务容器可以通过以下两种方式之一获取Reset-Info ConfigMap。
- 文件挂载。将Reset-Info ConfigMap挂载为一个文件的方式进入业务容器,业务容器内可以通过不断轮询地查询该文件内容,获取故障信息。需要用户在任务模板中增加该挂载信息,挂载示例如下。挂载后,只需要读取“/user/restore/reset/config”下的reset.json文件就可获取故障信息。
volumeMounts: - name: reset-config mountPath: /user/restore/reset/config ….. volumes: - name: reset-config configMap: name: reset-config-mindx-dls-test # Correspond to the ConfigMap name above.
- 通过K8s客户端获取。业务容器内进程通过K8s客户端获取Reset-Info ConfigMap,不断轮询地查询ConfigMap中的内容,获取故障信息。该方法需要用户给容器内进程配置K8s读取ConfigMap的相关权限,获取示例如下:
import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // TaskDevInfo is the device info of a task type TaskDevInfo struct { RankId int DevFaultInfo } // DevFaultInfo is the fault info of device type DevFaultInfo struct { LogicId int32 Status string Policy string InitialPolicy string ErrorCode []int64 ErrorCodeHex string } // GetConfigMap get config map by name and namespace func (ki *ClientK8s) GetConfigMap(cmName, cmNameSpace string) (*v1.ConfigMap, error) { return ki.Clientset.CoreV1().ConfigMaps(cmNameSpace).Get(context.TODO(), cmName, metav1.GetOptions{ ResourceVersion: "0", }) } func getResetInfoData(resetInfo *v1.ConfigMap) ([]*common.TaskDevInfo, error) { data, ok := resetInfo.Data[common.ResetInfoCMDataKey] if !ok { return nil, fmt.Errorf("%s not exist", common.ResetInfoCMDataKey) } if len(data) > common.CMDataMaxLength { return nil, fmt.Errorf("configmap data size is out of memory") } var taskResetInfo common.TaskResetInfo if err := json.Unmarshal([]byte(data), &taskResetInfo); err != nil { return nil, fmt.Errorf("unmarshal configmap data failed, err: %#v", err) } if taskResetInfo.UpdateTime == 0 { hwlog.RunLog.Debugf("reset configmap is initializing") return nil, nil } checkCode, ok := resetInfo.Data[common.ResetInfoCMCheckCodeKey] if !ok { return nil, fmt.Errorf("%s not exist", common.ResetInfoCMCheckCodeKey) } if checkCode != common.MakeDataHash(taskResetInfo) { return nil, fmt.Errorf("configmap check hash code error") } return taskResetInfo.RankList, nil }
- 文件挂载。将Reset-Info ConfigMap挂载为一个文件的方式进入业务容器,业务容器内可以通过不断轮询地查询该文件内容,获取故障信息。需要用户在任务模板中增加该挂载信息,挂载示例如下。挂载后,只需要读取“/user/restore/reset/config”下的reset.json文件就可获取故障信息。
- Reset-Info ConfigMap的主要作用是告知业务面故障芯片的RANK信息、故障信息及容错策略。业务面管理进程不断轮询Reset-Info ConfigMap,根据其中信息进行训练进程的重拉起。Reset-Info ConfigMap和训练任务一起创建,每个任务使用一个Reset-Info ConfigMap。创建训练任务时,需要在任务模板中创建Reset-Info ConfigMap,ConfigMap模板如下。
父主题: 芯片故障