开启调度功能

更新时间:
复制 MD 格式

ACK托管集群Pro集群中部署GPU计算任务时,可通过为GPU节点分配调度属性标签(如独占、共享、拓扑感知等)和指定卡型标签(卡型调度),实现资源利用率优化与应用精准调度。

调度标签介绍

GPU调度标签通过标识GPU型号、资源分配策略等信息,实现资源精细化管理与高效调度。

调度模式

标签值

适用场景

独占调度默认

ack.node.gpu.schedule: default

 性能要求高、需独占整卡的任务,如模型训练、HPC等。

共享调度

ack.node.gpu.schedule: cgpu

ack.node.gpu.schedule: core_mem

ack.node.gpu.schedule: share

ack.node.gpu.schedule: mps

提升 GPU 利用率,适用于多租户、推理等多个轻量级任务并发运行的场景。

  • cgpu:算力共享,显存隔离,基于阿里云cGPU共享技术实现。

  • core_mem:算力与显存隔离。

  • share:共享算力和显存资源,无隔离。

  • mps:算力共享,显存隔离,基于NVIDIA MPS隔离功能结合阿里云cGPU技术实现。

ack.node.gpu.placement: binpack

ack.node.gpu.placement: spread

适用于在开启cgpucore_memsharemps共享调度功能后,且单个节点含多张GPU卡,优化多GPU卡资源的分配策略。

  • binpack:(默认)多卡紧凑调度,多个Pod优先填满一张GPU后再分配下一张,减少资源碎片,适合资源利用率或节能优先的场景。

  • spread:多卡分散调度,将Pod分散到不同GPU上,降低单卡故障影响,适合高可用性任务。

拓扑感知调度

ack.node.gpu.schedule: topology

根据单机内GPU物理拓扑关系,为Pod自动分配通信带宽最优的GPU组合,适用于对GPU之间通信延迟敏感的任务。

卡型调度

aliyun.accelerator/nvidia_name: <GPU显卡名称>

配合卡型调度设置GPU任务的显存容量、总GPU卡数。
aliyun.accelerator/nvidia_mem: <每张卡的显存容量>
aliyun.accelerator/nvidia_count: <总共拥有的GPU卡数>

将任务调度到指定 GPU 型号的节点上,或避开特定型号。

开启调度功能

一个节点只能启用一种 GPU 调度模式(独占、共享或拓扑感知)。启用后,其他调度模式所上报的扩展资源将自动置为 0。

独占调度

节点未添加任何GPU调度标签,则默认启用独占调度。此时,节点以单张GPU卡为最小分配单元,为Pod提供GPU资源。

若已开启其他GPU调度模式,仅删除标签无法恢复独占调度,需通过节点池将标签值修改为 ack.node.gpu.schedule: default 才能恢复独占调度能力。

共享调度

