# 节点内NPU拓扑亲和调度
节点内NPU拓扑感知调度是一种基于昇腾AI处理器硬件拓扑特性的智能资源管理技术，通过优化资源分配和网络路径选择，有效减少计算资源碎片和网络拥塞，最大化提升NPU算力利用率。该技术可显著提升AI训练和推理任务的执行效率，实现昇腾计算资源的高效调度与管理。
在CCE Standard/Turbo集群中，节点内NPU拓扑感知调度需要多个组件配合完成，具体实现流程如下：
1. CCE AI套件（Ascend NPU）插件中的huawei-npu-device-plugin对节点内NPU芯片的拓扑结构进行查询和上报。
2. 用户提交任务创建需要使用NPU资源的Pod，Volcano Scheduler将基于Pod的资源需求和NPU设备的拓扑结构，选择最优的节点以及NPU分配方案。
3. Volcano Scheduler将Pod调度到选定的节点。
4. Kubelet根据分配方案进行NPU资源分配，并运行Pod。
图1节点内NPU拓扑感知调度实现流程   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002250001324.png "点击放大")
#### 拓扑亲和规则
不同硬件型号因其内部互联架构差异，需要采用不同的拓扑亲和调度策略，但所有策略都遵循以下原则：
- 首要原则：保障高速网络通路。
- 次要原则：最小化资源碎片化。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
- HCCS（Huawei Cache Coherent System），华为一致性系统总线，用于CPU和NPU之间互联的高速总线。
- PCIE（Peripheral Component Interconnect Express），一种串行外设扩展总线标准，用于计算机系统的外设扩展使用。
- SIO（Serial Input/Output）,一种最基本的串行接口，由一个主器件和一个从器件通过一条数据线和一条时钟线采用一对一的方式连接组成。
 
 表1节点内NPU拓扑亲和调度 
| 硬件类型       | 互联方式                                                                                                                                      | 亲和策略                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 约束与限制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| Snt9A    | 节点内部共有8个NPU芯片，其中NPU 0-3组成一个HCCS环，NPU 4-7组成另一个HCCS环。每个HCCS环构成一个小网分组，两个分组之间通过PCIE互联。 **分组内的网络传输速度优于组间的传输速度。** | 仅支持小网分组拓扑亲和调度策略，具体如下： - 当Pod申请4个及以下NPU时，**给同一Pod** **分配的NPU卡必须在同一分组内，否则任务将运行失败**。当多个节点满足条件时，系统将根据分组内NPU利用率、节点NPU利用率以及优先级权重值计算节点得分，最终根据得分选择节点。权重值越高，则越倾向于选择调度后分组内NPU利用率更高的节点。  - Pod申请8个NPU时，选择可用NPU数量为8的节点。                                                                                                                                                                                                                                                                                                         | - 支持申请1、2、4、8个NPU的Pod。  - Volcano插件版本在1.6.4及以上。                                                                                                                                                                                                                                                                                                                                                                                                    |
| Snt9B    | 节点内部共有8个NPU芯片，采用星型拓扑结构，每个NPU通过HCCS互联。                                                                                                    | 仅支持基本亲和调度策略，即优先选择调度后资源利用率更高的节点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | - 支持申请1\~8个NPU的Pod。  - Volcano插件版本在1.15.8及以上。                                                                                                                                                                                                                                                                                                                                                                                              |
| Snt9C   | 节点内部共有8张训练卡，每张训练卡有2个NPU芯片，每张训练卡构成一个DIE结构。训练卡内NPU通过SIO互联，两卡之间通过HCCS互联。 **DIE** **内的网络传输速度优于DIE间的传输速度。**       | 支持DIE拓扑亲和调度策略，具有两种模式，即硬亲和、不亲和。 - 硬亲和（默认配置）： - 如果申请NPU个数为1，当多个节点满足条件时，系统将根据DIE内NPU利用率、节点NPU利用率以及优先级权重值计算节点得分，最终根据得分选择节点。权重值越高，则越倾向于选择调度后DIE内NPU利用率更高的节点。  - 如果申请NPU个数为2、4、8，则需要进行整卡粒度调度。若存在多个节点满足条件，则优先选择调度后资源利用率更高的节点。  - 如果申请NPU个数为16，选择可用NPU数量为16的节点。    - 不亲和：表示基本拓扑亲和调度策略，即优先选择调度后资源利用率更高的节点。   | - 硬亲和： - 支持申请1、2、4、8、16个NPU的Pod。  - Volcano插件版本在1.15.8及以上。    - 不亲和： - 支持申请1\~16个NPU的Pod。  - Volcano插件版本在1.15.8及以上。       |
| Snt3P   | 节点内部共有8个NPU芯片，采用星型拓扑结构，每个NPU通过PCIE互联。                                                                                                     | 仅支持基本拓扑亲和调度策略，即优先选择调度后资源利用率更高的节点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | - 支持申请1\~8个NPU的Pod。  - Volcano插件版本在1.15.8及以上。                                                                                                                                                                                                                                                                                                                                                                                                         |
| Snt3P IDUO2 | 节点内部共有4张推理卡，每张推理卡有2个NPU芯片，每张推理卡构成一个DIE结构。推理卡内NPU通过HCCS互联，两卡之间通过PCIE互联。 **DIE** **内的网络传输速度优于DIE间的传输速度。**      | 支持DIE拓扑亲和调度策略，具有两种模式，即硬亲和、不亲和。 - 硬亲和（默认配置）： - 如果申请NPU个数为1，当多个节点满足条件时，系统将根据DIE内NPU利用率、节点NPU利用率以及优先级权重值计算节点得分，最终根据得分选择节点。权重值越高，则越倾向于选择调度后DIE内NPU利用率更高的节点。  - 如果申请NPU个数为2、4，则需要进行整卡粒度调度。若存在多个节点满足条件，则优先选择调度后资源利用率更高的节点。  - 如果申请NPU个数为8，选择可用NPU数量为8的节点。    - 不亲和：表示基本亲和调度策略，即优先选择调度后资源利用率更高的节点。          | - 硬亲和： - 支持申请1、2、4、8个NPU的Pod。  - Volcano插件版本在1.15.8及以上。    - 不亲和： - 支持申请1\~8个NPU的Pod。  - Volcano插件版本在1.15.8及以上。     |
   
