【云驻共创】教你如何彻底摆脱Kubernetes集群资源抢占难题
一、背景介绍
企业在进行构建AI时经常遇到许多问题,例如模型不够好,不符合实际需要。模型太大,需要巨大的算力,然而算力又与时间和金钱挂钩。又或者是数据量不够,无法完成算法训练等。鹏城实验室的启智章鱼平台可以很好的为企业解决这一问题。
1.1 鹏城实验室
鹏城实验室是国家网络通信领域新兴科研机构,主要聚焦通信、网络和智能三个方向。从事战略性、前瞻性、基础性重大科学问题和关键核心技术研究。高端人才聚集,目前拥有31位院士、160多位国际会士、国家杰青等。与华为、国家超算深圳中心、中国电子、清华大学、北京大学、南方科技大学、香港中文大学等全国150余家院校和科研机构开展了深度合作。
1.2 启智章鱼平台
启智章鱼(OPENI-OCTOPUS)是一个集群管理和资源调度系统,由鹏城实验室、北京大学、中国科学技术大学进行开发和维护。
主要拥有以下特征:
- 完全开源:遵守Open-Intelligence许可
- 利用Kubernetes部署、管理和调度
- 支持在集群运行AI任务作业,支持GPU,NPU,FPGA,华为升腾芯片,寒武纪MLU等硬件
- 适用于AI的高性能网络,支持IB网络
- 提供监控分析工具,包括网络,平台和AI作业的监控分析
- 支持主流的深度学习框架
- 采用微服务结构
上图直观的展示了平台所包含的功能模块。
- 下层部分为底层硬件适配,包括GPU、NPU、FPGA等都可接入平台。
- 中间部分为启智章鱼平台核心内容,服务部分管理系统经API服务器集成Prometheus、Kubebox服务、模型Hub等功能工具,计算部分计算节点的功能包含AI作业监控、Kubebox客户端、模型客户端等功能工具。
- 上层部分主要为服务功能的实现,包括数据引擎、模型仓库、异地互联等,其中异地互联可以使得异地的集群相互连接。
二、业务场景与挑战
启智章鱼平台主要是为了完成科研领域、交通、医疗、金融等场景下算法的训练、模型的开发、推理等任务。例如,智能交通的车辆跟踪、智慧医疗的医疗影像识别、智慧金融的量化算法开发等都可以使用本平台构建。
在三个层面对应解决三个问题:
- 模型层 —— 模型孤岛
- 数据层 —— 数据孤岛
- 资源层 —— 算力孤岛
在模型层面:使用多态异构模型引擎,提供神经网络模型表示和异构模型转换集成。
在数据层面:使用多源异质数据引擎,提供多源异构数据融合和半自动数据标注。
在资源层面:使用AI分布式计算引擎,提供异构硬件统一表示和硬件任务适配调度。
业务场景及对应的挑战
- 场景:面向的业务场景非常复杂,以面向实验室内外的科研AI任务为主,包括智慧交通、医疗、金融等领域的算法训练与推理等。多个不同领域的开发和推理都需要在启智章鱼平台实现。
- 挑战:缺少一个高性能计算平台,满足复杂场景的业务诉求。
- 场景:高端异构硬件资源优势,150P+级算力集群和10PB级高速存储。实现最大化利用资源。
- 挑战:高效利用异构硬件资源,支持灵活调度策略,需解决资源抢占难题,避免关键任务资源饿死现象。实现高性能调度器。
- 场景:支持快速和灵活部署,系统运行可靠稳定,方便外部团队使用。
- 挑战:系统架构需可扩展,服务高可用
三、选择Volcano
为了有效地应对上述三大挑战,调研之后,对比多个方案:
- 自研或者开源
在对比自研和开源后,发现开源不仅减少开发量,且开源项目能力可满足基本诉求。
- 开源组件的抉择
Default scheduler
Yarn
Kube-batch
Volcano
研究发现,Default scheduler 对于批量处理任务不太友好。Yarn 基于Hadoop,但是平台已经不再使用Hadoop。Kube-batch 为 Volcano前身,所以最后选择了Volcano。
- Volcano的独特价值
完善的架构和生态,社区发展状态好。
支持自定义调度流程,灵活。
队列调度,Gang scheduling,适用不同类型的任务,模型开发,模型训练,模型推理,将其分为不同的任务队列进行调度,更好管理。
Binpack等插件,减少集群的资源使用碎片,提高资源利用率。
四、基于Volcano的二次开发
调研之后,发现Volcano对于部分场景仍不满足要求,需要对Volcano进行二次开发
4.1 二次开发 - 资源状态统计与管理
首先进行资源状态统计与管理的二次开发,这里资源指代的是用户提交任务后,生成的Job、Task等任务资源。
需求
以一个例子说明为什么需要做资源状态统计与管理的二次开发。
在集成学习中,有一个结合模块,若干个个体学习器。结合模块根据每个个体学习器的输出最后综合输出一个结果。关键之处在于结合模块,一旦结果输出完成,任务将立即全部停止,无需等待其他个体学习器运行的结果。
也就是说,整个作业当作一个Job, 结合模块就是MainTask,其他个体学习器就是普通Task。只要MainTask运行成功,输出结果了,就立即退出,无视Task运行状态。
从该场景出发,面对不同的复杂业务场景,应该找到一个资源管理灵活的策略。
由此,得出三个开发需求:
- 关注Job、Task和Replica三个层级状态
- 资源的统计与回显
- 自定义策略与状态管理
实现
在启智章鱼和Volcano与开发进行交互中,可以发现启智章鱼和Volcano都会去监听Kubernetes关于状态的信息,只要用户提交一个任务之后,Volcano会主动监听和改变任务的状态,改变之后,Kubernetes会通知启智章鱼,处理状态信息。
核心部分在于Volcano如何改变Job状态:
- 实现Job,Task,Replica的三级别状态机。不但可以满足每个层级之间内部状态转移的条件实现方式,每个层级与每个层级的状态转移也可以实现,实现三个层级的状态转移使得资源状态统计与回显更加详细,Job生命周期管理拥有更高的细粒度。
- 实现自定义Event和Policy。依赖于第一点三层层级状态机,每个层级的状态转移条件都由自己来触发,在触发中更加灵活,拥有更加灵活的Job生命周期管理用于支撑上层业务开发。
- 实现生命周期回调钩子,例如计费功能是在job的开始与结束统计计算时长实现,支撑多样化业务场景需求。
4.2 二次开发 - Privilege Action
在任务进行中,经常存在以下问题:
- 任务队列资源饿死现象,大作业一直等待,迟迟得不到运行
- 紧急作业、关键作业不能等待,需要优先调度
- 用户作业可能在线开发,不可随意终止等问题
Volcano已有能力:
- 同队列中不同优先级Job的抢占,无法区分Job所来自的租户身份
- 以Pod为单位进行驱逐
- 立即抢占
需求
在启智章鱼平台上,Volcano已有能力并不能满足项目要求。存在用户实时编辑,但是人区被立即抢占,任务并未保存等情况。因此,需求如下:
- 同队列中作业来自不同租户,不同租户拥有不同优先级和抢占权限
- 以Job为单位进行驱逐。抢占的时候以Job为单位整个抢占,而不是以Pod为单位
- 延时抢占,给予用户时间去保存和结束他的任务
实现
如图,左边是在调度器中实现的流程图、中间是Kubernetes服务,右边是启智章鱼核心服务。首先判断是否抢占,再判断资源是否满足,最后更新Job状态到Kubernetes服务中,将Job状态传递到启智章鱼Octopus中。启智章鱼Octopus可以决定是否启动定时器功能实现延时抢占。
具体实现延时抢占:
- 同队列中作业来自不同租户,不同租户拥有不同优先级和抢占权限
为任务增加是否为抢占任务属性Preempt
抢占任务只抢占属于同个队列中优先级较低的任务
- 以Job为单位进行驱逐
驱逐待选的Pod按照所属JobID排序,可减少受影响的Job数量
由调度器通知启智章鱼,在业务层对Job进行停止
- 延时抢占
为Job状态机增加Privileged和WillEvicted状态
进入Privileged和WillEvicted状态的Job不可被其他Job抢占
如果抢占或被抢占的Job状态发生变化,另一方的状态也要相应改变
五、收益
通过对Volcano的二次打开,主要有能力增强和性能优化两方面的进步。
能力增强
- 满足分布式大规模训练任务的需求
- 支持多种AI计算框架
- 插件化调度器,支持自定义开发,适应复杂业务场景
- 多队列调度,实现硬件资源的分组与组间动态资源分配
性能优化
- 硬件资源利用率大幅提高,达到90%以上
- 作业平均调度时延大幅降低,由使用Yarn调度器的平均任务等待时间60秒降到现在的10秒
- 系统稳定增强,集群节点资源利用率平衡度好,减少了节点间因资源使用差异度引起的运维工作
体现在实际项目上,截至2021年4月份,启智章鱼数据具体为:
- 管理120+个节点,总GPU卡数为1K张,GPU在超负荷情况下使用率可达90%以上
- 各节点间资源利用率平衡性较好,差异度低于20%
- 2019年上线以来,运行作业数为120k+
六、总结
基于Volcano的启智章鱼,已能满足绝大多数科研任务的需要
Volcano原生能力完美适配AI训练所需的基本功能
基于Volcano的二次开发,完善了复杂场景下多样化的调度需求
启智章鱼相比于传统高性能计算平台拥有明显的性能和功能优势
Volcano !好使!
备注:本文整理自鹏城实验室启智章鱼:教你如何彻底摆脱Kubernetes集群资源抢占难题,点击回看
查看活动详情:https://bbs.huaweicloud.com/blogs/266530
- 点赞
- 收藏
- 关注作者
评论(0)