共享调度,仅支持ACK托管集群Pro。具体信息,请参见使用限制

  1. 安装共享调度组件ack-ai-installer

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > 云原生AI套件

    3. 云原生AI套件页面,单击一键部署。在一键部署云原生AI套件页面,选中调度策略扩展(批量任务调度、GPU共享、GPU拓扑感知)。

      如何设置cGPU服务支持的算力调度Policy策略,请参见安装并使用cGPU服务
    4. 云原生AI套件页面,单击部署云原生AI套件

      云原生AI套件页面组件列表,查看已安装的共享GPU组件ack-ai-installer

  2. 开启共享调度功能。

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

    2. 节点池页面,单击创建节点池配置节点标签,单击确认配置

      其余配置项信息可保持默认。关于节点标签的使用场景,请参见调度标签介绍
      • 配置基础共享调度。

        单击节点标签(Labels)节点标签,设置ack.node.gpu.schedule,可选择配置cgpucore_memsharemps(需安装MPS Control Daemon组件)标签值之一。

      • 配置多卡共享调度。

        当节点包含多张GPU卡,优化多GPU卡资源的分配策略时,可在基础共享调度上,进一步配置多卡共享调度。

        单击节点标签(Labels)节点标签,设置ack.node.gpu.placement,可选择配置binpackspread标签值之一。

  3. 验证是否已开启共享调度功能。

    cgpu/share/mps

    将变量<NODE_NAME>替换为目标节点名称后,执行以下命令,验证节点池是否开启cgpu/share/mps共享调度功能。

    kubectl get nodes <NODE_NAME> -o yaml | grep -q "aliyun.com/gpu-mem"

    预期输出:

    aliyun.com/gpu-mem: "60"

    aliyun.com/gpu-mem字段不为0,说明已开启cgpu/share/mps共享调度功能。

    core_mem

    将变量<NODE_NAME>替换为目标节点名称后,执行以下命令,验证节点池是否开启core_mem共享调度功能。

    kubectl get nodes <NODE_NAME> -o yaml | grep -E 'aliyun\.com/gpu-core\.percentage|aliyun\.com/gpu-mem'

    预期输出:

    aliyun.com/gpu-core.percentage:"80"
    aliyun.com/gpu-mem:"6"

    字段aliyun.com/gpu-core.percentagealiyun.com/gpu-mem均不为0,说明已开启core_mem共享调度功能。

    binpack

    使用共享GPU调度GPU资源查询工具,执行以下命令,查询节点GPU资源分配情况:

    kubectl inspect cgpu

    预期输出:

    NAME                   IPADDRESS      GPU0(Allocated/Total)  GPU1(Allocated/Total)  GPU2(Allocated/Total)  GPU3(Allocated/Total)  GPU Memory(GiB)
    cn-shanghai.192.0.2.109  192.0.2.109  15/15                   9/15                   0/15                   0/15                   24/60
    --------------------------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    24/60 (40%)

    输出结果表明,GPU0资源已全部分配15/15,GPU1已分配资源为9/15,符合优先填满一张GPU后再分配下一张的调度策略,binpack策略生效。

    spread

    使用共享调度GPU资源查询工具,执行以下命令,查询节点GPU资源分配情况:

    kubectl inspect cgpu

    预期输出:

    NAME                   IPADDRESS      GPU0(Allocated/Total)  GPU1(Allocated/Total)  GPU2(Allocated/Total)  GPU3(Allocated/Total)  GPU Memory(GiB)
    cn-shanghai.192.0.2.109  192.0.2.109  4/15                   4/15                   0/15                   4/15                   12/60
    --------------------------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    12/60 (20%)

    输出结果表明,GPU0已分配资源4/15,GPU1已分配资源为4/15,GPU3已分配资源为4/15,符合优先将Pod分散到不同GPU上的调度策略,spread策略生效。

拓扑感知调度

拓扑感知调度,仅支持ACK托管集群Pro。具体信息,请参见系统组件版本要求

  1. 安装共享调度组件ack-ai-installer

  2. 开启拓扑感知调度功能。

    通过节点池为 GPU 节点添加拓扑感知调度标签:在目标节点池的节点标签中,设置 ack.node.gpu.schedule,值为 topology

    节点激活GPU拓扑感知调度后,不再支持非拓扑感知GPU资源的调度。如需恢复,请通过节点池将标签值改为 default
  3. 验证是否已开启拓扑感知调度功能。

    将变量<NODE_NAME>替换为目标节点名称后,执行以下命令,验证节点池是否开启topology拓扑感知调度功能。

    kubectl get nodes <NODE_NAME> -o yaml | grep aliyun.com/gpu

    预期输出:

    aliyun.com/gpu: "2"

    aliyun.com/gpu字段不为0,说明已开启topology拓扑感知调度功能。

卡型调度

