掌桥专利:专业的专利平台
掌桥专利
首页

一种任务处理方法、装置、设备及存储介质

文献发布时间:2023-06-19 12:24:27


一种任务处理方法、装置、设备及存储介质

技术领域

本公开实施例涉及数据处理领域,尤其涉及一种任务处理方法、装置、设备及存储介质。

背景技术

随着信息技术的发展和人工智能的兴起,深度学习在日常生活中的应用日益广泛。深度学习模型的种类也随着应用的普及越来越多,结构也越来越复杂。深度学习模型的训练系统(以下简称训练系统)是对深度学习模型进行训练的框架或平台,目前常见的有Pytorch、TensorFlow、MXNet等。

为了提高整体训练性能,训练系统通常会启动多个工作进程同时进行不同批次的数据读取和预处理。但是传统方案中的工作进程在运行过程中可能出现死锁的现象,影响整体训练效率。

发明内容

本公开实施例提供一种任务处理方法、装置、设备及存储介质。

第一方面,提供一种任务处理方法,包括:

响应于训练任务在第一训练周期的启动事件,通过主进程发送工作进程创建请求至中间服务器进程;所述中间服务器进程为包括所述主进程中主线程的单线程进程;

基于所述工作进程创建请求,通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程;所述至少一个工作进程用于执行所述训练任务在所述第一训练周期的训练子任务;

响应于所述中间服务器进程的异常终止事件,通过所述主进程以生成函数的方式重启所述中间服务器进程,以继续执行所述训练任务。

在一些实施例中,所述方法还包括:

响应于所述训练任务的启动事件,通过所述主进程停止所述主进程中的其他线程,并清理计算资源;所述其他线程为所述主进程中不是所述主线程的至少一个其他线程;所述训练任务包括至少一个训练周期;

通过所述主进程以所述分叉函数的方式创建所述中间服务器进程。

在本公开实施例中,由于在通过主进程创建该中间服务器进程之前,先停止主进程除了主线程的其他线程,并释放了占用的计算资源,因此,在基于分叉函数创建中间服务器进程之后,可以使得中间服务器线程为单线程进程,避免工作进程出现死锁的现象。同时,由于采用分叉函数创建中间服务器进程,相比于以生成函数创建中间服务器进程的方案,不仅可以减少无意义的数据拷贝,提高了启动速度,还可以使得中间服务器进程可以访问主进程已经加载的数据,避免了重新加载等其他数据操作,提升了数据读取性能。

在一些实施例中,所述训练任务包括用于预处理的训练子任务,所述方法还包括:

在所述至少一个工作进程执行所述第一训练周期的用于预处理的训练子任务的过程中,通过所述主进程发送第一批次的预处理数据获取请求至所述至少一个工作进程;

响应于所述第一批次的预处理数据获取请求,通过所述至少一个工作进程读取所述第一批次对应的待处理数据;

通过所述至少一个工作进程对所述第一批次对应的待处理数据进行预处理,得到所述第一批次的预处理数据,并将所述第一批次的预处理数据发送至所述主进程,以通过所述主进程基于所述第一批次的预处理数据执行所述训练任务在所述第一训练周期的其他训练子任务。

在本公开实施例中,由于主进程和中间服务器进程为父子进程,中间服务器进程和每一工作进程均为父子进程,且中间服务器进程和每一工作进程均是通过分叉函数创建的,因此,中间服务器进程和每一工作进程均可以访问主进程加载的数据,在训练过程中可以省去数据读取的时间,提升了整体训练效率。

在一些实施例中,所述通过所述至少一个工作进程读取所述第一批次对应的待处理数据,包括:

基于所述第一批次的预处理数据获取请求,通过所述至少一个工作进程获取所述第一批次的批次索引;

所述至少一个工作进程基于所述第一批次的批次索引,读取所述第一批次对应的待处理数据。

在一些实施例中,所述通过所述至少一个工作进程基于所述第一批次的批次索引,读取所述第一批次对应的待处理数据,包括:

通过所述至少一个工作进程从内存中读取数据索引表;所述数据索引表通过所述主进程加载至所述内存;

基于所述第一批次的批次索引,通过所述至少一个工作进程在所述数据索引表中获取所述第一批次的待处理数据的数据地址;

通过所述至少一个工作进程从所述第一批次的待处理数据的数据地址中读取所述第一批次的待处理数据。

通过上述公开实施例,由于至少一个工作进程可以通过访问主进程加载的数据索引表,以得到待处理数据的数据地址,相比于传统技术中每一工作进程先加载数据索引表至内存,再从内存中获取待处理数据的数据地址的方案,不仅提升了数据读取速度,也节省了内存空间。

在一些实施例中,所述方法还包括:

在得到所述第一批次的预处理数据的情况下,通过所述至少一个工作进程获取第二批次的批次索引;所述第二批次为所述第一批次的下一批次;

基于所述第二批次的批次索引,通过所述至少一个工作进程读取所述第二批次对应的待处理数据并进行预处理,得到所述第二批次的预处理数据;

在所述至少一个工作进程接收到所述主进程发送的所述第二批次的预处理数据获取请求情况下,通过所述至少一个工作进程将得到的所述第二批次的预处理数据发送至所述主进程。

通过上述公开实施例,在任意训练周期内,当前训练周期对应的至少一个工作进程在处理完第一批次对应的待处理数据之后,并且在接收到主进程发送的第二批次的预处理数据获取请求之前,预先对第二批次的待处理数据进行读取并预处理,可以提升一个训练周期的整体训练效率,也提升了各个工作进程的使用效率。

