用于执行神经网络计算的指令调度方法及相应计算系统

文档序号:1598689 发布日期:2020-01-07 浏览:3次 >En<

阅读说明:本技术 用于执行神经网络计算的指令调度方法及相应计算系统 (Instruction scheduling method for performing neural network computation and corresponding computing system ) 是由 于谦 隋凌志 方绍峡 王俊斌 单羿 于 2018-06-28 设计创作,主要内容包括:提出了一种用于执行神经网络计算的指令调度方法及其相应的神经网络计算系统。该方法包括:获取用于执行神经网络计算的指令;使用第一功能模块执行当前指令;以及至少基于所述当前指令的参数信息以及直接依赖所述当前指令的后续指令的依赖信息,在所述当前指令执行完毕之前,使用第二功能模块开始所述后续指令的执行。由此,通过在当前指令执行完成之前启动对后续依赖指令的执行,能够在计算系统实现具有依赖关系的指令之间更高的并行度,由此从整体上提升神经网络计算的计算效率。(An instruction scheduling method for performing neural network computation and a corresponding neural network computing system thereof are provided. The method comprises the following steps: obtaining instructions for performing neural network computations; executing the current instruction by using the first functional module; and starting the execution of the subsequent instruction by using a second functional module before the current instruction is completely executed based on at least parameter information of the current instruction and dependency information of the subsequent instruction directly dependent on the current instruction. Therefore, by starting the execution of the subsequent dependent instructions before the execution of the current instruction is completed, higher parallelism between the instructions with the dependency relationship can be realized in the computing system, and the computing efficiency of the neural network computing is improved as a whole.)

用于执行神经网络计算的指令调度方法及相应计算系统

技术领域

本发明涉及深度学习领域,尤其涉及一种用于执行神经网络计算的指令调度方法及相应计算系统。

背景技术

人工智能近年得到迅速发展,在图像分类、检测、视频和语音处理等领域取得良好的应用效果,并且依然具备极大的发展前景。神经网络是人工智能应用的核心,深度学习神经网络算法是其中最常见的一种神经网络模型。为了将训练之后的深度神经网络进行部署,需要将神经网络算法编译成神经网络计算系统所能执行的指令码。

神经网络算法的一大特点在于数据驱动,经编译的指令码中含有大量的数据和相对少量的控制逻辑指令,如何以更高的效率和更好的适应性来执行这些针对大量数据的输入指令,成为人们所面临的一大挑战。

因此,需要一种改进的用于神经网络计算的指令调度方案。

发明内容

为了解决上述至少一个问题,本发明提出了一种用于执行神经网络计算的指令调度方法及相应计算系统,通过在当前指令执行完成之前启动对后续依赖指令的执行,能够实现具有依赖关系的指令之间更高的并行度,由此从整体上提升神经网络计算的计算效率。

根据本发明的一个方面,提出了一种用于执行神经网络计算的指令调度方法,包括:获取用于执行神经网络计算的指令;使用第一功能模块执行当前指令;以及至少基于所述当前指令的参数信息以及直接依赖所述当前指令的后续指令的依赖信息,在所述当前指令执行完毕之前,使用第二功能模块开始所述后续指令的执行。

由此,能够提早后续指令的执行开始时间,从而使得整体指令执行更为紧凑,从而提升系统的整体计算效率。

具体地,可以至少基于所述当前指令和所述后续指令的类型信息,将所述当前指令的执行划分为依赖和无依赖两个阶段;在所述依赖阶段已完成的情况下直接生成所述当前指令结束标示;以及至少基于所述当前指令结束标示,使用第二功能模块执行所述后续指令。由此,能够通过结束标示的适时提早发出,实现计算系统内部各功能模块之间的高并行度指令执行。

具体地,可以至少基于所述参数信息和所述依赖信息,将所述当前指令的执行划分为多个阶段;在所述多个阶段的至少一个阶段已完成的情况下生成阶段结束标示;以及至少基于所述阶段结束标示,使用第二功能模块执行所述后续指令。由此可以基于计算系统内部对指令更细粒度的划分,实现依赖指令间更细粒度的依赖执行。划分的所述多个阶段的粒度大小可以至少基于所述用于执行神经网络计算的指令的粒度大小以及用于执行所述神经网络计算的计算系统的参数来确定。优选地,可以基于所述已完成的至少一个阶段得到的数据,使用第二功能模块执行所述后续指令。

获取的用于执行神经网络计算的指令可以包括:将用于神经网络计算的数据从外部存储器加载至内部缓存的数据加载指令,所述用于神经网络计算的数据包括参数数据和特征图数据;从所述内部缓存读取所述参数数据和特征图数据以进行运算并将运算结果回存所述内部缓存的数据运算指令;以及将所述运算结果从所述内部缓存存储回所述外部存储器的数据存储指令。本发明的指令调度方法尤其适用于主要包括上述指令类型的神经网络推理计算。