#### 前提条件
- 已创建CCE Standard/Turbo集群，不同拓扑亲和策略对集群版本要求如下：
  - DIE拓扑亲和调度策略：集群版本在v1.23.18、v1.25.13、v1.27.10、v1.28.8、v1.29.4、v1.30.1及以上。
  
  - 小网分组拓扑亲和调度策略：集群版本在v1.23及以上。
   
- 集群中已有对应类型节点。CCE Standard/Turbo集群暂不支持购买Snt9类型节点，您可以在ModelArts中提前购买Snt9类型节点（Ascend规格实例），购买后CCE集群将自动纳管，具体步骤请参见[创建Standard专属资源池](https://support.huaweicloud.com/resmgmt-modelarts/resmgmt-modelarts_0004.html)。
- 已安装CCE AI套件（Ascend NPU）插件，且插件版本在2.1.23及以上。关于插件安装的具体操作，请参见[CCE AI套件（Ascend NPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0239.html)。
- 已安装Volcano插件，且插件版本要求请参见[表1]。关于插件安装的具体操作，请参见[Volcano调度器](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)。
 
#### 约束与限制
在单个Pod内，仅支持1个容器申请NPU资源，且不允许init容器申请NPU资源，否则Pod将无法被调度。
#### 开启拓扑亲和调度策略
不同亲和策略，开启时需要配置的参数不同，具体如下。
- [开启小网分组拓扑亲和调度]
  仅Snt9A类型节点支持使用"小网分组拓扑亲和调度"，请根据需求配置。
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群概览页。在左侧导航栏中选择"配置中心"，在右侧切换至"调度配置"页签。
  
  2. 在设置"设置集群默认调度器"中选择Volcano调度器。开启Volcano调度器后，直接使用"小网分组拓扑亲和调度"。
  
  3. （可选步骤）在"专家模式"中单击"开始使用"，在cce-gpu-topology-priority插件下配置gpuaffinitytopologyaware.weight参数，从而自定义小网分组的优先级权重值。配置优先级权重时，需确保已配置cce-gpu-topology-priority插件。 
     ```
     ...
     tiers:
         - plugins:
             - name: priority
             - enableJobStarving: false
               enablePreemptable: false
               name: gang
             - name: conformance
         - plugins:
             - enablePreemptable: false
               name: drf
             - name: predicates
             - name: nodeorder
         - plugins:
             - name: cce-gpu-topology-predicate
             - name: cce-gpu-topology-priority  # 存在该参数，则说明已配置cce-gpu-topology-priority插件。若无，请增加该参数
               arguments:   # 配置优先级权重值
                 gpuaffinitytopologyaware.weight: 10
             - name: xgpu
         - plugins:
             - name: nodelocalvolume
             - name: nodeemptydirvolume
             - name: nodeCSIscheduling
             - name: networkresource
     ...
     ```
     表2参数说明 
     | 参数                                        | 示例  | 说明                                                                                               |
     |:---|:---|:---|
     | arguments.gpuaffinitytopologyaware.weight | 10 | 表示优先级权重值，取值范围为0\~2147483647。 权重值越高，则越倾向于选择调度后分组内NPU利用率更高的节点，以减少资源碎片。 |
        
     
     
  
  4. 在右下角单击"确认配置"。在"确认配置"弹窗中，确认修改信息，无误后单击"保存"。
   
- [开启基础拓扑亲和调度]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群概览页。在左侧导航栏中选择"配置中心"，在右侧切换至"调度配置"页签。
  
  2. 在设置"设置集群默认调度器"中选择"Volcano调度器"。开启Volcano调度器后，直接使用"基础拓扑亲和调度"，无需其他配置。
  
  3. 在右下角单击"确认配置"。在"确认配置"弹窗中，确认修改信息，无误后单击"保存"。
   
- [开启DIE拓扑亲和调度]
  仅Snt9C、Snt3P IDUO2类型节点支持使用"DIE拓扑亲和调度"，请根据需求配置。
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群概览页。在左侧导航栏中选择"配置中心"，在右侧切换至"调度配置"页签。
  
  2. 在Volcano调度器配置中，"DIE拓扑亲和拓扑调度"默认开启，您可以根据以下步骤进行验证。 
     1. 在设置"设置集群默认调度器"中选择Volcano调度器，在"专家模式"中单击"开始使用"。
        图2"专家模式 \> 开始使用"   
        ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002285614601.png "点击放大")
        
        
     
     2. 在YAML配置文件中，检查是否已配置如下参数。DIE拓扑亲和调度依赖cce-gpu-topology-predicate和cce-gpu-topology-priority插件，其在Volcano-scheduler配置中默认开启。若无如下参数，请手动配置。
        ```
        ...
        tiers:
            - plugins:
                - name: priority
                - enableJobStarving: false
                  enablePreemptable: false
                  name: gang
                - name: conformance
            - plugins:
                - enablePreemptable: false
                  name: drf
                - name: predicates
                - name: nodeorder
            - plugins:
                - name: cce-gpu-topology-predicate
                - name: cce-gpu-topology-priority
                - name: xgpu
            - plugins:
                - name: nodelocalvolume
                - name: nodeemptydirvolume
                - name: nodeCSIscheduling
                - name: networkresource
        ...
        ```
        
     
     3. 配置cce-gpu-topology-predicate插件后，默认为DIE硬亲和模式，并支持cce-gpu-topology-predicate和cce-gpu-topology-priority插件中配置以下参数。
        ```
        ...
        tiers:
            - plugins:
                - name: priority
                - enableJobStarving: false
                  enablePreemptable: false
                  name: gang
                - name: conformance
            - plugins:
                - enablePreemptable: false
                  name: drf
                - name: predicates
                - name: nodeorder
            - plugins:
                - name: cce-gpu-topology-predicate
                  arguments:   # 配置DIE不亲和模式
                    npu-die-affinity: none    
                - name: cce-gpu-topology-priority
                  arguments:   # 配置优先级权重值，仅适用于硬亲和模式
                    gpuaffinitytopologyaware.weight: 10
                - name: xgpu
            - plugins:
                - name: nodelocalvolume
                - name: nodeemptydirvolume
                - name: nodeCSIscheduling
                - name: networkresource
        ...
        ```
        表3参数说明 
        | 参数                                         | 示例   | 说明                                                                                                                                                                                                                                                               |
        |:---|:---|:---|
        | arguments.npu-die-affinity                 | none | 用于配置DIE拓扑亲和调度模式，取值如下： - required：表示硬亲和模式。  - none：表示不亲和默认。   无该参数时，默认为DIE硬亲和模式。 |
        | arguments.gpuaffinitytopologyaware.weight | 10     | 仅适用于硬亲和模式，表示优先级权重值，取值范围为0\~2147483647。 权重值越高，则越倾向于选择调度后DIE内NPU利用率更高的节点，以减少资源碎片。                                                                                                                                                   |
           
        
     
     4. 参数填写完成后，在右下角单击"保存"。
     
     
     
     
  
  3. 在右下角单击"确认配置"。在"确认配置"弹窗中，确认修改信息，无误后单击"保存"。
   