在一些实施例中,在通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程之后,所述方法还包括:

在所述主进程和每一所述工作进程之间创建通信管道。

在一些实施例中,所述方法包括:

响应于所述训练任务在第一训练周期的结束事件,停止所述至少一个工作进程,并保持所述中间服务器进程的运行状态;

响应于所述训练任务在第二训练周期的启动事件,通过所述主进程重新发送所述第二训练周期对应的工作进程创建请求至所述中间服务器进程,以启动所述第二训练周期的训练任务;所述第二训练周期为所述第一训练周期的下一训练周期。

通过上述公开实施例,由于在每一训练周期结束后,停止当前训练周期的至少一个工作进程,不仅节省计算资源,避免下一训练周期出现死锁现象,还便于为不同训练周期设置不同数量的工作进程,提高了训练的灵活性;同时,由于在整个训练任务中保存该中间服务器进程的运行状态,不仅可以便于任意训练周期中的至少一个子任务创建,并且,还可以便于不同训练周期中至少一个工作任务对主进程加载至内存的数据进行读取,提升了数据读取效率。

在一些实施例中,所述方法包括:

响应于所述训练任务的完成事件,通过所述主进程发送停止指令至所述中间服务器进程,以停止所述中间服务器进程;

在所述中间服务器进程已停止的情况下,结束所述主进程。

通过上述公开实施例,由于在完成该训练任务之后,不仅停止最后批次的至少一个工作进程,还终止了创建的中间服务器进程和主进程,实现了对进程占用资源的完全释放,提升了系统资源的利用效率。

第二方面,提供一种任务处理装置,包括:

第一创建模块,用于响应于训练任务在第一训练周期的启动事件,通过主进程发送工作进程创建请求至中间服务器进程;所述中间服务器进程为包括所述主进程中主线程的单线程进程;

第二创建模块,用于基于所述工作进程创建请求,通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程;所述至少一个工作进程用于执行所述训练任务在所述第一训练周期的训练子任务;

重启模块,用于响应于所述中间服务器进程的异常终止事件,通过所述主进程以生成函数的方式重启所述中间服务器进程,以继续执行所述训练任务。

第三方面,提供一种任务处理设备,包括:存储器和处理器,所述存储器存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法中的步骤。

第四方面,提供一种计算机存储介质,所述计算机存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述方法中的步骤。

在本公开实施例中,由于通过该中间服务器进程以分叉函数的方式创建至少一个工作进程,可以提升每一训练周期中工作进程的创建效率,同时,由于该中间服务器进程为单线程进程,在利用分叉函数的方式创建至少一个工作进程之后,有效的避免了传统技术中多线程进程以分叉函数的方式创建子进程时出现的死锁现象;同时,在中间服务器进程异常终止的情况下,通过生成函数的方式重启该中间服务器进程,相比于以分叉函数的方式创建中间服务器进程的方案,同样避免了死锁现象,提升了训练系统的稳定性。

附图说明

图1为本公开实施例提供的一种任务处理系统结构示意图;

图2为本公开实施例提供的一种任务处理方法的流程示意图;

图3为本公开实施例提供的一种任务处理方法的流程示意图;

图4为本公开实施例提供的一种任务处理方法的流程示意图;

图5为本公开实施例提供的一种任务处理方法的流程示意图;

图6为本公开实施例提供的一种任务处理方法的流程示意图;

图7为本公开实施例提供的一种任务处理方法的流程示意图;

图8为本公开另一实施例提供的一种任务处理方法的流程示意图;

图9为本公开实施例提供的一种三级进程结构的结构示意图;

图10为本公开实施例提供的一种任务处理装置的组成结构示意图;

图11为本公开实施例提供的一种任务处理设备的硬件实体示意图。

具体实施方式

下面将通过实施例并结合附图具体地对本公开的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。

需要说明的是:在本公开实例中,“第一”、“第二”等是用于区别类似的对象,而不必用于描述目标的顺序或先后次序。另外,本公开实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。

图1为本公开实施例提供的一种任务处理方法的流程示意图,如图1所示,该方法应用于消息代理系统,该方法包括:

S101、响应于训练任务在第一训练周期的启动事件,通过主进程发送工作进程创建请求至中间服务器进程;所述中间服务器进程为包括所述主进程中主线程的单线程进程。

在一些实施例中,该训练任务可以包括至少一个训练周期(epoch)的训练过程,为了便于说明本公开的实施方案,以该训练任务中的任意一个训练周期,即第一训练周期为例进行说明。

在一些实施例中,该训练任务为针对各种神经网络模型的训练任务。针对不同的应用场景,需要使用的神经网络模型也可能不同;相应地,在对神经网络模型的训练过程中也需要参考神经网络模型的应用场景,从而使得不同应用场景下的神经网络模型所具有的处理手段以及所使用的训练数据集均不同。示例性的,本公开实施例不仅可以用于图像分类、语音识别、机器翻译以及人脸识别等应用场景中,还可以应用于其他应用场景中,本公开实施例对此不做具体限定。

还需要说明的是,本公开实施例中的神经网络模型可以是任一种神经网络模型(例如,残差神经网络(Residual Neural Network,ResNet)、应用于嵌入式设备的轻量级的深层神经网络(例如,MobileNet)、网络架构搜索网络(Neural Architecture Search,NASNet)、长短期记忆网络(Long Short-Term Memory,LSTM)等),也可以是任一种深度学习模型,还可以是其他类型的神经网络模型。

S102、基于所述工作进程创建请求,通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程;所述至少一个工作进程用于执行所述训练任务在所述第一训练周期的训练子任务。

