作者:
王庆璨:阿里云技术专家,专注于大规模集群资源管理和调度。Kubernetes社区成员,主要参与Kube-scheduler社区开发。目前负责阿里云容器服务ACK资源调度和云原生AI相关工作。
张凯:阿里云高级技术专家,从事容器服务ACK 和云原生AI解决方案的研发和客户支持。拥有10余年大规模深度学习平台,云计算,SOA等领域经验。
往期回顾:
前言
本系列的前两篇《进击的Kubernetes调度系统 (一):Scheduling Framework》 和进击的 Kubernetes 调度系统(二):支持批任务的 Coscheduling/Gang scheduling 分别介绍了Kubernetes Scheduling Framework和如何通过扩展Scheduling Framework实现Coscheduling/Gang scheduling调度策略。当我们的批任务作业在集群里边运行起来之后,随后要关注的就是资源的利用率。特别是对于GPU卡的价格昂贵,不希望有资源的浪费。本文将介绍在批任务的调度过程中如何通过Binpack的方式,减少资源碎片,提升GPU的利用率。
为什么需要Binpack功能?
Kubernetes默认开启的资源调度策略是LeastRequestedPriority
,消耗的资源最少的节点会优先被调度,使得整体集群的资源使用在所有节点之间分配地相对均匀。但是这种调度策略往往也会在单个节点上产生较多资源碎片。
下面拿一个简单的例子来说明这种问题。如下图所示,资源在节点之间平均使用,所以每个节点使用3个GPU卡,则两个节点各剩余1GPU的资源。这是有申请2GPU的新作业,提交到调度器,则因为无法提供足够的资源,导致调度失败。
如上这种情况情况,每个节点都有1个GPU卡空闲,可是又无法被利用,导致资源GPU这种昂贵的资源被浪费。如果使用的资源调度策略是Binpack,优先将节点资源填满之后,再调度下一个节点,则上图所出现的资源碎片问题得到解决。申请2GPU的作业被正常调度到节点上,提升了集群的资源使用率。
<