【AI算力平台】算力高效调度策略——GPU调度
概述
作为AI算力平台,如何高效调度GPU资源,使其利用率最大化,是必须回答的一个问题。
本文以CCE集群+Volcano调度器为例,介绍常见的GPU调度策略及其使用场景
一、GPU整卡调度
GPU整卡:表示GPU整卡调度,即该容器将独立使用GPU卡,系统不会将该卡划分给其他容器使用。
nvidia.com/gpu设置为整数:表示GPU整卡调度
即该容器将独占使用一张物理GPU卡,系统不会将该卡划分给其他容器使用,适用于对资源性能和隔离要求高的场景。
二、GPU虚拟化
CCE GPU虚拟化采用自研xGPU虚拟化技术,能够动态对GPU设备显存与算力进行划分。
单个GPU卡最多虚拟化成20个GPU虚拟设备。
2.1 GPU虚拟化优势
灵活性:算力分配粒度为5%GPU,显存分配粒度达MiB级别。
隔离性:支持显存和算力的严格隔离,支持单显存隔离,算力与显存同时隔离两类场景
2.2 限制条件
单个GPU卡最多虚拟化成20个GPU虚拟设备。
init容器不支持使用GPU虚拟化资源。
单个GPU卡仅支持调度同一种隔离模式的工作负载。
容器内应用程序初始化时,通过nvidia-smi监测工具监测到的实时算力可能超过容器可用的算力上限。
GPU虚拟化的算显隔离功能在渲染场景无法使用,渲染场景请使用整卡模式或显存隔离模式。
节点上开启了GPU虚拟化且有多张GPU卡时,如果GPU资源不足,不支持抢占其他Pod的GPU资源。
2.3 资源准备
2.3.1 开启GPU虚拟化
“配置中心 > 异构资源配置”,开启“GPU虚拟化”,支持配置集群级别和节点池级别的GPU虚拟化
1)集群级别GPU虚拟化
开启“GPU配置 > GPU虚拟化”,开启后,全局默认开启GPU虚拟化,支持单GPU卡的算力与显存切分。
2)节点池级别GPU虚拟化
“GPU配置 > 节点池配置”
3)检查GPU虚拟化是否配置成功
找到配置GPU虚拟化的节点,查看YAML
如果YAML中“node-status.volcano.sh/nvidia”字段的值为“{"enableXGPU":true}”,则说明该节点GPU虚拟化配置成功。
2.3.2 创建GPU节点
在集群中创建支持GPU虚拟化的节点以使用GPU虚拟化功能,确保节点或节点池中有符合GPU虚拟化条件的GPU节点
2.3.3 修复Volcano调度策略
Volcano针对GPU节点的调度策略默认为Spread,即如果节点配置相同,会选择一个正在运行的容器数量最少的节点,可以尽量将容器平均分配到各个节点。
而Binpack调度策略与之相反,它会尽可能地把所有的容器调度到一台节点上运行,尽量少用节点,避免资源碎片化。
在使用GPU虚拟化特性时需要使用Binpack调度策略
2.4 创建GPU虚拟化应用
当显存设置为单张GPU卡的容量上限或算力设置为100%时,将会使用整张GPU卡。
使用GPU虚拟化时,工作负载调度器将默认指定为Volcano且不可更改。
在使用GPU虚拟化特性时需要使用Binpack调度策略
1)创建工作负载
2)配置工作负载信息
在“容器配置>基本信息”中设置GPU配额:
显存:显存值单位为MiB,需为正整数,且为128的倍数。若配置的显存超过单张GPU卡的显存,将会出现无法调度状况。
算力:算力值单位为%,需为5的倍数,且最大不超过100。
3)工作负载创建成功后,验证GPU虚拟化的隔离能力
2.5 GPU虚拟化关键参数
参数 | 是否必选 | 描述 |
volcano.sh/gpu-mem.128Mi | 否 | 该数值表示128Mi的倍数,需为正整数,显存值单位为MiB。若配置的显存超过单张GPU卡的显存,将会出现无法调度状况。 |
volcano.sh/gpu-core.percentage | 否 | 算力值单位为%,需为5的倍数,且最大不超过100。 |
三、GPU共享模式
共享模式:表示GPU共享调度,即多个容器可共享同一张物理GPU卡的计算资源和显存。
工作负载支持Kubernetes默认GPU调度,即设置nvidia.com/gpu参数
3.1 使用场景
1)nvidia.com/gpu设置为小数:表示GPU共享调度
即多个容器可共享同一张物理GPU卡的计算资源和显存,适用于轻量级推理等对算力需求较低的场景。
例如,在16GiB的GPU上,nvidia.com/gpu设置为0.5,则容器将被分配0.5×16GiB=8GiB=8192MiB(128MiB的64倍)
2)nvidia.com/gpu设置为整数:表示GPU整卡调度
即该容器将独占使用一张物理GPU卡,系统不会将该卡划分给其他容器使用,适用于对资源性能和隔离要求高的场景。
3.2 限制条件
使用不同GPU资源名称的Pod之间不支持装箱调度。
使用nvidia.com/gpu和volcano.sh/gpu-mem.128Mi声明资源的Pod,由于资源标识不一致,调度器无法将其视为同类资源,因此二者之间不支持装箱调度原则。
3.3 兼容GPU共享调度模式
1)创建一个使用nvidia.com/gpu资源的工作负载
nvidia.com/gpu: 0.1 # 表示GPU申请值
四、GPU多卡均分调度
4.1 使用场景
单张GPU常因算力或显存不足无法满足需求,因此需要多张GPU卡协同工作。
GPU虚拟化的多卡均分调度功能允许任务跨多张GPU卡分配显存和计算力,实现更高效的资源利用。
通过多卡均分调度,一个Pod可以灵活使用多张GPU,且每张GPU提供等量资源,实现GPU资源的精细化分配与高效利用。
4.2 限制条件
4.3 多卡均分调度使用示例
在“容器配置 > 基本信息 >GPU配额”中选择GPU虚拟化。在下方开启“多卡均分调度”
“多卡均分调度”与“卡数”为容器共用配置,修改后将对负载的所有容器生效。
4.4 GPU多卡均分关键参数
参数 | 是否必选 | 描述 |
volcano.sh/gpu-num: '2' | 是 | 指定多卡均分调度的GPU卡数量,此例中Pod申请2卡,每卡占据4GB显存 |
volcano.sh/gpu-mem.128Mi | 是 | 该数值表示128Mi的倍数,需为正整数,显存值单位为MiB。若配置的显存超过单张GPU卡的显存,将会出现无法调度状况。 |
volcano.sh/gpu-core.percentage | 否 | 算力值单位为%,需为5的倍数,且最大不超过100。 |
小结
我们以CCE集群+Volcano调度器为例,介绍GPU整卡调度、GPU虚拟化、GPU共享模式、GPU多卡均分调度等多种GPU调度策略,适合不同的场景使用,有利于提高算力使用率。