在GPU-HPN节点上使用GPU共享调度

更新时间:2025-04-25 09:11:59

ACS支持在GPU-HPN节点上通过GPU共享调度实现将多个Pod运行在同一个GPU设备上。在GPU独占调度场景,Pod只会按整卡粒度申请资源。当某个Pod没有必要使用整卡的资源时,会造成资源浪费。通过GPU共享调度,您可以为Pod申请更加细粒度的异构资源算力。同时,GPU共享调度支持为Pod配置灵活的requestslimits约束,可以满足多种应用场景的资源隔离和共享需求。

功能介绍

GPU共享调度提供了更细粒度的资源描述,支持Pod按不足一卡的粒度申请资源(如0.5张卡)。

在使用GPU共享调度时,Pod并不会直接访问具体的GPU设备,而是通过GPU共享模块与设备进行交互。GPU共享模块又分为代理和资源管理两个模块,代理模块默认集成在Pod内,会拦截GPU设备相关的API,将其转发到后端资源模块;资源模块则负责将GPU指令运行在真实的GPU设备上,并根据Pod的资源描述,对GPU资源的使用进行限制。

image

此外,GPU共享的资源模块还会占用一定的CPU和内存资源,在功能开启后会自动预留。更多信息,请参见节点配置说明

资源配置及QoS

GPU共享资源使用Kubernetesrequests/limits约束来描述资源,支持以百分比的形式分别配置算力和显存。同时也支持limits大于requests的资源描述形式,因此可能会出现多个Pod同时争抢GPU资源的情况。ACS定义了GPU共享资源的QoS(服务质量),当节点中有多个Pod同时使用GPU资源时,Pod会排队并可能触发抢占。示例如下:

...
resources:
  requests:  # 控制节点上可调度的Pod数量
    alibabacloud.com/gpu-core.percentage: 10         # Pod需要使用的算力百分比。
    alibabacloud.com/gpu-memory.percentage: 10       # Pod需要使用的显存百分比。
  limits:    # 控制运行时可以使用的资源上限,具体效果请参见配置说明。
    alibabacloud.com/gpu-core.percentage: 100        # 算力用量上限
    alibabacloud.com/gpu-memory.percentage: 100      # 显存用量上限,超用会有CUDA OOM报错
...

与操作系统的进程管理机制类似,GPU共享模块会将Pod划分为三种类型,分别为“休眠”、“就绪”、“运行”,各状态的转换过程如图所示。

image
  • Pod在启动后首先会被标记为“休眠”状态。

  • Pod尝试使用GPU资源时,会被标记为“就绪”状态,GPU共享模块会按一定优先策略为Pod分配GPU资源。

  • Pod分配到GPU后,会被标记为“运行”状态。

  • 若所有资源分配后,仍有Pod处于“就绪”状态,则会触发抢占机制,以保障Pod之间的资源公平性。

  • Pod被抢占时,占用GPU资源的进程会被kill,重新回到“休眠”状态。

排队策略

处于“就绪”状态的Pod会按FIFO(First In, First Out. 即先来先服务)策略排队,GPU共享模块会为最先进入“就绪”状态的Pod分配资源,若当前资源不足,则触发抢占策略。

抢占策略

当资源无法满足“就绪”状态的Pod需求时,GPU共享模块会尝试抢占其他Pod。首先从正在运行的Pod中按一定条件做筛选,对于符合条件的Pod打分排序,依次抢占直至排队Pod的资源得到满足。

若当前正在运行的Pod均无法满足筛选条件,“就绪”状态中的Pod会持续排队等待资源,具体如下。

策略类型

说明

策略类型

说明

筛选策略

当前正在运行Pod已经连续占用了2个小时的GPU资源,可自定义配置。更多信息,请参见QoS配置

打分策略

Pod连续占用的GPU资源时长,连续占用时间更长的Pod优先被抢占。

资源共享模型

GPU共享调度基于共享模型,支持在一张GPU卡上同时运行多个Pod。目前ACS支持以下共享模型:

模型名称

使用效果

资源配置

排队策略

抢占策略

适用场景

模型名称

使用效果

资源配置

排队策略

抢占策略

适用场景

share-pool