具体地,可以使用数据加载引擎执行当前数据加载指令;并在获取所述当前数据加载指令执行完毕的指示信息之前,响应于用于至少一个完整运算单元的权重和特征图数据加载完成,使用数据运算引擎开始所述数据运算指令的执行。

具体地,可以使用数据运算引擎执行当前数据运算指令;以及在获取当前数据运算指令执行完毕的指示信息之前,响应于至少一个运算最终结果的生成,将所述至少一个运算最终结果缓存至所述内部缓存,并使用数据存储引擎开始所述数据存储指令的执行以将所述至少一个运算最终结果从所述内部缓存存储回所述外部存储器。

具体地,还可以使用数据存储引擎执行当前数据存储指令;并且响应于当前数据存储指令存储回所述外部存储器的输出特征图数据与直接依赖于所述当前数据存储指令的数据加载指令要从所述外部存储器中加载的输入特征图数据不存在依赖关系,在所述输出特征图数据写入总线缓冲区之后,使用数据加载模块开始所述数据加载指令的执行。

获取的指令中可以包括所述指令与其他指令的显式依赖关系信息,并且所述当前指令中的显式依赖关系信息用作直接依赖所述当前指令的后续指令的依赖信息。

根据本发明的另一个方面,提出了.一种神经网络计算系统,包括:基于用于执行神经网络计算的指令执行各自功能的多个功能模块;用于缓存执行神经网络计算所需数据的内部缓存;以及控制器,用于:使用第一功能模块执行当前指令;以及至少基于所述当前指令的参数信息以及直接依赖所述当前指令的后续指令的依赖信息,在所述当前指令执行完毕之前,使用第二功能模块开始所述后续指令的执行。

优选地,所述控制器可以进一步用于:至少基于所述当前指令和所述后续指令的类型信息,将所述当前指令的执行划分为依赖和无依赖两个阶段;在所述依赖阶段已完成的情况下直接生成所述当前指令结束标示;以及至少基于所述当前指令结束标示,使用第二功能模块执行所述后续指令。

优选地,所述控制器可以进一步用于:至少基于所述参数信息和所述依赖信息,将所述当前指令的执行划分为多个阶段;在所述多个阶段的至少一个阶段已完成的情况下生成阶段结束标示;以及至少基于所述阶段结束标示,使用第二功能模块执行所述后续指令。

优选地,所述控制器可以进一步用于:基于所述已完成的至少一个阶段得到的数据,使用第二功能模块执行所述后续指令。

划分的所述多个阶段的粒度大小由所述控制器至少基于所述用于执行神经网络计算的指令的粒度大小以及用于执行所述神经网络计算的计算系统的参数来确定。

优选地,所述多个功能模块可以包括:执行将用于神经网络计算的数据从外部存储器加载至内部缓存的数据加载指令的数据加载引擎,所述用于神经网络计算的数据包括参数数据和特征图数据;执行从所述内部缓存读取所述参数数据和特征图数据以进行运算并将运算结果回存所述内部缓存的数据运算指令的数据运算引擎;以及执行将所述运算结果从所述内部缓存存储回所述外部存储器的数据存储指令的数据存储引擎。

优选地,所述第一功能模块可以是数据加载引擎,所述第二功能模块可以是数据运算引擎,并且响应于所述数据加载引擎加载完成至少一个完整运算单元的权重和特征图数据,所述数据运算引擎开始所述数据运算指令的执行。

优选地,所述第一功能模块可以是数据运算引擎,所述第二功能模块可以是数据存储引擎,并且响应于所述数据运算引擎生成至少一个运算最终结果并将所述至少一个运算最终结果缓存至所述内部缓存,所述数据存储引擎开始所述数据存储指令的执行以将所述至少一个运算最终结果从所述内部缓存存储回所述外部存储器。

优选地,所述第一功能模块可以是数据存储引擎,所述第二功能模块可以是数据加载引擎,并且响应于所述数据存储引擎存储回所述外部存储器的输出特征图数据与直接依赖于所述当前数据存储指令的数据加载指令要从所述外部存储器中加载的输入特征图数据不存在依赖关系,在所述输出特征图数据写入总线缓冲区之后,使用所述数据加载模块开始所述数据加载指令的执行。

用于执行神经网络计算的指令中可以包括所述指令与其他指令的显式依赖关系信息,并且所述控制器将所述当前指令中的显式依赖关系信息用作所述直接依赖所述当前指令的后续指令的依赖信息。

所述计算系统可以至少部分由GPU、FPGA或ASIC实现。