将任务调度到指定 GPU 型号的节点上,或避开特定型号。

  1. 查看节点GPU卡型。

    执行以下命令,在集群中查询节点的GPU卡型。

    节点GPU卡型名称:NVIDIA_NAME字段。
    kubectl get nodes -L aliyun.accelerator/nvidia_name

    预期输出如下:

    NAME                        STATUS   ROLES    AGE   VERSION            NVIDIA_NAME
    cn-shanghai.192.XX.XX.176   Ready    <none>   17d   v1.26.3-aliyun.1   Tesla-V100-SXM2-32GB
    cn-shanghai.192.XX.XX.177   Ready    <none>   17d   v1.26.3-aliyun.1   Tesla-V100-SXM2-32GB

    展开查看更多方式查看GPU卡型。

    集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 容器组在创建的容器所在行(例如tensorflow-mnist-multigpu-***),单击操作列的终端。然后从下拉列表中选择需要登录的容器,执行如下命令。

    • 查询卡型:nvidia-smi --query-gpu=gpu_name --format=csv,noheader --id=0 | sed -e 's/ /-/g'

    • 查询每张卡显存容量:nvidia-smi --id=0 --query-gpu=memory.total --format=csv,noheader | sed -e 's/ //g'

    • 查询节点上总共拥有的GPU卡数:nvidia-smi -L | wc -l

  2. 开启卡型调度。

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 任务

    2. 任务页面,单击使用YAML创建资源。使用如下示例创建应用,并开启卡型调度功能。

      指定特定卡型

      利用GPU卡型调度标签,让业务运行在指定卡型的节点上。

      aliyun.accelerator/nvidia_name: "Tesla-V100-SXM2-32GB" 代码中Tesla-V100-SXM2-32GB替换为节点实际卡型。

      展开查看YAML文件详细信息

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: tensorflow-mnist
      spec:
        parallelism: 1
        template:
          metadata:
            labels:
              app: tensorflow-mnist
          spec:
            nodeSelector:
              aliyun.accelerator/nvidia_name: "Tesla-V100-SXM2-32GB" # 使该应用运行在Tesla V100-SXM2-32GB上
            containers:
            - name: tensorflow-mnist
              image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5
              command:
              - python
              - tensorflow-sample-code/tfjob/docker/mnist/main.py
              - --max_steps=1000
              - --data_dir=tensorflow-sample-code/data
              resources:
                limits:
                  nvidia.com/gpu: 1
              workingDir: /root
            restartPolicy: Never

      创建成功后,可在左侧导航栏中选择工作负载 > 容器组,查看示例 Pod 是否已调度到对应卡型的节点上。

      屏蔽特定卡型

      利用GPU卡型调度标签,通过节点亲和性与反亲和性,避免让业务运行在某些卡型上。

      values: - "Tesla-V100-SXM2-32GB"Tesla-V100-SXM2-32GB替换为节点实际卡型。

      展开查看YAML文件详细信息

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: tensorflow-mnist
      spec:
        parallelism: 1
        template:
          metadata:
            labels:
              app: tensorflow-mnist
          spec:
            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                  - matchExpressions:
                    - key: aliyun.accelerator/nvidia_name  # 卡型调度标签
                      operator: NotIn
                      values:
                      - "Tesla-V100-SXM2-32GB"            # 避免Pod调度到卡型为Tesla-V100-SXM2-32GB上。
            containers:
            - name: tensorflow-mnist
              image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5
              command:
              - python
              - tensorflow-sample-code/tfjob/docker/mnist/main.py
              - --max_steps=1000
              - --data_dir=tensorflow-sample-code/data
              resources:
                limits:
                  nvidia.com/gpu: 1
              workingDir: /root
            restartPolicy: Never

      创建成功后,应用不会调度到标签键为aliyun.accelerator/nvidia_name且对应值为Tesla-V100-SXM2-32GB的节点,但允许调度到其他卡型的GPU节点。

最佳实践:以节点池划分调度方式

建议为每种 GPU 调度模式创建独立的节点池,通过节点池标签统一管理调度属性,避免在同一节点池内混用多种调度模式。推荐划分方式如下:

  • 独占调度节点池:无需添加任何 GPU 调度标签,节点默认即为独占调度。适用于模型训练、HPC 等需独占整卡的任务。

  • 共享调度节点池:设置 ack.node.gpu.schedule: cgpu(或其他共享标签值)。适用于推理服务、多租户等需提升 GPU 利用率的场景。

  • 拓扑感知节点池:设置 ack.node.gpu.schedule: topology。适用于分布式训练等对 GPU 间通信延迟敏感的任务。

卡型调度标签(aliyun.accelerator/nvidia_name)可与上述任意调度模式组合使用,用于进一步限制 Pod 调度到指定 GPU 型号的节点。

变更调度模式
  • 若需变更某个节点的调度模式,必须将该节点从原节点池移除,再加入目标调度模式的节点池。

  • 若需变更整个节点池的调度模式,请通过节点池操作修改标签。修改节点池标签默认仅对新增节点生效;如需同步到存量节点,请在编辑节点池时勾选同步更新存量节点的污点(Taints)及节点标签(Labels)

    重要

    kubectl label 直接修改节点调度标签可能存在潜在风险,强烈不建议这样操作

    直接执行 kubectl label node <NODE_NAME> ack.node.gpu.schedule=<value> --overwrite 切换调度模式,可能导致节点上已运行的 GPU Pod 资源分配异常,甚至触发 Pod 驱逐或不可恢复的调度错误。请通过节点池标签统一管理调度模式,确保节点池内所有节点标签一致。