将节点所有的GPU看作一个共享池(share pool),只要任意物理卡上有空闲资源,pod就可以使用。

requests<=limits

FIFO

允许自定义配置。

Notebook研发场景,结合资源QoS中的request/limit配置,可以支持多人错峰使用GPU资源,当资源不足时会触发排队、抢占等QoS机制。具体信息,请参见Notebook场景利用share-pool模式错峰使用资源案例

static

GPU切分场景,为Pod分配固定的GPU设备,运行期间不会发生变化。设备调度时优先将Pod集中在相同GPU,避免碎片。

requests==limits

不支持

不支持

小型AI应用,多个Pod共用GPU设备提升资源利用率。受request==limit约束,Pod在运行期间可以随时获得GPU资源,不会出现排队情况。

Notebook场景利用share-pool模式错峰使用资源案例

Notebook研发模式中,应用通常并不会长期持续占用资源,因此可以利用share-pool模式,让Pod错峰运行在不同的GPU卡上,当有资源需求时,Pod才会进入到就绪队列等待资源。

以下展示了一个Notebook场景的使用案例:

image

Pod A、B的资源描述为requests=0.5,limits=0.5,Pod C、D的资源描述为requests=0.5卡,limits=1卡。按照request需求,这些Pod可以同时调度到一个总量为2张卡的GPU-HPN节点。

T1时段:

  1. 资源被Pod APod C占用,Pod BPod D在就绪队列中等待调度。

  2. GPU共享模块会尝试为队首的Pod D分配资源,但目前仅有GPU0只有0.5张卡的空闲资源,虽然Pod Dreqeust0.5,从容量上可以满足需求,但考虑到Pod Dlimit1,Pod APod D在同一张卡上运行会出现资源争抢,GPU共享模块会让Pod D排队等待资源。

T2时段-阶段一:

  1. Pod C任务结束,进入休眠队列。

  2. GPU 1空闲之后将资源分配给了Pod D。

T2时段-阶段二:

Pod B得到资源,Pod Blimit0.5,可以和Pod A同时在GPU0上使用,不存在资源竞争。

GPU共享调度使用示例

本示例演示Pod使用GPU共享调度功能。操作流程中会选择一个GPU-HPN节点开启GPU共享调度功能(share-pool),并提交Pod使用GPU共享资源,随后关闭节点的GPU共享调度功能。

image

步骤一:GPU-HPN节点配置标签 

  1. 查看GPU-HPN节点。

    重要

    开启前需要确保节点上不存在声明GPU独占资源的Pod,否则需要先将Pod删除才能开启。若Pod仅申请了CPU和内存资源则不需要删除。

    kubectl get node -l alibabacloud.com/node-type=reserved

    预期输出:

    NAME                     STATUS   ROLES   AGE   VERSION
    cn-wulanchabu-c.cr-xxx   Ready    agent   59d   v1.28.3-aliyun
  2. 为节点cn-wulanchabu-c.cr-xxx增加标签alibabacloud.com/gpu-share-policy=share-pool,开启GPU共享调度功能。

    $ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=share-pool

步骤二:查看对应节点的开启状态

等待节点功能开启完成,查看节点开启状态。在capacity字段中可以看到GPU共享资源,且conditions中的GPUSharePolicyValid提示为True,表示开启成功。

$ kubectl get node cn-wulanchabu-c.cr-xxx -o yaml

GPU共享策略生效后,节点状态会更新为以下形式。预期输出:

# 具体以实际情况为准
apiVersion: v1
kind: Node
spec: 
  # ...
