一种多模块调度方法、装置及系统与流程

文档序号:18059086发布日期:2019-07-03 02:56阅读:240来源:国知局
一种多模块调度方法、装置及系统与流程

本发明涉及计算机科学领域,特别涉及一种多模块调度方法、装置及系统。



背景技术:

目前在深度学习领域中,在一个学习任务中会设置许多学习模块。通常采用如下的技术方案实现多模块调度:将每一个模块封装成一个进程,模块之间依靠进程之间的socket通信机制,通过发布和订阅消息来获取需要的输入数据和发送输出数据。该方案的优点在于,各进程可以实现跨机通信,每个模块所在的进程可以分布在不同机器间,无需改变系统架构。

以自动驾驶技术中的深度学习任务为例,如图1所示,单机1上运行如下模块:摄像头1、车辆检测1、车辆追踪1、摄像头2、车辆检测2、车辆追踪2、融合1,单机2上运行如下模块:摄像头3、车辆检测3、车辆追踪3和分割5,这些模块均被封装为单独的进程,车辆检测1获取摄像头1输出的数据第一帧图像p11,对数据p11进行处理后,输出数据p11’,车辆跟踪1获取摄像头1输出的数据p11和车辆检测1输出的数据p11’,对数据p11和p11’进行处理,得到数据g11。同理,车辆检测2和车辆追踪2,以及车辆检测3和车辆追踪3具有与上述相类似的处理,并且分别得到数据g21和g31。分割3获取摄像头3输出的数据p31,并对数据p31进行处理,得到数据q31。融合分别获取来自车辆追踪1、车辆追踪2、车辆追踪3和分割3的数据p11、p21、p31和q31,并对数据进行处理得到结果,并将该结果输出给控制器。图1中各进程之间的通信机制为socket机制,通过发布和订阅消息来获取进程所需要的输入数据和输出数据。

但是在上述的多模块调度方案中,存在至少两个技术问题:

第一,计算模块的输入数据存在不一致。如图1中的进程车辆跟踪1需要来自进程摄像头1的输出数据p1和来自进程车辆检测1的输出数据p1’。但是由于系统使用消息机制传递信息时存在延时,当车辆检测1将输出数据p1’发送到车辆跟踪1时,车辆跟踪1接收到的来自摄像头1的数据是第二帧图像p12、而不是第一帧图像p11,从而导致进程车辆跟踪1的计算错误。当模块数目增大时,这种不一致性的问题更加显著,并且会扩大计算错误。

第二,计算模块间数据传输时延显著。由于将各个计算模块都封装为单独的进程,进程之间通过通信机制进行数据的传输,当进程之间传递大量的图片信息时,该通信需要进行大量的序列化、反序列化、压缩、解压缩等操作,这样极大地增加了通信开销,增大了处理时长。经过测试,在同一台机器内,进程之间发送和接收一张图片的延时在5毫秒(ms)左右,在两台机器之间进行进程之间的传输,时延高达40ms。这样高的时延极大地增加了系统整体的延时,大幅度地降低了系统的吞吐量。



技术实现要素:

鉴于上述问题,本发明提供一种多模块调度方法、装置和系统,以解决现有多模块调度技术中存在的技术问题计算模块的输入数据存在不一致、计算模块间数据传输时延显著中的至少之一。

根据本申请的一个方面,提供了一种多模块调度方法,包括:

主进程读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程包括按照计算方向组合的多个计算模块;有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;

主进程在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;

根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;

向待调用节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;

在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;

在确定全部节点的状态更新结束后,进行下一个计算周期的处理。

根据本申请的另一个方面,提供了一种多模块调度方法,包括:

在当前计算周期中,从进程中的一个计算模块接收来自主进程的远程过程调用(rpc)的调用请求;其中,从进程中包括根据计算方向组合的多个计算模块;对于具有多个输入数据的计算模块,调用请求是主进程在确定计算模块的多个输入数据都已就绪的情况下发出的;

该计算模块响应于调用请求执行处理;

在处理执行完成后,计算模块向主进程反馈应答响应。

根据本申请的另一个方面,提供了一种多模块调度装置,包括:

读取模块,用于读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程包括按照计算方向组合的多个计算模块;有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;

执行模块,用于在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;向待调用的节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;在确定全部节点的状态更新结束时,进行下一个计算周期的处理。

根据本申请的另一个方面,提供了一种多模块调度装置,该多模块调度装置应用在一个从进程中,从进程中包括按照计算方向组合的多个多模块调度装置,该装置包括:

接收模块,用于在当前计算周期中,接收来自主进程的远程过程调用(rpc)的调用请求;对于具有多个输入数据的多模块调度装置,调用请求是主进程在确定多模块调度装置的多个输入数据都已就绪的情况下发出的;

执行模块,用于响应于调用请求执行处理;

反馈模块,用于在执行模块执行完处理后,计算模块向主进程反馈应答响应。

根据本申请的另一个方法,提供了一种多模块调度装置,包括:一个处理器和至少一个存储器,至少一个存储器中存储有至少一条机器可执行指令,处理器执行至少一条机器可执行指令以实现:

读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程包括按照计算方向组合的多个计算模块;有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;

在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;

根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;

向待调用节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;

在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;

在确定全部节点的状态更新结束时,进行下一个计算周期的处理。

根据本申请的另一个方面,提供了一种多模块调度装置,包括一个处理器和至少一个存储器,至少一个存储器中存储有至少一条机器可执行指令,处理器执行至少一条机器可执行指令以实现:

在当前计算周期中,收来自主进程的远程过程调用(rpc)的调用请求;对于具有多个输入数据的多模块调度装置,调用请求是主进程在确定多模块调度装置的多个输入数据都已就绪的情况下发出的;

响应于调用请求执行处理;

在处理执行完成后向主进程反馈应答响应。

根据本申请的另一个方面,提供了一种多模块调度系统,包括:主进程和多个从进程;其中,每个从进程包括按照计算方向组合的多个计算模块;

主进程用于读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程;有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;主进程在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;向待调用节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;在确定全部节点的状态更新结束时,进行下一个计算周期的处理;

从进程中的一个计算模块接收来自主进程的rpc的调用请求;该计算模块响应于调用请求执行处理;在处理执行完成后,计算模块向主进程反馈应答响应。

根据本申请实施例提供的技术方案,主进程根据有向计算图来控制从进程中所有计算模块的计算逻辑,即主进程通过rpc来控制计算模块的执行,并且根据模块执行的情况来维护与模块对应的节点的状态,以及节点的输出的状态;在一个节点的多个输入边的状态均为完成的情况下,才能调用执行与节点对应的计算模块,在收到应答响应的情况下,更新该节点的状态和该节点的输出边的状态,也即,计算模块在一个计算周期中的多个输入数据都完成的情况下,计算模块才会得到调用执行处理,从而能够控制保证计算模块的输入数据的一致性。

