Introduction
Problem Statement
目前,Kubernetes通过Device Plugin和Extended Resource机制支持在集群中使用GPU等异构资源,但官方的实现限制了只能以独占的方式使用资源,即资源分配的最小粒度是一张卡。在深度学习领域模型推理等场景下,一个客观存在的事实是,上层应用往往无法跑满独占的整卡资源,这就导致了资源的闲置和浪费,考虑到GPU较高的使用成本,提升其利用率就成为了用户的刚需。
User stories
● 作为集群管理员,我想要提升集群的GPU利用率
● 作为开发者,我想让我的多个推理任务同时跑在一张GPU卡上
● 作为集群管理员,我想让多个用户基于同一张GPU卡共享开发和测试资源
Goals
相比于独占,让多个任务共享GPU资源显然能提升资源利用率,这也是当下一些第三方解决方案提供的能力,但比“共享”本身更重要的可能是“如何共享”,不同的业务场景对共享策略的需求不尽相同。比如在资源固定的集群中,均衡负载有助于保障更好的服务质量,而在成本敏感的自动扩缩容场景下,尽量将每张卡“填满”则是更优的策略。此外在混部的场景下,集群中可能需要同时部署独占GPU的应用和共享GPU的应用。本方案致力于解决这些需求,有如下目标:
- 提供多个应用共享GPU的能力
- 针对不同业务场景,提供对应的共享策略
- 支持混部需求,可以按需指定独占或共享
Non Goals
本方案不解决以下领域的问题:
- 资源隔离:共享GPU资源的应用,实际资源使用量可以超过配额,这也意味着共享同一张卡的应用之间可能存在资源竞争
- 超卖:共享GPU资源的应用,其配额总和不会超过资源总量
Design Overview
Principles
● 该方案基于Kubernetes原生的扩展机制实现
● 不侵入任何Kubernetes原生组件
● 使用云原生的方式部署
Architecture
Components
GPU Manager Pro
GPU Manager Pro负责管理GPU设备,为K8s屏蔽底层资源。其功能主要包括:
- 资源注册
- 虚拟化设备列表并上报
- 维护物理设备和虚拟设备的映射关系
- 生成容器运行所需的GPU设备参数
- 监测物理设备的健康状态,同步虚拟设备的健康状态
GPU Scheduler Pro
GPU Scheduler Pro负责完成GPU场景下的Pod调度。其功能主要包括:
- 感知并维护集群范围内所有GPU设备的剩余资源量
- 在GPU卡的维度作出预选
- 实现Spread, Random, Binpack三种优选策略
- 在GPU卡的维度作出优选
- 根据调度结果,上报卡号,完成Pod到Node的绑定
- 感知物理设备健康状态,更新GPU设备的剩余资源量
Implementation
Steps
Node Initializing
Scheduling
Allocating
Issues
Priority Strategies
本方案提供三种优选策略:
● Spread
目标:均衡集群内GPU卡上的资源占用
算法:score=available resource*10/total resource
● Random
目标:随机发放任务
算法:score=rand0,10
● Binpack
目标:优先“填满”已经占用了资源的GPU卡
算法:score=(total resource-available resource)*10/total resource
Colocation
针对混部的场景,比如离线训练任务和在线推理任务运行在一个集群,本方案从设计上天生支持了该特性,用户只需按需填写即可实现相互隔离的混合部署,比如:
- 独占两张卡的任务:tencent.com/gpu-percent: "200"
- 占用60%卡资源的任务:tencent.com/gpu-percent: "60"
High Availability
● 硬件资源GPU卡
GPU Manager Pro通过nvml库Watch底层GPU物理设备的事件,当监测到物理设备健康状态发生变化时,会通过映射关系转换为虚拟设备的健康状态(如果虚拟设备数量不足,需要补全),上报Kubelet,驱动其更新可用设备列表;同时将物理设备健康状态Patch到Node Annotation上,以使得GPU Scheduler Pro能够感知,进而影响调度。
● GPU Manager Pro
该组件部署为Daemonset,由Kubernetes保证其高可用
● GPU Scheduler Pro
该组件部署为Deployment,由Kubernetes保证其高可用
Data Consistency
● GPU Manager Pro
该组件可以参考Kubelet对Cache做文件持久化,或者直接复用Kubelet的Cache持久化文件(待验证)
● GPU Scheduler Pro
该组件的Cache是可重建的,每次启动都通过ListAndWatch API Server来创建缓存