本发明提出了一种神经网络计算系统内部的指令调度方法及相应计算系统,通过在当前指令执行完成之前启动对后续依赖指令的执行,能在具有依赖关系的指令之间实现更高的并行度,由此从整体上提升神经网络计算的计算效率。具体地,可以通过提前发出指令结束标示来实现其他模块对后续指令的提前执行,也可以通过更细粒度的多阶段划分来实现指令间的细粒度依赖,由此提升各功能模块之间的并行度。

附图说明

通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。

图1示出了典型CNN的构成例。

图2示出了神经网络中一个卷积层的典型操作例。

图3示出了卷积操作的一个例子。

图4示出了现有神经网络编译器的编译示意图。

图5示出了根据本发明一个实施例的用于执行神经网络计算的指令调度方法的流程示意图。

图6示出了根据本发明一个实施例的用于执行神经网络计算的计算系统的示意图。

图7示出了根据本发明另一个实施例的用于执行神经网络计算的计算系统的示意图。

图8A和8B示出了现有技术和本发明中具有依赖关系的指令执行状况的例子。

图9示出了可用于实现本发明涉及神经网络计算的SoC的一个例子。

具体实施方式

下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。

人工智能近年得到迅速发展,在图像分类、检测、视频和语音处理等领域取得良好的应用效果,并且依然具备极大的发展前景。神经网络是人工智能应用的核心,深度学习神经网络算法是其中最常见的一种神经网络模型。神经网络的工作负载特征是计算和数据密集。神经网络计算所需的乘加操作通常为G数量级,例如目标检测类神经网络SSD的计算量为120G操作次数。而计算所需参数则通常为M至数百M字节数量级,例如分类神经网络VGG的参数为480M字节。

常见的人工神经网络(ANN)包括深度神经网络(DNN)、循环神经网络(RNN)与卷积神经网络(CNN)。以下以CNN为例进行一定程度的背景说明。

CNN基本概念

如图1所示,典型的CNN由一系列有序运行的层(Layer)组成。

CNN神经网络由输入层、输出层和多个隐藏层串联组成。CNN的第一层读取输入值,例如输入图像,并输出一系列的激活值(也可称为特征图)。下面的层读取由上一层产生的激活值,并输出新的激活值。最后一个分类器(classifier)输出该输入图像可能属于的每一类别的概率。

这些层大致可分为带权重的层(如CONV层、全连接层、批量归一化层等)和不带权重的层(如池化层、ReLU层、Softmax层等)。CONV层(Convolutional layers,卷积层)以一系列特征图作为输入,并以卷积内核卷积获得输出激活值。池化层(Pooling layer)通常与CONV层相连,用于输出每个特征图中的每个分区(sub area)的最大值或平均值,由此通过亚采样降低计算量,同时保持某种程度的位移、尺度和形变不变性。一个CNN中可以包括卷积层和池化层之间的多个交替,由此逐步降低空间分辨率并增加特征映射的数量。CONV层之间也可以不经过池化层直接相连。随后可以连接至至少一个全连接层(FC),通过应用于输入特征向量上的线性变换,得到包括多个特征值的一维向量输出。

总体来说,带权重的层的操作可以表示为:

Y=WX+b,

其中W为权重值,b为偏置,X为输入激活值,Y为输出激活值。

不带权重的层的操作可以表示为:

Y=f(X),

其中f(X)为非线性函数。

在此,“权重”(weights)指代隐藏层中的参数。在CNN网络中,可以将权重认为是针对每一卷积层尺寸可以有所变化,针对每一卷积层的每个通道取值也可以有所变化的卷积核。从广义上理解,权重还可以包括偏置,并且是通过训练过程习得的数值,并且在推理时保持不变。另外,CNN还可以包括用于执行其他操作的参数,例如不带权重的层进行各类操作所需的参数。激活值指代从输入层开始,每一层的输出由输入值和权重值通过运算得到,在各层之间传递的数值,也称为特征值。与参数值不同,激活值的分布会根据输入数据样本而动态变化。

如图所示,在特征值被送入FC层之前,从输入特征图(输入图像)开始的各个层都具有多个通道(channel),用以表征输入图像的不同特征。在输入为彩色图像时,最初的输入特征图通常具有RGB三个通道,同一层内不同通道的特征值与尺寸相同但取值可以不同的卷积核分别进行卷积计算以生成该层的输出特征值,随后该特征值被送入通道数与卷积核大小可以不同的下一CONV层(Layer 1)中进行进一步的特征提取。重复上述过程直至Layer 7的输出被送入FC层。如图所示,在输入特征图中的W、H和C分别指代宽、高和通道三个维度。上述箭头可以指代具体计算顺序或计算并行度(尤其是在高并行度计算平台上进行计算的情况下)。

第一个FC层可以是用于将各个通道的特征提取为一个一维特征向量的全连接层。第二个FC层则可以是用于进行分类的分类器。

卷积层的操作

