选取昇腾AI处理器
任务说明
volcano框架根据节点优选得到分数后为Pod任务选择最优的节点,并将其绑定。在该过程中可以注册回调函数,依据亲和性策略,实现昇腾AI处理器选取。
例如Pod任务需要1个昇腾AI处理器,此时节点两个HCCL环分别剩余1个和3个昇腾AI处理器,那么最终会选择剩余1个昇腾AI处理器的环。
具体实现
具体代码实现请参考开源代码中UseAnnotation方法,其中selectNPUFromNode方法实现了根据亲和性从node上选取昇腾AI处理器的功能。
代码示例如下:
func (tp *module910x8) selectNPUFromNode(task *api.TaskInfo, node plugin.NPUNode) ([]int, error) { // 获取task所需NPU数量 taskNPUNum, err := tp.GetTaskReqNPUNum(task) if err != nil { klog.V(util.LogErrorLev).Infof("%s ScoreBestNPUNodes err: %s", tp.GetPluginName(), err.Error()) return nil, err } // 获取节点NPU数量 nodeTop, err := tp.getUsableTopFromNode(node, len(tp.Tasks) > 1) if err != nil { klog.V(util.LogErrorLev).Infof("%s ScoreBestNPUNodes err: %s", tp.GetPluginName(), err.Error()) return nil, err } // 如果是8昇腾AI处理器任务,直接全部选取 if taskNPUNum == nodeNPUNumber { if len(nodeTop) == nodeNPUNumber { return nodeTop, nil } err = fmt.Errorf("node<%s> top<%v> can not meet task req<%d>", node.Name, nodeTop, taskNPUNum) klog.V(util.LogErrorLev).Infof("%s ScoreBestNPUNodes err: %s", tp.GetPluginName(), err.Error()) return nil, err } // 获取任务的优先级数组 priorityArray, err := getNPUAllocPriorityArray(taskNPUNum) if err != nil { klog.V(util.LogErrorLev).Info(err.Error()) return nil, err } klog.V(util.LogInfoLev).Infof("%s selectNPUFromNode %s[%d] priority:%v in %v.", tp.GetPluginName(), task.Name, taskNPUNum, priorityArray, nodeTop) // 根据任务优先级数组选出昇腾AI处理器 leftHccsArray, rightHccsArray := getNodeHccsArray(nodeTop) for _, priority := range priorityArray { if priority == len(leftHccsArray) { return leftHccsArray[:taskNPUNum], nil } if priority == len(rightHccsArray) { return rightHccsArray[:taskNPUNum], nil } } err = fmt.Errorf("node<%s> top<%v> can not meet task req<%d>", node.Name, len(nodeTop), taskNPUNum) klog.V(util.LogErrorLev).Infof("%s ScoreBestNPUNodes err: %s", tp.GetPluginName(), err.Error()) return nil, err }
父主题: 昇腾AI处理器的调度算法说明