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