欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字“加群”,加入华为云线上技术讨论群;输入关键字“最新活动”,获取华为云最新特惠促销。华为云诸多技术大咖、特惠活动等你来撩!

作者:TommyLike

序:

在今年6月上海的KubeCon2019上,作为开源领域的积极贡献者和推进者,华为云开源了面向高性能计算的云原生批量计算平台——Volcano,寄寓助力企业算力像火山一样爆发。该项目是基于华为云容器平台大规模高性能计算应用管理的最佳实践,在原生K8s的基础上,补齐了作业(Job)调度和设备管理等多方面的短板。

目前,Volcano在华为云上对接了包括一站式AI开发平台ModelArts、云容器实例CCI、云容器引擎CCE在内的多款服务,是整个高性能计算领域不可或缺的基座。在今年5月斯坦福大学发布最新的DAWNBench榜单中,华为云ModelArts就以2分43秒的成绩获得图像识别训练世界第一,其背后就离不开Volcano的助力。

同时,得益于Volcano的高性能任务处理机制,华为云基因容器服务将基因测序的效率提升了30%,成为基因测序行业的一匹黑马,受到国内多家头部基因测序企业的青睐。自开源以来,华为云Volcano项目已经吸引了来自腾讯、百度、快手以及AWS等多个公司的贡献者。

背景:

随着容器化以及容器编排技术的普及,越来越多的上层业务正开始拥抱K8s生态,但无法否认的是,针对人工智能和大数据作业场景,原生K8s的支持度并不高,终端用户如果想要将现有的业务迁移到K8s平台,很有可能会面临以下问题:

成组调度(Gang Scheduling): 一个BigData/AI的作业通常会包含多个任务,而业务逻辑一般要求Pod要么同时启动要么都不启动。比如一个Tensorflow的作业如果仅单独拉起一种角色的任务(Ps or Worker)是没法正常执行的。

资源公平调度(Fair-share): 部署的K8s集群会存在多个Namespace,而每个Namespace也可能提交多个作业,怎样调度资源才能避免某个Namespace的资源被无限制压缩,又怎样才能确保作业之间的资源调度公平?

GPU Topology感知(GPU Topology Awareness): 一个常见的AI训练/推理作业,为了达到更高的性能,往往需要使用多个GPU共同完成,此时 GPU的Topology结构以及设备之间的传输性能会对计算的性能造成很大影响。目前, K8s提供的扩展资源调度机制还无法满足调度时Topology感知的问题。

集群自动配置(Cluster Configuration): 许多上层工具,在业务启动之前,需要用户配置工具的集群状态,方便系统内部节点互通和识别,以MPI(Message Passing Interface)作业为例,需要用户以命令行参数“—host”配置集群的所有节点信息,并且还依赖节点之间SSH互通,所以,用户还要考虑怎样自动配置和管理业务集群。

此外,怎么监控整个作业集群的状态?单个Pod失败怎么处理?怎么解决任务依赖的问题?这些都是需要处理的问题。

正基于此,华为云Volcano在解决此类问题的基础上,致力于提供一个针对BigData/AI场景的通用、稳定、可扩展、高性能的原生批量计算平台,方便以Kubeflow[1], KubeGene[2], Spark[3] 为代表的上层业务组件集成和使用。

概述:

图2: Volcano业务全景

如图2所示,华为云Volcano在K8s之上抽象了一个批量计算的通用基础层,向下弥补K8s调度能力的不足,向上提供灵活通用的Job抽象。目前,项目最重要的2个组件分别是Volcano-Scheduler和Volcano-Controller。

图3: Kube-Batch介绍

Volcano-Scheduler: 这个组件最开始来自社区的Scheduling SIG子项目项目Kube-Batch[4], 它是一个可扩展的增强调度器,主要支持的能力主要有:

Actions:

① Allocate: 正常的资源分配动作。

② Preempt: 抢占,当系统中存在高优先级作业,且系统资源无法满足请求时,会触发资源抢占操作。

③ Reclaim: 资源回收, Kube-Batch会使用队列(queue)将资源按照比例分配,当系统中新增或移除队列时,Reclaim会负责回收和重新分配资源到剩余队列中去。

Plugins:

① DRF: 即Dominant Resource Fairness, 目的是为了确保在多种类型资源共存的环境下,尽可能满足分配的公平原则,其理论最早来自于UC伯克利大学的论文《Dominant Resource Fairness: Fair Allocation of Multiple Resource Types》[5]。

② Conformance: 资源一致性,确保系统关键资源不被强制回收使用。