在一些实施例中,该分叉函数(fork)在启动一个新的进程的过程中,新的进程相当于是当前进程的一个拷贝,即子进程和父进程使用相同的代码段;子进程复制父进程的堆栈段和数据段。这样,父进程加载的所有数据都可以被子进程访问。在S102中,通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程可以访问中间服务器进程加载的所有数据。

S103、响应于所述中间服务器进程的异常终止事件,通过所述主进程以生成函数的方式重启所述中间服务器进程,以继续执行所述训练任务。

在一些实施例中,该生成函数(spawn)包含分叉函数(fork)与执行函数(exec)。其中,执行函数可以将拷贝好的新的进程进行参数替换,替换成为一个指定的程序,其参数包括文件名(filename)、参数列表(argv)以及环境变量(envp)。

在一些实施例中,可以通过主进程探测所述中间服务器进程是否异常终止,在所述主进程探测到所述中间服务器进程异常终止的情况下,生成所述中间服务器进程的异常终止事件。其中,该中间服务器进程在整个训练任务中均为运行状态,即在不同的任意训练周期及任意批次的训练过程中,该中间服务器进程均保持存活。

在一些实施例中,可以通过主进程向所述中间服务器进程发送探测消息,在发送成功的情况下,表征所述中间服务器进程处于存活状态;在发送失败的情况下,表征所述中间服务器异常终止。

需要说明的是,在训练任务执行的过程中需要重启该中间服务器进程,由于训练系统中的主进程为多线程进程,通过主进程以分叉函数的方式重启所述中间服务器进程,得到的中间服务器进程为多线程进程,将会存在死锁风险。因此,本公开实施例通过生成函数的方式重启所述中间服务器进程,即先以分叉函数(fork)复制主进程,再以执行函数(exec)对复制的主进程进行参数替换,得到与当前主进程不同的,仍为单线程进程的中间服务器进程,从而避免了死锁风险。

在本公开实施例中,由于通过该中间服务器进程以分叉函数的方式创建至少一个工作进程,可以提升每一训练周期中工作进程的创建效率,同时,由于该中间服务器进程为单线程进程,在利用分叉函数的方式创建至少一个工作进程之后,有效的避免了传统技术中多线程进程以分叉函数的方式创建子进程时出现的死锁现象;同时,在中间服务器进程异常终止的情况下,通过生成函数的方式重启该中间服务器进程,相比于以分叉函数的方式创建中间服务器进程的方案,同样避免了死锁现象,提升了训练系统的稳定性。

参见图2,图2是本公开实施例提供的任务处理方法的一个可选的流程示意图,基于图1,在图1中的S101之前,所述方法还可以包括S201至S202,将结合图2示出的步骤进行说明。

S201、响应于所述训练任务的启动事件,通过所述主进程停止所述主进程中的其他线程,并清理计算资源;所述其他线程为所述主进程中不是所述主线程的至少一个其他线程;所述训练任务包括至少一个训练周期。

在一些实施例中,针对需要训练的神经网络模型,在完成该神经网络模型的训练准备之后,可以生成该神经网络模型对应的训练任务启动事件。为了得到相对较优的训练后的神经网络模型,在该神经网络模型中需要进行至少一次训练周期(epoch)的训练过程,在一次训练周期的训练过程中,需要利用当前训练集的所有训练样本。

在一些实施例中,通过训练系统执行该神经网络模型的训练任务的过程中,该训练系统中的用于执行训练任务的主进程至少包括该主进程的主线程,即0号线程。在该主线程之外,该主进程至少包括启动(Engine)线程,也就是说,在执行该训练任务的过程中,训练系统中的主进程为多线程进程,为了避免死锁问题,需要停止主进程中除了主线程之外的其他进程,即停止包括该启动线程的至少一个其他线程,同时,清理占用的计算资源。

其中,该启动线程为所述主进程中用于分解算子计算任务和/或分发算子计算任务的线程,在该训练任务运行的过程中,该启动线程必须存在。该计算资源可以包括GPU计算资源、CPU计算资源和内存资源中的至少之一。

需要说明的是,S201通过停止所述主进程中的其他线程,并清理计算资源的方式,将该主进程优化为仅包括主线程的单线程进程,以便于生成中间服务器进程时复制(copy)不必要的进程数据。

S202、通过所述主进程以所述分叉函数的方式创建所述中间服务器进程。

在一些实施例中,由于当前主进程为仅包括主线程的单线程进程,在通过该主进程以分叉函数的方式创建中间服务器进程的过程中,得到的中间服务器进程也是仅包括主线程的单线程进程。同时,由于采用了分叉函数的方式创建该中间服务器进程,作为子进程的中间服务器进程可以使用作为父进程的主进程加载的数据。

需要说明的是,在通过主进程创建中间服务器线程之后,在执行该训练任务的过程中,该主进程的其他线程仍会被启动,但由于中间服务器进程已经被创建,因此在主进程再次由单线程进程变化为多线程进程之后,该中间服务器进程仍然为单线程进程。

在本公开实施例中,由于在通过主进程创建该中间服务器进程之前,先停止主进程除了主线程的其他线程,并释放了占用的计算资源,因此,在基于分叉函数创建中间服务器进程之后,可以使得中间服务器线程为单线程进程,避免工作进程出现死锁的现象。同时,由于采用分叉函数创建中间服务器进程,相比于以生成函数创建中间服务器进程的方案,不仅可以减少无意义的数据拷贝,提高了启动速度,还可以使得中间服务器进程可以访问主进程已经加载的数据,避免了重新加载等其他数据操作,提升了数据读取性能。