附图说明

附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。

图1为现有技术中包括多模块的学习任务的架构示意图;

图2为本申请实施例提供了多模块调度系统的结构示意图;

图3a为本申请实施例提供的一种多模块调度方法的流程图;

图3b为与图2中从进程对应的有向计算图;

图3c为图3a中步骤302的处理流程图;

图4为本申请提供的另一种多模块调度方法的处理流程图;

图5a为本申请实施例提供的一种多模块调度装置的结构框图;

图5b为本申请实施例提供的一种多模块调度装置的另一种结构框图;

图6为本申请实施例提供的一种多模块调度装置的结构框图;

图7为本申请实施例提供的一种多模块调度装置的结构框图;

图8为本申请实施例提供的一种多模块调度装置的结构框图;

图9a为申请实施例提供的多模块调度系统在应用场景中的结构示意图;

图9b为申请实施例提供的多模块调度系统在应用场景中的另一结构示意图;

图10为与图9b中的从进程相对应的有向计算图。

具体实施方式

为了使本技术领域的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

针对现有的多模块调度的方案中存在的技术问题:计算模块的输入数据不一致以及计算模块间的通信时延显著,本申请提出了一种多模块调度的技术方案,以解决至少一个现有技术中的上述问题。

在本申请提供的技术方案中,设置主进程和从进程,从进程中包括按照计算方向组合的多个计算模块,主进程中预存有一个有向计算图,有向计算图中包括多个节点,每个节点对应于一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;主进程根据有向计算图来控制从进程中所有计算模块的计算逻辑,即主进程通过远程过程调用(remoteprocesscall,rpc)来控制计算模块的执行,并且根据模块执行的情况来维护与模块对应的节点的状态,以及节点的输出的状态;在一个节点的多个输入边的状态均为完成的情况下,才能调用执行与节点对应的计算模块,在收到应答响应的情况下,更新该节点的状态和该节点的输出边的状态,也即,计算模块在一个计算周期中的多个输入数据都完成的情况下,才会调用计算模块执行处理,从而能够控制保证计算模块的输入数据的一致性。

更进一步地,从进程中包括按照计算方向组合的多个计算模块,从进程中还具有一个对应的共享存储空间,共享存储空间中包括与进程中的每个计算模块相对应的存储空间,计算模块之间不再通过进程之间的通信机制进行数据传输,而是通过进程内共享的存储空间来进行数据的读取和写入,从而能够提高计算模块之间的通信效率,降低通信延时,提高多模块之间整体的通信效率,提高系统吞吐量。

以下结合附图对本申请的技术方案进行详细说明。

图2示出了本申请实施例提供了多模块调度系统的结构示意图,在该系统中包括一个主进程21和多个从进程22,主进程21和从进程22可以被配置在一个终端上,也可以配置在多个终端上,多个从进程22可以分开配置,也可以集中配置。每个从进程都包括按照计算方向组合的多个计算模块。

主进程21用于控制从进程22中计算模块的计算逻辑,即主进程21用于调用从进程中各个计算模块的执行,并且维护、更新从进程22中各个计算模块的状态。从进程22中的计算模块用于根据主进程的调用,执行相应的处理。

具体地,主进程21读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程22包括按照计算方向组合的多个计算模块;有向计算图中包括多个节点,每个节点对应一个从进程22中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;主进程21在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;向待调用节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;在确定全部节点的状态更新结束时,进行下一个计算周期的处理。

从进程22中的一个计算模块接收来自主进程的rpc的调用请求该计算模块响应于调用请求执行处理;在处理执行完成后,计算模块向主进程反馈应答响应。

下面分别说明主进程21和从进程22的工作原理。

图3a示出了本申请实施例提供的一种多模块调度方法的流程图,该方法应用在图2所示的主进程21端。如图3a所示该方法包括如下处理过程:

步骤301、主进程读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程包括按照计算方向组合的多个计算模块;图3b中示出了一个示例性的有向计算图,如图3b所示,有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边。

其中,主进程又可以包括主线程和线程池,线程池中包括多个从线程。

步骤302、主进程在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态。

其中,节点的状态包括:未就绪(unready)、就绪(ready)、运行(run)和结束(done);连接边的状态包括:未完成(uncomplete)和完成(complete)。

在一个实施例中,步骤302包括如图3c所示的处理过程:

步骤3021、在计算起始时,主线程判断有向计算图中所有节点的状态是否为done状态;

也即,主线程判断是否还有节点对应的计算模块处于处理执行中,如果全部节点的状态为done则说明全部计算模块都已经结束处理,上一个计算周期已经完成了,当前计算周期刚刚开始;如果还有节点的状态不为done,则说明还有些计算模块有待调用或者处于处理中,当前计算周期未结束;

步骤3022、在判断为是的情况下,将有向计算图中起始节点的状态重置为ready,其它节点的状态设置为unready,并将所有的连接边的状态设置为uncomplete。

在上一个计算周期已经完成、当前计算周期刚刚开始时,主线程仅将起始节点的状态修改为ready,即起始节点可以获得调用,其它节点有待调用。

步骤3023、在判断为否的情况下,主线程将自身的状态设置为等待。也即当前计算周期未结束,主线程等待本次计算周期的结束。

在当前计算周期尚未结束,从进程中的一些计算模块有待调用或者处于处理中,主线程不能进行下一个计算周期的处理,必须处于等待状态。

步骤303、根据有向计算图中的计算方向以及节点的状态确定待调用节点。

在一个实施例中,在计算起始时,在初始化全部节点和全部连接边的状态后,主线程根据计算方向遍历有向计算图中的各个节点的状态,将状态为ready的节点确定为待调用节点,其中,状态为ready的节点包括起始节点;将待调用节点的状态修改为run,并将待调用节点推送到计算队列中;并且主线程进行下一个计算周期的处理,主线程进行下一个计算周期的处理后执行步骤3021,判断当前还有节点的状态不为done,则进入到步骤3023,进入等待状态。

也即,在当前计算周期的计算起始时,待调用节点只包括起始节点。主线程将待调用节点推送到计算队列之后,主线程结束在当前计算周期中的处理,但是当前计算周期并未结束,主线程进入下一个计算周期的等待状态。

或者,在计算过程中,线程池中的一个从线程根据计算方向遍历有向计算图中的各个节点的状态,将状态为ready的节点确定为待调用节点,其中,状态为ready的节点包括节点的多个输入边均为complete状态的节点,将待调用节点的状态修改为run,并将待调用节点推送到计算队列中。

