节点优选
任务说明
根据亲和性策略,对通过节点预选的所有节点打分,并由调度器选择最终的节点。
例如Pod任务需要1个昇腾AI处理器,现在有满足任务的两个节点A和B,其中节点A的某一个HCCL环剩余1个昇腾AI处理器,节点B两个环分别剩余2个和3个昇腾AI处理器,根据亲和性策略,节点A会获得更高的分数。
具体实现
具体代码实现请参考开源代码中 ScoreBestNPUNodes方法,其中getNodeBestScore方法实现了根据亲和性确定节点优先级。
代码示例如下:
func (tp *module910x8) getNodeBestScore(taskNPUNum int, npuTop []int) (int, error) {
var bestScore = affScore4
// 根据NPU编号分为左右环,左[0,1,2,3],右[4,5,6,7]
sNodeInf := initSelectNodeInf(npuTop)
if sNodeInf.allNPUNum < 1 ||
sNodeInf.allNPUNum > tp.MaxNodeNPUNum ||
sNodeInf.rightNPUNum > npuNumPerHccs ||
sNodeInf.leftNPUNum > npuNumPerHccs {
return bestScore, fmt.Errorf("node top<%v> is invalid", npuTop)
}
var err = fmt.Errorf("node top<%v> is not meet task req npu<%d>", npuTop, taskNPUNum)
// 节点和任务的NPU数量都是8,优先级为0
if taskNPUNum == nodeNPUNumber {
if len(npuTop) == nodeNPUNumber {
return 0, nil
}
return bestScore, err
}
if taskNPUNum < 1 || taskNPUNum > npuNumPerHccs {
return bestScore, fmt.Errorf("task req npu num<%d> is invalid", taskNPUNum)
}
// 任务所需NPU数量为1\2\4时,根据左右环昇腾AI处理器数量得出优先级
switch {
case sNodeInf.rightNPUNum == 0:
bestScore = tp.affScoreList[taskNPUNum-1][sNodeInf.leftNPUNum-1]
case sNodeInf.leftNPUNum == 0:
bestScore = tp.affScoreList[taskNPUNum-1][sNodeInf.rightNPUNum-1]
default:
bestScore = util.Min(tp.affScoreList[taskNPUNum-1][sNodeInf.rightNPUNum-1],
tp.affScoreList[taskNPUNum-1][sNodeInf.leftNPUNum-1])
}
if bestScore == affScore4 {
return bestScore, err
}
return bestScore, nil
}
父主题: 昇腾AI处理器的调度算法说明