一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种深度学习场景下的弹性分布式训练方法与流程

2022-07-17 00:43:14 来源:中国专利 TAG:


1.本发明涉及分布式训练技术领域,具体涉及一种深度学习场景下的弹性分布式训练方法。


背景技术:

2.深度学习框架/平台支持分布式训练模式,即使用多台设备,每台设备上可以设置多个gpu(图形处理器,graphics processing unit),深度学习模型在各台设备中的gpu上并行化地进行训练。
3.现有的分布式训练方案多采用parameter server(参数服务器和节点组成的树形通信拓扑)和ring all-reduce(所有节点对等组成的环形通信拓扑)两种拓扑结构,parameter server方案中存在一个参数服务器负责每个节点的参数收集和平均值计算,然后再下发给每个节点,当参数服务器启动失败或异常退出都会使得训练过程中断,而且参数服务器的通信量受节点的数量增加而增加,所以parameter server不适合大规模的分布式训练作业;而ring all-reduce方案由于采用ring allreduce算法,可以有效的减少每个节点通信量,每个节点的通信量不会随着参数节点的增加而增加,可以实现接近线性的加速比,成为目前主流的分布式训练方案,但是该方案由于采用环状的通信方式,任意节点的退出都会使得训练过程中断,需要通过重启训练任务来解决。
4.tensorflow(一种深度学习框架)集群中的节点被分为两类:参数服务器(parameter server)和工作服务器(worker)。参数服务器存放模型的参数,而工作服务器负责计算参数的梯度,给工作服务器配置gpu。在每个迭代过程,工作服务器从参数服务器中获得参数,然后将计算的梯度返回给参数服务器,参数服务器聚合从工作服务器传回的梯度,然后更新参数,并将新的参数广播给工作服务器。
5.pytorch(一种深度学习框架)集群中的节点只有一类:节点(worker),所有的节点构成一下环形,每一个节点即向环上下一个节点发送数据同时接受环上上一个节点传输的数据。当收到所有节点的数据后在每个节点上即获取到了本轮需要更新的参数。
6.现有的弹性分布式训练方式主要针对tensorflow深度学习框架进行适配,主要用于支持parmeter server分布式训练模式,不支持ringallreduce通信拓扑。为此,提出一种深度学习场景下的弹性分布式训练方法。


技术实现要素:

7.本发明所要解决的技术问题在于:如何解决优化弹性伸缩调度策略,提高集群整体的资源利用率,提供了一种深度学习场景下的弹性分布式训练方法,本发明采用ringallreduce通信拓扑,有效减少了参数传递量,可以充分利用各个节点的带宽,加速分布式训练过程;以及支持训练节点加入和退出动态感知,自动重建新的训练拓扑。
8.本发明是通过以下技术方案解决上述技术问题的,本发明包括以下步骤:步骤s1:弹性分布式训练作业创建
集成深度学习平台,获取深度学习平台发送的训练任务对应的参数,创建一个弹性分布式训练作业;步骤s2:根据弹性分布式训练作业参数创建弹性伸缩作业;步骤s3:监控集群资源,计算弹性伸缩资源量;步骤s4:计算弹性伸缩资源占用比例,根据配置的弹性伸缩阈值确定是进行弹性扩张、收缩、维持;步骤s5:根据弹性伸缩结果下发更新volcano job,进而更新弹性分布式训练作业。
9.更进一步地,在所述步骤s1中,深度学习平台集成过程如下:s11:构建基于horovod、pytorch以及tensorflow的运行镜像文件;s12:通过前端传递弹性分布式训练作业的启动参数,启动参数包括弹性分布式训练作业的最小副本数,最大副本数,以及作业依赖的镜像以及启动训练程序的命令行和每个训练节点所需的资源大小;s13:通过volcano job适配horovod弹性分布式训练作业,volcano分布式训练作业创建之后,所有节点的域名均被记录到作业域名文件中,该文件以挂载的方式挂载到所有训练节点中,在使用域名通信时,域名则经过kubernetes的dns解析服务解析为具体的ip;并且所有节点之间均挂载相同的ssh密钥文件来实现节点之间免密登录;s14:编写分布式训练作业节点感知程序,该程序通过查询作业域名文件获取所有节点的域名以及通过ssh密钥免密依次登录各个节点查询训练容器挂载的gpu卡数量,生成horovod所需的弹性分布式训练作业的训练节点配置文件s15:当有节点加入或退出时,节点内的作业域名文件更新,当作业域名文件更新之后,节点感知工具自动获取当前所有的在线节点,生成新的训练作业节点列表配置文件,节点列表配置文件记录了训练节点域名与训练节点分配的gpu卡数的映射关系。
10.更进一步地,在所述步骤s1中,训练任务对应的参数包括镜像、最小副本数、最大副本数、启动命令以及每个副本所需的资源,其中,镜像为基于tensorflow、pytorch和horovod构建的镜像;最小副本数为启动该弹性分布式训练作业需要满足的最小副本数,记为n1;最大副本数为该弹性分布式训练作业可以扩张的最大副本数,记为n2,最大副本数应大于等于最小副本数;启动命令为用户需要执行的训练脚本。
11.更进一步地,在所述步骤s2中,创建的弹性伸缩作业即基于volcano创建一个volcanojob,弹性伸缩作业创建后每个节点均能感知到该任务下所有副本的ip,用于进行分布式训练作业的启动。
12.更进一步地,所述步骤s3具体包括以下子步骤:s31:获取集群总资源记为a,统计集群已使用的资源记为a;s32:通过配置参数获取弹性伸缩资源比例记为p;s33:通过公式计算出可用于弹性伸缩扩张的资源量为(a-a)*p,记为m。
13.更进一步地,在所述步骤s4中,弹性伸缩阈值包括弹性伸缩扩张阈值记为et、弹性伸缩收缩阈值记为st、弹性伸缩中间阈值为(et st)/2,记为mt,统计所有弹性伸缩作业总占用的资源记为eu,计算出当前弹性伸缩资源量中已使用资源占用的比例为eu/m,记为t,比较t与et和st的大小,如果t《et,则进行弹性扩张,如果t》st则进行弹性收缩,如果et≤t
≤st则进行弹性维持。
14.更进一步地,当t《et时,则进行弹性扩张,首先计算可用于弹性扩张资源量为(mt-t)*m,记为em,然后获取所有弹性伸缩作业,任务当前运行中的副本数记为n0,任务单个副本所需的资源记为r1,筛选出当前运行中的副本未达到最大副本数的任务,即n0《n2,筛选出来的任务记为tt,根据任务的优先级、上次弹性扩张的时间和弹性扩张次数进行排序,循环遍历任务,判断条件为em-r1≥0,则将任务的当前运行中的副本数进行加1,即将n0设置为n0 1,循环的结束条件为tt中所有任务都满足n0等于n2,或者em-r1小于0,即判断条件为n0==n2或者em-r1《0。
15.更进一步地,当t》et时,则进行弹性收缩,首先计算可用于弹性收缩资源量为(t-mt)*m,记为em,然后获取所有弹性伸缩作业,任务当前运行中的副本数记为n0,任务单个副本所需的资源记为r1,筛选出当前运行中的副本大于最小副本数的任务,即n0》n1,筛选出来的任务记为tt,根据任务的优先级、上次弹性收缩的时间和弹性收缩次数进行排序,循环遍历任务,判断条件为em-r1≥0,则将任务的当前运行中的副本数进行减1,即将n0设置为n0-1,循环的结束条件为tt中所有任务都满足n0等于n2,或者em-r1小于0,即判断条件为n0==n1或者em-r1《0。
16.更进一步地,当et≤t≤st时,则进行弹性维持,不进行任何的操作。
17.更进一步地,在所述步骤s5中,将所有弹性扩张或收缩的结果进行下发,通过kubernetesapiserver api更新volcanojob的副本数,volcanojob则尝试启动期望的副本数个数的副本;在弹性伸缩作业动态增加或删除副本时,所有副本均能感知到新加入和退出的副本的ip;当存在故障节点时,弹性分布式训练作业自动剔除离线节点继续训练,volcano尝试创建一个新的训练节点并启动,由深度学习平台感知到新加入的训练节点。
18.本发明相比现有技术具有以下优点:该深度学习场景下的弹性分布式训练方法,当集群资源空闲较多时,使用弹性分布式训练相比使用传统的分布式训练作业,任务的等待时间会被大幅的缩短,整体的训练时间也会有效的减少,而训练的模型精度基本不会产生损失,整体产生的训练费用也会比传统任务更少;当集群资源空闲很少时,使用弹性分布式训练会释放出部分资源,保证最小资源,从而可以容纳更多的作业,而弹性分布式作业的训练不会被中断;从而使得集群整体的资源利用率会有所提高。
附图说明
19.图1是本发明实施例中深度学习场景下的弹性分布式训练方法的流程示意图;图2是本发明实施例中集群总资源各部分比例示意图;图3是本发明实施例中弹性伸缩阈值的位置示意图;图4是本发明实施例中弹性扩张示意图;图5是本发明实施例中弹性收缩示意图;图6是本发明实施例中弹性维持示意图。
具体实施方式
20.下面对本发明的实施例作详细说明,本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施
例。
21.在本实施例中,首先进行深度学习平台(horovod)的集成,具体集成过程如下:1、构建基于horovod、pytorch以及tensorflow的运行镜像文件;2、通过前端传递弹性分布式训练作业的启动参数,启动参数包括弹性分布式训练作业的最小副本数,最大副本数,以及作业依赖的镜像以及启动训练程序的命令行和每个训练节点所需的资源大小;此处的前端表示:用户提交弹性分布式训练作业的页面;3、通过volcanojob适配horovod弹性分布式训练作业,volcano分布式训练作业创建之后,所有节点的域名都会被记录到作业域名文件(job_hosts文件)中,该文件会以挂载的方式挂载到所有训练节点中,在使用域名通信时,域名则经过kubernetes的dns解析服务解析为具体的ip;并且所有节点之间都会挂载相同的ssh密钥文件来实现节点之间免密登录;4、编写分布式训练作业节点自动感知的程序,该程序通过查询作业域名文件获取所有节点的域名以及通过ssh密钥免密依次登录各个节点查询训练容器挂载的gpu卡数量,最终生成horovod所需的弹性分布式训练作业的训练节点配置文件,该配置文件中每条记录以“节点域名:gpu卡数量”的格式生成。
22.5、当有节点加入或退出时,节点内的作业域名文件都会更新,当作业域名文件更新之后,节点感知工具自动获取当前所有的在线节点,生成新的训练作业节点列表配置文件。节点列表配置文件记录了训练节点域名与训练节点分配的gpu卡数的映射关系。
23.如图1所示,本实施例中深度学习场景下的弹性分布式训练方法的具体过程如下:1、获取深度学习平台发送的训练作业对应的参数,创建一个弹性分布式训练作业;在本步骤中,作业参数包含镜像、最小副本数、最大副本数以及启动命令、以及每个副本所需的资源,其中,镜像为基于tensorflow、pytorch和horovod构建出来的镜像;最小副本数为启动该弹性分布式训练作业需要满足的最小副本数,记为n1;最大副本数为该弹性分布式训练作业可以扩张的最大副本数,记为n2,最大副本数应大于等于最小副本数;启动命令为用户需要执行的训练脚本。
24.需要说明的是,作业:一个弹性分布式训练的作业,包含若干个任务;任务:一个弹性分布式训练作业通常包含一个master任务,一个worker任务,每个任务又包含若干节点;节点:一个任务中的一个容器/pod称为一个节点,节点又根据任务类型的不同分为训练节点(worker任务下的节点)和管理节点,弹性伸缩也指的是针对worker任务的节点数量进行伸缩;副本:表示的是节点内的启动的任务进程,通常一个节点内只会启动一个训练进程,也就是节点数量和副本数量是相同的,可以将副本理解为节点。
25.2、根据弹性分布式训练作业参数创建弹性伸缩作业;在本步骤中,创建的弹性伸缩作业即基于volcano创建一个volcanojob,但不限于volcano,可以用其他开源方案替代,如frameworkcontroller,kubeflow training-operator等,对分布式训练性能没有影响;volcanojob主要针对于批处理作业,分布式训练作业就属于批处理作业的一种。
26.在本步骤中,弹性伸缩作业创建后每个参与训练的节点都可以感知到该作业下所
有参与训练的节点的域名/ip,用于进行分布式训练作业的启动。
27.3、监控集群资源,计算弹性伸缩资源量;在本步骤中,首先获取集群总资源记为a,统计集群已使用的资源记为a,配置文件以yaml格式编写,即下面的示例配置文件,以文件的方式挂载到弹性伸缩服务容器内,通过解析配置文件获取配置参数,通过配置参数获取弹性伸缩资源比例记为p,然后通过公式计算出可用于弹性伸缩扩张的资源量为(a-a)*p,记为m,如图2所示。
28.配置文件示例如下:elasticconfig:elasticproportion: 0.3
ꢀꢀꢀ
#弹性伸缩资源比例[a]expandthreshold: 0.3 #弹性扩张阈值[et]expandpolicy: fail
ꢀꢀꢀꢀꢀꢀꢀ
#弹性扩张策略scalingthreshold: 0.9
ꢀꢀꢀꢀ
#弹性收缩阈值[st]scalingpolicy: priority
ꢀꢀ
#弹性收缩策略hpacheckminutes: 5
ꢀꢀꢀꢀꢀꢀ
#弹性伸缩调度周期(分钟)4、计算弹性伸缩资源占用比例,根据配置的弹性伸缩阈值确定是进行弹性扩张、收缩、维持;在步骤中,如图3所示,首先通过配置参数获取弹性伸缩扩张阈值记为et,弹性伸缩收缩阈值记为st,计算出弹性伸缩中间阈值为(et st)/2,记为mt;然后统计所有弹性伸缩作业总占用的资源记为eu,计算出当前弹性伸缩资源量中已使用资源占用的比例为eu/m,记为t,比较t与et和st的大小,如果t《et,则进行弹性扩张,如果t》st则进行弹性收缩,如果et≤t≤st则进行弹性维持;作为更具体的,如图4所示,当t《et时,则进行弹性扩张,首先计算可用于弹性扩张资源量(如图4中阴影部分所示)为(mt-t)*m,记为em,然后获取所有弹性伸缩作业,任务当前运行中的副本数记为n0,任务单个副本所需的资源记为r1,筛选出当前运行中的副本未达到最大副本数的任务即n0《n2,筛选出来的任务记为tt,根据任务的优先级、上次弹性扩张的时间和弹性扩张次数进行排序,将高优先级,扩张次数少,上次扩张时间早的任务排名提前,循环遍历任务,判断条件em-r1≥0,则将任务的当前运行中的副本数进行加1,即将n0设置为n0 1,循环的结束条件为tt中所有任务都满足n0等于n2,或者em-r1小于0,即判断条件为n0==n2或者em-r1《0。
[0029]
作为更具体的,如图5所示,当t》et时,则进行弹性收缩,首先计算可用于弹性收缩资源量为(t-mt)*m,记为em,然后获取所有弹性伸缩作业,任务当前运行中的副本数记为n0,任务单个副本所需的资源记为r1,筛选出当前运行中的副本大于最小副本数的任务即n0》n1,筛选出来的任务记为tt,根据任务的优先级、上次弹性收缩的时间和弹性收缩次数进行排序,将低优先级,收缩次数少,上次收缩时间早的任务排名提前,循环遍历任务,判断条件em-r1≥0,则将任务的当前运行中的副本数进行减1,即将n0设置为n0-1,循环的结束条件为tt中所有任务都满足n0等于n2,或者em-r1小于0,即判断条件为n0==n1或者em-r1《0。
[0030]
作为更具体的,如图6所示,当et≤t≤st时,则进行弹性维持,不进行任何的操作;5、根据弹性伸缩结果下发更新弹性伸缩作业,即volcano job(volcano job即弹
性分布式训练作业的实现层名词),更新弹性分布式训练作业。
[0031]
在本步骤中,将所有弹性扩张或收缩的结果进行下发,通过kubernetes(用于自动部署,扩展和管理容器化应用程序的开源系统)apiserverapi更新volcanojob的副本数,volcanojob在收到副本更新请求时,会尝试将副本维持在期望状态,volcano会维持pod的顺序,如扩张情况副本数增加,则volcanojob会启动新的pod,该pod会采用上一个pod相同命名前缀,并将pod的索引加1作为命名,如上一个pod命名为job0-worker0-1,则新的pod命名为job0-worker0-2,该pod启动后将作为训练节点加入弹性伸缩作业;在收缩情况,volcano job会将最后一个pod删除掉,当节点下线后训练节点检测程序则会将其剔除训练作业。
[0032]
需要说明的是,在弹性伸缩作业动态增加或删除副本时,所有副本都可以感知到新加入和退出的副本的ip,然后基于horovod的弹性分布式训练作业的特性实现无感的弹性扩缩容。
[0033]
需要说明的是,当存在故障节点时,horovod弹性分布式训练作业会自动剔除离线节点继续训练,volcano会尝试创建一个新的训练节点并启动,随后horovod就会感知到新加入的训练节点。
[0034]
综上所述,上述实施例的深度学习场景下的弹性分布式训练方法,当集群资源空闲较多时,使用弹性分布式训练相比使用传统的分布式训练作业,任务的等待时间会被大幅的缩短,整体的训练时间也会有效的减少,而训练的模型精度基本不会产生损失,整体产生的训练费用也会比传统任务更少;当集群资源空闲很少时,使用弹性分布式训练会释放出部分资源,保证最小资源,从而可以容纳更多的作业,而弹性分布式作业的训练不会被中断;从而使得集群整体的资源利用率会有所提高,值得被推广使用。
[0035]
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献