status:
  allocatable:
    # GPU共享资源描述
    alibabacloud.com/gpu-core.percentage: "1600"
    alibabacloud.com/gpu-memory.percentage: "1600"
    # 功能开启后,预留CPU和内存资源给GPU共享模块使用
    cpu: "144"
    memory: 1640Gi
    nvidia.com/gpu: "16"
    ephemeral-storage: 6Ti
  capacity:
    # GPU共享资源描述
    alibabacloud.com/gpu-core.percentage: "1600"
    alibabacloud.com/gpu-memory.percentage: "1600"
    cpu: "176"
    memory: 1800Gi
    nvidia.com/gpu: "16"
    ephemeral-storage: 6Ti
  conditions:
  # 提示GPU Share策略配置正确性
  - lastHeartbeatTime: "2025-01-07T04:13:04Z"
    lastTransitionTime: "2025-01-07T04:13:04Z"
    message: gpu share policy is valid.
    reason: Valied
    status: "True"
    type: GPUSharePolicyValid
  # 提示当前节点生效的GPU Share策略
  - lastHeartbeatTime: "2025-01-07T04:13:04Z"
    lastTransitionTime: "2025-01-07T04:13:04Z"
    message: gpu share policy is share-pool.
    reason: share-pool
    status: "True"
    type: GPUSharePolicy

关于GPU共享资源各配置项的说明,请参见节点配置说明

步骤三:使用GPU共享资源规格部署Pod

  1. 创建gpu-share-demo.yaml,配置使用与节点相同的共享模型share-pool

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        alibabacloud.com/compute-class: "gpu-hpn"
        # 指定Pod的GPU共享模型为share-pool,与节点配置一致
        alibabacloud.com/gpu-share-policy: "share-pool" # static
      name: gpu-share-demo
      namespace: default
    spec:
      containers:
      - name: demo
        image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
        args:
          - '1000h'
        command:
          - sleep
        # 资源描述中填写GPU共享资源gpu-core.percentage和gpu-memory.percentage
        # request和limit效果详见配置说明
        resources:
          limits:
            cpu: '5'
            memory: 50Gi
            alibabacloud.com/gpu-core.percentage: 100
            alibabacloud.com/gpu-memory.percentage: 100
          requests:
            cpu: '5'
            memory: 50Gi
            alibabacloud.com/gpu-core.percentage: 10
            alibabacloud.com/gpu-memory.percentage: 10
  2. 部署示例Pod。

    kubectl apply -f gpu-share-demo.yaml

步骤四:查看PodGPU共享资源使用情况

登录容器,查看PodGPU共享资源使用情况。

kubectl exec -it pod gpu-share-demo -- /bin/bash

您可使用nvidia-smi等命令,查看容器GPU资源分配和使用情况,具体情况以实际输出为准。

说明

对于share-pool类型的Pod,当Pod未使用GPU资源时,BusID字段会展示为Pending。

(可选)步骤五:关闭节点GPU共享调度策略

重要

关闭前若节点上存在声明GPU共享资源的Pod,需要先将Pod删除。若Pod仅申请了CPU和内存资源则不需要删除。

  1. 删除使用GPU共享功能的Pod。

    $ kubectl delete pod gpu-share-demo
  2. 关闭节点的GPU共享调度功能。

    $ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=none
  3. 再次查看节点策略配置状态。

    $ kubectl get node cn-wulanchabu-c.cr-xxx -o yaml

    预期输出:

    apiVersion: v1
    kind: Node
    spec: 
      # ...
    status:
      allocatable:
        # 功能关闭后,预留CPU和内存资源恢复原值
        cpu: "176"
        memory: 1800Gi
        nvidia.com/gpu: "16"
        ephemeral-storage: 6Ti
      capacity:
        cpu: "176"
        memory: 1800Gi
        nvidia.com/gpu: "16"
        ephemeral-storage: 6Ti
      conditions:
      # 提示GPU Share策略配置正确性
      - lastHeartbeatTime: "2025-01-07T04:13:04Z"
        lastTransitionTime: "2025-01-07T04:13:04Z"
        message: gpu share policy config is valid.
        reason: Valid
        status: "True"
        type: GPUSharePolicyValid
      # 提示当前节点生效的GPU Share策略
      - lastHeartbeatTime: "2025-01-07T04:13:04Z"
        lastTransitionTime: "2025-01-07T04:13:04Z"
        message: gpu share policy is none.
        reason: none
        status: "False"
        type: GPUSharePolicy

详细配置说明

节点配置说明

开启配置

开启GPU共享调度在NodeLabel标签中配置,具体如下。

配置项

说明

取值说明

示例

配置项

说明

取值说明

示例

alibabacloud.com/gpu-share-policy