无论是DNN、RNN还是CNN,典型的神经网络模型,尤其是用于计算机视觉应用的神经网络模型都包括如图1所示的多个CONV层。针对每个CONV层,都会从输入的特征图数据中提取出更高级别的抽象数据,以保留输入数据中重要且唯一的信息。现代的DNN能够通过利用深层级(例如,几百个卷积层)来实现优异的视觉性能。

图2示出了神经网络中一个卷积层的典型操作例。上述操作同样适用于全连接层,例如图1所示的FC层。每个卷积层的三维输入是具有多个通道(C)的二维特征图(W×H)。对进行视觉处理的神经网络而言,其第一次的输入通常是具有RGB三个颜色通道的二维图像。多个三维过滤器(具有R×S×C维度的M个过滤器,过滤器也可被称为卷积核)随后与输入特征图进行卷积,并且每个过滤器可以生成输出的三维特征图(具有M个通道的二维E×F特征图)的一个通道。相同的一组M个过滤器可以应用于具有N个输入特征图的批次(B)。于是,N个输入特征图能够获取N个输出特征图(在此,也可以将批次B看作是输入的第四个维度)。此外,可以对经过滤的结果施加1维的偏置(图2中未示出)。

图3示出了卷积操作的一个例子。该卷积操作可以看作是在某一个通道C上,二维过滤器(R×S)与二维特征图(W×H)的卷积。如图3所示,使用一个3x3(R×S)的卷积核,以步长1对一个5x5(W×H)的特征图进行卷积计算。图的左侧示出了第一次卷积计算,中间示出了第二次卷积计算,依次类推。根据卷积计算的定义可知,每次具体的卷积计算可以分解成多次乘加计算。在经过9次卷积计算后,得到图3右侧的经卷积的3x3特征图。这9次的卷积计算之间不存在依赖关系,因此可以在利用高并行度计算平台进行计算时,在单次操作中完成执行(并行度M通常可以达到数千量级)。图3可以看作是CONV层多个通道中的一个通道C的卷积操作,在完成了所有通道C的卷积操作以及后续的相加操作后才能得到输出三维特征图的M个通道中的一个通道的特征图。更进一步地,上述输出三维特征图(具有M个通道的二维E×F特征图)也只是该批次中N个输出三维特征图之一。

神经网络的部署

在部署使用CNN进行推理(例如,图像分类)之前,首先需要对CNN进行训练。通过训练数据的大量导入,确定神经网络模型各层的参数,例如权重和偏置。

