听电影学英语-热血教师 -中国日报网

可惜上文很简短。为了深入了解 PaddlePaddle EDL,我调研了设计文档和源码,访问了EDL的 主要设计者王益,并且在Playground的机群上部署了EDL。我把我的探索写成三篇文章

一般云端的机器学习训练任务会包含几个master进程,一些参数服务(parameter server)进程 ,和比较多的训练进程(training process)。这些进程全部运行在云端机器集群里,有时需要和其它训练任务共享计算资源,经常还需要和其它的云端服务(比如web服务)共享资源。理想的状态是机器学习训练系统知道根据集群资源使用情况和各个任务的优先级动态地调整参数服务 进程和训练进程的个数,从而达到充分地利用集群CPU/GPU的目的。而这正是Elastic Deep Learning (EDL) 系统的设计目标。

Horizontal Pod Autoscaling (HPA)是Kubernetes提供的一种弹性调度机制。它的出发点是通过公平分配计算资源给某一个单一的计算任务中的各个Pod来实现分布式系统资源针对单一任务的最优化利用。在“训练深度学习模型”这个场景下,“某一个单一的计算任务”可能是训练一个识别图 像中物体的模型,而另一个“单一的训练任务”可能是训练一个语音识别系统。这两个训练任务可 能都需要部署在同一个集群里,部署时间有先后,对资源的需求也有不同。理想的情况是 autoscaling controller对每一个这样的训练任务所需的系统资源有一个全局的了解,然后按需分配 资源。可是HPA controller并没有对不同训练任务有那样一个全局了解。

另一方面,HPA的弹性调度是针对同种类型的计算任务(homogenous computing task)下的 Pods。但是深度学习系统里的training process和parameter server往往是在不同类型的Pods里 的。我们想要autoscale不同种类的Pods。 这些深度学习训练系统特有的需求导致使用Kubernetes的时候需要有特定的弹性调度解决方案, 而不能直接采用HPA。而这套特定的解决方案就是本文讨论的PaddlePaddle EDL。

1.让Kubernetes支持定制的弹性调度机制

controller知道集群中一共有多少个GPU,当前有多少个闲置的GPU,并试图把闲置的GPU全部 分配给当前的训练任务。PaddlePaddle给需求GPU的训练任务定义一个“满足程度”的评分( fulfillment score),此评分的范围是[0,1]。PaddlePaddle会优先分配GPU资源给满足程度评分最低的训练任务。如果有分数相同的情况,则分别优先考虑GPU需求数,CPU需求数,内存需求数。如果有某个训练任务的GPU min-instance没有满足(除非cur-instance=min-instance),那么PaddlePaddle会把一个满足程度最高分的训练任务里的GPU资源拿出来分给它。如果满足程度分数最高的训练任务cur-instance=min-instance,则整个集群不再执行新的训练任务,新来的任务需等待。

CPU资源的分配和GPU思路相同。controller知道集群中一共有多少个CPU,内存,它们的负载情况;同时也知道训练任务对CPU的需求。同样的,CPU资源根据满足程度评分被按需分配。

这里讨论PaddlePaddle的容错机制。原则上,在一个分布式训练任务里,如果master进程或者所 有的参数服务进程都死掉了,那么整个训练任务会被停掉,过一段时间被Kubernetes整个重启。 否则如果具体训练进程没有都死掉,则整个训练任务继续。我们来看看PaddlePaddle的错误恢复机制。

2. 查看etcd中是否存在任务队列。如果不存在,则新建一个任务队列;否则得到这个任务队列中的信息

3. 把自身的ip地址写进etcd中/master/addr 这个key中,便于后来的训练进程和自己通信

4. 开端口监听训练进程的任务需求,如果收到来自训练进程的任务请求,从任务队列中取任务分配之,并且更新任务队列。

如果master进程因为任何原因死掉了,Kubernetes会将它重启,从被重启到获取etcd的信息,获取训练进程的任务,这个过程一般是几分钟。

当训练进程被Kubernetes启动时,它进行如下操作:

1. 查看etcd中包含参数服务前缀 /ps/ 获取当前参数服务进程的数量并等待,直到该数量达到配置文件中的要求

3. 向master发起任务请求,根据任务开始训练程序

当训练进程死掉之后,Kubernetes会将它重启,新起来的进程会重复上述工作直到开始新的训练工作。

当参数服务进程被Kubernetes启动时,它进行如下操作:

1. 从etcd /ps_desired中读取训练任务所需求的参数服务进程个数

在etcd里创建这个entry,以此作为自身的id。(如下图所示)

3. 参数服务进程会从自身对应的etcd path中找到已有的训练结果参数并且将它读入

4. 参数服务进程开始接收来自训练进程的请求。

从设计理念和实现思路来看,Paddle EDL和KubeFlow有非常多的相似之处。从开源的时间来看 ,二者也是同一时段,百度和谷歌的工程师对同一主题的几乎一样的理解。不过二者的确存在一些差别。

另外,虽然二者都支持一般的Kubernetes+docker环境,KubeFlow和Google在深度学习生态系 统中的其它开源项目一样,非常推崇在GCE上布署,深度整合Google云服务。而Paddle EDL并没有强调布署云的供应商服务。

由于Paddle EDL和KubeFlow都是刚刚开源的项目,更多的细节还在演化当中,我相信开源社区对它们的使用和理解会不断加深的。不过有一点可以肯定,Kubernetes和深度学习系统的结合将会越来越紧密,一个抽象层的,和Kubernetes API结合更紧密的,可调度不同后端训练系统(不 再绑定Tensorflow或者PaddlePaddle)的项目也许正在孕育中。返回搜狐,查看更多

听电影学英语-热血教师 -中国日报网报
新闻推荐
广东工行提供200亿元支持广州城投项目

3月5日下午,广东省副省长陈良贤到建工集团调研,了解推进改革重组及服务全省重大建设任务情况,强调作为国企改革重组的排头兵,建工集团要争创一流企业,干出与广东经济大省、强省相匹配的业绩。省国资...

横琴岛澳门大学新校区发展项目中央行政楼、文化及交流中心工程
芜湖卷烟厂“都宝”卷烟生产线技术改造项目制丝工房及综合库工程
广东中烟工业有限责任公司广州生产基地易地技改项目第二标段联合工房
昆明新机场航站区工程
沙特哈立德国王大学
飞来峡水利枢纽工程
广州市轨道交通六号线浔峰岗停车场
暨南大学第一附属医院