GPU资源共享策略。

  • none:关闭节点GPU共享调度功能。

  • share-pool:节点所有的GPU看作一个共享池(share pool),Pod并不固定在某个GPU设备上运行,只要任意物理卡上有空闲资源,Pod就可以使用。

  • static:GPU切分场景,Pod运行在固定的GPU设备上。

apiVersion: v1
kind: Node
metadata:
  labels:
    # 功能开启,使用share-pool策略,取值中可指定其他策略
    alibabacloud.com/gpu-share-policy: share-pool
重要
  • 若节点上已经有独占GPU类型的Pod,请先将相关Pod删除再开启共享策略。

  • 若节点上已经有GPU共享资源类型的Pod,不能修改或关闭GPU共享策略,需要先将相关Pod删除才能继续操作。

  • 若节点上的Pod仅申请了CPU和内存资源则不需要删除。

QoS配置

GPU-HPN节点支持在节点注解中配置GPU共享调度的QoS参数,格式如下。

apiVersion: v1
kind: Node
...
metadata:
  annotations:
    alibabacloud.com/gpu-share-qos-config: '{"preemptEnabled": true, "podMaxDurationMinutes": 120}'
...

具体说明如下:

参数

类型

取值

说明

参数

类型

取值

说明

preemptEnabled

Boolean

  • true

  • false

仅适用于share-pool模式,表示是否开启抢占。默认值为true,表示开启抢占。

podMaxDurationMinutes

Int

大于0的整数,单位为分钟。

仅适用于share-pool模式,Pod占用GPU超过该时间,才可能会被抢占。默认值为120,即2小时。

查看节点共享资源

功能开启后,节点allocatablecapacity中会增加对应的GPU共享资源名称,同时allocatable中会扣除新增的基础资源开销,各资源名说明如下。

配置项

说明

计算方式

配置项

说明

计算方式

alibabacloud.com/gpu-core.percentage

GPU共享资源算力,百分比格式。

功能开启后会增加该字段,功能关闭后会删除该字段。

设备数量*100,例如16卡的机器,对应值为1600。

alibabacloud.com/gpu-memory.percentage

GPU共享资源显存,百分比格式。

功能开启后会增加该字段,功能关闭后会删除该字段。

设备数量*100,例如16卡的机器,对应值为1600。

cpu

开启后.status.allocatable中会扣除基础开销,供GPU共享模块使用。功能关闭后自动取消预留。

设备数量*2,例如16卡的机器,对应预留资源为32核。

memory

设备数量*10GB,例如16卡的机器,对应预留资源为160GB。

正确性提示

字段

取值

说明

字段

取值

说明

type

GPUSharePolicyValid

表示当前GPU Share配置的正确性。

status

"True","False"

  • True:表示当前GPU Share的配置正确。

  • False:表示当前GPU Share的配置错误,具体错误原因可以在condition.reason中查看。

reason

Valid,InvalidParameters,InvalidExistingPods,ResourceNotEnough

  • Valid:当前共享策略配置正确。

  • InvalidParameters:当前共享策略配置拼写不合法。

  • InvalidExistingPods:当前节点上有其他类型的GPU Pod,无法开启或关闭功能。

  • ResourceNotEnough:当前节点资源不足,无法满足GPU共享功能的基础开销,需要删除一部分Pod后才能开启。关于预留资源量,请参见节点配置说明

message

-

方便阅读的提示信息。

  • lastTransitionTime

  • lastHeartbeatTime

UTC时间

condition上次更新的时间。

当前生效的GPU共享策略

字段

取值

说明

字段

取值

说明

type

GPUSharePolicy

表示当前GPU Share配置的正确性。

status

"True","False"

  • True:当前节点已经开启了GPU共享功能。

  • False:当前节点未开启GPU共享功能。

reason

none,share-pool,static

  • none:当前节点未开启GPU共享功能。

  • share-pool:当前节点已经生效了share-pool类型的共享策略。

  • static:当前节点已经生效了static类型的共享策略。

message

-

方便阅读的提示信息。

  • lastTransitionTime

  • lastHeartbeatTime

UTC时间

condition上次更新的时间。

重要

若功能开启或关闭后,节点资源未按上述说明发生变化,说明配置修改失败,可以在conditions中查看配置正确性提示信息。

