神经网络模型的指令调度方法及装置转让专利

申请号 : CN201811276880.X

文献号 : CN109272109B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李军李建军黄畅

申请人 : 北京地平线机器人技术研发有限公司

摘要 :

公开了一种神经网络模型的指令调度方法及装置,包括:在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;选择所述第二指令序列中的至少一条指令;将所述至少一条指令插入到所述第一指令序列中;以及,运行包含所述至少一条指令的所述第一指令序列。本申请能够在不增加硬件资源的前提下提高多个神经网络模型的整体执行效率。

权利要求 :

1.一种神经网络模型的指令调度方法,包括:

在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;

选择所述第二指令序列中的至少一条指令;

对所述至少一条指令进行校验以确定所述至少一条指令于所述第一指令序列中的合法位置;

将校验后的所述至少一条指令插入到所述第一指令序列中;以及运行包含所述至少一条指令的所述第一指令序列。

2.根据权利要求1所述的指令调度方法,其中,选择所述第二指令序列中的至少一条指令,包括:遍历所述第二指令序列以查找所述第二指令序列中的首位计算指令;以及,选择所述第二指令序列中的在所述首位计算指令之前的指令。

3.根据权利要求1所述的指令调度方法,其中,将所述至少一条指令插入到所述第一指令序列中,包括:按照指令操作的数据由大到小的次序逐个将所述至少一条指令插入到所述第一指令序列中。

4.根据权利要求1所述的指令调度方法,其中,所述至少一条指令为用于加载所述第二神经网络模型运算所需数据的加载指令。

5.根据权利要求1所述的指令调度方法,其中,将所述至少一条指令插入到所述第一指令序列中,包括:将所述至少一条指令插入到所述第一指令序列中的计算指令之间。

6.根据权利要求1所述的指令调度方法,其中,对所述至少一条指令进行校验以确定所述至少一条指令于所述第一指令序列中的所述合法位置,包括:校验所述至少一条指令与所述第一指令序列中的各条指令之间是否存在数据冲突和/或硬件资源冲突,以确定所述至少一条指令于所述第一指令序列中的所述合法位置,以便将所述至少一条指令插入到所述第一指令序列中。

7.根据权利要求6所述的指令调度方法,其中,

如果所述至少一条指令于所述第一指令序列中存在两个或更多合法位置,确定并行时间最长的合法位置为所述至少一条指令的插入位置。

8.根据权利要求6所述的指令调度方法,其中,如果所述至少一条指令于所述第一指令序列中存在两个或更多合法位置,确定并行时间最长且在第一指令序列中最靠前的合法位置为所述至少一条指令的插入位置。

9.根据权利要求6所述的指令调度方法,其中,

如果所述至少一条指令于所述第一指令序列中不存在合法位置,拆分所述至少一条指令为两组指令,将所述两组指令中与所述第一指令序列中的指令不存在数据冲突的一组指令插入到所述第一指令序列中。

10.根据权利要求9所述的指令调度方法,其中,所述拆分所述至少一条指令为两组指令,包括:确定所述至少一条指令与所述第一指令序列中的指令之间存在冲突的数据和不存在冲突的数据;以及,按照所述存在冲突的数据和不存在冲突的数据,将所述至少一条指令拆分为两组指令,所述两组指令中的第一组指令用于操作所述存在冲突的数据,所述两组指令中的第二组指令用于操作所述不存在冲突的数据。

11.根据权利要求7或8所述的指令调度方法,其中,确定并行时间最长的合法位置,包括:确定第一指令序列中在各个合法位置处与所述至少一条指令并行的一条或多条指令;

基于该一条或多条指令操作数据的大小估算所述各个合法位置的并行时间;

基于估算的所述各个合法位置的并行时间,确定并行时间最长的合法位置。

12.根据权利要求6所述的指令调度方法,其中,从所述第一指令序列的末尾开始针对逐条指令执行所述校验。

13.根据权利要求6所述的指令调度方法,其中,校验所述至少一条指令与第一指令序列中各条指令之间是否存在数据冲突,包括:判断所述至少一条指令所访问的内存地址与第一指令序列的指令所访问的内存地址是否重叠,以及所述至少一条指令和/或所述第一指令序列中的指令是否将对该内存地址中的数据执行写操作;

在所述内存地址重叠且所述至少一条指令和/或所述第一指令序列的指令将对该内存地址中的数据执行写操作时,确定所述至少一条指令与第一指令序列的该条指令存在数据冲突。

14.根据权利要求6所述的指令调度方法,其中,校验所述至少一条指令与第一指令序列中各条指令之间是否存在硬件资源冲突,包括:查询预先配置的各条指令与其所使用硬件资源之间的映射关系信息,基于所述映射关系信息判断所述至少一条指令与第一指令序列的指令是否需要使用同一硬件资源;

在需要使用同一硬件资源时确定所述至少一条指令与所述第一指令序列的指令存在硬件资源冲突。

15.根据权利要求1所述的指令调度方法,其中,

所述确定要运行的对应第二神经网络模型的第二指令序列的步骤、选择所述第二指令序列中的至少一条指令的步骤、对所述至少一条指令进行校验以确定所述至少一条指令于所述第一指令序列中的所述合法位置的步骤、以及将校验后的所述至少一条指令插入到所述第一指令序列中的步骤由第二处理器执行;

所述第一指令序列和第二指令序列由第一处理器编译,且所述第一处理器和所述第二处理器是不同类型的处理器。

16.一种电子设备,包括:

一个或多个处理器;以及

存储器,存储有计算机指令,所述计算机指令在被所述处理器运行时使所述处理器执行根据权利要求1至15中任一项所述的方法。

17.一种神经网络模型的指令调度装置,包括:

指令序列确定单元,配置为在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;

指令选择单元,配置为选择所述第二指令序列中的至少一条指令;

指令插入单元,配置为对所述至少一条指令进行校验以确定所述至少一条指令于所述第一指令序列中的合法位置,并将校验后的所述至少一条指令插入到所述第一指令序列中;以及指令运行单元,配置为运行包含所述至少一条指令的所述第一指令序列。

18.一种计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行如权利要求1至15中任一项所述的方法。

说明书 :

神经网络模型的指令调度方法及装置

技术领域

[0001] 本申请涉及人工神经网络的技术领域,尤其涉及一种神经网络模型的指令调度方法及装置。

背景技术

[0002] 在某些特定的应用场景(比如,自动驾驶、人脸识别)中,需要运行多个神经网络模型才能获得所需的结果。而对于需要运行多个神经网络模型来获得所需结果的情况,如何在这多个神经网络模型的指令序列之间建立流水线,减少硬件资源的闲置和浪费,从而在不增加硬件资源的前提下尽可能的提高多个神经网络的整体执行效率,目前尚未提出有效的解决方案。

发明内容

[0003] 为了解决上述技术问题,提出了本申请。本申请的实施例提供了一种神经网络模型的指令调度方法及装置。
[0004] 根据本申请的一个方面,提供了一种神经网络模型的指令调度方法,包括:
[0005] 在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;
[0006] 选择所述第二指令序列中的至少一条指令;
[0007] 将所述至少一条指令插入到所述第一指令序列中;以及
[0008] 运行包含所述至少一条指令的所述第一指令序列。
[0009] 根据本申请的另一个方面,提供了一种电子设备,包括:一个或多个处理器;以及,存储器,存储有计算机指令,所述计算机指令在被所述处理器运行时使所述处理器执行上述神经网络模型的指令调度方法。
[0010] 根据本申请的另一个方面,提供了一种神经网络模型的指令调度装置,包括:
[0011] 指令序列确定单元,配置为在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;
[0012] 指令选择单元,配置为选择所述第二指令序列中的至少一条指令;
[0013] 指令插入单元,配置为将所述至少一条指令插入到所述第一指令序列中;以及[0014] 指令运行单元,配置为运行包含所述至少一条指令的所述第一指令序列。
[0015] 另外,本申请还提供一种计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行如上述神经网络模型的指令调度方法。
[0016] 通过根据本申请的示例的方法和装置,能够在多个神经网络模型的指令序列之间建立流水线,进而减少硬件资源的闲置和浪费,更多的发挥硬件资源的流水执行能力,在不增加硬件资源的前提下提高多个神经网络的整体执行效率。