③ Gang: 资源成组,确保作业内的成组Pod资源不被强制驱逐。

而Volcano-Scheduler在Kube-Batch的基础上,又更进一步,引入了更多领域性的动作和插件,包括BinPack,GPUShare,GPUTopoAware等。

Volcano-Controller: Volcano通过CRD的方式提供了通用灵活的Job抽象Volcano Job (batch.volcano.sh/jobs), Controller则负责跟Scheduler配合,管理Job的整个生命周期。主要功能包括:

①: 自定义的Job资源: 跟K8s内置的Job(作业)资源相比,Volcano Job有了更多增强配置,比如:任务配置,提交重试,最小调度资源数,作业优先级, 资源队列等。

②: Job生命周期管理: Volcano Controller会监控Job的创建,创建和管理对应的子资源(Pod, ConfigMap, Service),刷新作业的进度概要,提供CLI方便用户查看和管理作业资源等。

③: 任务执行策略: 单个Job下面往往会关联多个任务(Task),而且任务之间可能存在相互依赖关系,Volcano Controller支持配置任务策略,方便异常情况下的任务间关联性重试或终止。

④: 扩展插件: 在提交作业、创建Pod等多个阶段,Controller支持配置插件用来执行自定义的环境准备和清理的工作,比如常见的MPI作业,在提交前就需要配置SSH插件,用来完成Pod资源的SSH信息配置。

下面以一个MPI Job作业的YAML片段为例,带大家从整体上了解Job Controller的功能(扩展功能相关字段已添加注释,方便理解)。

图4: Volcano Job样例(/example/integrations/mpi/mpi-example.yaml)

有了上面的介绍,回过头来参照图5梳理华为云Volcano一次普通作业的执行流程,也就很容易理解了。

图5: Volcano组件与调度流程

  1. 用户通过kubectl创建Volcano Job资源。

  2. Volcano Controller监测到Job资源创建,校验资源有效性,依据JobSpec创建依赖的Pod, Service, ConfigMap等资源,执行配置的插件。

  3. Volcano Scheduler监听Pod资源的创建,依据策略,完成Pod资源的调度和绑定。

  4. Kubelet负责Pod资源的创建,业务开始执行。

  5. Volcano Controller负责Job后续的生命周期管理(状态监控,事件响应,资源清理等)。

调度效率:

除去易用性和扩展性,在BigData/AI场景下,资源调度的效率(成功率)通常能有效减少业务的运行时间,提高底层硬件设备的使用率,从而降低使用成本。我们以Volcano Scheduler和原生Scheduler在Gang Scheduling的场景下做了一个简单的TF Job 执行时间对比:

图6: Volcano与Default Scheduler调度作业执行时间对比(Gang Scheduling)

参考图6发现,单个作业的执行环境,两种执行方式在运行时间上并无明显区别,但是当集群中存在多个作业时,因为原生Scheduler无法保证调度的成组性,直接导致极端的情况出现: 作业之间出现资源竞争,互相等待,上层业务无法正常运行,直至超时,此时调度的效率大打折扣。

社区和贡献:

目前,华为云Volcano项目还在不断地发展壮大中,更多特性也在设计和开发阶段,如果您有兴趣,欢迎随时加入我们的Slack讨论[6], 提问题,给意见,贡献代码[7]。另外,9月18至20日,华为全联接大会即将于上海举行,会上将设多场云原生相关的技术论坛,华为云云原生技术大咖和布道师也会亲临现场同开发者进行面对面的交流和互动,期待与你相遇。

[1]: https://www.kubeflow.org/

[2]: https://github.com/kubegene/kubegene

[3]: http://spark.apache.org/

[4]: https://github.com/kubernetes-sigs/kube-batch

[5]: https://people.eecs.berkeley.edu/~alig/papers/drf.pdf

[6]: http://volcano-sh.slack.com

[7]: http://github.com/volcano-sh/volcano

