昇腾社区首页
中文
注册

节点优选

任务说明

根据亲和性策略,对通过节点预选的所有节点打分,并由调度器选择最终的节点。

例如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
}