Pod配置说明

功能开启后,在Pod中配置GPU共享资源标签即可使用该功能。

apiVersion: v1
kind: Pod
metadata:
  labels:
    # 仅支持gpu-hpn计算类
    alibabacloud.com/compute-class: "gpu-hpn"
    # 指定Pod的GPU共享模型为share-pool,与节点配置一致
    alibabacloud.com/gpu-share-policy: "share-pool"
  name: gpu-share-demo
  namespace: default
spec:
  containers:
  - name: demo
    image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
    args:
      - '1000h'
    command:
      - sleep
    resources:
      limits:
        cpu: '5'
        memory: 50Gi
        alibabacloud.com/gpu-core.percentage: 100
        alibabacloud.com/gpu-memory.percentage: 100
      requests:
        cpu: '5'
        memory: 50Gi
        alibabacloud.com/gpu-core.percentage: 10
        alibabacloud.com/gpu-memory.percentage: 10

配置项说明如下:

计算类

配置项

取值

说明

配置项

取值

说明

metadata.labels.alibabacloud.com/compute-class

gpu-hpn

仅支持gpu-hpn计算类。

GPU共享策略

配置项

类型

取值

说明

配置项

类型

取值

说明

metadata.labels.alibabacloud.com/gpu-share-policy

String

  • none

  • share-pool

  • static

指定PodGPU共享模型,模型匹配的Node才会参与调度。

资源需求

在容器资源request中配置GPU共享资源,描述算力和显存需求和限制,可以控制节点上可调度的Pod数量。同时,节点上的Pod数量还会受其他资源维度的限制,例如CPU、内存、Pod数量等。

需求类别

配置项

类型

取值

说明

需求类别

配置项

类型

取值

说明

requests

alibabacloud.com/gpu-core.percentage

Int

[10, 100]

算力百分比,表示申请的单卡算力比例需求,最少为10%的算力。

alibabacloud.com/gpu-memory.percentage

显存百分比,表示申请的单卡显存比例需求,最少为10%的显存。

limits

alibabacloud.com/gpu-core.percentage

算力百分比,表示申请的单卡算力比例限制,最少为10%的算力。

alibabacloud.com/gpu-memory.percentage

显存百分比,表示申请的单卡显存比例限制,最少为10%的显存。

配置约束

除了以上当个配置项的约束,Pod在申请资源时还会受到以下约束。

  • requestslimits中必须同时填写显存和算力(alibabacloud.com/gpu-core.percentagealibabacloud.com/gpu-memory.percentage)。

  • Pod最多只支持有一个容器使用GPU共享资源(通常为主容器),其他容器(如Sidecar容器)仅允许申请CPU、内存等非GPU资源。

  • 不支持容器内既申请GPU独占卡资源(nvidia.com/gpu等),又申请GPU共享资源(alibabacloud.com/gpu-core.percentagealibabacloud.com/gpu-memory.percentage)。

FAQ

若节点无空闲GPU资源,就绪队列中的Pod会如何表现?

GPU共享Pod等待资源时,会定时打印提示信息,样例如下。

You have been waiting for ${1} seconds。 Approximate position: ${2}

其中${1}参数表示已经等待的时间,${2}参数表示当前在“就绪队列”中的顺位。

GPU共享模式特有的Pod监控指标有哪些?

对于使用了GPU共享资源的Pod,可以通过以下指标查看Pod使用GPU共享资源的情况。

指标

描述

样例

指标

描述

样例

DCGM_FI_POOLING_STATUS

仅在share-pool模式下提供,表示GPU共享模式下的Pod状态类型,包括“休眠”、“就绪”和“运行”,具体如下:

  • 0 “休眠”,表示没有GPU资源需求。

  • 1 “就绪”,表示等待GPU资源 。

  • 2 “正常运行”,表示正在使用GPU资源,且资源连续占用时间未超过podMaxDurationMinutes。

  • 3 “可被抢占”,表示正在使用GPU资源,且资源连续占用时间已超过podMaxDurationMinutes,但目前因为还没有Pod排队,可以继续占用资源。

DCGM_FI_POOLING_STATUS{NodeName="cn-wulanchabu-c.cr-xxx",pod="gpu-share-demo",namespace="default"} 1