华为云Volcano:让企业AI算力像火山一样爆发的更多相关文章

  1. 沈抚示范区·“华为云杯”2021全国AI大赛圆满落

    摘要:以赛促学,赛教结合!驱动AI产业繁荣发展 本文分享自华为云社区<云聚沈抚 · 智赢未来!沈抚示范区·"华为云杯"2021全国AI大赛圆满落幕>,作者:灰灰哒. 近 ...

  2. AI本质就是“暴力计算”?看华为云如何应对算力挑战

    随着AI人工智能技术的飞速发展,相关的AI应用场景已经拓宽至各行各业.你可能想象不到的是,现在大家手上的智能手机的运算能力,甚至比美国航空航天局1969年登月计划中最先进计算机还高出几百上千万倍乃至更 ...

  3. 顶会两篇论文连发,华为云医疗AI低调中崭露头角

    摘要:2020年国际医学图像计算和计算机辅助干预会议(MICCAI 2020),论文接收结果已经公布.华为云医疗AI团队和华中科技大学合作的2篇研究成果入选. 同时两篇研究成果被行业顶会收录,华为云医 ...

  4. 华为全栈AI技术干货深度解析,解锁企业AI开发“秘籍”

    摘要:针对企业AI开发应用中面临的痛点和难点,为大家带来从实践出发帮助企业构建成熟高效的AI开发流程解决方案. 在数字化转型浪潮席卷全球的今天,AI技术已经成为行业公认的升级重点,正在越来越多的领域为 ...

  5. 华为云WeLink:智能工作空间,联接无限想象

    [中国,上海,2019年9月19日] 在HUAWEI CONNECT 2019期间,华为办公应用装备部部长王俊先生代表华为云介绍WeLink--企业专属的智能工作空间.WeLink源于华为数字化办公实 ...

  6. 大海航行靠舵手 华为云靠什么征服K8S?

    Kubernetes 是Google开源的容器集群管理系统或者称为分布式操作系统.它构建在Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于 ...

  7. 华为云WeLink 颠覆你对智能办公的想象

    导读 华为云发现,与企业数字化关系最紧密的就是办公数字化,所以将WeLink放到华为云上可以作为一个抓手让企业更直观地感受到云端数字化,而且华为云的合作伙伴,也可以与WeLink建立联接,从而进整个企 ...

  8. 华为云PaaS首席科学家:Cloud Native +AI,企业数字化转型的最佳拍档

    近日,在2019华为全球分析师大会期间,华为云PaaS首席科学家熊英博士在+智能,见未来(华为云&大数据)的分论坛上,从云计算行业发展谈起,深入云原生发展趋势,对华为云智能应用平台做了深度解读 ...

  9. 硬核评测:企业上云的极速存储挑战,华为云全新极速IO云硬盘性能评测

    来源:至顶网 作者:董培欣 借助华为云全新一代极速IO云硬盘开启邀测的时机,至顶网评测实验室展开了一次华为云极速IO云硬盘与超高IO云硬盘的性能对比测试活动,并且尝试通过相关测试成绩,对云硬盘的应用能 ...

随机推荐

  1. 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?

    Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你 ...

  2. python之装饰器的概念

    装饰器对于程序来说虽然不是必要的,但有时候却可以提高效率,也可以保证程序的安全. 说装饰器之前需要掌握闭包,前面一篇文章已经介绍过,这里不再重复. 那么,装饰器到底是什么东西呢?看下面这个例子 首先定 ...

  3. 『题解』Codeforces2A Winner

    Portal Portal1: Codeforces Portal2: Luogu Description The winner of the card game popular in Berland ...

  4. setAccessible()方法

    在java代码中,我们经常使用private来控制类中成员变量的访问权限,在类的外边我们一般使用get方法获取私有成员变量的值,但是如果类中没有get方法,但我们又想获取该类私有成员变量的值,该怎么办 ...

  5. Machine Learning in Action ---- kNN

    ------------恢复内容开始------------ # -*- coding: utf-8 -*- """ Created on Thu Nov 14 19:2 ...

  6. Potato Sacks

    Potato sacks come in different weight capacities (specified in pounds). Potatoes come in different w ...

  7. Arduino 将 String 转化为 int

    Arduino 将 String 转化为 int 函数:toInt() 实例: String my_str = "; int my_int = my_str.toInt();

  8. 100天搞定机器学习|Day56 随机森林工作原理及调参实战(信用卡欺诈预测)

    本文是对100天搞定机器学习|Day33-34 随机森林的补充 前文对随机森林的概念.工作原理.使用方法做了简单介绍,并提供了分类和回归的实例. 本期我们重点讲一下: 1.集成学习.Bagging和随 ...

  9. cn_windows虚拟机配置

    1.打开“VMware”,点击“主页”,点“创建新的虚拟机”: 2.会弹出一个“新建虚拟机向导”,类型选择“典型”,点击“下一步”: 3.选择“稍后安装操作系统”,点击“下一步”: 4.选择“Micr ...

  10. java课笔记

    http://127.0.0.1:8088/ http://127.0.0.1:8088/test/index.jsp http://127.0.0.1:8088/test/show 用户 (请求) ...