也即,在当前计算周期的计算过程中,只有节点的多个输入边的状态均为complete的节点才是待调用节点,相对应地,计算模块在一个计算周期中的多个输入数据都已经就绪的情况下,计算模块才能得到调用,从而能够保证多模块调用中计算模块的输入数据的一致性。

步骤304、向待调用节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;

在一个实施例中,线程池中的一个从线程从计算队列中取出一个节点,向该节点对应的从进程中的计算模块发送rpc的调用请求。

更进一步,在另一个实施例中,根据预存的配置文件,线程池中的一个从线程确定从计算队列中取出的节点所对应的计算模块的标识、以及计算模块的输入数据的存储地址和/或输出数据的存储地址,将该计算模块的标识、输入数据的存储地址和/或输出数据的存储地址以及携带在调用请求中;

其中,计算模块的输出数据的存储地址是计算模块所在的从进程所对应的共享存储空间中的地址,该地址与计算模块相对应;或者,输出数据的存储地址是另一个从进程所应对的共享存储空间中的地址,该地址与计算模块相对应,也即在另一个从进程中为该计算模块分配有对应的存储地址;计算模块的输入数据的存储地址是计算模块所在的从进程所对应的共享存储空间中的地址。

也即,在每个从进程中都具有一个对应的共享存储空间。在一个从进程的共享存储空间中,从进程的每个计算模块在共享存储空间中具有一个对应的存储空间。计算模块将处理的结果也即输出数据写入到与模块对应的存储空间中。根据计算方向,一个计算模块的输出数据是另一个计算模块的输入数据,则另一个计算模块的输入数据的存储地址是该计算模块的输出数据的存储地址。

当一个计算模块需要同一个从进程中的另一个计算模块的输出数据作为输入数据时,主线程在调用请求中携带另一个计算模块的存储空间的地址作为该计算模块的输入数据的存储地址,该计算模块根据调用请求直接从另一个计算模块对应的存储空间中读取所需的输入数据。

在当前从进程中的一个计算模块b需要另一个从进程中的计算模块a的输出数据作为输入数据时,主线程在发送给计算模块a的调用请求中携带计算模块a在当前从进程中的存储空间的地址作为该计算模块a的输出数据的存储地址,计算模块b从计算模块a在当前从进程的共享存储空间中的存储地址中获取数据作为输入数据,这一部分将在后续对从进程的工作原理的说明中进行阐述。

步骤305、在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;

在一个实施例中,线程池中的一个从线程在收到针对一个节点所发出的调用请求的应答响应后,将该节点的状态设置为done,将该节点的输出边的状态修改为complete,并且将所有输入边均为complete的节点的状态设置为ready。

这样,节点对应的计算模块执行完处理后,从线程根据响应将该节点的状态设置为done,将节点的输出边的状态修改为complete,所有输入边的状态均为complete、节点状态为ready的节点即为一个待调用节点。根据上述步骤303的处理,从线程将会将该节点确定为待调用节点,并将节点推送到计算队列中。

步骤306、在确定全部节点的状态更新结束时,进行下一个计算周期的处理。

在一个实施例中,线程池中的一个从线程遍历有向计算图中的各个节点的状态,在确定有向计算图中所有节点的状态为done的情况下,通知或唤醒(notify)处于等待状态的主线程。

也即,所有节点的状态均为done时当前计算周期执行完成,可以进行下一个计算周期的处理,从线程唤醒处于等待状态的主线程,执行下一个计算周期的处理。

从上述处理过程中可以看出,本申请实施例提供的主进程端的多模块调度方法,能够由主进程来控制从进程中的多个计算模块的计算逻辑,并且在一个计算周期中,在一个节点的多个输入边的状态均为完成的情况下,该节点对应的模块才能够得到调用进行计算或处理,能够保证计算模块的在一个计算周期中的输入数据的一致性,不会出现多个输入数据来自于不同的计算周期的情况,从而能够解决现有技术中计算模块的输入数据不一致的问题。

进一步地,在主进程通过rpc向从进程中的计算模块发送调用请求时,在调用请求中携带计算模块的输入数据的存储地址和输出数据的存储地址,输入数据的存储地址和输出数据的存储地址为从进程对应的共享存储空间中的地址,这些计算模块之间的数据通信可以通过在共享存储空间中进行数据的读写来实现,能够提高模块之间的通信效率、降低通信时延、提高处理吞吐量,从而能够解决现有技术中计算模块之间的通信效率低、时延大、吞吐量低的问题。更进一步地,在计算模块的输出数据的地址是另一个从进程中的共享存储空间中的地址的情况下,还能跨进程将输出数据写入到其它从进程的共享存储空间中,从而能够实现计算模块之间跨进程的数据通信。

本申请的实施例还提供了一种多模块调度方法,该方法应用在图2的从进程中,如图4所示,本申请提供的多模块调度方法的处理流程包括如下过程:

步骤401、在当前计算周期中,从进程的一个计算模块接收来自主进程的远程过程调用(rpc)的调用请求,其中,从进程中包括根据计算方向组合的多个计算模块;对于具有多个输入数据的计算模块,调用请求是主进程在确定计算模块的多个输入数据都已就绪的情况下发出的;

在一个实施例中,接收到的调用请求中包括计算模块的标识、输入数据的存储地址和/或输出数据的存储地址;输出数据的存储地址是从进程所对应的共享存储空间中的地址,该地址与计算模块相对应;或者,输出数据的存储地址是另一个从进程所应对的共享存储空间中的地址,该地址与计算模块相对应;输入数据的存储地址是从进程所对应的共享存储空间中的地址;

在另一个实施例中,为了便于实现计算模块以及计算模块的远程调用,可以将计算模块封装成一个服务(service)函数。

步骤402、该计算模块响应于调用请求执行处理。

与上述实施例相对应,计算模块响应于调用请求,从输入数据的存储地址读取输入数据执行处理,并将输出数据写入到输出数据的存储地址中。在输入数据的存储地址和输出数据的存储地址都是当前从进程中的共享存储空间的情况下,计算模块之间可以高效地进行数据的通信。

进一步,在计算模块的输出数据的存储地址是在另一个从进程的共享存储空间中所对应的地址的情况下,计算模块将处理结果作为输出数据写入到另一个从进程的共享存储空间中与该计算模块相对应的地址中,从而实现计算模块之间跨进程的数据传输。

步骤403、在处理执行完成后,计算模块向主进程反馈应答响应。

从上述处理过程中可以看出,根据本申请实施例提供的从进程端的多模块调度方法,从进程不对计算逻辑进行控制,计算模块响应于主进程的调用而执行处理,对于具有多个输入数据的计算模块,调用请求是主进程在确定计算模块的多个输入数据都已就绪的情况下发出的,这样能够保证计算模块在一个计算周期中的输入数据的一致性,不会出现多个输入数据来自于不同的计算周期的情况,从而能够解决现有技术中计算模块的输入数据不一致的问题。