参见图3,图3是本公开实施例提供的任务处理方法的一个可选的流程示意图,基于图1,在图1中的S102之后,所述方法还包括S301至S303,将结合图3示出的步骤进行说明。

S301、在所述至少一个工作进程执行所述第一训练周期的用于预处理的训练子任务的过程中,通过所述主进程发送第一批次的预处理数据获取请求至所述至少一个工作进程。

在一些实施例中,以执行训练任务中的数据预处理任务为例,在执行该第一训练周期的训练任务的过程中,需要对训练集中的样本数据进行预处理,以便进行后续的训练子任务。其中,针对任意训练周期,可以包括N个批次(batch),每一个批次可以对应M个样本数据(即待处理数据),在进行一个批次的预处理子任务的过程中,需要从训练集中获取M个待处理数据,并对该M个待处理数据进行预处理,得到该批次的M个预处理数据。

其中,由于上述至少一个工作进程用于执行一个批次的预处理子任务,因此,需要通过主进程将上述第一训练周期中的第一批次的预处理数据获取请求发送至该至少一个工作进程,以使该主进程得到第一批次的预处理数据。

需要说明的是,可以通过主进程发送M个预处理数据获取请求,即预处理数据获取请求的个数可以与第一批次对应的待处理数据的个数相同。在一些实施中,工作进程的个数可以与该预处理数据获取请求的个数相同,即通过M个工作进程中的每一工作进程分别接收1个预处理数据获取请求。在另一些实施例中,该预处理数据获取请求的个数可以为工作进程的个数的Y倍,Y为正整数,即每一个工作进程可以接收M/Y个预处理数据获取请求。

S302、响应于所述第一批次的预处理数据获取请求,通过所述至少一个工作进程读取所述第一批次对应的待处理数据。

在一些实施例中,在至少一个工作进程的个数与第一批次的待处理数据相同的情况下,可以通过每一工作进程读取该工作进程对应的一个待处理数据;在第一批次的待处理数据是工作进程的个数的Y倍的情况下,可以通过每一工作进程获取工作进程对应的Y个待处理数据。

在一些实施例中,在训练集的数据量小于预设阈值的情况下,该训练集对应的所有待处理数据(样本)可以被主进程加载至内存中,同时,由于主进程和中间服务器进程为父子进程,中间服务器进程和每一工作进程均为父子进程,且中间服务器进程和每一工作进程均是通过分叉函数创建的,因此,中间服务器进程和每一工作进程均可以访问主进程加载的所有待处理数据。上述通过所述至少一个工作进程读取所述第一批次对应的待处理数据,可以包括:通过所述至少一个工作进程在内存中读取所述第一批次对应的待处理数据,所述第一批次对应的待处理数据是所述主进程加载至内存的。

S303、通过所述至少一个工作进程对所述第一批次对应的待处理数据进行预处理,得到所述第一批次的预处理数据,并将所述第一批次的预处理数据发送至所述主进程,以通过所述主进程基于所述第一批次的预处理数据执行所述训练任务在所述第一训练周期的其他训练子任务。

在一些实施例中,针对每一工作进程,在该工作进程读取到该工作进程对应的待处理数据之后,可以基于预设的预处理函数,对该待处理数据进行预处理,以得到该工作进程对应的预处理数据;在得到该工作进程对应的预处理数据之后,可以通过该工作进程将预处理数据发送至主进程,以使该主进程执行训练任务在所述第一训练周期的其他训练子任务。其中,该其他训练子任务可以包括以下至少之一:采样子任务、特征提取子任务、特征融合子任务、损失计算子任务和参数调整子任务等。

在一些实施例中,在通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程之后,所述方法还包括:在所述主进程和每一所述工作进程之间创建通信管道。

基于上述实施例,S301可以更新为:在所述至少一个工作进程执行所述第一训练周期的用于预处理的训练子任务的过程中,通过所述至少一个工作进程接收所述主进程通过所述通信管道发送的第一批次的预处理数据获取请求。S303可以更新为:通过所述至少一个工作进程对所述第一批次对应的待处理数据进行预处理,得到所述第一批次的预处理数据,并将所述第一批次的预处理数据发送至所述主进程,以通过所述主进程基于所述第一批次的预处理数据执行所述训练任务在所述第一训练周期的其他训练子任务。

在本公开实施例中,由于主进程和中间服务器进程为父子进程,中间服务器进程和每一工作进程均为父子进程,且中间服务器进程和每一工作进程均是通过分叉函数创建的,因此,中间服务器进程和每一工作进程均可以访问主进程加载的数据,在训练过程中可以省去数据读取的时间,提升了整体训练效率。

参见图4,图4是本公开实施例提供的任务处理方法的一个可选的流程示意图,基于图3,图3中的S302可以包括S401至S402,将结合图4示出的步骤进行说明。

S401、基于所述第一批次的预处理数据获取请求,通过所述至少一个工作进程获取所述第一批次的批次索引。

S402、基于所述第一批次的批次索引,通过所述至少一个工作进程读取所述第一批次对应的待处理数据。

在一些实施例中,可以通过步骤S4021至S4023实现上述基于所述第一批次的批次索引,通过所述至少一个工作进程读取所述第一批次对应的待处理数据:

S4021、通过所述至少一个工作进程从内存中读取数据索引表;所述数据索引表通过所述主进程加载至所述内存。