DCGM_FI_POOLING_POSITION

仅在share-pool模式下提供,表示当前Pod正在就绪队列中等待资源,值含义为当前Pod在就绪队列中的位置,从1开始计数。

仅在POOLING_STATUS=1的时候才会出现。

DCGM_FI_POOLING_POSITION{NodeName="cn-wulanchabu-c.cr-xxx",pod="gpu-share-demo",namespace="default"} 1

Pod使用GPU共享调度时,GPU利用率数据指标有什么区别?

PodGPU利用率指标与之前一致,但对于使用了GPU共享调度场景的Pod,指标的标签及含义有以下区别。

  • ACS提供的Pod监控数据中,GPU算力利用率、显存用量等指标为基于整卡的绝对值,与GPU独占场景一致。

  • Pod内通过nvidia-smi等命令看到的显存用量为绝对值,与GPU独占场景一致;但算力利用率为相对值,其分母为Podlimit。

  • Pod GPU利用率指标中的编号标签等设备信息对应节点上的真实编号,并不都是从0开始编号。

  • 对于share-pool类型的共享模式,由于Pod会在所有GPU设备内弹性使用不同的卡设备,所以指标中的设备号可能会发生变化。

集群内仅开启了一部分GPU共享调度,如何避免GPU独占Pod调度冲突

ACS集群默认调度器会自动匹配PodNode类型,避免调度冲突。

若您使用了自定义调度器,由于节点容量中同时存在GPU设备资源和GPU共享资源,可能会导致GPU独占Pod调度到GPU共享节点上,您可选择以下两种方案:

  • 方案一:编写调度器插件,自动感知ACS Node的配置标签和condition协议,过滤类型不符合的Node。更多信息,请参见K8s调度器框架介绍

  • 方案二:利用K8slabeltaint机制,在开启GPU共享调度的Node上增加labeltaint,为GPU独占和共享Pod分别配置不同的亲和性策略。

GPU共享Pod被抢占时,有哪些提示信息可以查看

对于share-pool类型的共享模式,当触发抢占时,Pod会有EventCondition提示。Event为非结构化的数据格式,若您需要读取结构化的数据内容,可以在对应Condition中的reasonstatus中获取,具体如下。

# 表示当前Pod的GPU资源被抢占,触发抢占的Pod名称是<new-pod-name>。
Warning  GPUSharePreempted  5m15s  gpushare   GPU is preempted by <new-pod-name>.
# 表示当前Pod抢占了其他Pod的GPU资源,被抢占的Pod名称是<old-pod-name>。
Warning  GPUSharePreempt    3m47s  gpushare   GPU is preempted from <old-pod-name>.
- type: Interruption.GPUShareReclaim # 表示GPU共享Pod抢占的事件类型
  status: "True" # True表示发生了抢占或者被抢占的行为
  reason: GPUSharePreempt # GPUSharePreempt表示抢占了其他Pod,GPUSharePreempted表示被其他pod抢占
  message: GPU is preempted from <old-pod-name>. # 与event类似的提示信息
  lastTransitionTime: "2025-04-22T08:12:09Z" # 发生抢占行为的时间
  lastProbeTime: "2025-04-22T08:12:09Z"
  • 本页导读 (0)
  • 功能介绍
  • 资源配置及QoS
  • 资源共享模型
  • GPU共享调度使用示例
  • 步骤一:为GPU-HPN节点配置标签 
  • 步骤二:查看对应节点的开启状态
  • 步骤三:使用GPU共享资源规格部署Pod
  • 步骤四:查看Pod的GPU共享资源使用情况
  • (可选)步骤五:关闭节点GPU共享调度策略
  • 详细配置说明
  • 节点配置说明
  • Pod配置说明
  • FAQ
  • 若节点无空闲GPU资源,就绪队列中的Pod会如何表现?
  • GPU共享模式特有的Pod监控指标有哪些?
  • Pod使用GPU共享调度时,GPU利用率数据指标有什么区别?
  • 集群内仅开启了一部分GPU共享调度,如何避免GPU独占Pod调度冲突
  • GPU共享Pod被抢占时,有哪些提示信息可以查看
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等