进一步地,从进程中的计算模块响应于调用请求,分析得到调用请求中携带的计算模块的输入数据的存储地址和输出数据的存储地址,输入数据的存储地址和输出数据的存储地址均为从进程对应的共享存储空间中的地址,这些计算模块之间的数据通信可以通过在共享存储空间中进行数据的读写来实现,能够提高模块之间的通信效率、降低通信时延、提高处理吞吐量,从而能够解决现有技术中计算模块之间的通信效率低、时延大、吞吐量低的问题。更进一步地,在计算模块的输出数据的地址是另一个从进程中的共享存储空间中的地址的情况下,还能够跨进程实现计算模块之间的数据通信。

基于相同的发明构思,本申请的实施例还相应地提供了一种多模块调度装置,如图5a所示,该装置包括:

读取模块51,用于读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程包括按照计算方向组合的多个计算模块;有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边。

其中,节点的状态包括:未就绪(unready)、就绪(ready)、运行(run)和结束(done);连接边的状态包括:未完成(uncomplete)和完成(complete)。

执行模块53,用于在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;向待调用的节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;在确定全部节点的状态更新结束时,进行下一个计算周期的处理。

在一个实施例中,如图5b所示,执行模块53包括主线程模块531和线程池模块532,线程池模块532中包括多个从线程模块533。

执行模块53在在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态,包括:在计算起始时,主线程模块531判断有向计算图中所有节点的状态是否为done状态;在判断为是的情况下,将有向计算图中起始节点的状态重置为ready,其它节点的状态设置为unready,并将所有的连接边的状态设置为uncomplete;在判断为否的情况下,主线程模块531将自身的状态设置为等待。

执行模块53根据有向计算图中的计算方向以及节点的状态确定待调用节点,包括:在计算起始时,在初始化全部节点和全部连接边的状态后,主线程模块531根据计算方向遍历有向计算图中的各个节点的状态,将状态为ready的节点确定为待调用的节点,其中,状态为ready的节点包括起始节点;将待调用节点的状态修改为run,并待调用节点推送到计算队列中,并且主线程模块进行下一个计算周期的处理;或者,在计算过程中,线程池模块532中的一个从线程模块533根据计算方向遍历有向计算图中的各个节点的状态,将状态为ready的节点确定为待调用节点,其中,状态为ready的节点包括节点的多个输入边均为complete状态的节点,将待调用节点的状态修改为run,并待调用节点推送到计算队列中。

执行模块53向待调用的节点对应的从进程中的计算模块发送rpc的调用请求以执行该计算模块,包括:线程池模块532中的一个从线程模块533从计算队列中取出一个节点,向该节点对应的从进程中的计算模块发送rpc的调用请求。

从线程模块533还用于:根据预存的配置文件,确定从计算队列中取出的节点所对应的计算模块的标识、以及计算模块的输入数据的存储地址和/或输出数据的存储地址,将该计算模块的标识、输入数据的存储地址和/或输出数据的存储地址以及携带在调用请求中。计算模块的输出数据的存储地址是计算模块所在的从进程所对应的共享存储空间中的地址,该地址与计算模块相对应,或者,输出数据的存储地址是另一个从进程所应对的共享存储空间中的地址,该地址与计算模块相对应。计算模块的输入数据的存储地址是计算模块所在的从进程所对应的共享存储空间中的地址。

执行模块53在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态,包括:线程池模块532中的一个从线程模块533在收到针对一个节点所发出的调用请求的应答响应后,将该节点的状态设置为done,将该节点的输出边的状态修改为complete,并且将所有输入边均为complete的节点的状态设置为ready。

执行模块53在确定全部节点的状态更新结束时,进行下一个计算周期的处理,包括:线程池模块532中的一个从线程模块533遍历有向计算图中的各个节点的状态,在确定有向计算图中所有节点的状态为done的情况下,通知(notify)处于等待状态的主线程进行下一个计算周期的处理。

根据图5a或者图5b所示的多模块调度装置,能够由作为主进程的多模块调度装置来控制从进程中的多个计算模块的计算逻辑,并且在一个计算周期中,在一个节点的多个输入边的状态均为完成的情况下,该节点对应的模块才能够得到调用进行计算或处理,能够保证计算模块的在一个计算周期中的输入数据的一致性,不会出现多个输入数据来自于不同的计算周期的情况,从而能够解决现有技术中计算模块的输入数据不一致的问题。

进一步地,在主进程(多模块调度装置)通过rpc向从进程中的计算模块发送调用请求时,在调用请求中携带计算模块的输入数据的存储地址和输出数据的存储地址,输入数据的存储地址和输出数据的存储地址为从进程对应的共享存储空间中的地址,这些计算模块之间的数据通信可以通过在共享存储空间中进行数据的读写来实现,能够提高模块之间的通信效率、降低通信时延、提高处理吞吐量,从而能够解决现有技术中计算模块之间的通信效率低、时延大、吞吐量低的问题。更进一步地,在计算模块的输出数据的地址是另一个从进程中的共享存储空间中的地址的情况下,还能够实现计算模块之间跨进程的数据通信。

基于相同的发明构思,本申请实施例还提供了一种多模块调度装置,该多模块调度装置应用在一个从进程中,从进程中包括按照计算方向组合的多个多模块调度装置,如图6所示,该装置包括:

接收模块61,用于在当前计算周期中,接收来自主进程的远程过程调用(rpc)的调用请求;对于具有多个输入数据的多模块调度装置,调用请求是主进程在确定多模块调度装置的多个输入数据都已就绪的情况下发出的;

在一个实施例中,接收模块接收到的调用请求中包括计算模块的标识、输入数据的存储地址和/或输出数据的存储地址;输出数据的存储地址是从进程所对应的共享存储空间中的地址,该地址与计算模块相对应;或者,输出数据的存储地址是另一个从进程所应对的共享存储空间中的地址,该地址与计算模块相对应。输入数据的存储地址是从进程所对应的共享存储空间中的地址。

执行模块63,用于响应于调用请求执行处理;

在一个实施例中,从输入数据的存储地址读取输入数据执行处理,并将输出数据写入到输出数据的存储地址中。

在一个实施例中,在输出数据的存储地址是另一个从进程所对应的共享存储空间中的地址的情况下,执行模块将处理结果作为输出数据写入到多模块调度装置在另一个从进程的共享存储空间中对应的存储地址中。

反馈模块65,用于在执行模块执行完处理后,计算模块向主进程反馈应答响应。