在一些实施例中,响应于所述训练任务的启动事件,通过主进程将所述训练任务对应的数据索引表加载至内存中,该数据索引表包括该训练任务对应的多个待处理数据和每一所述待处理数据对应的数据地址。由于主进程和中间服务器进程为父子进程,中间服务器进程和每一工作进程均为父子进程,且中间服务器进程和每一工作进程均是通过分叉函数创建的,因此,中间服务器进程和每一工作进程均可以访问主进程加载的数据索引表。

S4022、基于所述第一批次的批次索引,通过所述至少一个工作进程在所述数据索引表中获取所述第一批次的待处理数据的数据地址。

在一些实施例中,该数据地址用于指示待处理数据的存储位置,该存储位置包括不限于是内存中的存储位置,本地磁盘中的存储位置,网络中的存储位置等。

S4023、通过所述至少一个工作进程从所述第一批次的待处理数据的数据地址中读取所述第一批次的待处理数据。

通过上述公开实施例,由于至少一个工作进程可以通过访问主进程加载的数据索引表,以得到待处理数据的数据地址,相比于传统技术中每一工作进程先加载数据索引表至内存,再从内存中获取待处理数据的数据地址的方案,不仅提升了数据读取速度,也节省了内存空间。

参见图5,图5是本公开实施例提供的任务处理方法的一个可选的流程示意图,基于图3,图3中的方法还可以包括S501至S503,将结合图5示出的步骤进行说明。

S501、在得到所述第一批次的预处理数据的情况下,通过所述至少一个工作进程获取第二批次的批次索引;所述第二批次为所述第一批次的下一批次。

在一些实施例中,可以通过以下方式实现上述通过所述至少一个工作进程获取第二批次的批次索引:

(1)在通过所述主进程发送第一批次的预处理数据获取请求的过程中,该第一批次的预处理数据获取请求还携带第二批次的批次索引,在得到所述第一批次的预处理数据的情况下,基于所述第一批次的预处理数据获取请求获取第二批次的批次索引。

(2)基于批次索引的生成规则,在得到所述第一批次的预处理数据的情况下,基于该生成规则生成所述第二批次的批次索引。例如,若第一批次的批次索引包括“0200至0209”,对应当前训练周期的第21个批次,生成规则为“(21-1)*10至21*10-1”则第二批次对应当前训练周期的第22个批次,因此,可以生成第二批次的批次索引包括“(22-1)*10至22*10-1”,即“0210至0219”。

S502、基于所述第二批次的批次索引,通过所述至少一个工作进程读取所述第二批次对应的待处理数据并进行预处理,得到所述第二批次的预处理数据。

S503、在所述至少一个工作进程接收到所述主进程发送的所述第二批次的预处理数据获取请求情况下,通过所述至少一个工作进程将得到的所述第二批次的预处理数据发送至所述主进程。

在一些实施例中,上述S502至S503的实施方式中对于第二批次的待处理数据的读取和预处理过程,与S302至S303的实施方式中对于第一批次的待处理数据的读取和预处理过程相同。

通过上述公开实施例,在任意训练周期内,当前训练周期对应的至少一个工作进程在处理完第一批次对应的待处理数据之后,并且在接收到主进程发送的第二批次的预处理数据获取请求之前,预先对第二批次的待处理数据进行读取并预处理,可以提升一个训练周期的整体训练效率,也提升了各个工作进程的使用效率。

参见图6,图6是本公开实施例提供的任务处理方法的一个可选的流程示意图,基于上述任一实施例,以基于图1为例,图1中的方法还可以包括S601至S602,将结合图6示出的步骤进行说明。

S601、响应于所述训练任务在第一训练周期的结束事件,停止所述至少一个工作进程,并保持所述中间服务器进程的运行状态。

在一些实施例中,在检测到所述训练任务已经完成第一训练周期的训练任务之后,生成所述第一训练周期的结束事件。需要说明的是,第一训练周期的训练任务不仅包括第一训练周期中训练集中各个待处理数据对应的预处理子任务,还包括其他训练子任务。也就是说,在第一训练周期中所有批次的训练过程均完成之后,生成该训练任务在第一训练周期的结束事件。

其中,为了节省计算资源,并避免下一训练周期出现死锁现象,需要在每一训练周期的训练任务完成之后,停止当前训练周期对应的至少一个工作进程。同时,该中间服务器进程在训练任务的所有训练周期中均处于运行状态,以便任意训练周期中的至少一个子任务创建,并且,在训练任务开始之后,再停止主进程中的其他线程将丢失训练进度信息、训练数据等数据,即无法再次使用分叉函数的方式创建中间服务器进程,因此,需要在整个训练任务中保存该中间服务器进程的运行状态。

S602、响应于所述训练任务在第二训练周期的启动事件,通过所述主进程重新发送所述第二训练周期对应的工作进程创建请求至所述中间服务器进程,以启动所述第二训练周期的训练任务;所述第二训练周期为所述第一训练周期的下一训练周期。

在一些实施例中,由于在第一训练周期完成之后,该第一训练周期对应的至少一个工作进程已经被停止,因此,需要通过该主进程重新发送该第二训练周期对应的工作进程创建请求至该保持运行的中间服务器进程,已完成第二训练周期对应的至少一个工作进程的创建,第二训练周期的各个训练子任务与第一训练周期相同。

其中,每一训练周期对应的至少一个工作进程的数量可以相同也可以不同。以第一训练周期和第二训练周期为例,在第一训练周期与第二训练周期对应的至少一个工作进程的数量相同的情况下,第一训练周期通过主进程发送的工作进程创建请求的数量和第二训练周期通过主进程发送的工作进程创建请求的数量也相同。在另一些实施例中,不同的训练周期可以对应不同数量的工作进程,即,第二训练周期中通过所述主进程发送工作进程创建请求的数量与第一训练周期中通过所述主进程发送工作进程创建请求的数量不同。因此,在每一训练周期结束后,停止当前训练周期的至少一个工作进程也可以便于为不同训练周期设置不同数量的工作进程,提高了训练的灵活性。