为了将训练之后的深度神经网络进行部署,需要使用编译器将神经网络算法编译成计算平台所能执行的二进制指令流。不同于使用如C++或Java等的高级语言开发的应用程序,神经网络算法有着自己独特的语法和结构。有鉴于此,业已出现了专用于神经网络计算的高性能计算平台以及相应的神经网络编译器。例如,一种深度神经网络编译器DNNC(Deep Neural Network Compiler)可将神经网络算法编译成为DPU(Deep LearningProcessor Unit,深度学***台的优化指令流。通过解析神经网络的拓扑结构来构建与之对等的编译器内部计算图中间表示IR(Intermediate Representation)以及IR中的控制流和数据流信息,神经网络编译器基于IR施加各种编译优化和变换技术,在提高DPU计算性能的同时有效降低系统访存带宽和功耗需求。图4示出了现有神经网络编译器的编译示意图。如图4所示,可以将专门的神经网络算法(例如,针对经剪枝处理的CNN)送入包括编译前端、优化器和指令生成器的神经网络编译器,并生成用于神经网络计算平台(例如,DPU)的二进制指令码。

在此,“编译”指代利用编译器从一种高级的形式化方法描述的表示产生低级的面向计算平台上执行的目标代码的过程。由于硬件计算平台处理的只涉及二进制指令码,因此需要编译器将人们熟悉的高级语言描述转换成计算机可读的低级二进制代码。不同于使用C/C++等高级编程语言描述的源程序代码,神经网络需要通过描述神经网络算法的专用模型进行表示。神经网络算法包括神经网络算法的拓扑结构以及神经网络算法的参数。相比之下,神经网络拓扑结构的形式化描述所需的存储空间要远小于体量巨大的神经网络算法参数所需的存储空间。

在此,神经网络计算系统指代专用于执行神经网络推理计算的硬件平台,其也可被称为神经网络计算平台,并且可以被实现为神经网络专用的处理器,如上文所述的DPU。

本发明的指令调度技术

根据指令和数据流的概念可以将计算机体系结构划分为四种基本类型,分别是单指令单数据流、单指令多数据流、多指令单数据流以及多指令多数据流。单指令单数据流类型是一种传统架构,其硬件不支持任何形式的并行计算,所有指令都是串行执行,早期的计算机多采用此类架构。单指令多数据流架构常用于数字信号处理、图像处理以及多媒体信息处理等领域,一条指令对应多个并行数据处理单元。多指令单数据流架构并无实际应用,因为往往采用多指令架构的计算系统都对应有多个并行的数据流,所以多指令多数据流架构应用更为广泛。

在神经网络推理应用中,由于其计算并行度很高(如上参考图2和图3所述),且需要多个相互依赖的加速引擎协同工作,往往采用多指令多数据流架构。该架构中各个指令流之间的调度,往往决定着多数据流的工作效率。本发明提出了一种高效的指令调度的方式,可以有效提高此类系统的指令执行效率。

图5示出了根据本发明一个实施例的用于执行神经网络计算的指令调度方法的流程示意图。应该理解的是,上述指令调度方法可由用于执行神经网络计算的计算系统实现,例如由上文所述的深度学***台实现。

在步骤S510,获取用于执行神经网络计算的指令。在此获取的指令可以是如图4所示的经编译的可由DPU执行的二进制指令码。

在步骤S520,使用第一功能模块执行当前指令。随后,在步骤S530,至少基于所述当前指令的参数信息以及直接依赖所述当前指令的后续指令的依赖信息,在所述当前指令执行完毕之前,使用第二功能模块开始所述后续指令的执行。

在诸如神经网络计算系统的多指令多数据流系统中往往有两个或以上的功能模块(例如,加速引擎),每个功能模块都会执行与其相应的指令。各功能模块可以并行执行各自的指令,且不同功能模块之间的指令存在一定的依赖关系。本发明能够利用依赖的指令之间更细粒度的并行度,使得后续指令能够依赖与当前指令的一部分便开始执行,由此提升指令执行的交叠度,从而整体上提升神经网络推理计算的执行效率。

在一个实施例中,对于步骤S530,进一步可以包括:至少基于所述当前指令和所述后续指令的类型信息,将所述当前指令的执行划分为依赖和无依赖两个阶段;在所述依赖阶段已完成的情况下直接生成所述当前指令结束标示;以及至少基于所述当前指令结束标示,使用第二功能模块执行所述后续指令。在此,可以在当前指令真正被依赖的阶段执行完毕后,就提前发出指令结束标示,由此启动后续指令的执行。

在另一个实施例中,对于步骤S530,进一步可以包括至少基于所述参数信息和所述依赖信息,将所述当前指令的执行划分为多个阶段;在所述多个阶段的至少一个阶段已完成的情况下生成阶段结束标示;以及至少基于所述阶段结束标示,使用第二功能模块执行所述后续指令。换句话说,处理器能够在实际的神经网络推理计算执行过程中,基于所获取指令的参数以及各指令相互间的执行顺序和依赖关系,将获取的指令进一步划分为更小的粒度,并且通过处理器内部生成的针对上述更小粒度执行完成的结束标示,使得具有依赖关系的后续指令能够基于上述更小粒度间的依赖性而被提前执行,由此提升神经网络计算的整体效率。

指令之间的依赖性通常包括对在前指令运行结果的依赖或是对在前指令运行所需硬件的依赖。在对运行结果具有依赖的情况下,至少基于所述多个阶段的至少一个阶段已完成的结束标示,使用第二功能模块执行所述后续指令可以包括:基于所述已完成的至少一个阶段得到的数据,使用第二功能模块执行所述后续指令。

对于神经网络推理而言,由于其本身涉及的操作相对简单(神经网络模型算法所涉及的层的类型有限),数据量巨大,且各维度的并行度设置灵活,因此由神经网络计算平台所获取的神经网络计算操作指令的粒度较大。上述大粒度的指令使得神经网络模型对各类神经网络计算平台(例如,神经网络专用处理器)有着更为广泛的适应性,也为各计算平台的更细粒度的操作实现提供了空间。

图6示出了根据本发明一个实施例的用于执行神经网络计算的计算系统的示意图。如图所示,神经网络计算系统600可以包括多个功能模块610、内部缓存620和控制器630。

多个功能模块610可以是基于获取的用于执行神经网络计算的指令执行各自功能的多个功能模块。内部缓存620可以缓存执行神经网络计算所需数据的。控制器630则用于控制多个功能模块610和内部缓存620的操作。图中的细箭头指代控制指令的发送,粗箭头则指代数据的传递。多个功能模块中的“多个”指代两个或以上,图中虽然示出了三个功能模块,但应该理解的是,计算系统600可以根据具体应用而具有更多或是更少的功能模块。

控制器630可以用于使用第一功能模块执行当前指令,并且可以至少基于所述当前指令的参数信息以及直接依赖所述当前指令的后续指令的依赖信息,在所述当前指令执行完毕之前,使用第二功能模块开始所述后续指令的执行。在此,第一功能模块和第二功能模块可以是多个功能模块610中的任意模块。“第一”和“第二”仅是用于区分不同的模块,而并非对模块的次序或是重要性做出任何暗示。同样应该理解的是,随着指令的执行,多个功能模块之间的角色可以变化,换句话说,可以依据当前正执行的指令来确定哪个功能模块是正执行当前指令的第一功能模块,哪个功能模块是要执行后续指令的第二功能模块。

在一个实施例中,控制器630可以是用于执行指令读取和分发的控制模块。由此,使用第一功能模块执行当前指令可以理解为控制器630通过向第一功能模块分发当前指令而使得第一功能模块执行该当前指令。而所述控制器630用于在所述当前指令执行完毕之前,使用第二功能模块开始所述后续指令的执行则可被理解为控制器630在当前指令真正执行完毕之前,就获取由第一功能模块提前发出的指令结束标示,并通过提前向第二功能模块发送后续指令来提前启动第二功能模块对后续指令的执行。

内部缓存620从外部存储器中读取的数据中通常还可以包括指令数据。因此,在一个实施例中,尤其是在控制器630实现为执行指令读取和分发的控制模块的情况下,控制器630可以从内部缓存620中读取指令数据。

用于执行神经网络计算的指令中可以包括指令与其他指令的显式依赖关系信息。上述显式依赖关系信息可以是在例如指令编译阶段由专门的神经网络编译器基于输入的神经网络算法模型而编译得出的。在控制器630是用于执行指令读取和分发的控制模块的情况下,控制器630可以获取用于执行神经网络计算的经编译指令,同时获取上述显式依赖关系信息,并且可以上述信息用作直接依赖所述当前指令的后续指令的依赖信息。

在一个实施例中,控制器630可以进一步用于:至少基于所述当前指令和所述后续指令的类型信息,将所述当前指令的执行划分为依赖和无依赖两个阶段;在所述依赖阶段已完成的情况下直接生成所述当前指令结束标示;以及至少基于所述当前指令结束标示,使用第二功能模块执行所述后续指令。在控制器630是用于执行指令读取和分发的控制模块的情况下,上述阶段划分也可以在例如指令编译阶段由专门的神经网络编译器实现,第一功能模块可以在依赖阶段完成后直接生成所述当前指令结束标示,指令读取和分发的控制模块630在接收到上述结束标示之后,可以直接向第二功能模块分发后续指令以供其执行。

在一个实施例中,控制器630可以进一步用于:至少基于所述参数信息和所述依赖信息,将所述当前指令的执行划分为多个阶段;以及在所述多个阶段的至少一个阶段已完成的情况下生成阶段结束标示;以及至少基于所述阶段结束标示,使用第二功能模块执行所述后续指令。类似地,在控制器630是用于执行指令读取和分发的控制模块的情况下,上述阶段划分也可以在例如指令编译阶段由专门的神经网络编译器实现,第一功能模块可以在某一阶段完成后生成该阶段结束标示,指令读取和分发的控制模块630在接收到该阶段结束标示之后,可以直接向第二功能模块分发后续指令以供其执行。随后,第一功能模块例如可以持续向第二功能模块发送各阶段执行完成的结束标示,以使得第二功能模块能够执行相应的细粒度依赖操作。

在一个实施例中,多个功能模块610可以是更为具体的加速引擎。图7示出了本发明一个实施例的用于执行神经网络计算的计算系统的示意图。图7的神经网络计算系统700同样包括内部缓存720和控制器730。进一步地,该计算系统700的多个功能模块可以分别是数据加载引擎711、数据运算引擎712和数据存储引擎713。三个引擎共享一个内部缓存720,并且数据加载引擎711和数据存储引擎713例如可以经由总线或其他通信机制与外部存储器740进行数据交互。

数据加载引擎711可以执行将用于神经网络计算的数据从外部存储器加载至内部缓存的数据加载指令。加载的数据可以包括参数数据和特征图数据。参数数据可以包括权重数据(例如,卷积核)和诸如偏置等其他参数。特征图数据可以包括输入的图像数据,也可以包括各卷积层的中间计算结果。数据运算引擎712可以执行从内部缓存720读取权重数据和特征图数据以进行运算并将运算结果回存内部缓存720的数据运算指令。数据存储引擎713则可以执行将所述运算结果从内部缓存720存储回外部存储器740的数据存储指令。可以理解的是,数据加载引擎711、数据运算引擎712和数据存储引擎713是在内部控制器730的调度下实现各自的指令功能的。

相应地,获取的用于神经网络计算的指令可以包括将用于神经网络计算的数据从外部存储器加载至内部缓存的数据加载指令,所述用于神经网络计算的数据包括参数数据和特征图数据;从所述内部缓存读取所述参数数据和特征图数据以进行运算并将运算结果回存所述内部缓存的数据运算指令;以及将所述运算结果从所述内部缓存存储回所述外部存储器的数据存储指令。

图8A和8B示出了现有技术和本发明中具有依赖关系的指令执行状况。如图8A所示,在现有技术中,通常需要在前功能模块完成了当前指令,才能开始依赖该当前指令执行结果的下一指令的执行。例如,在数据加载引擎基于当前数据加载指令进行数据加载时,需要接收到该数据加载引擎发出当前指令完成的指示信息才能由数据运算引擎开始基于上述加载数据的数据运算指令的执行。

而在利用了本发明指令调度原理的计算系统中,例如,神经网络专用处理器中,可以如图8B所示在所述当前指令执行完毕之前,使用其他引擎开始所述后续指令的执行。由此,通过将原本具有依赖关系的指令在时间上部分叠加执行来提升计算系统的整体计算效率。

回到图5,在步骤S530,可以基于所述参数信息和所述依赖信息,将所述当前指令的执行划分为多个阶段;在所述多个阶段的至少一个阶段已完成的情况下生成阶段结束标示;以及至少基于所述阶段结束标示,使用第二功能模块执行所述后续指令。划分的所述多个阶段的粒度大小至少基于所述用于执行神经网络计算的指令的粒度大小以及用于执行所述神经网络计算的计算系统的参数来确定。换句话说,计算系统的内部控制器(例如,控制器630或730)可以根据获取的神经网络模型算法的指令粒度大小以及计算系统本身的参数来确定用于该计算系统内部的指令优化调度的粒度,并且可以通过送出细粒度的结束标示给用于执行后续指令的功能模块,使得该功能模块能够在获取在前指令执行完毕的指示信息之前就开始后续功能的执行。

在一个实施例中,步骤S520可以包括使用数据加载引擎执行当前数据加载指令。步骤S530则可包括在获取所述当前数据加载指令执行完毕的指示信息之前,响应于用于至少一个完整运算单元的权重和特征图数据加载完成,使用数据运算引擎开始所述数据运算指令的执行。在此,第一功能模块是数据加载引擎,第二功能模块是数据运算引擎。

在具体的神经网络加速应用中,会根据实际情况各自选用恰当的并行策略来执行如图2所示的卷积计算。上述并行计算可以在通道(C)、长宽(WxH)和批次(B)中的任意一个或多个方向上进行。本发明的指令调度策略可以根据数据加载引擎基于数据加载指令加载数据的顺序,以及数据运算引擎基于后续的数据运算指令所采取的并行运算方案来决定当前数据加载指令与后续数据运算指令的细粒度对应关系并执行相应的计算。

例如,在采用权重固定(weight stationary)的架构时,由于数据加载模块会先加载权重再例如逐行加载特征值,因此可以在一个完整的运算单元所需的数据加载完后(或是在一个时钟周期内并行运算的运算单元所需的数据都加载完后),使用数据运算引擎从内部缓存中读取相应数据进行计算。计算系统可以根据基于上述权重固定架构、在前数据加载指令的粒度及其数据运算引擎内的数据运算并行度来合理确定当前数据加载指令和后续数据运行指令的粒度,并以逐粒度对应的方式实现与例如特征值逐行加载相对应的卷积(乘加)运算。

相应地,在采用特征值固定(feature map stationary)的架构时,由于数据加载模块会首先加载计算所需的特征值,再逐个加载卷积核,因此同样可以在一个完整的运算单元所需的数据加载完后(或是在一个时钟周期内并行运算的运算单元所需的数据都加载完后),就使用数据运算引擎从内部缓存中读取相应数据进行计算。计算系统可以根据基于上述特征值固定架构、在前数据加载指令的粒度及其数据运算引擎内的数据运算并行度来合理确定当前数据加载指令和后续数据运行指令的粒度,并以逐粒度对应的方式实现与例如卷积核逐个加载相对应的卷积(乘加)运算。

在进行数据加载时,还可以采用其他的数据复用策略(例如行固定架构)或是获取到采取其他数据复用策略的神经网络计算指令等,无论采取何种策略,本发明的神经网络计算系统都能够基于上述复用信息、其自身的架构信息以及指令本身的依赖关系给出合理的指令调度方案,从而更为合理且高效的实现后续依赖指令的部分并行处理。

在一个实施例中,步骤S520可以包括使用数据运算引擎执行当前数据运算指令,步骤S530则可包括在获取所述当前数据运算指令执行完毕的指示信息之前,响应于至少一个运算最终结果的生成,将所述至少一个运算最终结果缓存至所述内部缓存,并使用数据存储引擎开始所述数据存储指令的执行以将所述至少一个运算最终结果从所述内部缓存存储回所述外部存储器。在此,第一功能模块是数据运算引擎,第二功能模块是数据存储引擎。

在数据运算指令后接数据存储指令时,控制器可以根据具体运算指令的参数,针对逐批获得的输出特征图计算结果(即,要存回外部存储器的计算结果,而非可供当前数据运算指令再次使用的中间计算结果),向数据存储引擎给出相应的计算结束标示,数据存储引擎于是可以根据逐一给出计算结束标示,以相应的粒度将输出特征图存回外部存储器。

在一个实施例中,步骤S520可以包括使用数据存储引擎执行当前数据存储指令,并且步骤S530可以包括响应于当前数据存储指令存储回所述外部存储器的输出特征图数据与直接依赖于所述当前数据存储指令的数据加载指令要从所述外部存储器中加载的输入特征图数据不存在依赖关系,在所述输出特征图数据写入总线缓冲区之后,使用数据加载模块开始所述数据加载指令的执行。在此,第一功能模块是数据存储引擎,第二功能模块是数据加载引擎。

在大多数情况下,神经网络中后续要加载的数据与当前正存储的数据没有依赖关系,即加载的数据无需等待存储数据的完成即可进行。在此情况下,数据的存储指令无需得到总线或者是设备的回应即可认为执行结束。在经由总线进行数据存取的实施例中,由于总线被输出数据占用,因此需要在输出数据占用结束后再进行加载数据的读取。但由于加载数据无需真正等到输出数据确实存回外部存储器中,因此可以在例如输出的特征图数据写入总线缓冲区之后,通过控制器发送的对应结束标示(即,指示输出数据对总线的占用结束的处理器内部标示,而非数据存储指令结束的指示信息)来开始后续数据加载指令的执行,例如,逐粒度的分段执行。

本发明的指令调度方案还可以进一步适用于指令内更细粒度操作的彼此交叠。例如,神经网络模型中的批量归一化(batch normalization)操作通常可以在数据加载时一并完成。若将加载数据记作Ld,加载参数计作Lw,实际的加载指令可以是Lw0,Lw1,...,Lwn,Ld0,Ld2,...,Ldm。由于各参数之间不存在依赖关系,因此在执行Lw0-Lwn时,后一条指令不必等待前一条真正执行完即可执行,在执行Ld0-Ldn时情况也是类似的。换句话说,Lw0-Lwn与Ld0-Ldn的执行可以存在一定的交叠。但在执行Ld0-Ldn时必须等待Lwn执行完毕才能执行,由此确保数据加载时参数已全部准备完毕,由此实现例如针对上述BL层的边加载边运算。

在专用的神经网络计算平台中,由于通常会采用GPU、FPGA或ASIC等异构电路来实现高并行度计算,因此相比于经由总线的外部存储器的数据存取操作,执行数据运算所需的时间很短。另外,神经网络模型算法具有涉及的计算类型较为单一,但计算量极大的特点。有鉴于此,本发明的指令调度方案通过将成块依赖的指令划分成更小的粒度,提升了为数据运算引擎供数的效率,并且对总线的数据存取进行了更为密集的利用,由此从整体上提升了神经网络计算系统的执行神经网络计算的效率。

应该理解的是,尽管本发明中由多个功能模块各自执行的不同类别的指令存在一定的相互依赖关系,但各个类别指令本身的执行可以是并行的。换句话说,各个功能模块可以并行执行各自类别的指令,并且在本发明所述的指令调度方案的指导下实现对依赖指令的合理执行。换句话说,本发明的当前指令以及执行当前指令的第一功能模块可以同时存在多个,后续指令以及执行后续指令的第二功能模块也可以同时存在多个,从而实现多模块的多依赖并行执行。

在一个实施例中,本发明的神经网络计算系统可以在包括通用处理器、存储器和数字电路的片上系统(SoC)实现。图9示出了可用于实现本发明所涉及神经网络计算的SoC的一个例子。

在一个实施例中,可由SoC上的数字电路部分(例如,FPGA)来实现本系统所需的深度学习网络,例如卷积神经网络。例如,使用GPU、FPGA或ASIC实现的神经网络专用处理器来实现根据本发明的指令调度方案。由于神经网络模型进行的是并行计算,因此通过逻辑硬件,尤其是GPU、FPGA或ASIC来实现神经网络计算功能具有天然优势,并且相比于软件执行,能够实现更低的功耗。

在一个实施例中,可以将通过在前训练得到的有关神经网络的全部参数都存储在片上系统的存储器(例如,主存储器,对应于图6和图7中的外部存储器)中,在随后进行神经网络推理计算(例如,目标检测)时,首先从主存储器中读取神经网络各层的参数,再由图9所示的可编程逻辑模块进行执行。应该理解的是,还可以使用图9的可编程逻辑模块所示以外的其他架构来实现本发明的神经网络计算系统。

本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。

附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

20页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:高并行度计算系统及其指令调度方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!