更新时间:2026-05-21 GMT+08:00
分享

超节点拓扑亲和调度

在大规模AI训练和推理场景中,CCE服务支持接入超节点算力作为容器节点,以加速AI计算任务的运行。超节点由48个包含多张NPU卡的节点组成,内部NPU通过特定的网络连接方式形成超平面网络,提供更快的网络传输速率。针对使用超节点的特殊集群场景,Volcano提供了超节点拓扑感知调度能力,通过将关联度高的计算任务调度至同一超节点内,显著提升了数据传输速度和任务执行效率。

前提条件

集群中已安装Volcano调度器插件,且插件版本在1.21.1及以上。

约束与限制

  • 网络拓扑感知调度暂不支持抢占。当资源紧张时,调度器不会主动抢占已分配给Pod的资源。
  • 若配置了分组亲和策略,则不支持soft模式的网络拓扑约束。
  • HyperJob工作负载不支持网络拓扑感知调度。即使在HyperJob的JobTemplate中配置了networkTopology或分组亲和策略,这些配置将被忽略且不会生效。
  • HyperNode自动发现功能不支持多种网络拓扑结构混部的场景(例如,A2与A3拓扑类型共存于同一集群)。
  • 应尽量避免在运行中变更网络拓扑配置项,因为这可能导致集群内HyperNode结构重建,进而引发Volcano调度器进程的负载波动或调度异常。
  • 若在调度过程中,集群网络拓扑结构或配置项发生变更,Volcano无法保证调度结果的正确性。

使用示例

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“配置中心”,切换至“调度配置”页面,选择Volcano调度器找到对应的“专家模式”,单击“开始使用”。

  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),这符合调度要求。

相关文档