通过上述公开实施例,由于在每一训练周期结束后,停止当前训练周期的至少一个工作进程,不仅节省计算资源,避免下一训练周期出现死锁现象,还便于为不同训练周期设置不同数量的工作进程,提高了训练的灵活性;同时,由于在整个训练任务中保存该中间服务器进程的运行状态,不仅可以便于任意训练周期中的至少一个子任务创建,并且,还可以便于不同训练周期中至少一个工作任务对主进程加载至内存的数据进行读取,提升了数据读取效率。

参见图7,图7是本公开实施例提供的任务处理方法的一个可选的流程示意图,基于上述任一实施例,以基于图1为例,图1中的方法还可以包括S701至S702,将结合图7示出的步骤进行说明。

S701、响应于所述训练任务的完成事件,通过所述主进程发送停止指令至所述中间服务器进程,以停止所述中间服务器进程。

S702、在所述中间服务器进程已停止的情况下,结束所述主进程。

在一些实施例中,在通过主进程发送该停止指令至该中间服务器进程之后,需要接收中间服务器进程的停止反馈,在通过主进程接收到该停止反馈,即在所述中间服务器进程已停止的情况下,结束所述主进程。

通过上述公开实施例,由于在完成该训练任务之后,不仅停止最后批次的至少一个工作进程,还终止了创建的中间服务器进程和主进程,实现了对进程占用资源的完全释放,提升了系统资源的利用效率。

下面,将说明本申请实施例在一个实际的应用场景中的示例性应用。

随着信息技术的发展和人工智能的兴起,深度学习在日常生活中的应用日益广泛。深度学习模型的种类也随着应用的普及越来越多,结构也越来越复杂。深度学习模型的训练系统(以下简称训练系统)是对深度学习模型进行训练的框架或平台,目前常见的有Pytorch、TensorFlow、MXNet等。

Dataloader是训练系统中用于数据读取和预处理的模块。该模块的执行引擎由训练系统实现和维护,通过调用用户提供的数据读取和预处理函数,为模型训练提供所需的输入数据。Dataloader作为训练系统中的一个子模块,功能与结构相对独立,这为高度定制化数据读取和预处理流程提供了基础。一般情况下,Dataloader模块会以子进程的方式运行,该子进程被称为Worker子进程,对应上述实施例中的工作进程。训练过程中,主进程与Worker子进程之间的交互如图8所示:

S801、主进程启动子进程;

S802、循环处理不同批次的待读取数据,直至所有数据都处理完成;

在一些实施例中,针对S802中的一次循环过程,可以通过S8021至S8022实现:

S8021、主进程发送数据读取请求至子进程;

其中,主进程将当前批次的批次索引通过数据读取请求发送至子进程,子进程可以响应于该数据读取请求,基于该批次索引获取当前批次对应的待处理数据,之后,基于该子进程对应的预处理函数,对该待处理数据进行处理,得到处理后的数据。

S8022、子进程发送读取并已经预处理的数据至主进程。

其中,子进程将该当前批次对应的处理后的数据反馈至主进程。

S803、主进程停止子进程。

其中,在所有待读取数据均被读取并完成预处理之后,主进程停止上述用于执行数据读取和预处理的子进程。之后,主进程可以基于得到的经过预处理的数据进行下一步。

在上述训练过程中,为了提高整体训练性能,训练系统通常会启动多个Worker子进程同时进行不同批次的数据读取和预处理。为了兼顾效率与安全,主进程启动Worker子进程的方式分为两种:spawn方式和fork方式。

其中,spawn方式启动的子进程是一个纯净的进程,无任何安全隐患,不会在启动后出现子进程死锁的状况。但是spawn启动方式的弊端是:(1)和fork方式相比较,启动速度慢;(2)无法利用主进程中已有的数据,以加速后续的数据读取操作,特别是用户在使用了lmdb等缓存技术的情形下。

其中,fork方式启动子进程时,操作系统会使用写时拷贝技术(Copy-on-Write,COW),将主进程的内存镜像(极少数据结构除外,譬如进程号)复制到子进程中。写时拷贝技术的其基本做法是:尽管父、子进程各自拥有独立的虚拟地址空间,但是共享物理内存空间,所以如果子进程不对内存空间进行写入操作,则父进程中的数据不会发生真实的拷贝操作,也就是说,仅在子进程对该内存空间进行写入操作后,父进程中的数据才会发生真实的拷贝操作。由此可见,fork方式启动子进程的优势有:(1)减少了无意义的数据拷贝,启动速度快;(2)子进程中保留了父进程中已经加载或处理的数据,这些数据可以被直接从内存中读取,而无需再经过I/O或其他处理操作,读取性能优异;(3)由于相同的数据在物理内存中仅有一份,因此节省了物理内存的使用。

然而,发明人在研究中发现,fork方式启动子进程也存在不小的风险,主要原因是:假设父进程是一个拥有0、1、2号三个线程的多线程程序,且在0号线程中调用了创建子进程的操作函数,那么在新创建的子进程中,只会保留0号线程,其他的线程将不复存在,这个行为是fork启动方式的机制决定且无法更改的。那么,如果在父进程中的1号线程获取了一个锁对象,在释放该锁对象前0号线程使用fork方式创建了一个子进程,则子进程中的那个锁对象将永远无法释放,因为1号线程已经不存在了。此时,子进程中的0号线程(或其他新创建的线程)若去获取该锁对象将永远无法成功,最终导致子进程挂起。这是使用fork方式启动子进程的技术壁垒,也是训练系统主进程启动Worker子进程时最大的安全隐患,因为该缺陷会导致训练过程暂停且无法自动恢复。Parrots训练系统是一个多线程的程序,其中至少存在着主线程和Engine线程两个线程,因此使用fork方式必然会遭遇这样的困境。

