全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:GPU节点卡型及调度标签说明

更新时间:Jul 10, 2025

在Kubernetes集群中部署GPU计算任务时,通过为GPU节点分配显卡型号标签及调度属性标签,可实现资源利用率优化与应用精准调度。其中,调度属性标签可进一步启用共享GPU调度、拓扑感知调度等高级功能。本文将详细介绍卡型及调度标签含义及配置。

标签说明

GPU节点调度属性标签说明

安装云原生AI套件的调度组件ack-ai-installer后,您可以为GPU节点打上调度属性标签,帮助GPU节点启用共享GPU调度、GPU拓扑感知调度等功能。

ack.node.gpu.schedule标签

调度功能

标签值

是否可以切换到其他标签值

说明

独占GPU调度

default

可切换至:

  • cgpu

  • core_mem

  • share

  • topology

  • 节点开启独占GPU调度能力,表示该节点以单个GPU卡为最小划分单元,为Pod分配GPU资源。

  • 若您节点中未添加ack.node.gpu.schedule标签,则默认开启独占GPU调度。

  • 如果某个节点已经添加标签ack.node.gpu.schedule(如开启共享GPU调度能力),且需要该节点恢复独占GPU调度能力,只能通过修改节点标签为ack.node.gpu.schedule:default实现。仅删除节点标签ack.node.gpu.schedule无法恢复节点独占GPU调度能力。

共享GPU调度

cgpu

可切换至:

  • default

  • topology

  • 节点开启共享GPU调度能力。

  • 节点上安装GPU隔离模块cGPU

  • cGPU默认使用Policy为5。

  • Pod仅申请GPU显存资源,多个Pod在一张卡上实现显存隔离和算力共享。

core_mem

可切换至:

  • default

  • topology

  • 节点开启共享GPU调度能力。

  • 节点上安装GPU隔离模块cGPU

  • cGPU默认使用Policy为3。

  • Pod需要同时申请GPU显存和算力资源,多个Pod在一张卡上的显存和算力都受到限制。

share

可切换至:

  • default

  • topology

  • cgpu

  • core_mem

  • 节点开启共享GPU调度能力。

  • 节点不安装cGPU隔离模块。

  • Pod仅申请GPU显存资源,一张卡上多个Pod实行算力共享策略。

GPU拓扑感知调度

topology

可切换至:

  • default

  • cgpu

  • core_mem

  • share

  • 节点开启GPU拓扑感知调度能力。

  • 节点仍以单个GPU卡为最小划分单元,为Pod分配GPU资源。每个Pod分配到的GPU卡的数量考虑了GPU卡之间的通信带宽。

动态划分MIG

mig

不可切换。

  • 节点开启MIG能力。

  • 节点按最大支持MIG实例数上报MIG资源,每个Pod的Container最多仅能够申请1个MIG资源。

  • 开启节点MIG能力涉及修改节点硬件属性,只能通过移除MIG节点池,再加入其他节点池方式完成。不能使用kubectl label切换节点标签值到其他GPU调度策略。

ack.node.gpu.placement标签

调度功能

标签值

是否可以切换到其他标签值

说明

共享GPU调度

spread

可切换至:binpack

  • 该标签仅在节点开启共享GPU调度能力的情况才有效。

  • 当节点上存在多张GPU卡时,该策略能够允许申请GPU资源的Pod打散在各GPU上。

binpack

可切换至:spread

  • 该标签仅在节点开启共享GPU调度能力的情况才有效。

  • 当节点上存在多张GPU卡时,该策略能够允许申请GPU资源的Pod先占满一张GPU卡,再占用另一张GPU卡,避免资源出现碎片。

  • 在开启共享GPU调度情况下,GPU节点上如果没有ack.node.gpu.placement标签,那么调度器将使用binpack策略为Pod寻找节点上的GPU卡资源。

GPU节点卡型属性标签说明

在集群中扩容GPU节点或者添加GPU节点时,添加节点脚本会自动为该GPU节点打上以下的三个标签。

标签名称

描述

aliyun.accelerator/nvidia_name

GPU节点的GPU显卡名称。

aliyun.accelerator/nvidia_mem

GPU节点的每张卡的显存容量。

