5-AI场景下Volcano作业管理能力实践
Posted 琦彦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-AI场景下Volcano作业管理能力实践相关的知识,希望对你有一定的参考价值。
5-AI场景下Volcano作业管理能力实践
今天的分享主要包括4个部分:
-
TensorFlow介绍
-
Volcano+TensorFlow作业
-
MindSpore介绍
-
实践演示
01TensorFlow介绍
TensorFlow是深度学习领域一个非常成熟的项目,它支持了很多开发语言,比如python、C++等,还支持了多种异构平台,提供了强大的算法模型,被越来越多的开发者所使用。可按照下列步骤进行使用:
- 构建分层神经网络
- 输入大量数据训练模型
- 迭代训练,调整参数
- 计算预测和正确结果的距离
举个例子:如何判断一张图片包含的是猫还是狗?
用传统的编程方法是很难进行判断的,甚至无法解决,因为我们很难制定出一系列的规则来告诉计算机什么是猫,什么是狗?最重要的是我们不知道如何把表情、姿势、品种等变量进行量化 。
作为替代,我们可以构建一个类似于人脑中神经元运行的简化版神经网络,图中每一个小黄点都是一个神经元,这些神经元是以层为单位关联起来,以我们所熟悉的图片作为输入,不断的进行训练,最后输出我们人类所能理解的结果。
我们让神经网络浏览大量的图片,这些图片需要被标记为正确的类别,猫分类到猫的一类,狗分类到狗的一类。一开始,所有的神经元都是被随机初始化的,我们需要计算和猜测与正确结果之间的距离,也就是误差,再使用这些误差进行神经元之间链接的强化,不断的进行迭代,缓慢逼近正确答案。
基本上重复上万次后就会得到一个不错的模型,这个模型就是能区分出这个图片到底是个猫还是狗。虽然说有可能你给神经元输入的图片它从来都没有见过,但训练之后的模型还是比较正确的分辨出到底是猫还是狗
TensorFlow在使用过程的一些问题:
因此我们需要一个集群调度和资源管理的平台去解决上面的这些问题,最容易想到的可能就是Kubernetes平台,我们可以把TensorFlow迁移到K8s平台上,借助K8s提供的天然的资源隔离/作业管理/调度功能等,用K8s去解决上面的这些问题。但是K8s调度器又不能满足TensorFlow独特的Gang-scheduling需求,要理解这个需求,我们需要先看下PS-Worker的架构。
TensorFlow PS-Worker模型
- Parameter Server(参数服务器)执行模型相关的作业,包括模型参数存储、分发、汇总、更新
- Worker(执行相关任务的节点)执行训练相关的作业,包括推理计算和梯度计算
在集群中,节点会分为两种角色,一种是Parameter Server,另外一种是Worker节点 ,其中PS节点是存放模型参数,而Worker节点只是进行梯度计算,在每一轮的迭代过程中,Worker都需要从PS的参数服务器中获得参数,在自己的进程中进行梯度计算,再返回给PS, PS会聚合所有Worker传回的梯度值进行加权更新操作。当它更新完参数之后,会再把参数广播给所有的Worker,一轮一轮的迭代下去。
在整个TensorFlow作业执行过程中,单独的PS,单独的Worker或者部分PS,部分Worker是无法完成整个作业的,所以它需要所有的PS和Worker一起协同工作,才能保证作业正常执行完,所以这种作业属性就给调度平台提出了相应的调度要求(比如Gang Scheduling,PS启动后,要求所有的worker都要启动),由于这种子任务之间需要彼此通信,所以在启动之后无法进行动态扩展,在没有Checkpoint的情况下,任意一个子任务失败了或者被驱逐了,整个作业都需要重启。
TensorFlow 案例
虽然TensorFlow提供了关于分布式训练的一系列接口,但是在框架之外还需要将TensorFlow计算集群信息先安排好,比如这个作业需要多少个PS服务器,多少个Worker节点,这些都需要提前计划好,将信息部署到对应的任务中去。
这个例子可以看到用了两个Worker,Worker 0和Worker 1,两个参数服务器PS 0和PS 1。
右边是启动TensorFlow作业时需要将这4个进程都要启动起来,**其中任何一个进程启动失败或退出,都会导致作业整体运行失败。**如果其中某个进程由于资源不足无法启动,整个作业也是无法真正的执行下去。
02 Volcano+TensorFlow作业
当一个TensorFlow作业提交到Volcano批处理系统的时候,Volcano会给作业设置一个PodGroup,PodGroup包含了用户配置的调度信息,比如这个例子作业包含了两个PS Pod和两个Worker Pod,PodGroup里包含了调度所需要的minAvailable值。
调度器在尝试调度时,就会看集群里的资源能满足多少个Pod去运行,如果满足一个,它的可调度数就会+1,最后会判断整个PodGroup里的可调度数是不是大于等于在Job里边设置的minAvaliable数,如果是,则整个Job才会被真正调度起来。
如何创建或配置TensorFlow 作业?
Volcano完全是基于K8s这种规范去开发的,所以它是解释型的CRD-配置即作业,直接所见即所得。
第一行定义了Volcano作业的apiVersion,Kind是Job类型,metadata定义作业的名字是tensorflow-dist-mnist。
在Spec里会去定义schedulerName,就是这个TensorFlow作业需要用Volcano调度器去调度。另外一个比较重要的变量是minAvailable值,这个值表示运行Job时所需最小的任务数,是由scheduler去处理的,达到最小任务数后,才会去调度这个作业。
下边是给作业配置的插件信息,Plugin提供了任务运行所必须的能力,Plugin内添写的插件可直接反映在task字段里的command字段里。
下边框起来的Task提供了多任务的模板能力,支持一个Job内定义多种角色,不同的角色执行不同的命令。
还可以为作业定义Policies,上面是定义整个作业的异常处理场景,就是说当有任意一个Pod被驱逐时,它处理的方式都是重启整个Job,也符合tensorflow AI作业的使用场景。
下边是在Task里边去定义Policies,当所有的Worker正常结束变成Completed状态,意味着整个Job正常结束。
每一个Task的具体配置
TensorFlow作业运行结果展示
03 MindSpore介绍
MindSpore是华为去年8月份推出的新一代全场景AI计算框架,在今年3月份华为宣布MindSpore正式开源,它是华为人工智能解决方案的重要组成部分,与tensorflow 等深度学习框架是对标的,目的是想大幅度降低AI应用和开发的门槛,让人工智能无处不在。
它是一款支持云/边/端独立或协同的统一训练和推理的框架,可以部署在手机端,既可以作为训练框架又可做推理框架,实现了一次性的算子开发,一致的开发和调试体验,可以帮助开发者实现一次开发能够应用在所有的设备上,提供平滑迁移的能力。
MindSpore的特点
**(1)开发态友好:**可以实现作业的自动微分,自动并行、自动调优,自动并行是说AI训练过程中模型和数据集越来越大,我们单机单卡GPU内存限制了大数据集或者大模型的训练,解决的简单办法是进行数据并行或切割,比如说拿20个Worker去训练2万个图片的话,每一个Worker就会去处理1千个图片,这样一轮轮迭代;
另外一种并行是当模型特别大的时候进行模型的切分,但会涉及到Worker之间的数据节点切换,也可能需要人工的参与,比较复杂,而MindSpore可以构建数据并行、模型并行或者两者相结合的方法,能够自动的选择开销最小的模型切分割策略,来实现自动的并行训练。
**(2)运行态高效:**不仅支持GPU、 CPU的训练,而且还支持华为昇腾芯片上的训练,而且面向昇腾芯片还做了深入性的性能优化。
**(3) 部署态灵活:**支持手机端、云端等多种部署环境。
MindSpore在Volcano调度器上的作业配置
下图是利用GPU进行训练的一个案例,整个配置起来是和TensorFlow差不多的:
04 实践演示
• 运行一个TensorFlow作业,参考 https://github.com/volcano-sh/volcano/blob/master/example/integrations/tensorflow/dist-mnist/tf-dist-mnist-example.yaml
• 运行一个MindSpore作业,参考 https://github.com/volcano-sh/volcano/blob/master/example/MindSpore-example/mindspore_cpu/mindspore-cpu.yaml
egrations/tensorflow/dist-mnist/tf-dist-mnist-example.yaml
• 运行一个MindSpore作业,参考 https://github.com/volcano-sh/volcano/blob/master/example/MindSpore-example/mindspore_cpu/mindspore-cpu.yaml
以上是关于5-AI场景下Volcano作业管理能力实践的主要内容,如果未能解决你的问题,请参考以下文章