基于上述问题,本公开实施例提供了一种三级进程结构,可以参阅图9提供的结构示意图。

其中,该三级进程结构包括主进程901、中间服务器进程902和与该中间服务器进程连接的多个子进程903。

在一些实施例中,该主进程901可以为各种类型的深度学习训练框架,其中的主进程是训练框架的主体部分,在模型训练时各个模块和流程均被该主进程控制与推动,包括训练过程的启动与终止、数据读取与预处理(Dataloader模块的功能)、深度网络模型中算子的执行流程、算子在不同设备上的执行、分布式训练时设备之间的同步等。该主进程还包括Engine线程,Engine线程是主进程中用于算子计算任务分解、分发的线程,它在后台运行且对用户不可见。在整个训练过程中,Engine线程必须存在。

在一些实施例中,中间服务器进程902是专门为fork dataloader设计的,用于创建和/或销毁Worker子进程。Worker子进程903用于模型训练过程中数据的读取和预处理,并将处理完成的输入数据发送回主进程。

如图9所示,训练系统在进行新一轮(epoch)训练时,首先会准备启动用于输入数据读取和预处理的Worker子进程。根据用户设定值,Worker子进程可能会启动多个并行运行以提高数据读取性能。

在一些实施例中,当启动第一个Worker子进程时,如果发现中间服务器进程还未启动,训练主进程会首先去停止Engine线程、清理关键资源,使用fork方式启动中间服务器进程。

其中,中间服务器进程在整个训练期间不会退出,以后台运行的方式等待主进程的用于创建Worker子进程的请求指令。

在一些实施例中,训练主进程将创建Worker子进程的请求以及进程创建参数发送至中间服务器进程,中间服务器进程在接收到该请求后,利用进程创建参数在fork方式下创建Worker子进程,并在训练主进程和Worker子进程之间创建用于二者通信的管道。

在一些实施例中,训练主进程在所有请求的Worker子进程全部启动之后,会把即将读取的数据批次索引发送至相应的Worker子进程中。子进程在收到该索引之后,开始数据读取和预处理,处理完成后将数据发送回训练主进程。

其中,训练系统都会采取预读取策略,此时Worker子进程会提前读取相应批次的数据并进行预处理,以尽量确保主进程需要对该批次数据进行计算时,数据已经被Worker子进程处理就绪。

在一些实施例中,如果中间服务器进程因为异常原因终止,那么主进程则会以spawn方式重启该进程。

通过上述方式,可以保证中间服务器进程的安全,又能使得训练过程继续进行。

在一些实施例中,在每一轮(epoch)训练结束时,Worker子进程会主动退出,并在下一轮训练开始后重新创建,但中间服务器进程始终在后台运行。整个训练结束后,训练主进程发送请求将中间服务器进程退出,并结束主进程本身。

图10为本公开实施例提供的一种任务处理装置的组成结构示意图,如图10所示,任务处理装置1000包括:

第一创建模块1001,用于响应于训练任务在第一训练周期的启动事件,通过主进程发送工作进程创建请求至中间服务器进程;所述中间服务器进程为包括所述主进程中主线程的单线程进程;

第二创建模块1002,用于基于所述工作进程创建请求,通过所述中间服务器进程以分叉函数的方式创建至少一个工作进程;所述至少一个工作进程用于执行所述训练任务在所述第一训练周期的训练子任务;

重启模块1003,用于响应于所述中间服务器进程的异常终止事件,通过所述主进程以生成函数的方式重启所述中间服务器进程,以继续执行所述训练任务。

在一些实施例中,第一创建模块1001,还用于响应于所述训练任务的启动事件,通过所述主进程停止所述主进程中的其他线程,并清理计算资源;所述其他线程为所述主进程中不是所述主线程的至少一个其他线程;所述训练任务包括至少一个训练周期;通过所述主进程以所述分叉函数的方式创建所述中间服务器进程。

在一些实施例中,所述训练任务包括用于预处理的训练子任务,所述任务处理装置1000还包括:数据处理模块,其中,所述数据处理模块,用于在所述至少一个工作进程执行所述第一训练周期的用于预处理的训练子任务的过程中,通过所述主进程发送第一批次的预处理数据获取请求至所述至少一个工作进程;响应于所述第一批次的预处理数据获取请求,通过所述至少一个工作进程读取所述第一批次对应的待处理数据;通过所述至少一个工作进程对所述第一批次对应的待处理数据进行预处理,得到所述第一批次的预处理数据,并将所述第一批次的预处理数据发送至所述主进程,以通过所述主进程基于所述第一批次的预处理数据执行所述训练任务在所述第一训练周期的其他训练子任务。

在一些实施例中,所述数据处理模块,还用于基于所述第一批次的预处理数据获取请求,通过所述至少一个工作进程获取所述第一批次的批次索引;所述至少一个工作进程基于所述第一批次的批次索引,读取所述第一批次对应的待处理数据。

