ACS支持在GPU-HPN节点上通过GPU共享调度实现将多个Pod运行在同一个GPU设备上。在GPU独占调度场景,Pod只会按整卡粒度申请资源。当某个Pod没有必要使用整卡的资源时,会造成资源浪费。通过GPU共享调度,您可以为Pod申请更加细粒度的异构资源算力。同时,GPU共享调度支持为Pod配置灵活的requests
和limits
约束,可以满足多种应用场景的资源隔离和共享需求。
功能介绍
GPU共享调度提供了更细粒度的资源描述,支持Pod按不足一卡的粒度申请资源(如0.5张卡)。
在使用GPU共享调度时,Pod并不会直接访问具体的GPU设备,而是通过GPU共享模块与设备进行交互。GPU共享模块又分为代理和资源管理两个模块,代理模块默认集成在Pod内,会拦截GPU设备相关的API,将其转发到后端资源模块;资源模块则负责将GPU指令运行在真实的GPU设备上,并根据Pod的资源描述,对GPU资源的使用进行限制。
此外,GPU共享的资源模块还会占用一定的CPU和内存资源,在功能开启后会自动预留。更多信息,请参见节点配置说明。
资源配置及QoS
GPU共享资源使用Kubernetes的requests
/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划分为三种类型,分别为“休眠”、“就绪”、“运行”,各状态的转换过程如图所示。
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就可以使用。 |
| FIFO | 允许自定义配置。 | Notebook研发场景,结合资源QoS中的request/limit配置,可以支持多人错峰使用GPU资源,当资源不足时会触发排队、抢占等QoS机制。具体信息,请参见Notebook场景利用share-pool模式错峰使用资源案例。 |
static | GPU切分场景,为Pod分配固定的GPU设备,运行期间不会发生变化。设备调度时优先将Pod集中在相同GPU,避免碎片。 |
| 不支持 | 不支持 | 小型AI应用,多个Pod共用GPU设备提升资源利用率。受request==limit约束,Pod在运行期间可以随时获得GPU资源,不会出现排队情况。 |
Notebook场景利用share-pool模式错峰使用资源案例
Notebook研发模式中,应用通常并不会长期持续占用资源,因此可以利用share-pool模式,让Pod错峰运行在不同的GPU卡上,当有资源需求时,Pod才会进入到就绪队列等待资源。
以下展示了一个Notebook场景的使用案例:
Pod A、B的资源描述为requests=0.5,limits=0.5,Pod C、D的资源描述为requests=0.5卡,limits=1卡。按照request需求,这些Pod可以同时调度到一个总量为2张卡的GPU-HPN节点。
T1时段:
资源被Pod A和Pod C占用,Pod B和Pod D在就绪队列中等待调度。
GPU共享模块会尝试为队首的Pod D分配资源,但目前仅有GPU0只有0.5张卡的空闲资源,虽然Pod D的reqeust为0.5,从容量上可以满足需求,但考虑到Pod D的limit为1,Pod A和Pod D在同一张卡上运行会出现资源争抢,GPU共享模块会让Pod D排队等待资源。
T2时段-阶段一:
Pod C任务结束,进入休眠队列。
GPU 1空闲之后将资源分配给了Pod D。
T2时段-阶段二:
Pod B得到资源,Pod B的limit为0.5,可以和Pod A同时在GPU0上使用,不存在资源竞争。
GPU共享调度使用示例
本示例演示Pod使用GPU共享调度功能。操作流程中会选择一个GPU-HPN节点开启GPU共享调度功能(share-pool),并提交Pod使用GPU共享资源,随后关闭节点的GPU共享调度功能。
步骤一:为GPU-HPN节点配置标签
查看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
为节点
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
创建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
部署示例Pod。
kubectl apply -f gpu-share-demo.yaml
步骤四:查看Pod的GPU共享资源使用情况
登录容器,查看Pod的GPU共享资源使用情况。
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和内存资源则不需要删除。
删除使用GPU共享功能的Pod。
$ kubectl delete pod gpu-share-demo
关闭节点的GPU共享调度功能。
$ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=none
再次查看节点策略配置状态。
$ 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共享调度在Node的Label标签中配置,具体如下。
配置项 | 说明 | 取值说明 | 示例 |
配置项 | 说明 | 取值说明 | 示例 |
alibabacloud.com/gpu-share-policy | GPU资源共享策略。 |
|
|
若节点上已经有独占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 |
| 仅适用于share-pool模式,表示是否开启抢占。默认值为true,表示开启抢占。 |
podMaxDurationMinutes | Int | 大于0的整数,单位为分钟。 | 仅适用于share-pool模式,Pod占用GPU超过该时间,才可能会被抢占。默认值为120,即2小时。 |
查看节点共享资源
功能开启后,节点allocatable和capacity中会增加对应的GPU共享资源名称,同时allocatable中会扣除新增的基础资源开销,各资源名说明如下。
配置项 | 说明 | 计算方式 |
配置项 | 说明 | 计算方式 |
alibabacloud.com/gpu-core.percentage | GPU共享资源算力,百分比格式。 功能开启后会增加该字段,功能关闭后会删除该字段。 | 设备数量*100,例如16卡的机器,对应值为1600。 |
alibabacloud.com/gpu-memory.percentage | GPU共享资源显存,百分比格式。 功能开启后会增加该字段,功能关闭后会删除该字段。 | 设备数量*100,例如16卡的机器,对应值为1600。 |
cpu | 开启后 | 设备数量*2,例如16卡的机器,对应预留资源为32核。 |
memory | 设备数量*10GB,例如16卡的机器,对应预留资源为160GB。 |
正确性提示
字段 | 取值 | 说明 |
字段 | 取值 | 说明 |
type | GPUSharePolicyValid | 表示当前GPU Share配置的正确性。 |
status | "True","False" |
|
reason | Valid,InvalidParameters,InvalidExistingPods,ResourceNotEnough |
|
message | - | 方便阅读的提示信息。 |
| UTC时间 |
|
当前生效的GPU共享策略
字段 | 取值 | 说明 |
字段 | 取值 | 说明 |
type | GPUSharePolicy | 表示当前GPU Share配置的正确性。 |
status | "True","False" |
|
reason | none,share-pool,static |
|
message | - | 方便阅读的提示信息。 |
| UTC时间 |
|
若功能开启或关闭后,节点资源未按上述说明发生变化,说明配置修改失败,可以在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 |
| 指定Pod的GPU共享模型,模型匹配的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在申请资源时还会受到以下约束。
requests
和limits
中必须同时填写显存和算力(alibabacloud.com/gpu-core.percentage
和alibabacloud.com/gpu-memory.percentage
)。Pod最多只支持有一个容器使用GPU共享资源(通常为主容器),其他容器(如Sidecar容器)仅允许申请CPU、内存等非GPU资源。
不支持容器内既申请GPU独占卡资源(
nvidia.com/gpu
等),又申请GPU共享资源(alibabacloud.com/gpu-core.percentage
,alibabacloud.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状态类型,包括“休眠”、“就绪”和“运行”,具体如下:
|
|
DCGM_FI_POOLING_POSITION | 仅在share-pool模式下提供,表示当前Pod正在就绪队列中等待资源,值含义为当前Pod在就绪队列中的位置,从1开始计数。 仅在POOLING_STATUS=1的时候才会出现。 |
|
Pod使用GPU共享调度时,GPU利用率数据指标有什么区别?
Pod的GPU利用率指标与之前一致,但对于使用了GPU共享调度场景的Pod,指标的标签及含义有以下区别。
ACS提供的Pod监控数据中,GPU算力利用率、显存用量等指标为基于整卡的绝对值,与GPU独占场景一致。
在Pod内通过nvidia-smi等命令看到的显存用量为绝对值,与GPU独占场景一致;但算力利用率为相对值,其分母为Pod的limit。
Pod GPU利用率指标中的编号标签等设备信息对应节点上的真实编号,并不都是从0开始编号。
对于share-pool类型的共享模式,由于Pod会在所有GPU设备内弹性使用不同的卡设备,所以指标中的设备号可能会发生变化。
集群内仅开启了一部分GPU共享调度,如何避免GPU独占Pod调度冲突
ACS集群默认调度器会自动匹配Pod和Node类型,避免调度冲突。
若您使用了自定义调度器,由于节点容量中同时存在GPU设备资源和GPU共享资源,可能会导致GPU独占Pod调度到GPU共享节点上,您可选择以下两种方案:
方案一:编写调度器插件,自动感知ACS Node的配置标签和
condition
协议,过滤类型不符合的Node。更多信息,请参见K8s调度器框架介绍。方案二:利用K8s的label或taint机制,在开启GPU共享调度的Node上增加label或taint,为GPU独占和共享Pod分别配置不同的亲和性策略。
GPU共享Pod被抢占时,有哪些提示信息可以查看
对于share-pool类型的共享模式,当触发抢占时,Pod会有Event和Condition提示。Event为非结构化的数据格式,若您需要读取结构化的数据内容,可以在对应Condition中的reason和status中获取,具体如下。
# 表示当前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被抢占时,有哪些提示信息可以查看