根据本申请实施例提供的从进程端的多模块调度装置,从进程端不对计算逻辑进行控制,作为计算模块的多模块调度装置响应于主进程的调用而执行处理,对于具有多个输入数据的计算模块,调用请求是主进程在确定计算模块的多个输入数据都已就绪的情况下发出的,这样能够保证计算模块在一个计算周期中的输入数据的一致性,不会出现多个输入数据来自于不同的计算周期的情况,从而能够解决现有技术中计算模块的输入数据不一致的问题。

进一步地,从进程中的计算模块(多模块调度装置)响应于调用请求,分析得到调用请求中携带的输入数据的存储地址和输出数据的存储地址,输入数据的存储地址和输出数据的存储地址为从进程对应的共享存储空间中的地址,这些计算模块(多模块调度装置)之间的数据通信可以通过在共享存储空间中进行数据的读写来实现,能够提高模块(多模块调度装置)之间的通信效率、降低通信时延、提高处理吞吐量,从而能够解决现有技术中计算模块之间的通信效率低、时延大、吞吐量低的问题。更进一步地,在计算模块的输出数据的地址是另一个从进程中的共享存储空间中的地址的情况下,还能够跨进程实现计算模块之间的数据通信。

基于相同的发明构思,本申请实施例还提供了一种多模块调度装置,如图7所示,该装置包括:一个处理器71和至少一个存储器73,至少一个存储器73中存储有至少一条机器可执行指令,处理器71执行至少一条机器可执行指令以实现:

读取预存的配置文件,配置文件中保存有一个有向计算图;其中,有向计算图与一个计算任务相对应,计算任务包括多个从进程,每个从进程包括按照计算方向组合的多个计算模块;有向计算图中包括多个节点,每个节点对应一个从进程中的一个计算模块,节点之间具有连接边,进入节点的连接边为输入边,离开节点的连接边为输出边;

在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态;

根据有向计算图中的计算方向以及节点的状态确定待调用节点,其中,待调用节点包括节点的多个输入边均为完成状态的节点;

向待调用节点对应的从进程中的计算模块发送远程过程调用(rpc)的调用请求以执行该计算模块;

在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态;

在确定全部节点的状态更新结束时,进行下一个计算周期的处理。

在一个实施例中,处理器71执行至少一条机器可执行指令以实现主线程和线程池,线程池中包括多个从线程;节点的状态包括:未就绪(unready)、就绪(ready)、运行(run)和结束(done);连接边的状态包括:未完成(uncomplete)和完成(complete)。

在一个实施例中,处理器71执行至少一条机器可执行指令以实现在当前计算周期中,在计算开始时初始化全部节点和全部连接边的状态,包括:在计算起始时,主线程判断有向计算图中所有节点的状态是否为done状态;在判断为是的情况下,将有向计算图中起始节点的状态重置为ready,其它节点的状态设置为unready,并将所有的连接边的状态设置为uncomplete;在判断为否的情况下,主线程将自身的状态设置为等待。

在一个实施例中,处理器71执行至少一条机器可执行指令以实现根据有向计算图中的计算方向以及节点的状态确定待调用节点,包括:在计算起始时,在初始化全部节点和全部连接边的状态后,主线程根据计算方向遍历有向计算图中的各个节点的状态,将状态为ready的节点确定为待调用的节点,其中,状态为ready的节点包括起始节点;将待调用节点的状态修改为run,并将待调用节点推送到计算队列中,并且主线程进行下一个计算周期的处理;或者,在计算过程中,线程池中的一个从线程根据计算方向遍历有向计算图中的各个节点的状态,将状态为ready的节点确定为待调用的节点,其中,状态为ready的节点包括节点的多个输入边均为complete状态的节点,将待调用节点的状态修改为run,并将待调用节点推送到计算队列中。

在一个实施例中,处理器71执行至少一条机器可执行指令以实现向待调用的节点对应的从进程中的计算模块发送rpc的调用请求以执行该计算模块,包括:线程池中的一个从线程从计算队列中取出一个节点,向该节点对应的从进程中的计算模块发送rpc的调用请求。

在一个实施例中,处理器71执行至少一条机器可执行指令还实现:根据预存的配置文件,线程池中的一个从线程确定从计算队列中取出的节点所对应的计算模块的标识、以及计算模块的输入数据的存储地址和/或输出数据的存储地址,将该计算模块的标识、输入数据的存储地址和/或输出数据的存储地址以及携带在调用请求中。计算模块的输出数据的存储地址是计算模块所在的从进程所对应的共享存储空间中的地址,该地址与计算模块相对应;或者,输出数据的存储地址是另一个从进程所应对的共享存储空间中的地址,该地址与计算模块相对应。计算模块的输入数据的存储地址是计算模块所在的从进程所对应的共享存储空间中的地址。

在一个实施例中,处理器71执行至少一条机器可执行指令以实现:在收到针对调用请求的应答响应后,更新该节点的状态和该节点的输出边的状态,包括:线程池中的一个从线程在收到针对一个节点所发出的调用请求的应答响应后,将该节点的状态设置为done,将该节点的输出边的状态修改为complete,并且将所有输入边均为complete的节点的状态设置为ready。

在一个实施例中,处理器71执行至少一条机器可执行指令以实现:在确定全部节点的状态更新结束时,进行下一个计算周期的处理,包括:线程池中的一个从线程遍历有向计算图中的各个节点的状态,在确定有向计算图中所有节点的状态为done的情况下,通知(notify)处于等待状态的主线程进行下一个计算周期的处理。

根据如图7所示的多模块调度装置,能够由作为主进程的多模块调度装置来控制从进程中的多个计算模块的计算逻辑,并且在一个计算周期中,在一个节点的多个输入边的状态均为完成的情况下,该节点对应的模块才能够得到调用进行计算或处理,能够保证计算模块的在一个计算周期中的输入数据的一致性,不会出现多个输入数据来自于不同的计算周期的情况,从而能够解决现有技术中计算模块的输入数据不一致的问题。

进一步地,在主进程(多模块调度装置)通过rpc向从进程中的计算模块发送调用请求时,在调用请求中携带计算模块的输入数据的存储地址和输出数据的存储地址,输入数据的存储地址和输出数据的存储地址为从进程对应的共享存储空间中的地址,这些计算模块之间的数据通信可以通过在共享存储空间中进行数据的读写来实现,能够提高模块之间的通信效率、降低通信时延、提高处理吞吐量,从而能够解决现有技术中计算模块之间的通信效率低、时延大、吞吐量低的问题。更进一步地,在计算模块的输出数据的地址是另一个从进程中的共享存储空间中的地址的情况下,还能够实现计算模块之间跨进程的数据通信。

根据相同的发明构思,本申请实施例还提供了一种多模块调度装置,如图8所示,该装置包括:一个处理器81和至少一个存储器83,至少一个存储器83中存储有至少一条机器可执行指令,处理器81执行至少一条机器可执行指令以实现:

在当前计算周期中,收来自主进程的远程过程调用(rpc)的调用请求;对于具有多个输入数据的多模块调度装置,调用请求是主进程在确定多模块调度装置的多个输入数据都已就绪的情况下发出的;

响应于调用请求执行处理;

在处理执行完成后向主进程反馈应答响应。

在一个实施例中,处理器81执行至少一条机器可执行指令还实现:接收到的调用请求中包括计算模块的标识、输入数据的存储地址和/或输出数据的存储地址;输出数据的存储地址是从进程所对应的共享存储空间中的地址,该地址与计算模块相对应;或者,输出数据的存储地址是另一个从进程所应对的共享存储空间中的地址,该地址与计算模块相对应。输入数据的存储地址是从进程所对应的共享存储空间中的地址;

在一个实施例中,处理器81执行至少一条机器可执行指令以实现:响应于调用请求执行处理,包括:响应于调用请求,从输入数据的存储地址读取输入数据执行处理,并将输出数据写入到输出数据的存储地址中。

根据本申请实施例提供的从进程端的多模块调度装置,从进程端不对计算逻辑进行控制,作为计算模块的多模块调度装置响应于主进程的调用而执行处理,对于具有多个输入数据的计算模块,调用请求是主进程在确定计算模块的多个输入数据都已就绪的情况下发出的,这样能够保证计算模块在一个计算周期中的输入数据的一致性,不会出现多个输入数据来自于不同的计算周期的情况,从而能够解决现有技术中计算模块的输入数据不一致的问题。

进一步地,从进程中的计算模块(多模块调度装置)响应于调用请求,分析得到调用请求中携带的输入数据的存储地址和输出数据的存储地址,输入数据的存储地址和输出数据的存储地址为从进程对应的共享存储空间中的地址,这些计算模块(多模块调度装置)之间的数据通信可以通过在共享存储空间中进行数据的读写来实现,能够提高模块(多模块调度装置)之间的通信效率、降低通信时延、提高处理吞吐量,从而能够解决现有技术中计算模块之间的通信效率低、时延大、吞吐量低的问题。更进一步地,在计算模块的输出数据的地址是另一个从进程中的共享存储空间中的地址的情况下,还能够跨进程实现计算模块之间的数据通信。

下面对本申请提供的技术方案在具体应用场景中的实现进行说明。

本申请提供的多模块调度方法可以应用在自动驾驶领域的深度学习中。

如图1所示,在现有技术中,自动驾驶领域的深度学习任务通常包括如下计算模块:摄像头(sensor)、车辆检测(detection)、车辆追踪(tracking)、分割(segmentation)、融合(fusion)。摄像头模块获取无人驾驶车辆的驾驶环境的图像,车辆检测模块用于识别出摄像头拍摄的每帧图片中的车辆位置,车辆追踪模块用于将车辆检测模块的一段连续图像帧的输出作为输入,并标识出这段连续的图像帧内的相同的车辆,分割模块用于识别出车道线的位置,融合模块根据多个车载追踪模块的输出来计算车辆周围的路况信息。

将本申请提供的多模块调度方案应用在自动驾驶领域的深度学习任务中,如图9a所示,设置一个主进程(master),三个从进程(server),从进程1中包括计算模块:摄像头1、车辆检测1、车辆追踪1、融合1,从进程2中包括计算模块:摄像头2、车辆检测2、车辆追踪2,从进程3中包括计算模块:摄像头3、车辆检测3、车辆追踪、分割5。从进程1和从进程2设置在单机1上,主进程和从进程3设置在单机2上。图9a中计算模块之间的单向箭头表示计算方向和数据的传输方向,如在从进程1中车辆检测1的输入数据为摄像头1的输出数据,车辆追踪1的输入数据包括摄像头1的输出数据和车辆检测1的输出数据,计算模块融合1的输入数据包括从进程1中的车辆追踪1的输出数据、从进程2中的车辆追踪2的输出数据、从进程3中的车辆追踪3的输出数据和从进程3中的分割模块5的输出数据。其它从进程中的计算方向与此同理,不做一一阐述。

每个从进程中分配有一个共享存储空间,并且在每个从进程的共享存储空间中都为从进程的每个计算模块分配有对应的存储地址,如图9a所示,为从进程1-3分配的共享存储空间为r1-3,在从进程1的共享存储空间中分别为摄像头1、车辆检测1、车辆追踪1和融合1分配了各自对应的存储空间r1-s、r1-d、r1-t、r1-f,其它的从进程中也是类似的情况,从进程2中的共享存储空间中包括r2-s、r2-d、r2-t,从进程3中的共享存储空间中包括r3-s、r3-d、r3-t、r3-g。计算模块之间通过将输出数据写入对应的存储空间,以及从共享存储空间中读取输入数据,来实现计算模块之间的数据传输。

仔细分析图9a可知,融合模块1需要跨进程读取输入数据。融合模块1不仅需要同一个从进程中的车辆追踪模块1的输出数据,还需要从进程2中的车辆追踪模块2的输出数据、从进程3中的车辆追踪模块3的输出数据、从进程3中的分割模块5的输出数据。从进程内部通过在共享存储空间中读写数据进行数据通信,不同从进程的计算模块之间无法通过这样的方法进行数据通信。

为了解决这一问题,在深度学习任务中,为需要进行跨进程进行数据传输的模块设置拷贝模块,并且为拷贝模块分配跨进程的共享存储空间中的存储地址作为输出数据的存储地址,主进程在发送给拷贝模块的rpc调用请求中携带该输出数据的存储地址。如图9b所示,从进程1的共享存储空间中还为从进程2中的拷贝模块4’、从进程3中的拷贝模块4”、从进程3中的拷贝模块4”’分别分配了各自对应的存储空间,具体为:r1-2c、r1-3c、r1-4c。

如图9b所示,拷贝模块2用于根据主进程的rpc请求,在从进程2的共享存储空间中车辆追踪2对应的存储空间r2-t中读出数据,并将读出的数据作为输出数据写入到拷贝模块2在从进程1的共享存储空间中对应的存储地址r1-2c中,拷贝模块3和拷贝模块4的工作原理与此类似。

通过设置拷贝模块,能够实现计算模块之间跨进程的数据传输。

与图9b相对应,预先为深度学习任务生成一个配置文件,配置文件中保存有一个有向计算图,该有向计算图如图10所示。在图10中,对应于从进程1,节点1代表摄像头1,节点2代表车辆检测1、节点3代表车辆追踪1、节点4代表融合模块;对应于从进程2,节点1’代表摄像头2,节点2’代表车辆检测2,节点3’代表车辆追踪2;对应于从进程3,节点1”代表摄像头3,节点2”代表车辆检测3,节点3”代表车辆追踪3,节点5代表从进程3中的分割模块5。此外,在图10中,节点4’代表从进程2中的拷贝模块2,节点4”代表从进程3中的拷贝模块3,节点4”’代表从进程3中的拷贝模块4。