附图说明

[0017] 通过结合附图对本申请实施例进行更详细的描述,本申请的上述以及其他目的、特征和优势将变得更加明显。附图用来提供对本申请实施例的进一步理解,并且构成说明书的一部分,与本申请实施例一起用于解释本申请,并不构成对本申请的限制。在附图中,相同的参考标号通常代表相同部件或步骤。
[0018] 图1是相关技术中神经网络模型的指令序列内部指令调度的示意图。
[0019] 图2是相关技术中三个神经网络模型的整体运行流程示意图。
[0020] 图3是本申请适用的系统结构图。
[0021] 图4是图3所示系统的异构网络架构示例图。
[0022] 图5是本申请一示例性实施例提供的神经网络模型指令调度方法的流程示意图。
[0023] 图6是本申请一示例性实施例中将一指令序列中的指令插入到另一指令序列的示例性流程的示意图。
[0024] 图7是本申请一示例性实施例提供的神经网络模型的指令调度的示例性执行过程的示意图。
[0025] 图8是本申请一示例性实施例提供的使用本申请实施例提供的神经网络模型的指令调度方法后三个神经网络模型的整体执行流程的示例性示意图。
[0026] 图9是本申请一示例性实施例提供的由图4所示系统执行神经网络模型的指令调度方法的示例性过程的示意图。
[0027] 图10是本申请一示例性实施例提供的神经网络模型的指令调度装置的一示例性结构示意图。
[0028] 图11是本申请一示例性实施例提供的神经网络模型的指令调度装置的另一示例性结构示意图。
[0029] 图12是本申请一示例性实施例提供的电子设备的结构图。

具体实施方式