在一些实施例中,所述数据处理模块,还用于通过所述至少一个工作进程从内存中读取数据索引表;所述数据索引表通过所述主进程加载至所述内存;基于所述第一批次的批次索引,通过所述至少一个工作进程在所述数据索引表中获取所述第一批次的待处理数据的数据地址;通过所述至少一个工作进程从所述第一批次的待处理数据的数据地址中读取所述第一批次的待处理数据。

在一些实施例中,所述数据处理模块,还用于在得到所述第一批次的预处理数据的情况下,通过所述至少一个工作进程获取第二批次的批次索引;所述第二批次为所述第一批次的下一批次;基于所述第二批次的批次索引,通过所述至少一个工作进程读取所述第二批次对应的待处理数据并进行预处理,得到所述第二批次的预处理数据;在所述至少一个工作进程接收到所述主进程发送的所述第二批次的预处理数据获取请求情况下,通过所述至少一个工作进程将得到的所述第二批次的预处理数据发送至所述主进程。

在一些实施例中,所述第二创建模块1002,还用于在所述主进程和每一所述工作进程之间创建通信管道。

在一些实施例中,所述第二创建模块1002,还用于响应于所述训练任务在第一训练周期的结束事件,停止所述至少一个工作进程,并保持所述中间服务器进程的运行状态;响应于所述训练任务在第二训练周期的启动事件,通过所述主进程重新发送所述第二训练周期对应的工作进程创建请求至所述中间服务器进程,以启动所述第二训练周期的训练任务;所述第二训练周期为所述第一训练周期的下一训练周期。

在一些实施例中,所述任务处理装置1000还包括:终止模块,其中,所述终止模块,用于响应于所述训练任务的完成事件,通过所述主进程发送停止指令至所述中间服务器进程,以停止所述中间服务器进程;在所述中间服务器进程已停止的情况下,结束所述主进程。

以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本公开装置实施例中未披露的技术细节,请参照本公开方法实施例的描述而理解。

需要说明的是,本公开实施例中,如果以软件功能模块的形式实现上述的任务处理方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台设备执行本公开各个实施例方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本公开实施例不限制于任何目标的硬件和软件结合。

图11为本公开实施例提供的一种任务处理设备的硬件实体示意图,如图11所示,该任务处理设备1100的硬件实体包括:处理器1101和存储器1102,其中,存储器1102存储有可在处理器1101上运行的计算机程序,处理器1101执行程序时实现上述任一实施例的方法中的步骤。在一些实施方式中,游戏桌上收赔游戏币的设备1100可以是上述任一实施例中所说明的检测设备。

存储器1102存储有可在处理器上运行的计算机程序,存储器1102配置为存储由处理器1101可执行的指令和应用,还可以缓存待处理器1101以及任务处理设备1100中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(FLASH)或随机访问存储器(Random Access Memory,RAM)实现。

处理器1101执行程序时实现上述任一项的任务处理方法的步骤。处理器1101通常控制任务处理设备1100的总体操作。

本公开实施例提供一种计算机存储介质,计算机存储介质存储有一个或者多个程序,该一个或者多个程序可被一个或者多个处理器执行,以实现如上任一实施例的任务处理方法的步骤。

这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本公开存储介质和设备实施例中未披露的技术细节,请参照本公开方法实施例的描述而理解。

上述处理器可以为目标用途集成电路(Application Specific IntegratedCircuit,ASIC)、数字信号处理器(Digital Signal Processor,DSP)、数字信号处理装置(Digital Signal Processing Device,DSPD)、可编程逻辑装置(Programmable LogicDevice,PLD)、现场可编程门阵列(Field Programmable Gate Array,FPGA)、中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器中的至少一种。可以理解地,实现上述处理器功能的电子器件还可以为其它,本公开实施例不作具体限定。

上述计算机存储介质/存储器可以是只读存储器(Read Only Memory,ROM)、可编程只读存储器(Programmable Read-Only Memory,PROM)、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性随机存取存储器(Ferromagnetic Random Access Memory,FRAM)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(Compact Disc Read-Only Memory,CD-ROM)等存储器;也可以是包括上述存储器之一或任意组合的各种终端,如移动电话、计算机、平板设备、个人数字助理等。

应理解,说明书通篇中提到的“一个实施例”或“一实施例”或“本公开实施例”或“前述实施例”或“一些实施例”意味着与实施例有关的目标特征、结构或特性包括在本公开的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”或“本公开实施例”或“前述实施例”或“一些实施例”未必一定指相同的实施例。此外,这些目标的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本公开的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本公开实施例的实施过程构成任何限定。上述本公开实施例序号仅仅为了描述,不代表实施例的优劣。

在未做特殊说明的情况下,检测设备执行本公开实施例中的任一步骤,可以是检测设备的处理器执行该步骤。除非特殊说明,本公开实施例并不限定检测设备执行下述步骤的先后顺序。另外,不同实施例中对数据进行处理所采用的方式可以是相同的方法或不同的方法。还需说明的是,本公开实施例中的任一步骤是检测设备可以独立执行的,即检测设备执行上述实施例中的任一步骤时,可以不依赖于其它步骤的执行。

在本公开所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。

上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。

另外,在本公开各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本公开所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。

本公开所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。

本公开所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。

或者,本公开上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、检测设备、或者网络设备等)执行本公开各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、磁碟或者光盘等各种可以存储程序代码的介质。

在本公开实施例中,不同实施例中相同步骤和相同内容的说明,可以互相参照。在本公开实施例中,术语“并”不对步骤的先后顺序造成影响。

以上所述,仅为本公开的实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。

相关技术
  • 任务处理网络生成、任务处理方法、装置、电子设备及存储介质
  • 存储设备的任务处理方法、装置、设备及可读存储介质
技术分类

06120113284251