图10中模块之间的单向箭头表示计算方向和数据的传输方向,图10中的计算方向和数据传输方向和图9中的计算方向和传输方向一致。

下面通过一个整体的处理流程来说明图9b所示计算模块的处理过程。

步骤s1、主进程中的主线程读取配置文件,获取如图10所示的有向计算图;

步骤s2、主线程判断当前计算周期中是否还有处于计算的计算模块(具体地,可以判断全部节点的状态是否均为done),在判断为否的情况下处理进行到步骤s4,在判断为是的情况下处理进行到步骤s3;

步骤s3、主线程判断还有处于计算中的计算模块,进入等待状态;

步骤s4、主线程判断全部节点的状态均为done,主线程初始化图10中全部节点的状态和全部连接边的状态,具体地,将节点1、节点1’、节点1”的状态设置为ready,其它节点的状态设置为unready,将所有连接边的状态设置为uncomplete;

步骤s5、主线程将节点1、节点1’、节点1”的状态修改为run,并将节点1、节点1’、节点1”推送到计算队列中;主线程进入到下一个计算周期,主线程的处理返回到步骤s2;

注:在以下的说明中,线程池中的从线程与从进程或者计算模块之间均不存在对应关系,以下为了方便说明按照从线程的顺序进行说明。

步骤s6、线程池中的一个从线程a从计算队列中取出节点1,向节点1对应的计算模块摄像头1发送rpc调用请求,在请求中携带输出数据的存储地址,也即摄像头1在进程1的共享存储空间中的存储地址r1-s;

线程池中的一个从线程b从计算队列中取出节点1’,向节点1’对应的模块摄像头2发送rpc调用请求,在请求中携带输出数据的存储地址,也即摄像头2在进程2的共享存储空间中的存储地址r2-s;

线程池中的一个从线程c从计算队列中取出节点1”,向节点1”对应的模块摄像头3发送rpc调用请求,在请求中携带输出数据的存储地址,也即摄像头3在进程3的共享存储空间中的存储地址r3-s;

步骤s7、响应于调用请求,摄像头1将获取的数据写入到进程1中的存储地址r1-s内,向从线程a反馈应答响应;

响应于调用请求,摄像头2将获取的数据写入到进程2中的存储地址r2-s内,向从线程b反馈应答响应;

响应于调用请求,摄像头3将获取的数据写入到进程3中的存储地址r3-s内,向从线程c反馈应答响应;

步骤s8、从线程a接收到应答响应后,将节点1的状态设置为done,并将节点1的两个输出边1-2、1-3的状态设置为complete;

从线程b接收到应答响应后,将节点1’的状态设置为done,并将节点1’的两个输出边1’-2’、1’-3’的状态设置为complete;

从线程c接收到应答响应后,将节点1”的状态设置为done,并将节点1’的三个输出边1”-2”、1”-3”、1”-5的状态设置为complete;

步骤s9、从线程a将输入边的状态为complete的节点2的状态修改为ready;

从线程b将输入边的状态为complete的节点2’的状态修改为ready;

从线程c将输入边的状态为complete的节点2”的状态修改为ready,将输入边的状态为complete的节点5的状态修改为ready;

步骤s10、从线程a遍历有向计算图中各个节点的状态,将状态为ready的节点2的状态设置为run,将节点2推送到计算队列中;

从线程b遍历有向计算图中各个节点的状态,将状态为ready的节点2’的状态设置为run,将节点2’推送到计算队列中;

从线程c遍历有向计算图中各个节点的状态,将状态为ready的节点2”和5的状态设置为run,将节点2”和节点5推送到计算队列中;

步骤s11、从线程a从计算队列中取出从计算队列中取出节点2,向节点2对应的模块车辆检测1发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头1在进程1的共享存储空间中的存储地址r1-s,输出数据地址为车辆检测1在进程1的共享存储空间中的存储地址r1-d;

从线程b从计算队列中取出节点2’,向节点2’对应的模块车辆检测2发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头2在进程2的共享存储空间中的存储地址r2-s,输出数据地址为车辆检测2在进程2的共享存储空间中的存储地址r2-d;

从线程c从计算队列中取出节点2”,向节点2”对应的模块车辆检测3发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头3在进程3的共享存储空间中的存储地址r3-s,输出数据地址为车辆检测3在进程3的共享存储空间中的存储地址r3-d;

从线程d从计算队列中取出节点5,向节点5对应的分割模块发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头3在进程3的共享存储空间中的存储地址r3-s,输出数据地址为分割模块在进程3的共享存储空间中的存储地址r3-g;

步骤s12、根据调用请求,车辆检测1在从进程1的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程a反馈应答响应;

根据调用请求,车辆检测2在从进程2的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程b反馈应答响应;

根据调用请求,车辆检测3在从进程3的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程c反馈应答响应;

根据调用请求,分割模块5在从进程3的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程d反馈应答响应;

步骤s13、从线程a接收到应答响应后,将节点2的状态设置为done,并将节点2的一个输出边2-3的状态设置为complete;

从线程b接收到应答响应后,将节点2’的状态设置为done,并将节点2’的一个输出边2’-3’的状态设置为complete;

从线程c接收到应答响应后,将节点2”的状态设置为done,并将节点2”的一个输出边2”-3”的状态设置为complete;

从线程d接收到应答响应后,将节点5的状态设置为done,并将节点5的一个输出边5-4”’的状态修改为complete;

步骤s14、从线程a将输入边1-3、2-3的状态均为complete的节点3的状态修改为ready;

从线程b将输入边1’-3’、2’-3’的状态均为complete的节点3’的状态修改为ready;

从线程c将输入边1”-3”、2”-3”的状态均为complete的节点3”的状态修改为ready;

从线程d将输入边5-4”’的状态为complete的节点4”’的状态修改为ready;

步骤s15、从线程a遍历有向计算图中各个节点的状态,将状态为ready的节点3的状态设置为run,将节点3推送到计算队列中;

从线程b遍历有向计算图中各个节点的状态,将状态为ready的节点3’的状态设置为run,将节点3’推送到计算队列中;

从线程c遍历有向计算图中各个节点的状态,将状态为ready的节点3”的状态设置为run,将节点3”推送到计算队列中;

从线程d遍历有向计算图中各个节点的状态,将状态为ready的节点4”’的状态设置为run,将节点4”’推送到计算队列中;