[0030] 下面,将参考附图详细地描述根据本申请的示例实施例。显然,所描述的实施例仅仅是本申请的一部分实施例,而不是本申请的全部实施例,应理解,本申请不受这里描述的示例实施例的限制。
[0031] 申请概述
[0032] 在某些应用场景中,需要运行多个神经网络模型才可获得所需的结果。比如,在人脸识别中,先调用一神经网络模型检测一幅图像中是否含有人的脸部图像,如果有人的脸部图像,再调度另一神经网络模型对该幅图像中人的脸部图像进行识别,最终获得所需的结果。如果有多幅图像,需要同时调用多个神经网络模型来进行检测,同样,如果多幅图像中均有人的脸部图像,那么也需要调用多个神经网络模型来进行识别。再比如,在自动驾驶中,则需要多种神经网络模型来对实时采集的图像进行检测、识别等处理,才可获得最终结果。可见,需要运行多个神经网络模型才可获得所需结果的场景非常多见。在这些场景中如何提高这多个神经网络模型的整体执行效率非常关键。
[0033] 在流水线技术中,硬件资源的流水执行能力强烈依赖于指令序列,指令调度较为合理的指令序列能够在保障运算结果正确性的前提下更多地发挥硬件资源的流水执行能力,减少硬件资源的闲置和浪费。相关技术中,由于每个神经网络模型的指令序列是在运行前生成的,而编译器在运行前只能以神经网络模型为单位进行编译,这就意味着编译器只能在单个神经网络模型的指令序列内部调度指令来实现指令序列内部的流水线,而不能在多个神经网络模型的指令序列之间调度指令,也就无法在多个神经网络模型的指令序列之间建立流水线。
[0034] 神经网络模型在开始运行的时候,不能立刻开始运算,而是需要先加载数据。由于多个神经网络的指令序列之间无法建立流水线,因此,在每个神经网络模型开始阶段的加载过程中计算单元(比如,BPU)只能等待,这造成了硬件资源的浪费和执行效率的降低。图1示出了相关技术中神经网络模型的指令序列内部指令调度的示例,通过图1可见,尽管指令序列内部的指令调度可通过序列内部指令间的并行来掩盖该指令序列的部分运行时间,但每个神经网络模型在开始阶段的加载时间无法掩盖,在此期间BPU只能等待,不仅造成了硬件资源的浪费,而且也降低了这多个神经网络模型的整体执行效率。
[0035] 从整体来看,每个神经网络模型的执行过程可以简化为“开始阶段的加载数据->中间阶段的计算->最后阶段的存储结果”。当有多个神经网络模型需要运行的时候,由于相关技术无法在多个神经网络模型的指令序列之间建立流水线,因此,这多个神经网络模型需要逐个执行,其执行过程是:先执行第一个神经网络模型,等第一个神经网络模型结束,再执行第二个神经网络模型,以此类推。图2示出了三个神经网络模型的整体运行流程示例,其中,三个神经网络模型整体的运行流程是:先执行神经网络模型1的加载、计算和存储,在神经网络模型1执行结束后再执行神经网络模型2的加载、计算和存储,在神经网络模型2执行结束后再执行神经网络3的加载、计算和存储,这整个运行过程需要3*3=9个时间段,而在这9个时间段中有3个时间段(即时间段1、时间段4和时间段7)BPU处于闲置状态,整体执行效率非常低。
[0036] 对于某些应用场景来说,为获得所需结果需要频繁调用众多结构比较简单的神经网络模型(例如,只有三到四层卷积的神经网络模型),由于无法在这多个神经网络模型的指令序列之间建立流水线,因此,每调用一次神经网络模型,BPU就必须等待一次加载,这样,BPU会长时间地处于闲置状态,相应的这多个神经网络模型的整体运行效率也非常低。根据统计,这些结构比较简单的神经网络模型开始阶段的加载时间占其整个运行时长的
30%-50%,即每调用一次神经网络模型,BPU在该神经网络模型整个运行时长的30%-50%的时间里均处于闲置状态,也就是说,通过调用这些神经网络模型获得所需结果的过程中,BPU在至少30%-50%的运行时间里处于闲置状态,这必然导致这些神经网络模型的整体执行效率十分低下。
[0037] 由上可见,在需要运行多个神经网络模型才能获得所需结果的情况下,如何在这多个神经网络模型的指令序列之间建立流水线,减少硬件资源的闲置和浪费,从而在不增加硬件资源的前提下尽可能的提高多个神经网络的整体执行效率,是亟待解决的技术问题。
[0038] 针对上述技术问题,本申请的基本构思是提出一种神经网络模型的指令调度方法、装置、电子设备及计算机可读存储介质,在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;选择所述第二指令序列中的至少一条指令;将所述至少一条指令插入到所述第一指令序列中;以及,运行包含所述至少一条指令的所述第一指令序列。本申请实施例,通过将对应第二神经网络模型的第二指令序列中的至少一条指令调度到对应第一神经网络模型的第一指令序列中,使得第二神经网络模型的至少一条指令能够与第一神经网络模型中的指令并行,也就在第一指令序列与第二指令序列之间建立了流水线,能够在确保运算结果正确的前提下更多的发挥硬件资源的流水执行能力,进而减少硬件资源(比如,BPU)的闲置和浪费,在不增加硬件资源的前提下提高多个神经网络模型的整体执行效率。尤其是对于需要频繁调用众多结构比较简单的神经网络模型的情况,通过本申请实施例可在不增加硬件资源的前提下大幅提高这些神经网络模型的整体执行效率。
[0039] 需要说明的是,尽管上文以众多结构比较简单的神经网络模型的应用场景为例进行说明,但本申请实施例的适用范围不限于此。对于需要运行两个或两个以上的神经网络模型的任意场景,本申请实施例均可适用。比如,对于需要多个结构比较复杂的神经网络模型的场景,本申请实施例仍适用。
[0040] 示例性系统
[0041] 本申请的实施例可适用于任何支持多个神经网络模型运行的系统,该系统可以为异构网络结构,也可以为同构网络结构。
[0042] 图3为上述支持多个神经网络模型运行的系统的示例性结构30,包括:相互连接或通信的编译设备301和运行设备302,编译设备301负责在运行之前(即离线状态下)编译各个神经网络模型的指令序列,运行设备302负责运行编译设备提供的各个神经网络模型的指令序列。这里,编译设备301可通过一个或多个处理器来实现,这些处理器运行有编译器,实际应用中这些处理器可通过强性能的CPU来实现;运行设备302可包括一个或多个处理器,这些处理器中的一台或多台可用于实现神经网络相关的计算,这些计算包括但不限于:卷积、激活函数的计算、池化等。
[0043] 图4为图3所示系统的异构网络结构示例40,其中,第一处理器401属于上述编译设备301,存储器403、第二处理器402和第三处理器404属于上述的运行设备302。其中,第一处理器401负责在运行前编译各神经网络模型的指令序列,第二处理器402负责在运行时将各神经网络模型的指令序列装载到存储器403,存储器403负责在运行时存储处于等待状态的各神经网络模型的指令序列,第三处理器404负责在运行时从存储器403中读取神经网络模型的指令序列并运行该指令序列。这里,第一处理器401可以为强性能的CPU,其配置有编译器;第二处理器402可以为弱性能的ARM处理器,第三处理器404可以为大脑处理器(BPU,Brain Processing Unit)、张量处理单元(TPU,Tensor Processing Unit)等支持神经网络相关计算的处理器,存储器403可以为内存(例如DDR)或非易失性存储器(例如硬盘、SSD、Flash、EEPROM等)。
[0044] 需要说明的是,上述图3和图4仅为示例,本申请实施例适用的系统不限于此。本申请实施例可应用于支持两个或两个以上神经网络模型运行的任意系统。
[0045] 示例性方法
[0046] 图5是本申请一示例性实施例提供的神经网络模型的指令调度的示例性方法500。如图5所示,该示例性方法500包括如下步骤:
[0047] 步骤501,在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;
[0048] 步骤502,选择所述第二指令序列中的至少一条指令;
[0049] 步骤503,将所述至少一条指令插入到所述第一指令序列中;以及,
[0050] 步骤504,运行包含所述至少一条指令的所述第一指令序列。
[0051] 本申请实施例中,在需要运行第一神经网络模型的第一指令序列时,通过将第二神经网络模型的至少一条指令插入到第一神经网络模型的指令序列中,在第一指令序列与第二指令序列之间建立了流水线,第二神经网络模型的至少一条指令能够与第一神经网络模型中的指令并行,在确保运算结果正确的前提下更大程度的发挥了硬件资源的流水执行能力,节省了这多个神经网络模型的整体运行时间,进而减少了硬件资源(比如,BPU)的闲置和浪费,在不增加硬件资源的前提下提高了多个神经网络模型的整体执行效率。对于需要频繁调用众多结构比较简单的神经网络模型的情况,通过本申请实施例可在不增加硬件资源的前提下大幅提高这些神经网络模型的整体执行效率。
[0052] 本申请实施例,步骤501中在需要运行第一指令序列时(即在第一指令序列处于等待状态时)确定在其之后要运行的第二指令序列,以便在步骤502~步骤503中针对即将运行的第一指令序列及紧随其后的第二指令序列进行指令序列之间的指令调度,从而按照多个神经网络模型的实际运行顺序建立了多个指令序列之间的流水线,使得这多个指令序列之间的流水线不会影响多个神经网络模型的整体运算结果,确保运算结果正确。
[0053] 本申请实施例中,步骤501中第二指令序列的确定,取决于第一神经网络模型的运算结果、和/或当前场景下最终需要的结果。
[0054] 本申请实施例的一种实现方式中,步骤501中可以在调用各个神经网络模型时动态确定接下来运行哪个神经网络模型,由此即可确定要运行的第二指令序列具体是哪个。具体地,可以根据第一神经网络模型的运算结果、以及当前场景最终需要的结果来确定接着需要调用哪个神经网络模型(即第二神经网络模型是哪个),在确定要调用哪个神经网络模型时即确定了在第一指令序列之后需要运行哪个指令序列。以人脸识别为例,神经网络模型1(本申请所述的第一神经网络模型的一示例)用于检测原始图像中是否有人的脸部图像,神经网络模型2(本申请所述的第二神经网络模型的一示例)用于对原始图像中人的脸部图像进行识别,神经网络模型1对应指令序列1(本申请所述的第一指令序列的一示例),神经网络模型2对应指令序列2,那么,如果神经网络模型1的检测结果为原始图像中有人的脸部图像,则需要继续调用神经网络模型2进行识别,此时即可确认在指令序列1之后需要运行指令序列2。如果神经网络模型1的结果为原始图像中不存在人的脸部图像,则不需要继续调用神经网络模型2进行识别,即在指令序列1之后不再需要运行指令序列2,可以直接结束该原始图像的处理。如果同时对2000幅原始图像进行检测,那么可能需要运行2000个指令序列1来分别对该2000幅原始图像进行检测,如果检测到1000幅原始图像中有人的脸部图像,那么可能需要同时调用1000个神经网络模型2来分别对这1000幅原始图像中人的脸部图像进行识别,相应的,在这2000个指令序列1之后需要运行1000个指令序列2。
[0055] 本申请实施例的另一种实现方式中,步骤501中可以根据应用场景的需求,预先设定多个神经网络模型的调用顺序,该调用顺序即指示了这多个神经网络模型的指令序列的运行顺序。
[0056] 需要说明的是,上述两种实现方式仅为示例,本申请实施例中步骤501中具体如何确定第一指令序列之后要运行哪个指令序列,可以有多种实现方式,本申请实施例不予限制。
[0057] 本申请实施例的一些实现方式中,所述至少一条指令为用于加载所述第二神经网络模型运算所需数据的加载指令。该加载指令可以包括特征数据的加载指令和/或权重、偏移量等参数的加载指令。一种实现方式中,该至少一条指令可以为第二神经网络模型开始阶段的加载指令,即第二指令序列中第一条计算指令之前的加载指令。如此,可以将第二神经网络模型开始阶段的加载指令提前到第一神经网络模型的运行过程中,可以节省第二神经网络模型开始阶段的加载时间,减少开始阶段BPU的等待时间,从而提高执行效率。在该实现方式中,步骤503中可以将所述至少一条指令插入到所述第一指令序列中的计算指令之间。当然,还可以采用“将第二指令序列中中间部分的加载指令插入到第一指令序列中”、“将第二指令序列的计算指令插入到第一指令序列中”的实现方式。具体实施中,从第二指令序列中选择哪个或哪些指令插入到第一指令序列中,取决于具体的应用场景、各个神经网络模型的指令序列长度。对此,本申请实施例不予限制。
[0058] 本申请实施例的一些实现方式中,步骤502中选择所述第二指令序列中的至少一条指令,可以包括:遍历所述第二指令序列以查找所述第二指令序列中的首位计算指令;以及,选择所述第二指令序列中的在所述首位计算指令之前的指令。如此,可以有针对性的将第二神经网络模型开始阶段的指令作为指令序列之间调度的对象,使得第二神经网络模型的开始阶段能够与第一神经网络模型的部分阶段(比如,中间阶段)并行,从而节省第二神经网络模型开始阶段的执行时间,避免在第二神经网络模型的开始阶段硬件资源(比如,BPU)长时间等待,进而在不增加硬件资源的前提下提高多个神经网络模型的整体执行效率。
[0059] 由于指令的运行时间取决于该指令需要操作的数据大小,需要操作的数据比较大时指令的运行时间比较长,需要操作的数据比较小时指令的运行时间比较短,因此,本申请实施例的一些实现方式中,步骤503中可以按照指令操作的数据由大到小的次序逐个将所述至少一条指令插入到所述第一指令序列中。这样,可优先将第二神经网络模型中运行时间比较长的指令插入到第一指令序列,使得第二指令序列中运行时间比较长的指令能够与第一指令序列中的一条或多条指令并行,从而节省更多的运行时间(比如,第二神经网络模型开始阶段加载数据的时间),进而更多地提高多个神经网络模型的整体执行效率。
[0060] 本申请实施例中,步骤503可以包括:校验所述至少一条指令与所述第一指令序列中的各条指令之间是否存在数据冲突(也可称为依赖性冲突)和/或硬件资源冲突(也可称为结构性冲突),以确定所述至少一条指令于所述第一指令序列中的合法位置,以便将所述至少一条指令插入到所述第一指令序列中。如此,在将至少一条指令插入到第一指令序列之前,通过校验来确定至少一条指令在第一指令序列中的合法位置,可有效避免冲突的产生,在多个神经网络模型的指令序列之间建立更合理的流水线,避免这些神经网络模型运行或计算上发生错误,从而在确保这多个神经网络模型整体运算结果正确的前提下提高这多个神经网络模型的整体执行效率。
[0061] 本申请实施例的一些实现方式中,具体如何通过校验数据冲突和/或硬件资源冲突来确定合法位置,取决于是否会引起指令执行过程中的合法问题(该合法问题包括但不限于运行上的错误和/或计算上的错误)。一种实现方式中,对于只有数据冲突才会引起指令执行过程的合法问题的情况(比如,对于异步阻塞指令),只需要校验数据冲突,如果不存在数据冲突即可确认为合法位置,如果存在数据冲突即确认为非合法位置。另一种实现方式中,对于数据冲突和硬件资源冲突中任一均会引起指令执行过程的合法问题的情况(比如,对于同步阻塞指令),需要校验数据冲突和硬件资源冲突(可以先校验数据冲突再校验硬件资源冲突),如果不存在数据冲突和硬件资源冲突即可确认为合法位置,如果存在数据冲突和硬件资源冲突中任一项即确认为非合法位置。
[0062] 本实施例中,一条指令可以包括操作码,操作码用于指示该指令要执行哪些操作(即该条指令用于完成哪些任务),该操作可以包括但不限于:取数据、写数据、卷积、池化(pooling)等,通过操作码可以确定一条指令属于神经网络模型的加载指令还是计算指令。除此之外,一条指令还可以包括:地址码和操作数,地址码用于指示该指令所操作数据的内存地址,操作数用于指示该条指令要针对哪些对象(比如,特征数据、神经网络计算相关的权重、偏移量等参数)。具体应用中,可通过解析一条指令来确定该条指令的类型、操作数据的大小、内存地址等。
[0063] 本申请实施例的一些实现方式中,校验所述至少一条指令与第一指令序列中各条指令之间是否存在数据冲突,可以包括:判断所述至少一条指令所访问的内存地址与第一指令序列的指令所访问的内存地址是否重叠,以及所述至少一条指令和/或所述第一指令序列中的指令是否将对该内存地址中的数据执行写操作;在所述内存地址重叠且所述至少一条指令和/或所述第一指令序列中的指令将对该内存地址中的数据执行写操作时,确定所述至少一条指令与所述第一指令序列的指令存在数据冲突。举例来说,假设指令A为第一指令序列中的指令,指令B为第二指令序列中待插入第一指令序列的一条指令,如果指令A在地址a读取数据而指令B在地址a写数据,则确认指令A与指令B存在数据冲突;如果指令A在地址a读取数据,指令B也在地址a读数据,则确认指令A与指令B之间不存在数据冲突。也就是说,两条指令访问同一地址的数据,如果不对数据内容做更改,则确认这两条指令之间不存在数据冲突,如果有任一条指令需要对数据内容做更改,那么这两条指令之间即存在数据冲突。这里,指令访问的内存地址及其执行何种操作可通过解析指令来获得。
[0064] 本申请实施例的一种实现方式中,校验第二指令序列中的一条指令与第一指令序列中的一条指令(比如,第一指令序列中末尾的第一条指令)是否存在数据冲突时以比特为单位进行校验,即对第二指令序列中的一条指令与第一指令序列中的一条指令操作的每比特数据进行校验,以确定这两条指令是否存在数据冲突,一旦有部分数据存在冲突(即部分数据的内存地址相同且需要对该部分数据执行写操作)则视为这两条指令存在数据冲突。
[0065] 需要说明的是,上述校验数据冲突的方式仅为示例,校验第二指令序列中至少一条指令与第一指令序列中各条指令之间是否存在数据冲突还可通过其他方式来实施。对于校验数据冲突的具体实施方式,本申请不予限制。
[0066] 本申请实施例的一些实现方式中,可以通过静态配置的方式预先配置指令与硬件资源之间的映射关系信息,在校验时通过查询该映射关系信息来判断两条指令是否存在硬件资源冲突。一个示例中,上述校验第二指令序列中的至少一条指令与第一指令序列中各条指令之间是否存在硬件资源冲突,可以包括:查询预先配置的各条指令与其所使用硬件资源之间的映射关系信息,基于所述映射关系信息判断所述至少一条指令与第一指令序列的指令是否需要使用同一硬件资源;在需要使用同一硬件资源时确定所述至少一条指令与所述第一指令序列的指令存在硬件资源冲突。在不需要使用同一硬件资源时则确定所述至少一条指令与所述第一指令序列的指令不存在硬件资源冲突。这里,指令与其所使用硬件资源之间的映射关系信息用于通过映射关系来指示各条指令所使用的硬件资源有哪些,该映射关系可以为一对一、一对多、多对一等多种,取决于指令的类型、指令的操作码以及硬件资源的具体配置(比如,一个处理器还是多个处理器,一个存储器还是多个存储器等)。通过指令与其所使用硬件资源之间的映射关系,可以避免硬件资源冲突。需要说明的是,对于硬件资源冲突的具体校验方式,本申请实施例不限于此。
[0067] 在一实施例中,指令序列是指包含多条指令的序列,该序列中的各条指令按照其运行开始时刻排序,运行开始时刻在前的指令排序靠前,运行开始时刻在后的指令后排序靠后。本申请实施例的一些实现方式中,第二指令序列中一条指令在第一指令序列中的合法位置是指在第一指令序列中的该位置处插入第二指令序列中一条指令后不会影响第一指令序列的运算结果,并且第二指令序列中的该条指令与第一指令序列中排序在该位置之后的所有指令都不存在数据冲突。一个示例中,一条指令在一个指令序列中的位置可以通过序号来表示,该序号可指示该条指令在该指令序列中的排序。比如,一条指令在一个指令序列排序为3,那么该指令的位置可以表示为3。当然,具体实施时一指令在指令序列中的位置还可通过其他方式来表示,其具体表示方式本申请实施例不予限制。相应的,合法位置的表示方式与上述位置的表示方式类似。需要特别说明的是,第二指令序列中的一条指令在第一指令序列中的合法位置可以作为该条指令在第一指令序列中的可插入位置,但不一定是该条指令在第一指令序列中的实际插入位置。
[0068] 本申请实施例中,第二指令序列中的一条指令在第一指令序列中的合法位置可能没有,也可能存在一个或多个。如果第二指令序列中的一条指令在第一指令序列中的合法位置有多个,可以从中选择一个合法位置作为该指令的插入位置。如果第二指令序列中的一条指令在第一指令序列中的合法位置只有一个,可以以该合法位置作为该指令的插入位置。如果第二指令序列中的至少一条指令在第一指令序列中不存在合法位置,拆分所述至少一条指令为两组指令,将所述两组指令中与所述第一指令序列中的指令不存在数据冲突的一组指令插入到所述第一指令序列中。
[0069] 本申请实施例中,是否拆分第二指令序列中的至少一条指令,取决于该至少一条指令操作数据中不存在冲突的数据的大小。一些实现方式中,可以判断所述至少一条指令操作数据中不存在冲突的数据的大小是否大于预先设定的阈值;在所述至少一条指令操作数据中不存在冲突的数据的大小大于所述阈值时,拆分所述至少一条指令。在所述至少一条指令操作数据中不存在冲突的数据的大小小于或等于所述阈值时,可以不拆分所述至少一条指令。该阈值可以预先设定,该阈值的取值可以为经验值,其具体取值与实际的应用场景相关,本申请不予限制。一个示例中,所述至少一条指令为加载指令时,根据统计每条加载指令操作的前N byte数据占用了大部分的运行时间,此时,可基于N来设置上述阈值,比如,上述阈值可以取为N的倍数(比如,2N),这里,N为不小于1的整数。一种实现方式中,如果第二指令序列中的一条指令属于第二神经网络模型开始阶段(比如,即第一条计算指令之前的加载指令)且其操作数据中不存在冲突的数据较大(比如,指令操作的数据中不存在冲突的数据的大小超过了上述的阈值),可以根据该条指令与第一指令序列中指令的数据冲突情况将该条指令拆分为两组指令,该两组指令中第一组指令与第一指令序列中的指令存在数据冲突,第二组指令与第一指令序列中的指令不存在数据冲突,将第二组指令插入到第一指令序列中。如此,在第二指令序列中的一条指令不存在合法位置时,可以通过拆分的方式将其部分地插入到第一指令序列中,从而进一步节省第二神经网络模型的运行时间,提高多个神经网络模型的整体执行效率。
[0070] 本申请实施例的一种实现方式中,根据第二指令序列中的一条指令与第一指令序列中指令的数据冲突情况将第二指令序列中的一条指令拆分,具体可以为:(可以利用数据冲突校验的结果)确定第二指令序列中的一条指令与第一指令序列中的指令之间存在冲突的数据和不存在冲突的数据(比如,可以直接利用数据冲突校验的结果来确定哪些是存在冲突的数据,哪些是不存在冲突的数据);以及,按照所述存在冲突的数据和不存在冲突的数据,将所述至少一条指令拆分为两组指令,所述两组指令中的第一组指令(可能包括一条或多条指令)用于操作所述存在冲突的数据(比如,用于加载存在冲突的数据的指令),所述两组指令中的第二组指令(可能包括一条或多条指令)用于操作所述不存在冲突的数据(比如,用于加载不存在冲突的数据的指令)。可选的,拆分指令之前将不存在冲突的数据的大小与上述阈值比较,在不存在冲突的数据的大小大于上述阈值时,按照所述存在冲突的数据和不存在冲突的数据,将所述至少一条指令拆分为两组指令。这样,第一组指令与第一指令序列中的上述指令存在数据冲突,但第二组指令与第一指令序列中的上述指令不存在数据冲突,如此,即可将第二组指令插入到第一指令序列中,也即将第二指令序列中的上述一条指令部分地插入到了第一指令序列中。本申请实施例中,通过拆分第二指令序列中指令的方式将第二指令序列中运行时间较长的指令插入到第一指令序列,有利于节省更多的运行时间,在不增加硬件资源的前提下更大幅度的提高多个神经网络模型的整体执行效率。
[0071] 一个示例中,第二指令序列中的一条指令A的操作数据为“abcdef”,通过数据冲突校验发现指令A与第一指令序列中的指令存在数据冲突,存在冲突的数据为“b”、“d”,这时,可以将指令A拆分为两组指令,第一组指令包括操作数据“b”的指令1和操作数据“d”的指令2,第二组指令包括操作数据“a”的指令3、操作数据“c”的指令4和操作数据“ef”的指令5,拆分之后,可以将第二组指令中的指令3、指令4、指令5分别插入到第一指令序列中,第一组指令中的指令1和指令2则保留在第二指令序列中。
[0072] 本申请实施例的一种实现方式中,如果所述至少一条指令于所述第一指令序列中存在两个或更多的合法位置,可以确定并行时间最长的合法位置为所述至少一条指令的插入位置,以便尽可能多地节省运行时间,从而更大幅度地提高多个神经网络模型的整体执行效率。
[0073] 本申请实施例的另一种实现方式中,如果所述至少一条指令于所述第一指令序列中存在两个或更多合法位置,确定并行时间最长且在第一指令序列中最靠前的合法位置为所述至少一条指令的插入位置,以便尽可能多地节省运行时间,从而更大幅度地提高多个神经网络模型的整体执行效率。
[0074] 本申请实施例中,对于第二指令序列中的一条指令,其在第一指令序列中的一个合法位置处的并行时间,取决于第一指令序列中与其并行的一条或多条指令的运行时间。由于一条指令的运行时间与其所操作数据的大小直接相关,因此,本申请实施例的一种实现方式中,确定并行时间最长的合法位置,可以包括:确定第一指令序列中在各个合法位置处与该至少一条指令并行的一条或多条指令,基于该一条或多条指令操作数据的大小估算各个合法位置的并行时间;基于估算的所述各个合法位置的并行时间,确定并行时间最长的合法位置。这样,可以估算出第二指令序列中的一条指令在各个合法位置处能够真实掩盖的运行时间,真实掩盖的运行时间越多节省的运行时间也就越多,进而能够以节省更多运行时间的合法位置作为该条指令的实际插入位置,从而更大幅度地提高多个神经网络模型的整体执行效率。
[0075] 本申请实施例中,第二指令序列中的一条指令在第一指令序列中的一个合法位置处的并行时间等于第一指令序列中在该合法位置处与第二指令序列中的一条指令并行的一条或多条指令的运行时间之和。也就是说,估算第一指令序列中合法位置处与第二指令序列中的一条指令并行的一条或多条指令的运行时间即可确定第二指令序列中的一条指令在第一指令序列中的一个合法位置处的并行时间。这里,对于加载指令来说,根据需要读取数据的大小来估算运行时间,一般来说,要读取的数据越大其运行时间越长,读取数据的大小与运行时间可以是线性关系,该线性关系可以通过收集各个指令的实际运行时间及其实际读取数据的大小,并对这些进行统计分析来得到。对于计算指令来说,可以根据其计算数据的大小来估算运行时间,一般来说,要计算的数据越大相应的计算指令运行时间也就越长,计算指令的运行时间与其实际计算的数据大小之间一般是非线性的关系,该非线性关系也可以通过收集计算指令的实际运行时间及其实际计算数据的大小并进行统计分析来得到。概况来说,一条指令的运行时间可以根据其需操作的数据大小来确定。
[0076] 本申请实施例的一种实现方式中,可以从所述第一指令序列的末尾开始针对逐条指令执行所述校验。对于第二指令序列中的一条指令,从第一指令序列的末尾开始执行校验,有利于找到该条指令在第一指令序列中排序最靠前的合法位置,从而以排序最靠前的合法位置作为该条指令在第一指令序列中的插入位置,以便尽可能的节省运行时间,提高多个神经网络模型的整体执行效率。
[0077] 下面一个示例来说明上述神经网络模型的指令调度方法的具体实施流程。
[0078] 神经网络模型1(本申请所述的第一神经网络模型的一示例)对应指令序列1(本申请所述的第一指令序列的一示例),指令序列2(本申请所述的第二指令序列的一示例)对应神经网络模型2(本申请所述的第二神经网络模型的一示例),神经网络模型1先于神经网络模型2执行。如图6所示,将神经网络模型2开始阶段的加载指令(即指令序列2中第一条计算指令之前的加载指令)插入到指令序列1的示例性流程600,可以包括如下步骤:
[0079] 步骤601,遍历指令序列2,查找到指令序列2中的第一条计算指令(比如,第一条卷积指令),并将指令序列2中该第一条计算指令之前的所有指令(即所有加载指令)提取出来,形成候选指令集;
[0080] 步骤602,通过解析候选指令集中各条指令确定各条指令所操作数据的大小,并将该候选指令集中的各条指令按照其操作数据由大到小的顺序进行排列;
[0081] 步骤603,从候选指令集中读取排序最靠前的一条指令,如果读取失败,则表明候选指令集为空,结束当前流程,如果读取成功,则表明候选指令集不为空,继续步骤604;
[0082] 这里,假设当前取出的指令为指令A;
[0083] 步骤604,确定指令A在指令序列1中的插入位置,如果指令A在指令序列1中没有合法的插入位置则继续步骤606,如果指令A在指令序列1中有合法的插入位置则继续步骤605;
[0084] 步骤605,在指令序列1中的插入位置处插入指令A,并返回步骤603,继续取候选指令集中下一条指令。
[0085] 步骤606,将指令A放回到指令序列2中第一条计算指令之前。
[0086] 一个示例中,假设指令序列1中包含指令B、指令C和指令D这三条指令,那么步骤604中确定指令A在指令序列1中的插入位置的示例性流程,可以包括如下步骤:
[0087] 步骤1,初始化指令A的合法位置记录,并从指令序列1末尾的第一条指令开始搜索[0088] 这里,假设当前搜索到的一条指令为指令B。
[0089] 这里,初始化指令A的合法位置记录包括:生成指令A的合法位置记录,并将该合法位置记录中各个参数的取值设置为默认值,该默认值为无效值。其中,该合法位置记录中的参数可以包括:指令A在指令序列1的最新合法位置、该最新合法位置插入指令A时的并行时钟周期数、以及指示该最新合法位置是否存在硬件资源冲突的第一标记。
[0090] 步骤2,校验指令B与指令A之间是否存在数据冲突,如果是,则确定该指令A在指令序列1中不存在合法位置,当前流程结束;否则,继续步骤3;
[0091] 步骤3,校验指令B与指令A之间是否存在硬件资源冲突,如果是,则继续步骤5,否则继续步骤4;
[0092] 步骤4,确定指令序列1中指令B之前的位置作为指令A的最新合法位置,估算在该最新合法位置插入指令A时的并行时钟周期数m,更新指令A的合法位置记录,并继续步骤5;
[0093] 这里,更新指令A的该合法位置记录,包括:将指令A在指令序列1的最新合法位置更新为指令B之前的位置;将指令A的并行时钟周期数更新为并行时钟周期数m;以及,将第一标记的取值更新为指令B之前的位置不存在硬件资源冲突。
[0094] 这里,该并行的时钟周期数为上文所述并行时间的一种示例性的表示方式。实际应用中,不排除有其他的表示方式。本申请实施例中并行时间的表示方式不限于此。
[0095] 这里,估算并行时钟周期数m的过程可以包括:确定将指令A插入指令B之前的位置时指令序列1中与指令A并行的一条或多条指令,根据指令序列1中与指令A并行的指令操作的数据估算其运行时间(比如,运行的时钟周期数),将指令序列1中与指令A并行的一条或多条指令的运行时间(比如,运行的时钟周期数)之和确定为并行周期数m。
[0096] 步骤5,判断指令B是否为指令序列1中排序最靠前的指令,如果是,则继续步骤14,否则继续搜索指令序列末尾的第二条指令C;
[0097] 步骤6,校验指令C与指令A之间是否存在数据冲突,如果是,则继续步骤14;否则,继续步骤7;
[0098] 步骤7,校验指令C与指令A之间是否存在硬件资源冲突,如果是,则继续步骤14,否则继续步骤8;
[0099] 步骤8,估算在指令序列1中指令C之前的位置插入指令A时的并行时钟周期数n,将并行时钟周期数n与指令A的合法位置记录中的并行时钟周期数m比较,如果并行时钟周期数n大于或等于并行时钟周期数m,则确定指令C之前的位置为指令A的最新合法位置,并相应的更新指令A的合法位置记录;如果并行时钟周期数n小于并行时钟周期数m,则保持指令A的合法位置记录不变;继续步骤9;
[0100] 这里,估算并行时钟周期数n的过程与上文中估算并行时钟周期数m的过程相似,不再赘述。
[0101] 这里,更新指令A的该合法位置记录,包括:将指令A在指令序列1的最新合法位置更新为指令C之前的位置;将指令A的并行时钟周期数更新为并行时钟周期数n;以及,将第一标记的取值更新为指令C之前的位置不存在硬件资源冲突。
[0102] 步骤9,判断指令C是否为指令序列1中排序最靠前的指令,如果是,则继续步骤14,否则继续搜索指令序列末尾的第三条指令D;
[0103] 步骤10,校验指令D与指令A之间是否存在数据冲突,如果是,则继续步骤14;否则,继续步骤11;
[0104] 步骤11,校验指令D与指令A之间是否存在硬件资源冲突,如果是,则继续步骤13,否则继续步骤12;
[0105] 步骤12,估算在指令序列1中指令D之前的位置插入指令A时的并行时钟周期数k,将并行时钟周期数k与指令A的合法位置记录中的并行时钟周期数(可能是并行时钟周期数m,也可能是并行时钟周期数n)比较,如果并行时钟周期数k大于或等于合法位置记录中的并行时钟周期数,则确定指令D之前的位置为指令A的最新合法位置,并相应的更新指令A的合法位置记录;如果并行时钟周期数k小于合法位置记录中的并行时钟周期数,则保持指令A的合法位置记录不变;继续步骤13;
[0106] 这里,估算并行时钟周期数k的过程与上述估算并行时钟周期数m的过程相似,不再赘述。
[0107] 这里,更新指令A的该合法位置记录,包括:将指令A在指令序列1的最新合法位置更新为指令D之前的位置;将指令A的并行时钟周期数更新为并行时钟周期数k;以及,将第一标记的取值更新为指令D之前的位置不存在硬件资源冲突。
[0108] 步骤13,判断指令D为指令序列1中排序最靠前的指令,继续步骤14;
[0109] 步骤14,读取指令A的合法位置记录,判断合法位置记录中的各个参数的取值是否为无效值,如果不是则将指令A的合法位置记录中的最新合法位置确定为指令A在指令序列1中的插入位置,如果是则确定指令A在指令序列1中没有合法的插入位置,当前流程结束。
[0110] 需要说明的是,上述流程仅为确定指令A在指令序列1中插入位置的一示例性实现方式,本申请实施例不限于此。
[0111] 可替换地,在指令A与指令序列1中不存在合法位置且该指令A所操作数据较大(比如,指令A操作的数据中与指令序列1中指令不存在冲突的数据的大小超过了预设的阈值时)时,将指令A拆分为两组指令,该两组指令中第一组指令与指令序列1中的一条指令(该条指令可能是指令序列1中任意一条指令)存在数据冲突,第二组指令与指令序列1中的上述指令不存在数据冲突,将第一组指令放回到指令序列2中,对于第二组指令来说,可以按照上述流程确定该第二组指令中的一条或多条指令在指令序列1中的插入位置,并将第二组指令中的一条或多条指令插入到指令序列1中。如此,在指令序列2中的一条加载指令不存在合法位置时,可以通过拆分的方式将其部分地插入到指令序列1中,从而进一步节省神经网络模型2开始阶段的加载时间,提高多个神经网络模型的整体执行效率。
[0112] 图7示出了使用本申请实施例提供的神经网络模型的指令调度方法在指令序列之间进行指令调度的执行过程示例,该示例中,指令序列a(本申请中的第一指令序列的一示例)和指令序列b(本申请中的第二指令序列的一示例)分别对应神经网络模型a(本申请中的第一神经网络模型的一示例)和神经网络模型b(即,本申请中的第二神经网络模型的一示例),神经网络网络a先于神经网络模型b运行,通过本申请实施例的上述方法可以将神经网络模型b开始阶段的特征数据加载指令“LD-Feature”和权重加载指令“LD Weight”插入到指令序列a的卷积计算指令“CONV”之间,这样,将指令序列b的特征数据加载指令“LD-Feature”和权重加载指令“LD Weight”提前到指令序列a并与指令序列a的卷积计算指令“CONV”并行,在指令序列a和指令序列b之间建立了流水线,运行神经网络模型b之前其开始阶段的特征数据加载指令“LD-Feature”和权重加载指令“LD Weight”即已执行完成,神经网络模型b开始阶段的部分加载时间被掩盖,在神经网络模型b开始阶段BPU不需要长时间等待,从而在不增加硬件资源的前提下大幅提升了神经网络模型a和神经网络模型b的整体执行效率。
[0113] 图8示出了使用本申请实施例提供的神经网络模型的指令调度方法之后三个神经网络模型的整体运行流程,其中,在神经网络模型1、神经网络模型2和神经网络模型3的指令序列之间建立了流水线,执行神经网络模型1的计算时即可执行神经网络模型2的加载,执行神经网络模型1的“存储结果”时即可执行神经网络模型2的计算,执行神经网络模型2的计算时即可执行神经网络模型3的加载,执行神经网络模型2的“存储结果”时即可执行神经网络模型3的计算,这整个运行过程需要5个时间段即可完成,相较于图2所示的相关技术来说,在不增加硬件资源的前提下整体执行效率明显提高。
[0114] 本申请实施例中,可以同时针对多个神经网络模型的指令序列执行上述示例性方法的处理,也可以对多个神经网络模型的指令序列逐个地执行上述示例性方法的处理,这取决于硬件资源的配置和神经网络模型的运行顺序。举例来说,只有一个运行神经网络模型的处理器(比如,只有一个BPU)时,每次只能运行一个指令序列,那么只能按照神经网络模型的运行顺序对多个神经网络模型的指令序列逐个地执行上述示例性方法的处理,以在这多个神经网络模型的指令序列之间建立流水线。有多个运行神经网络模型的处理器(比如,配有多个BPU)时,可以同时运行多个神经网络模型,相应的可以按照神经网络模型的运行顺序对这多个神经网络模型的指令序列同时执行上述示例性方法的处理,以在同时运行的多个神经网络模型的指令序列建立流水线。
[0115] 本申请实施例的一种实现方式中,所述确定要运行的对应第二神经网络模型的第二指令序列的步骤501、选择所述第二指令序列中的至少一条指令的步骤502、以及将所述至少一条指令插入到所述第一指令序列中的步骤503可以由图4所示系统中的第二处理器执行;所述第一指令序列和第二指令序列可以由图4所示系统中的第一处理器编译。这里,所述第一处理器和所述第二处理器是不同类型的处理器。运行包含所述至少一条指令的所述第一指令序列的步骤504可以由图4所示系统的第三处理器来执行。
[0116] 图9示出了图4所示系统执行本申请实施例的示例性方法的示例性过程,该示例性过程中,在第一处理器编译各神经网络模型的指令序列(一个神经网络模型对应一个指令序列)并提供给第二处理器之后,第二处理器按照各神经网络模型的运行顺序执行本申请实施例示例性方法的处理并装载到存储器中,第三处理器从存储器中读取指令序列或指令序列中的指令并运行。其中,装载的过程可以包括:将待运行的神经网络模型的指令序列写入存储器(比如,DDR)并将其在存储器中的起始地址(即,首地址)和该指令序列的长度(即包括多少条指令)提供给第三处理器,以便第三处理器从存储器读取指令序列。一个示例中,第二处理器可以按照如下方式执行本申请实施例的示例性方法:根据神经网络模型的运行顺序确定下一个要运行的指令序列(假设为指令序列E),从第一处理器编译好的指令序列中提取该指令序列E,将该指令序列E放入缓存,在缓存中该指令序列E处于等待状态,此时,第二处理器对该指令序列E与其之前的指令序列(假设为指令序列D)执行上述示例性方法的处理,即将指令序列E中的至少一条指令调度至指令序列D中,然后将指令序列D装载至存储器,以便第三处理器从存储器中读取指令序列D并运行,这样,指令序列E部分指令被提前到了指令序列D运行过程中来执行。指令序列D装载之后,第二处理器提取运行顺序在指令序列E之后的指令序列F并放入缓存,再将指令序列F中的至少一条指令调度至指令序列E中,然后将指令序列E装载至存储器,第三处理器从存储器中读取指令序列E并运行,这样,指令序列F部分指令被提前到了指令序列E运行过程中来执行。如此顺序执行,直到最后一个神经网络模型运行结束。
[0117] 实际应用中,可以在各个神经网络模型的指令序列的编译阶段,对各个神经网络模型的指令序列进行序列内部的指令调度(比如,可通过图4所示系统的第一处理器来实现),通过该序列内部的指令调度在各个指令序列内部建立流水线,在各个神经网络模型的运行阶段通过本申请实施例的上述示例性方法进行指令序列之间的指令调度(比如,可通过图4所示系统的第二处理器来实现),通过该指令序列之间的指令调度可以在指令序列之间建立流水线。这样,将指令序列内部的流水线与指令序列之间的流水线相结合,可最大化的发挥硬件资源的流水执行能力,从而在不增加硬件资源的前提下更大幅度的提高多个神经网络模型的整体执行效率。
[0118] 本申请实施例的上述示例性方法可适用于多种需要运行多个神经网络模型的情况,并能够在不增加硬件资源和确保运算结果正确的前提下提高这多个神经网络模型的整体执行效率。
[0119] 根据统计,对于一个结构较为简单(比如,两层的神经网络)的神经网络模型,加载数据和加载参数所需时间将占到该神经网络总运行时长的30%-50%,那么对于结构较为简单的多个神经网络模型来说,通过本申请实施例的上述方法,对于这多个神经网络模型的整体来说在最好的情况下可以省去大概40%的运行时间,平均下来可以省去大约20%的运行时间,相应的,多个神经网络模型的整体执行效率可有至少20%-40%幅度的提高。
[0120] 根据统计,对于一个结构较为复杂的神经网络(比如,一千层的神经网络结构),加载数据和加载参数所需时间将占到该神经网络总运行时长的3%-5%。那么对于结构较为复杂的多个神经网络模型来说,通过本申请实施例的上述方法,对于这多个神经网络模型的整体来说,可以省去大概3%的运行时间,相应的,多个神经网络模型的整体执行效率可有至少3%幅度的提高。
[0121] 示例性装置
[0122] 图10是本申请一示例性实施例提供的神经网络模型的指令调度的示例性装置10。如图10所示,神经网络模型的指令调度的示例性装置10包括:
[0123] 指令序列确定单元101,配置为在需要运行对应第一神经网络模型的第一指令序列时,确定要运行的对应第二神经网络模型的第二指令序列,所述第一神经网络模型先于所述第二神经网络模型运行;
[0124] 指令选择单元102,配置为选择所述第二指令序列中的至少一条指令;
[0125] 指令插入单元103,配置为将所述至少一条指令插入到所述第一指令序列中;以及[0126] 指令运行单元104,配置为运行包含所述至少一条指令的所述第一指令序列。
[0127] 如图11是本申请一示例性实施例提供的神经网络模型的指令调度的示例性装置11。本申请实施例的一种实现方式中,指令选择单元102可以包括:遍历模块1021和选择模块1022,其中,遍历模型1021配置为遍历所述第二指令序列以查找所述第二指令序列中的首位计算指令;选择模型1022,配置为选择所述第二指令序列中在所述首位计算指令之前的指令。如此,可以有针对性的将第二神经网络模型开始阶段的指令作为指令序列之间调度的对象,使得第二神经网络模型的开始阶段能够与第一神经网络模型的部分阶段(比如,中间阶段)并行,从而节省第二神经网络模型开始阶段的执行时间,避免在第二神经网络模型的开始阶段硬件资源(比如,BPU)长时间等待,进而在不增加硬件资源的前提下提高多个神经网络模型的整体执行效率。
[0128] 本申请实施例的一种实现方式中,指令插入单元103是配置为按照指令操作的数据由大到小的次序逐个将所述至少一条指令插入到所述第一指令序列中。这样,可优先将第二神经网络模型中运行时间比较长的指令插入到第一指令序列,使得第二指令序列中运行时间比较长的指令能够与第一指令序列中的一条或多条指令并行,从而节省更多的运行时间(比如,第二神经网络模型开始阶段加载数据的时间),进而更多地提高这多个神经网络模型的整个执行效率。
[0129] 本申请实施例的一种实现方式中,所述至少一条指令为用于加载所述第二神经网络模型运算所需数据的加载指令。这里,该数据可以包括但不限于特征数据、权重参数等。在该实现方式中,指令插入单元103是配置为将所述至少一条指令插入到所述第一指令序列中的计算指令之间。如此,可以将第二神经网络模型开始阶段的加载指令提前到第一神经网络模型的运行过程中,可以节省第二神经网络模型开始阶段的加载时间,减少开始阶段BPU的等待时间,从而提高执行效率。
[0130] 如图11所示,本申请实施例的一种实现方式中,指令插入单元103可以包括:第一校验模块1031和/或第二校验模块1032;其中,第一校验模块1031配置为校验所述至少一条指令与所述第一指令序列中的各条指令之间是否存在数据冲突,以确定所述至少一条指令于所述第一指令序列中的合法位置,以便将所述至少一条指令插入到所述第一指令序列中;第二校验模块1032配置为校验所述至少一条指令与所述第一指令序列中的各条指令之间是否存在硬件资源冲突,以确定所述至少一条指令于所述第一指令序列中的合法位置,以便将所述至少一条指令插入到所述第一指令序列中。如此,在将至少一条指令插入到第一指令序列之前,通过校验来确定至少一条指令在第一指令序列中的合法位置,可有效避免冲突的产生,在多个神经网络模型的指令序列之间建立更合理的流水线,避免这些神经网络模型运行或计算上发生错误,从而在确保这多个神经网络模型整体运算结果正确的前提下提高这多个神经网络模型的整体执行效率。
[0131] 这里,第一校验模块1031和/或第二校验模块1302,是配置为从所述第一指令序列的末尾开始针对逐条指令执行所述校验。
[0132] 本申请实施例中,第一校验模块1031,是配置为:判断所述至少一条指令所访问的内存地址与第一指令序列的指令所访问的内存地址是否重叠,以及所述至少一条指令是否将对该内存地址中的数据执行写操作;在所述内存地址重叠且所述至少一条指令和/或所述第一指令序列的指令将对该内存地址中的数据执行写操作时,确定所述至少一条指令与第一指令序列的该条指令存在数据冲突。
[0133] 本申请实施例中,第二校验模块1302,是配置为查询预先配置的各条指令与其所使用硬件资源之间的映射关系信息,基于所述映射关系信息判断所述至少一条指令与第一指令序列的指令是否需要使用同一硬件资源;在需要使用同一硬件资源时确定所述至少一条指令与所述第一指令序列的指令存在硬件资源冲突。
[0134] 如图11所示,本申请实施例的一些实现方式中,指令插入单元103还可以包括:第一确定模块1033,配置为在所述至少一条指令于所述第一指令序列中存在两个或更多合法位置时,确定其中一个合法位置为所述至少一条指令的插入位置;插入操作模块1034,配置为将所述至少一条指令插入到第一指令序列中的所述插入位置处。本申请实施例的一种实现方式中,第一确定模块1033,可以是配置为在所述至少一条指令于所述第一指令序列中存在两个或更多合法位置时,确定并行时间最长的合法位置为所述至少一条指令的插入位置;本申请实施例的另一种实现方式中,第一确定模块1033,可以是配置为在所述至少一条指令于所述第一指令序列中存在两个或更多合法位置时,确定并行时间最长且在第一指令序列中最靠前的合法位置为所述至少一条指令的插入位置。这样,可以尽可能多地节省运行时间,从而更大幅度地提高多个神经网络模型的整体执行效率。
[0135] 一个示例中,指令插入单元103还可以包括:第二确定模块1035,配置为确定第一指令序列中在各个合法位置处与所述至少一条指令并行的一条或多条指令;估算模块1036,配置为基于所述第二确定模块确定的一条或多条指令的操作数据的大小估算所述各个合法位置的并行时间。第一确定模块1033,是配置为利用估算模型得到的并行时间确定所述至少一条指令的插入位置。这里,第一确定模块利用并行时间确定所述至少一条指令的插入位置的方式即为上述两种,不再赘述。
[0136] 如图11所示,本申请实施例的一些实现方式中,指令插入单元103还可以包括:拆分模块1037,配置为在所述至少一条指令于所述第一指令序列中不存在合法位置时,拆分所述至少一条指令为两组指令;插入操作模块1034,还配置为将所述拆分模块1037拆分获得的两组指令中与所述第一指令序列中的指令不存在数据冲突的一组指令插入到所述第一指令序列中。这样,通过拆分第二指令序列中指令的方式将第二指令序列中运行时间较长的指令插入到第一指令序列,有利于节省更多的运行时间,在不增加硬件资源的前提下更大幅度的提高多个神经网络模型的整体执行效率。
[0137] 如图11所示,本申请实施例的一种实现方式中,指令插入单元103还可以包括:第三确定模块1038,确定所述至少一条指令与所述第一指令序列中的指令之间存在冲突的数据和不存在冲突的数据;以及,拆分模块1037,是配置为按照所述存在冲突的数据和不存在冲突的数据,将所述至少一条指令拆分为两组指令,所述两组指令中的第一组指令用于操作所述存在冲突的数据,所述两组指令中的第二组指令用于操作所述不存在冲突的数据。
[0138] 本申请实施例的上述示例性装置可适用于多种需要运行多个神经网络模型的场景,并能够在不增加硬件资源和确保运算结果正确的前提下提高这多个神经网络模型的整体执行效率。需要说明的是,上述示例性装置10和示例性装置11均为示例,本申请实施例中神经网络模型的指令调度装置的具体结构不限于此两种方式。
[0139] 实际应用中,本申请实施例的上述示例性装置10和示例性装置11均可通过“示例性系统”中的运行设备来实现。一种实现方式中,示例性装置10和示例性装置11中,指令序列确定单元101、指令选择单元102、指令插入单元103通过图4所示系统中的第二处理器来实现,指令运行单元104可以通过图4所示系统中的第三处理器来实现。
[0140] 示例性电子设备
[0141] 除了上述方法以外,本申请的实施例还可以是电子设备,该电子设备包括:一个或多个处理器;以及,存储器,存储有计算机指令,所述计算机指令在被所述处理器运行时使所述处理器执行本说明书上述“示例性方法”部分中描述的根据本申请各种实施例的神经网络模型的指令调度方法中的步骤。
[0142] 本申请实施例的上述电子设备可适用于多种需要运行多个神经网络模型的场景,并能够在不增加硬件资源和确保运算结果正确的前提下提高这多个神经网络模型的整体执行效率。实际应用中,本申请实施例的上述电子设备可通过“示例性系统”中的运行设备来实现。一种实现方式中,该电子设备中可以包括图4所示系统中的第二处理器和第三处理器。
[0143] 图12图示了根据本申请实施例的电子设备的框图。
[0144] 如图12所示,电子设备12包括一个或多个处理器121和存储器122。
[0145] 处理器121可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备12中的其他组件以执行期望的功能。
[0146] 存储器122可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器121可以运行所述程序指令,以实现上文所述的本申请的各个实施例的神经网络模型的指令调度方法以及/或者其他期望的功能。
[0147] 在一个示例中,电子设备12还可以包括:输入装置123和输出装置124,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。例如,该输入装置123可以是麦克风或麦克风阵列。此外,该输入设备123还可以包括例如键盘、鼠标等等。该输出装置124可以向外部输出各种信息。该输出设备124可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。
[0148] 当然,为了简化,图12中仅示出了该电子设备12中与本申请有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备12还可以包括任何其他适当的组件。
[0149] 示例性计算机程序产品和计算机可读存储介质
[0150] 除了上述方法和设备以外,本申请的实施例还可以是计算机程序产品,其包括计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述“示例性方法”部分中描述的根据本申请各种实施例的神经网络模型的指令调度方法中的步骤。
[0151] 所述计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本申请实施例操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。
[0152] 此外,本申请的实施例还可以是计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述“示例性方法”部分中描述的根据本申请各种实施例的神经网络模型的指令调度方法中的步骤。
[0153] 所述计算机可读存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以包括但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
[0154] 以上结合具体实施例描述了本申请的基本原理,但是,需要指出的是,在本申请中提及的优点、优势、效果等仅是示例而非限制,不能认为这些优点、优势、效果等是本申请的各个实施例必须具备的。另外,上述公开的具体细节仅是为了示例的作用和便于理解的作用,而非限制,上述细节并不限制本申请为必须采用上述具体的细节来实现。
[0155] 本申请中涉及的器件、装置、设备、系统的方框图仅作为例示性的例子并且不意图要求或暗示必须按照方框图示出的方式进行连接、布置、配置。如本领域技术人员将认识到的,可以按任意方式连接、布置、配置这些器件、装置、设备、系统。诸如“包括”、“包含”、“具有”等等的词语是开放性词汇,指“包括但不限于”,且可与其互换使用。这里所使用的词汇“或”和“和”指词汇“和/或”,且可与其互换使用,除非上下文明确指示不是如此。这里所使用的词汇“诸如”指词组“诸如但不限于”,且可与其互换使用。
[0156] 还需要指出的是,在本申请的装置、设备和方法中,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本申请的等效方案。
[0157] 提供所公开的方面的以上描述以使本领域的任何技术人员能够做出或者使用本申请。对这些方面的各种修改对于本领域技术人员而言是非常显而易见的,并且在此定义的一般原理可以应用于其他方面而不脱离本申请的范围。因此,本申请不意图被限制到在此示出的方面,而是按照与在此公开的原理和新颖的特征一致的最宽范围。
[0158] 为了例示和描述的目的已经给出了以上描述。此外,此描述不意图将本申请的实施例限制到在此公开的形式。尽管以上已经讨论了多个示例方面和实施例,但是本领域技术人员将认识到其某些变型、修改、改变、添加和子组合。