#### 使用示例
**以DIE拓扑亲和调度策略为例，为您提供一个完整的使用示例**。现有一个Snt3P IDUO2类型的节点，其内部有4张推理卡，每张推理卡有2个NPU芯片。假设该节点上剩余3NPU资源，位于2张推理卡，即一个推理卡剩余2个NPU，另一个剩余1个NPU。创建一个Volcano Job，Pod实例数为1，且申请NPU数量为2，验证其能否实现整卡调度。
1. 依次执行以下命令，创建一个Volcano Job，用于执行任务。 
   1. 执行以下命令，创建Volcano Job的YAML文件。
      ```
      vim volcano-job.yaml
      ```
      文件内容如下，**在单个Pod内，仅支持1个容器申请NPU资源，且不允许init容器申请NPU资源，否则Pod将无法被调度** 。
      ```
      apiVersion: batch.volcano.sh/v1alpha1 
      kind: Job 
      metadata: 
        name: job-test
      spec:
        maxRetry: 10000    # 定义任务（Job）在失败时的最大重试次数
        schedulerName: volcano
        tasks: 
        - replicas: 1 
          name: worker
          maxRetry: 10000 
          template: 
            metadata: 
            spec:  
              containers:  
              - image: busybox 
                command: ["/bin/sh", "-c", "sleep 1000000"]  
                imagePullPolicy: IfNotPresent    
                name: running       
                resources:     
                  requests:    
                    cpu: 1    
                    "huawei.com/ascend-310": 2    
                  limits:     
                    cpu: 1    
                    "huawei.com/ascend-310": 2  
              restartPolicy: OnFailure
      ```
      - resources.requests支持以下参数：
        - "huawei.com/ascend-1980"：表示在Snt9C类型节点中申请的NPU资源，取值范围为1、2、4、8、16。
        
        - "huawei.com/ascend-310"：表示在Snt3P IDUO2类型节点中申请的NPU资源，取值范围为1、2、4、8。
         
       
   
   2. 执行以下命令，创建上述Volcano Job。
      ```
      kubectl apply -f volcano-job.yaml
      ```
      回显结果如下：
      ```
      job.batch.volcano.sh/job-test created
      ```
      
   
   3. 执行以下命令，查看Pod是否调度成功。
      ```
      kubectl get pod
      ```
      回显结果如下，则说明Volcano Job已成功运行，且Pod全部调度成功。
      ```
      NAME                         READY   STATUS    RESTARTS      AGE 
      job-test-worker-0            1/1     Running   0             20s
      ```
      
   
   
   
   
2. 执行以下命令，查看Pod分配NPU信息。 
   ```
   kubectl describe pod job-test-worker-0
   ```
   在Snt3P IDUO2类型的节点中NPU芯片默认编号为0、1、2...，其中0\~1处于一张推理卡中、2\~3处于一张推理卡中，依次往下。由回显可知，分配的NPU编号分别为2、3，在一张推理卡中，满足DIE拓扑亲和调度策略。
   ```
   Name:             job-test-worker-0 
   Namespace:        default 
   Priority:         0Service 
   Account:  default 
   Node:             192.168.147.31/192.168.147.31 
   Start Time:       Mon, 09 Sep 2024 21:23:01 +0800 
   Labels:           volcano.sh/job-name=job-test
                     volcano.sh/job-namespace=default  
                     volcano.sh/queue-name=default   
                     volcano.sh/task-index=0  
                     volcano.sh/task-spec=worker 
   Annotations:      huawei.com/AscendReal: Ascend310-2,Ascend310-3    
                     huawei.com/kltDev: Ascend310-2,Ascend310-3  
                     scheduling.cce.io/gpu-topology-placement: huawei.com/ascend-1980=0x0c
   ```
   
   
 