步骤s16、从线程a从计算队列中取出从计算队列中取出节点3,向节点3对应的模块车辆追踪1发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头1在进程1的共享存储空间中的存储地址r1-s和车辆检测1在进程1的共享存储空间中的地址r1-d,输出数据地址为车辆追踪1在进程1的共享存储空间中的存储地址r1-t;

从线程b从计算队列中取出节点3’,向节点3’对应的模块车辆追踪2发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头2在进程2的共享存储空间中的存储地址r2-s和车辆检测2在进程2的共享存储空间中的地址r2-d,输出数据地址为车辆追踪2在进程2的共享存储空间中的存储地址r2-t;

从线程c从计算队列中取出节点3”,向节点3”对应的模块车辆追踪3发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为摄像头3在进程3的共享存储空间中的存储地址r3-s和车辆检测3在进程3的共享存储空间中的存储地址r3-d,输出数据地址为车辆追踪3在进程3的共享存储空间中的存储地址r3-t;

从线程d从计算队列中取出节点4”’,向节点4”’对应的拷贝模块4发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为分割模块5在进程3的共享存储空间中的存储地址r3-g,输出数据地址为拷贝模块4在进程1的共享存储空间中的存储地址r1-4c;

步骤s17、根据调用请求,车辆追踪1在从进程1的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程a反馈应答响应;

根据调用请求,车辆追踪2在从进程2的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程b反馈应答响应;

根据调用请求,车辆追踪3在从进程3的共享存储空间中读取输入数据,并执行处理,将输出数据写入到调用请求中指定的输出数据存储地址中,向从线程c反馈应答响应;

根据调用请求,拷贝模块4在从进程3的共享存储空间中读取输入数据,将读取的数据作为输出数据写入到从进程1的工作存储空间的地址中,向从线程d反馈应答响应;

步骤s18、从线程a接收到应答响应后,将节点3的状态设置为done,并将节点3的一个输出边3-4的状态设置为complete;

从线程b接收到应答响应后,将节点3’的状态设置为done,并将节点3’的一个输出边3’-4’的状态设置为complete;

从线程c接收到应答响应后,将节点3”的状态设置为done,并将节点3”的一个输出边3”-4”的状态设置为complete;

从进程d接收到应答响应后,将节点4”’的状态设置为done,并将节点4”’的一个输出边4”’-4的状态设置为complete;

步骤s19、从线程b将输入边3’-4’的状态均为complete的节点4’的状态修改为ready;

从线程c将输入边3”-4”的状态均为complete的节点4”的状态修改为ready;

步骤s20、从线程b遍历有向计算图中各个节点的状态,将状态为ready的节点4’的状态设置为run,将节点4’推送到计算队列中;

从线程c遍历有向计算图中各个节点的状态,将状态为ready的节点4”的状态设置为run,将节点4”推送到计算队列中;

步骤21、从线程b从计算队列中取出节点4’,向节点4’对应的拷贝模块2发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为车辆追踪2在进程2的共享存储空间中的存储地址r2-t,输出数据地址为拷贝模块2在进程1的共享存储空间中的存储地址r1-2c;

从线程c从计算队列中取出节点4”,向节点4”对应的拷贝模块3发送rpc调用请求,在请求中携带输入数据的存储地址和输出数据的存储地址,输入数据地址为车辆追踪3在进程3的共享存储空间中的存储地址r3-t,输出数据地址为拷贝模块3在进程1的共享存储空间中的存储地址r1-3c;

步骤s22、根据调用请求,拷贝模块2在从进程2的共享存储空间中读取输入数据,并执行处理,将读取的数据作为输出数据写入到从进程1的工作存储空间的地址中,向从线程b反馈应答响应;

根据调用请求,拷贝模块3在从进程3的共享存储空间中读取输入数据,并执行处理,将读取的数据作为输出数据写入到从进程1的工作存储空间的地址中,向从线程c反馈应答响应;

步骤s23、从线程b接收到应答响应后,将节点4’的状态设置为done,并将节点4’的一个输出边4’-4的状态设置为complete;

从线程c接收到应答响应后,将节点4”的状态设置为done,并将节点4”的一个输出边4”-4的状态设置为complete;

步骤s24、从线程a将全部输入边3-4、4’-4、4”-4、4”’-4的状态均为complete的节点4的状态修改为ready;

步骤s25、从线程a遍历有向计算图中各个节点的状态,将状态为ready的节点4的状态设置为run,将节点4推送到计算队列中;

步骤s26、从线程a从计算队列中取出节点4,向节点4对应的融合模块4发送rpc调用请求,在请求中携带输入数据的存储地址,输入数据地址为车辆追踪1在从进程1的共享存储空间中的存储地址r1-t、拷贝模块2在从进程1的共享存储空间中的存储地址r1-2c、拷贝模块3在从进程1的共享存储空间中的存储地址r1-3c、拷贝模块4在从进程1的共享存储空间中的存储地址r1-4c;

步骤s27、根据调用请求,融合模块4在从进程1的共享存储空间中读取输入数据,并执行处理,将处理结果作为本次处理周期的处理结果,并输出该处理结果,向从线程a反馈应答响应;

步骤s28、从线程a接收到应答响应后,将节点4的状态设置为done;

步骤s29、从进程a遍历有向计算图中的各个节点的状态,确定有向计算图中所有节点的状态均为done,唤醒(notify)在步骤s3中处于等待状态的主线程,进行下一个计算周期的处理,即进行到步骤s4。

通过上述处理过程可以看出,主进程根据有向计算图来控制从进程中所有计算模块的计算逻辑,即主进程通过rpc调用来控制计算模块的执行,并且根据模块执行的情况来维护与模块对应的节点的状态,以及节点的输出的状态;在一个节点的多个输入边的状态均为完成的情况下,才能调用执行与节点对应的计算模块,在收到应答响应的情况下,更新该节点的状态和该节点的输出边的状态,也即,计算模块在一个计算周期中的多个输入数据都完成的情况下,计算模块才会得到调用执行处理,从而能够控制保证计算模块的输入数据的一致性。

更进一步地,从进程中还具有一个对应的共享存储空间,共享存储空间中包括与进程中的每个计算模块相对应的存储空间,计算模块之间不再通过进程之间的通信机制进行数据传输,而是通过进程内共享的存储空间来进行数据的读取和写入,从而能够提高计算模块之间的通信效率,降低通信延时,提高多模块之间整体的通信效率,提高系统吞吐量。

以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,对本领域普通技术人员而言,能够理解本发明的方法和装置的全部或者任何步骤或者部件可以在任何计算装置(包括处理器、存储介质等)或者计算装置的网络中,以硬件固件、软件或者他们的组合加以实现,这是本领域普通技术人员在阅读了本发明的说明的情况下运用它们的基本编程技能就能实现的。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1