昇腾社区首页
中文
注册

平台适配

平台集成芯片故障发现功能的操作示例如下。

操作步骤

  1. 通过Device-Info ConfigMap获取芯片故障信息。Device-Info ConfigMapMindCluster 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
      }
  2. (可选)通过Reset-Info ConfigMap获取芯片故障信息。Reset-Info ConfigMap仅在使用优雅容错模式时需要创建,如未使用优雅容错,可以跳过该步骤。
    1. Reset-Info ConfigMap的主要作用是告知业务面故障芯片的RANK信息、故障信息及容错策略。业务面管理进程不断轮询Reset-Info ConfigMap,根据其中信息进行训练进程的重拉起。Reset-Info ConfigMap和训练任务一起创建,每个任务使用一个Reset-Info ConfigMap。创建训练任务时,需要在任务模板中创建Reset-Info ConfigMapConfigMap模板如下。
      ---
      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)
      }
    2. 业务容器可以通过以下两种方式之一获取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
        }