
# 超节点拓扑亲和调度
在大规模AI训练和推理场景中，CCE服务支持接入超节点算力作为容器节点，以加速AI计算任务的运行。超节点由48个包含多张NPU卡的节点组成，内部NPU通过特定的网络连接方式形成超平面网络，提供更快的网络传输速率。针对使用超节点的特殊集群场景，Volcano提供了超节点拓扑感知调度能力，通过将关联度高的计算任务调度至同一超节点内，显著提升了数据传输速度和任务执行效率。
#### 前提条件
集群中已安装Volcano调度器插件，且插件版本在1.21.1及以上。
#### 约束与限制
- 网络拓扑感知调度暂不支持抢占。当资源紧张时，调度器不会主动抢占已分配给Pod的资源。
- HyperJob工作负载不支持网络拓扑感知调度。即使在HyperJob的JobTemplate中配置了networkTopology或分组亲和策略，这些配置将被忽略且不会生效。
- HyperNode自动发现功能不支持多种网络拓扑结构混部的场景（例如，A2与A3拓扑类型共存于同一集群）。
- 应尽量避免在运行中变更网络拓扑配置项，因为这可能导致集群内HyperNode结构重建，进而引发Volcano调度器进程的负载波动或调度异常。
- 若在调度过程中，集群网络拓扑结构或配置项发生变更，Volcano无法保证调度结果的正确性。
 
#### 使用示例
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"配置中心"，切换至"调度配置"页面，选择Volcano调度器找到对应的"专家模式"，单击"开始使用"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002519785283.png "点击放大")
   
   
   
   
   
3. 进入CCE专家模式配置页面，在YAML配置文件中，修改default_controller_conf配置为如下内容，以启用HyperNode自动发现功能。其中配置参数，请根据实际需求调整。 
   ```
   ...
   default_controller_conf:
     networkTopologyDiscovery:
       - source: label   # HyperNode自动发现插件的名称，不可修改
         enabled: true   # HyperNode自动发现插件开关，不可修改
         config:
           networkTopologyTypes:
             testtopology:                           # 网络拓扑层级关系的名称，可修改，最大限制20字符；当前仅支持配置一组
               - nodeLabel: volcano.sh/hypernode     # 第1层网络拓扑，对应超节点，不可修改
               - nodeLabel: kubernetes.io/hostname   # 第0层网络拓扑，对应节点，不可修改
   ...
   ```
   配置更新后，执行如下命令。
   ```
   kubectl get hypernodes
   ```
   若回显有TIERNAME为volcano.sh/hypernode的HyperNode，表明超节点对应的HyperNode已被创建，Volcano已感知到了超节点拓扑信息。
   同时，需在CCE专家模式页面的YAML配置文件中，在default_scheduler_conf配置中添加network-topology-aware插件，示例内容如下。
   ```
   ...
   default_scheduler_conf:
     actions: allocate, backfill, preempt
     configurations: ''
     metrics:
       interval: 30s
       type: ''
     tiers:
       - plugins:
           - name: priority
           - enableJobStarving: false
             enablePreemptable: false
             enableReclaimable: false
             name: gang
           - name: conformance
           - enableHierarchy: true
             name: capacity
       - plugins:
           - enablePreemptable: false
             enableReclaimable: false
             name: drf
           - name: predicates
           - name: nodeorder
       - plugins:
           - name: cce-gpu-topology-predicate
           - name: cce-gpu-topology-priority
           - name: xgpu
           - name: network-topology-aware # 添加本行内容，以启用网络拓扑感知调度
             arguments:
               weight: 10                       # 本插件整体策略权重，可不填，默认为1
               hypernode.binpack.cpu: 5         # CPU资源HyperNode级装箱权重，可不填，默认为1
               hypernode.binpack.memory: 5      # 内存资源HyperNode级装箱权重，可不填，默认为1
               hypernode.binpack.resources: nvidia.com/gpu, huawei.com/ascend-1980      # 装箱策略需要考虑的自定义资源名，可不填，默认为无
               hypernode.binpack.resources.nvidia.com/gpu: 10                           # 自定义资源“nvidia.com/gpu”的HyperNode级装箱权重，可不填，默认为1
               hypernode.binpack.resources.huawei.com/ascend-1980: 10                   # 自定义资源“huawei.com/ascend-1980”的HyperNode级装箱权重，可不填，默认为1
               hypernode.binpack.normal-pod.enable: true      # 针对无网络拓扑约束Pod的多层级HyperNode装箱调度能力开关，可不填，默认为true
               hypernode.binpack.normal-pod.fading: 0.8       # 无网络拓扑约束Pod在计算各层级HyperNode装箱分数时，第tier层的权重为math.Pow(fading, tier-1)，可不填，默认为0.8
       - plugins:
           - name: nodelocalvolume
           - name: nodeemptydirvolume
           - name: nodeCSIscheduling
           - name: networkresource
   ...
   ```
   
   
4. 您可以提交以下Volcano Job，以下发4个Pod，每2个Pod为一组，且每组Pod只能调度到同一个第一层HyperNode中。 
   ```
   apiVersion: batch.volcano.sh/v1alpha1
   kind: Job
   metadata:
     name: vcjob-test
   spec:
     tasks:
       - replicas: 4
         name: "worker"
         partitionPolicy:
           totalPartitions: 2
           partitionSize: 2
           networkTopology:
             mode: hard
             highestTierAllowed: 1
         template:
           spec:
             containers:
               - name: test
                 image: busybox
                 command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
                 imagePullPolicy: IfNotPresent
                 resources:
                   requests:
                     cpu: 1
                     "huawei.com/ascend-1980": 16
                   limits:
                     cpu: 1
                     "huawei.com/ascend-1980": 16
   ```
   
   
5. 执行以下命令，查看作业运行情况。 
   ```
   kubectl get pod -o wide
   ```
   返回信息如下所示。
   ```
   NAME                  READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
   vcjob-test-worker-0   1/1     Running   0          13s   172.19.3.181   192.168.5.95    <none>           <none>
   vcjob-test-worker-1   1/1     Running   0          13s   172.19.0.3     192.168.5.25    <none>           <none>
   vcjob-test-worker-2   1/1     Running   0          13s   172.19.1.3     192.168.5.231   <none>           <none>
   vcjob-test-worker-3   1/1     Running   0          13s   172.19.3.42    192.168.5.239   <none>           <none>
   ```
   
   
6. 执行以下命令，查看这4个Pod所在节点的超节点信息。 
   ```
   kubectl describe node 192.168.5.95  | grep volcano.sh/hypernode
   kubectl describe node 192.168.5.25  | grep volcano.sh/hypernode
   kubectl describe node 192.168.5.231 | grep volcano.sh/hypernode
   kubectl describe node 192.168.5.239 | grep volcano.sh/hypernode
   ```
   返回以下类似信息。
   ```
   volcano.sh/hypernode=hypernode-2
   volcano.sh/hypernode=hypernode-2
   volcano.sh/hypernode=hypernode-1
   volcano.sh/hypernode=hypernode-1
   ```
   第一组Pod（即worker-0和worker-1）被调度到了超节点2（volcano.sh/hypernode = hypernode-2），而第二组Pod（worker-2和worker-3）则被调度到了超节点1（volcano.sh/hypernode = hypernode-1），这符合调度要求。
   
   
 