aliyun.accelerator/nvidia_count

GPU节点总共拥有的GPU卡数。

在集群中使用如下命令可以查询节点的GPU卡型。

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
cn-shanghai.192.XX.XX.130   Ready    <none>   18d   v1.26.3-aliyun.1   Tesla-V100-SXM2-32GB
cn-shanghai.192.XX.XX.131   Ready    <none>   17d   v1.26.3-aliyun.1   Tesla-V100-SXM2-32GB
cn-shanghai.192.XX.XX.132   Ready    <none>   17d   v1.26.3-aliyun.1   Tesla-V100-SXM2-32GB

您也可以使用节点上的nvidia-smi工具查询标签值:

查询类型

查询命令

查询卡型

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

标签使用注意事项

使用kubectl label nodes或通过控制台节点标签管理功能切换标签值存在的问题

当一个GPU节点从一种GPU资源调度能力A切换到另一种GPU资源调度能力B时,直接使用kubectl label nodes命令切换节点GPU调度属性标签值,或在容器服务管理控制台节点页面使用标签管理功能切换节点标签,可能引发以下问题。

  • 该GPU节点上可能还存在使用GPU资源的应用,这些应用是以A方式申请的GPU资源。节点的能力由A切换到B以后,调度器维护该节点GPU资源的账本也会发生变化,导致节点上已经申请GPU资源的应用被遗漏。此时,调度器对该节点上的GPU资源账本与节点上实际分配的GPU资源情况不一致,导致GPU应用之间相互影响。

  • 某些能力是需要在节点上设置一些配置,当使用kubectl label nodes或通过控制台节点标签管理功能切换节点标签值时,系统并不会重置节点上先前的配置,可能造成GPU节点启用的新的GPU资源调度能力失败。

建议您使用节点池划分GPU资源调度能力来解决以上问题。

基于节点池划分GPU资源调度能力

假设现在您的一个集群需要同时使用GPU资源调度能力中的“共享GPU调度(仅显存隔离)”和“共享GPU调度(显存隔离和算力限制)”。那么可以在这个集群中创建两个节点池:

  • 节点池A:用于管理仅支持显存隔离的节点。

  • 节点池B:用于管理支持显存隔离和算力限制的节点。

2.png

同时如果一个GPU节点需要从一种GPU资源调度能力(例如图中节点池A)切换到另一种GPU资源调度能力(例如图中节点池B),需要将该节点从节点池A中移除,然后再将该节点添加到节点池B中。详细操作,请参见移除节点添加已有节点

手动切换节点GPU资源调度能力

除了通过节点池划分GPU资源调度能力外,您还可以选择手动切换。手动切换的步骤相对复杂,下面将详细说明节点状态的流转及相关操作:

  1. 节点下线:先将节点置为不可调度,不让节点接收新的Pod。

  2. 排空节点:排空节点上的已有运行Pod。

  3. 登录节点进行重置操作:登录到节点,进行重置操作。重置操作因不同的标签值而有所不同。详细信息,请参见标签配置重置

  4. 切换节点标签:进行重置操作以后,可以使用kubectl label给节点打上对应标签。

  5. 节点上线:标签打完后,上线节点。

3.png

标签配置重置

分类

标签

切换到其他标签之前需要的节点重置操作

共享GPU调度

ack.node.gpu.schedule=cgpu

bash /usr/local/cgpu-installer/uninstall.sh

ack.node.gpu.schedule=core_mem

卡型调度示例

使业务运行在指定卡型上

利用上述GPU属性标签,可以让您的业务运行在指定卡型的节点上,以下为举例说明。

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

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

  3. 任务页面右上角,单击使用YAML创建资源。使用如下示例创建应用。

    展开查看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节点标签的灵活调度。

避免业务运行在某些卡型上

您可以利用节点亲和性与反亲和性避免让业务运行在某些卡型上,以下为举例说明。

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

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

  3. 任务页面右上角,单击使用YAML创建资源。使用如下示例创建应用。

    展开查看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  # 避免Pod调度到卡型为NVIDIA T4上。
                    operator: NotIn
                    values:
                    - "T4"
          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且对应值为T4的节点,但允许调度到拥有该标签键值为其他的GPU节点。