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

一种神经网络加速器、加速方法以及装置

文献发布时间:2024-04-18 19:58:30


一种神经网络加速器、加速方法以及装置

技术领域

本申请涉及神经网络领域,尤其涉及一种神经网络加速器、加速方法以及装置。

背景技术

人工智能(artificial intelligence,AI)是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。换句话说,人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式作出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。人工智能领域的研究包括机器人,自然语言处理,计算机视觉,决策与推理,人机交互,推荐与搜索,AI基础理论等。

神经网络隶属于人工智能,是一种应用类似于大脑神经突触连接的结构进行信息处理的数学模型。神经网络中涉及大量的计算,主要包括卷积操作、激活操作、池化操作和量化运算等,占用了神经网络处理的大部分时间。

如何在有限的硬件面积内,使神经网络获得较高的性能,是一个值得研究的问题。

发明内容

本申请提供一种神经网络加速器,还提供了加速方法、装置、计算机可读存储介质以及计算机程序产品。通过本申请提供的方案能够降低神经网络在运行中产生的功耗,提升神经网络的处理性能。

为达到上述目的,本申请实施例提供如下技术方案:

第一方面,本申请的实施例提供了一种神经网络加速器,该加速器包括第一运算电路和第二运算电路,第二运算电路包括以下电路中的至少一种:激活运算电路、量化运算电路或者池化运算电路。换句话说,第二运算电路包括激活运算电路、量化运算电路或者池化运算电路中的至少一种运算电路。第一运算电路,用于对第一运算电路的输入执行卷积运算。第一运算电路包括两个输入和一个输出,两个输入可以包括卷积核和输入图像,其中卷积核通过权重矩阵表示,输入图像可以通过输入图像矩阵表示,输入图像也可以通过输入图像向量表示。第一运算电路的输出端与第二运算电路的输入端直接连接,即第一运算电路在执行卷积运算后将输出通过输出接口直接输入至第二运算电路的输入接口,第一运算电路的输出端无需设置用于缓存该输出结果的存储器或者缓存器。

当第二运算电路包括激活运算电路时,该激活运算电路,用于对激活运算电路的输入执行激活运算,激活运算电路的输入是从第一运算电路或者量化运算电路或者池化运算电路中获取的。假设激活运算电路的输入为一个1*N的向量,输出经过激活处理后仍为一个1*N的向量。当第二运算电路包括量化运算电路时,该量化运算电路,用于对量化运算电路的输入执行量化运算,量化运算电路的输入是从第一运算电路或者激活运算电路或者池化运算电路中获取的。假设量化运算电路的输入为一个1*N的向量,输出经过量化处理后仍为一个1*N的向量,输出的向量的数据格式包括但不限于fp16、s16、s8以及s4。当第二运算电路包括池化运算电路时,该池化运算电路,用于对池化运算电路的输入执行池化运算,池化运算电路的输入是从第一运算电路或者激活运算电路或者量化运算电路中获取的。也即,第一运算电路在执行卷积运算后将输出结果输入至第二运算电路,当前运算电路是第二运算电路中的任意一个电路,上一个运算电路为第一运算电路或者第二运算电路中的运算电路,当前运算电路的输入端与上一个运算电路的输出端连接时,上一个运算电路在执行对应的运算后将运算结果输入至当前运算电路。

由第一方面提供的方案可知,将神经网络执行的多种运算配置为随路运算,每次完成一种运算,不需要将该运算结果存入存储器中,而是直接用于其他运算中。由于不需要每次完成一种运算,都要将该运算结果存入存储器中,当需要调用该运算结果时,再从存储器中进行读取,所以节约了将运算结果存入存储器,再从存储器中读取运算结果这部分的功耗,有助于提升神经网络的性能。

在第一方面的一种可能的实施方式中,当所述激活运算电路的输入端与所述第一运算模型的输出端连接时,所述第一运算电路执行卷积操作后将输出数据输入至所述激活运算电路的输入端,或者,当所述激活运算电路的输入端与所述量化运算电路的输出端连接时,所述量化运算电路执行量化操作后将输出数据输入至所述激活运算电路的输入端,或者,当所述激活运算电路的输入端与所述池化运算电路的输出端连接时,所述池化运算电路执行池化运算后将输出数据输入至所述激活运算电路的输入端;

当所述量化运算电路的输入端与所述第一运算模型的输出端连接时,所述第一运算电路执行卷积操作后将输出数据输入至所述量化运算电路的输入端,或者,当所述量化运算电路的输入端与所述激活运算电路的输出端连接时,所述激活运算电路执行激活运算后将输出数据输入至所述激活运算电路的输入端,或者,当所述量化运算电路的输入端与所述池化运算电路的输出端连接时,所述池化运算电路执行池化运算后将输出数据输入至所述量化运算电路的输入端;

当所述池化运算电路的输入端与所述第一运算模型的输出端连接时,所述第一运算电路执行卷积操作后将输出数据输入至所述池化运算电路的输入端,或者,当所述池化运算电路的输入端与所述激活运算电路的输出端连接时,所述激活运算电路执行激活运算后将输出数据输入至所述池化运算电路的输入端,或者,当所述池化运算电路的输入端与所述量化运算电路的输出端连接时,所述量化运算电路执行量化运算后将输出数据输入至所述池化运算电路的输入端。

因此,在本申请实施方式中,第二运算电路中的各个电路存在多种连接方式,可以适应大多数需要进行量化、激活或者池化的神经网络,可以为大多数神经网络通过随路的方式提供加速,提高神经网络的运行效率。

在第一方面的一种可能的实施方式中,第一运算电路,具体用于利用卷积核遍历特征图feature map,以对卷积核中的元素和遍历区域内特征图中的元素进行卷积运算,得到多个卷积结果。池化运算电路,具体用于按照池化运算电路对多个卷积结果执行池化运算的顺序,获取多个卷积结果。为了保证池化运算电路能够正常进行随路运算,而无需引入存储器,卷积运算中卷积核执行卷积运算的顺序是根据池化运算中池化窗口执行池化运算的顺序确定的。换句话说,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据。

在第一方面的一种可能的实施方式中,第一运算电路还用于对输入至第一运算电路的两个张量的对应位置的元素进行相加操作、相减操作、相乘操作、相除操作、取最大值操作或者取最小值操作。通过同一个电路执行卷积运算或者element wise运算。换句话说,第一运算电路除了用于执行卷积运算,还可以用于执行element wise运算。这是因为卷积运算的本质是元素乘累加(元素乘,元素加),element wise运算的本质是对元素进行加、减、乘、除、取最大值,取最小值等操作。所以,本质上二者在运算是有重叠的,可以用一个硬件来做,即二者的硬件资源可以复用,降低硬件的面积开销,降低设计的复杂性。

在第一方面的一种可能的实施方式中,激活运算电路的输入具体是从第一运算电路中获取的,量化运算电路的输入具体是从激活运算电路中获取的,池化运算电路的输入具体是从量化运算电路中获取的。在这种实施方式中,给出了一种具体的加速器的结构,该结构能够支持大部分不同结构的应用于穿戴领域中的神经网络中的运算流程。

在第一方面的一种可能的实施方式中,池化运算中池化窗口的尺寸为w×h,池化步长为stride,其中,w、h、stride的取值相同,w为大于1的正整数。通过这样的设计,任意两次池化处理所处理的元素都没有重叠,能够节约计算量,进一步提升神经网络的性能。

在第一方面的一种可能的实施方式中,该加速器应用于卷积神经网络CNN中。

在第一方面的一种可能的实施方式中,该加速器应用于循环神经网络RNN中。

在第一方面的一种可能的实施方式中,该加速器部署在可穿戴设备上。申请人发现在穿戴设备中部署相同的硬件设备,并将运行在该硬件设备上的神经网络执行的多种运算配置为随路运算,该硬件设备能够支持大部分不同结构的应用于穿戴领域中的神经网络。通过本方案,既可以保证能够通过一套硬件设备支持多种不同结构的神经网络执行多种运算,还能够提升神经网络的性能。

在第一方面的一种可能的实施方式中,激活运算通过sigmoid函数、tanh函数、prelu函数、leay函数或者relu函数实现。

在第一方面的一种可能的实施方式中,池化运算包括最大值池化运算或者平均值池化运算。

在第一方面的一种可能的实施方式中,卷积运算包括深度可分卷积depthwise运算、矩阵与向量相乘的卷积GEMV运算或者矩阵与矩阵相乘的卷积GEMM运算。

第二方面,本申请的实施例提供了一种加速方法,包括:对第一运算电路的输入执行卷积运算。其中,第一运算电路的输出接口与第二运算电路的输入接口直接连接,第一运算电路在执行卷积运算后,将输出通过第一运算电路的输出接口直接输入至第二运算电路的输入接口;第二运算电路包括以下电路中的至少一种:激活运算电路、量化运算电路或者池化运算电路。当第二运算电路包括激活运算电路时,对激活运算电路的输入执行激活运算,激活运算电路的输入是从第一运算电路或者量化运算电路或者池化运算电路中获取的。当第二运算电路包括量化运算电路时,对量化运算电路的输入执行量化运算,量化运算电路的输入是从第一运算电路或者激活运算电路或者池化运算电路中获取的。当第二运算电路包括池化运算电路时,对池化运算电路的输入执行池化运算,池化运算电路的输入是从第一运算电路或者激活运算电路或者量化运算电路中获取的。也即,第一运算电路在执行卷积运算后将输出结果输入至第二运算电路,当前运算电路是第二运算电路中的任意一个电路,上一个运算电路为第一运算电路或者第二运算电路中的运算电路,当前运算电路的输入端与上一个运算电路的输出端连接时,上一个运算电路在执行对应的运算后将运算结果输入至当前运算电路。

在第二方面的一种可能的实施方式中,对第一运算电路的输入执行卷积运算,包括:利用卷积核遍历特征图feature map,以对卷积核中的元素和遍历区域内特征图中的元素进行卷积运算,得到多个卷积结果。对池化运算电路的输入执行池化运算,包括:池化运算电路,具体用于按照池化运算电路对多个卷积结果执行池化运算的顺序,获取多个卷积结果。

在第二方面的一种可能的实施方式中,该方法还包括:对输入至第一运算电路的两个张量的对应位置的元素进行相加操作、相减操作、相乘操作、相除操作、取最大值操作或者取最小值操作。

在第二方面的一种可能的实施方式中,激活运算电路的输入具体是从第一运算电路中获取的,量化运算电路的输入具体是从激活运算电路中获取的,池化运算电路的输入具体是从量化运算电路中获取的。

在第二方面的一种可能的实施方式中,池化运算中池化窗口的尺寸为w×h,池化步长为stride,其中,w、h、stride的取值相同,w为大于1的正整数。

在第二方面的一种可能的实施方式中,激活运算通过sigmoid函数、tanh函数、prelu函数、leay函数或relu函数中的任一种实现。

在第二方面的一种可能的实施方式中,池化运算包括最大值池化运算或者平均值池化运算。

在第二方面的一种可能的实施方式中,卷积运算包括深度可分卷积(depthwiseseparable convolution)、矩阵与矩阵相乘的卷积(general matrix to matrixmultiplication,GEMM)以及矩阵与向量相乘的卷积(general matrix to vectormultiplication,GEMV)。

第三方面,本申请提供一种加速装置,包括:处理器和存储器,其中,处理器和存储器通过线路互联,处理器调用存储器中的程序代码用于执行上述第二方面任一项所示的加速方法中与处理相关的功能。可选地,该加速装置可以是芯片。

第四方面,本申请实施例提供一种计算机可读存储介质,包括指令,当其在计算机集群上运行时,使得计算机集群执行如第二方面或第二方面任意可能实现方式中所描述的方法。

第五方面,本申请实施例提供了一种包含指令的计算机程序产品,当其在计算机集群上运行时,使得计算机集群执行第二方面或第二方面任意可能实现方式中所描述的方法。

第六方面,本申请实施例提供了一种芯片系统,包括:处理器,处理器用于从存储器中调用并运行该存储器中存储的计算机程序,执行如第二方面或其相应的可能的实施方式提供的方法。

第七方面,本申请实施例提供了一种可穿戴设备,可穿戴设备上部署有第一方面或第一方面任意可能实现方式中所描述的神经网络加速器。

在第七方面的一种可能的实施方式中,可穿戴设备可以包括眼镜、电视、车载设备、手表或者手环中的至少一种。

需要说明的是,第二方面至第七方面所带来的有益效果可以参照第一方面以及第一方面可能的实现方式所带来的有益效果进行理解,这里不再重复赘述。

本申请在上述各方面提供的实现方式的基础上,还可以进行进一步组合以提供更多实现方式。

附图说明

图1为卷积神经网络CNN的结构示意图;

图2为循环神经网络RNN的结构示意图;

图3为本申请实施例提供的一种神经网络加速器的结构示意图;

图4为本申请实施例提供的另一种神经网络加速器的结构示意图;

图5为本申请实施例提供的另一种神经网络加速器的结构示意图;

图6为本申请实施例提供的第一运算电路的运算流程示意图;

图7a为relu激活函数的示意图;

图7b为sigmoid激活函数的示意图;

图7c为tanh激活函数的示意图;

图8a为本申请实施例提供的池化运算电路的一种运算流程示意图;

图8b为本申请实施例提供的池化运算电路的另一种运算流程示意图;

图9为本申请实施例提供的向池化运算电路输入数据的示意图;

图10a为本申请实施例提供的卷积运算电路的一种运算流程示意图;

图10b为本申请实施例提供的卷积运算电路的另一种运算流程示意图;

图10c为本申请实施例提供的卷积运算电路的另一种运算流程示意图;

图10d为本申请实施例提供的卷积运算电路的另一种运算流程示意图;

图11为本申请实施例提供的卷积运算电路的另一种运算流程示意图;

图12为本申请实施例提供的神经网络加速器的运算流程示意图;

图13为本申请实施例提供配置神经网络加速器的指令时的流程图;

图14为本申请实施例提供的另一种神经网络加速器的结构示意图;

图15为本申请实施例提供配置神经网络加速器的指令时的流程图;

图16为本申请的实施例提供的一种加速方法的流程示意图;

图17为本申请的实施例提供的一种芯片的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请实施例提供一种神经网络加速器、加速方法以及装置,为了更好的理解本申请实施例提供的方案,下面首先对本申请实施例提供的方案的研究思路进行介绍:

神经网络可以看作由神经单元组成的机器学习模型,神经单元可以是指以xs和截距1为输入的运算单元,该运算单元的输出可以为:

其中,s=1、2、……n,n为大于1的自然数,Ws为xs的权重,b为神经单元的偏置。f为神经单元的激活函数(activation functions),用于将非线性特性引入神经网络中,来将神经单元中的输入信号转换为输出信号。该激活函数的输出信号可以作为下一层卷积层的输入。神经网络是将多个上述单一的神经单元联结在一起形成的网络,即一个神经单元的输出可以是另一个神经单元的输入。每个神经单元的输入可以与前一层的局部接受域相连,来提取局部接受域的特征,局部接受域可以是由若干个神经单元组成的区域。

神经网络的种类很多,比如卷积神经网络(convolutional neuron network,CNN)、循环神经网络(recurrent neural networks,RNN)、深度神经网络(deep neuralnetwork,DNN)、深度卷积神经网络(deep convolutional neural networks,DCNN)等等。不同类型的神经网络,结构往往不同,即使是同一种类型的神经网络,也存在多种不同的结构。示例性的,下面结合几种典型的神经网络结构对神经网络进行介绍。

参阅图1,为卷积神经网络CNN(以下简称为CNN网络)的结构示意图。在图1中,CNN网络的输入数据可以涉及图像、文本、语音,还可以涉及物联网数据,包括已有系统的业务数据以及力、位移、液位、温度、湿度等感知数据。以下以该输入数据是图像为例进行说明。CNN网络将获取到的图像交由卷积层、池化层以及后面的神经网络层(图中未示出)进行处理,可以得到图像的处理结果。

卷积层(比如图1中示出的卷积层101、卷积层102以及卷积层103)可以包括很多个卷积算子,卷积算子也称为核或者卷积核,其在图像处理中的作用相当于一个从输入图像矩阵中提取特定信息的过滤器,卷积算子本质上可以是一个权重矩阵,这个权重矩阵通常被预先定义,在对图像进行卷积操作的过程中,权重矩阵通常在输入图像上沿着水平方向一个像素接着一个像素(或两个像素接着两个像素……这取决于步长stride的取值)的进行处理,从而完成从图像中提取特定特征的工作。该权重矩阵的大小应该与图像的大小相关,需要注意的是,权重矩阵的纵深维度(depth dimension)和输入图像的纵深维度是相同的,在进行卷积运算的过程中,权重矩阵会延伸到输入图像的整个深度。因此,和一个单一的权重矩阵进行卷积会产生一个单一纵深维度的卷积化输出,但是大多数情况下不使用单一权重矩阵,而是应用多个尺寸(行×列)相同的权重矩阵,即多个同型矩阵。每个权重矩阵的输出被堆叠起来形成卷积图像的纵深维度,这里的维度可以理解为由上面所述的“多个”来决定。不同的权重矩阵可以用来提取图像中不同的特征,例如一个权重矩阵用来提取图像边缘信息,另一个权重矩阵用来提取图像的特定颜色,又一个权重矩阵用来对图像中不需要的噪点进行模糊化等。该多个权重矩阵尺寸(行×列)相同,经过该多个尺寸相同的权重矩阵提取后的卷积特征图的尺寸也相同,再将提取到的多个尺寸相同的卷积特征图合并形成卷积运算的输出。

通过上述介绍可知,卷积运算的本质是对矩阵中的元素进行乘累加运算,具体的,将权重矩阵中的元素与输入图像矩阵中的元素进行乘累加运算。

当有多层卷积层时,上一层卷积层和下一层卷积层之间具有一个函数关系,该函数关系称为激活函数或者激励函数。换句话说,需要对上一层卷积层的输出进行激活处理后作为下一层卷积层的输入。这是因为如果不引入激活函数,则下一层卷积层的输入都是上层卷积层输出的线性函数,则无论神经网络有多少卷积层,每个卷积层的输出都是上一层卷积层输入的线性组合,那么神经网络的逼近能力就相当有限,所以可以通过引入非线性函数作为激活函数,以增加神经网络的表达能力,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

此外,还可以观测卷积层输出和原始输入之间的差异,该差异可以作为训练过程中的辅助信息,以评估CNN网络的性能,有助于提升CNN网络的训练效果。具体的,可以在卷积层之后引入逐项运算element-wise。element-wise本质上是对两个张量进行操作,它在相应张量内的对应的元素进行操作,比如可以对对应的元素进行加(add)、减(sub)、乘(mul)、除(div)、取最大(max),取最小(min)、取绝对值(abs)等操作。如果两个元素在张量内占据相同位置,则称这两个元素是对应的。该位置由用于定位每个元素的索引确定。

由于常常需要减少训练参数的数量,因此卷积层之后常常需要周期性的引入池化层,可以是一层卷积层后面跟一层池化层,也可以是多层卷积层后面接一层或多层池化层,在如图1中所示例的卷积层201接在最后一层卷积层之后。在图像处理过程中,池化层的目的就是减少图像的空间大小。池化层可以包括平均池化算子和/或最大池化算子(可以理解为进行平均池化运算或者最大池话运算),以用于对输入图像进行采样得到较小尺寸的图像。平均池化算子可以在特定范围内对图像中的像素值进行计算产生平均值作为平均池化的结果。最大池化算子可以在特定范围内取该范围内值最大的像素作为最大池化的结果。另外,就像卷积层中用权重矩阵的大小应该与图像尺寸相关一样,池化层中的运算符也应该与图像的大小相关。通过池化层处理后输出的图像尺寸可以小于输入池化层的图像的尺寸,池化层输出的图像中每个像素点表示输入池化层的图像的对应子区域的平均值或最大值。

需要说明的是,图1所展示的仅为CNN网络的一种可能的结构,CNN网络还可能包括其他结构,比如可能不包括池化层,或者在每一层卷积层之后都接入池化层等等。此外,除了图1中所展示的CNN网络包括的层,CNN网络可能包括更多的层,比如,在经过卷积层/池化层的处理后,卷积神经网络还不足以输出所需要的输出信息。因为如前所述,卷积层/池化层只会提取特征,并减少输入图像带来的参数。然而为了生成最终的输出信息(所需要的类信息或其他相关信息),卷积神经网络需要利用神经网络层来生成一个或者一组所需要的类的数量的输出。因此,在神经网络层中可以包括多层隐含层,该多层隐含层中所包含的参数可以根据具体的任务类型的相关训练数据进行预先训练得到,例如该任务类型可以包括图像识别,图像分类,图像超分辨率重建等等。在神经网络层中的多层隐含层之后,也就是整个卷积神经网络的最后层还可以包括输出层,该输出层具有类似分类交叉熵的损失函数,具体用于计算预测误差,一旦整个卷积神经网络的前向传播(如图1由101至201方向的传播为前向传播)完成,反向传播(如图1由201至101方向的传播为反向传播)就会开始更新前面提到的各层的权重值以及偏差,以减少卷积神经网络的损失,及卷积神经网络通过输出层输出的结果和理想结果之间的误差。

参阅图2,为循环神经网络RNN(以下简称为RNN网络)的结构示意图。如图2所示,RNN网络可能包括多个图2所展示的结构,以下将图2所展示的结构称为RNN模块,虽然和图1所展示的CNN网络的结构不同,但是在RNN网络中也涉及逐项运算、激活处理等。关于逐项运算、激活处理可以参照图1中相关描述进行理解,这里不再重复赘述。图2所示的RNN模块包括三个输入,和两个输出,其中,三个输入分别为c

可见,神经网络中涉及大量的计算,主要包括卷积操作、激活操作、池化操作和量化运算等,占用了神经网络处理的大部分时间。但是在很多领域中,需要在有限的硬件面积内获得较高的性能和能效比。如何能在满足一定的功耗约束下,高效的处理神经网络执行的多种运算,是硬件设备的关键。

申请人发现在穿戴设备中部署相同的硬件设备,并将运行在该硬件设备上的神经网络执行的多种运算配置为随路运算,该硬件设备能够支持大部分不同结构的应用于穿戴领域中的神经网络。其中,非随路是指每次完成一种运算,都要将该运算结果存入存储器中,当需要调用该运算结果时,需要从存储器中进行读取。随路运算是指每次完成一种运算,不需要将该结果存入存储器中,而是直接用于其他运算中。为了更好的理解随路运算和非随路运算的概念,这里结合一个例子进行说明,比如神经网络包括卷积模块和池化模块,该卷积模块的输出用于作为池化模块的输入。其中卷积模块用于执行卷积运算,可以参照上文描述的卷积层进行理解,池化模块用于执行池化运算,可以参照上文描述的池化层进行理解。如果卷积模块被配置为非随路的,则卷积模块每次完成卷积运算后,将该卷积运算的结果存在存储器中,池化模块需要从存储器中调取该卷积结果并对该卷积结果进行池化运算。如果卷积模块被配置为随路的,则卷积模块的输出直接作为池化模块的输入,不需要再将卷积模块的输出写入到存储器中。将神经网络执行的多种运算配置为非随路,每一次运算结果都需要写入存储器中,导致硬件设备的功耗巨大、性能低下。此外,由于需要支持不同的运算流程,所以需要添加数据依赖控制,控制各个模块之间的运算顺序,或者说控制各个模块从存储器中读取运算结果,设计比较复杂。所以,本申请实施例提供的方案将运行在该硬件设备上的神经网络执行的多种运算配置为随路运算,此基础上,本申请实施例还可以对硬件资源进行复用,能够在苛刻面积、满足功耗约束基础上,兼顾性能,有效提升神经网络的运算速率。

基于上述研究思路,下面对本申请实施例提供的一种神经网络加速器进行具体的介绍:

参阅图3,为本申请实施例提供的一种神经网络加速器的结构示意图。如图3所示,本申请实施例提供的一种神经网络加速器可以包括第一运算电路和第二运算电路,第一运算电路的输出端与第二电路的输入端直接连接,第一运算电路的输出为第二运算电路的输入,第一运算电路用于执行卷积运算,并在执行卷积操作后通过与第二运算电路之间连接的接口将输出直接输入至第二运算电路的输入端。第二运算电路被配置为随路执行激活运算、量化运算以及池化运算中的至少一种。即第二运算电路可以包括以下电路中的至少一种:量化运算电路、激活运算电路以及池化运算电路。其中,量化运算电路用于执行量化运算,激活运算电路用于执行激活运算,池化运算电路用于执行池化运算,量化运算电路、激活运算电路以及池化运算电路均被配置为执行随路运算,即互相连接的各个运算电路之间直接连接,互相连接的上一个运算电路在执行对应的运算后直接将输出结果输入至下一个运算电路,无需额外设置用于存储数据的模块或者存储介质。

前述的直接连接,即上一个运算电路的输出接口直接与下一个运算电路的输入接口电连接,上一个运算电路在执行对应的运算后将输出通过输出接口直接输入至下一个运算电路的输入接口中,运算电路之间可以直接传输数据,而无需经过存储器或者缓存器进行存储,可以实现各个运算电路的随路配置。

可以理解为,第一运算电路在执行卷积运算后将输出结果输入至第二运算电路,当前运算电路是第二运算电路中的任意一个电路,上一个运算电路为第一运算电路或者第二运算电路中的运算电路,当前运算电路的输入端与上一个运算电路的输出端直接连接,上一个运算电路在执行对应的运算后直接将运算结果输入至当前运算电路,而无需经过额外得到的用于存储数据的模块或者存储介质,实现更高效的数据传输。

需要说明的是,本申请提供的神经网络加速器中的运算电路,可以包括使用多种元件来,如通过三极管、电阻、二极管等电子元件的组合可以实现加、按位与、或等电路,这些电路可以通过组合的方式来实现前述的卷积、池化、量化或者激活等运算,具体的电子元件设置方式可以根据实际所需的电路来进行连接,本申请对此并不作赘述。

其中,第二运算电路中包括的各个电路可以有多种随路配置方式,比如,参阅图4,在一个优选的实施方式中,第一运算电路的输出具体为量化运算电路的输入,量化运算电路的输出为激活运算电路的输入,激活运算电路的输出为池化运算电路的输入。换句话说,第二运算电路被配置为先随路执行量化运算,再随路执行激活运算,最后再随路执行池化运算。

再比如,参阅图5,第一运算电路的输出具体为激活运算电路的输入,激活运算电路的输出为池化运算电路的输入,池化运算电路的输出为量化运算电路的输入。换句话说,第二运算电路被配置为先随路执行激活运算,再随路执行池化运算,最后再随路执行量化运算。

卷积运算电路(为了便于描述方案,图3至图12中将第一运算电路称为卷积运算电路)包括两个输入和一个输出,两个输入可以包括卷积核和输入图像,其中卷积核通过权重矩阵表示,输入图像可以通过输入图像矩阵表示,输入图像也可以通过输入图像向量表示,以下以输入图像为输入图像向量表示为例进行介绍。参阅图6,卷积运算电路的输入包括一个向量和一个矩阵,卷积运算电路主要完成乘累加的操作,输出仍为一个向量,图6中所示的K和N均为大于0的正整数。需要说明的是,本申请实施例对卷积运算的类型并不进行限定,比如卷积运算的类型包括但不限于深度可分卷积(depthwise separableconvolution)、矩阵与矩阵相乘的卷积(general matrix to matrix multiplication,GEMM)以及矩阵与向量相乘的卷积(general matrix to vector multiplication,GEMV)。

量化运算电路用于执行量化操作,可以被配置为执行任意一种量化操作,本申请实施例对量化的方式并不进行限定。假设量化运算电路的输入为一个1*N的向量,输出经过量化处理后仍为一个1*N的向量,输出的向量的数据格式包括但不限于fp16、s16、s8以及s4。

激活运算电路通过激活函数执行激活操作,可以被配置为采用任意一种激活函数,本申请实施例对激活函数的类型并不进行限定。假设激活运算电路的输入为一个1*N的向量,输出经过激活处理后仍为一个1*N的向量。示例性的,激活函数包括但不限于relu、sigmoid、tanh。参阅图7a至图7c,给出了relu激活函数、sigmoid激活函数以及tanh激活函数的示意图,其中横纵代表激活运算电路的输入,纵轴代表激活运算电路的输出。

池化运算电路用于执行池化操作,可以被配置为执行任意一种池化操作,本申请实施例对池化的方式并不进行限定,示例性的,包括但不限于最大值池化(max pooling)和平均值池化(average pooling)。假设池化运算中池化窗口的尺寸为w×h,池化步长为stride,w、h、stride均为大于1的正整数。在一个优选的实施方式中,为了能够节约计算量,可以使w、h、stride的取值相同。为了更好的理解这一优选的实施方式的优势,下面结合图8a和图8b进行举例说明,如图8a所示,池化窗口的w、h、stride的取值不相同,图8a以3×3×2为例进行展示,其中w和h的取值为3,stride的取值为2,可见,两次池化运算的对象中存在重复的元素,具体的,第一次池化运算处理的元素包括1,1,4,4,3,5,2,2,8,7第二次池化运算处理的元素包括4,5,3,5,7,8,7,8,9,两次池化运算处理的元素存在重复的元素4,5,7。继续参阅图8b,使w、h、stride的取值相同,图8b以3×3×3为例进行展示,其中w、h、stride的取值均为3,可见,两次池化运算的对象中不存在重复的元素,具体的,第一次池化运算处理的元素包括1,4,4,3,5,2,8,7,第二次池化运算处理的元素包括5,3,3,7,8,1,8,9,2。通过另池化窗口的w、h、stride的取值相同,能够更快的完成对池化运算电路的输入的池化运算,节约计算量,提升性能。

此外,为了保证池化运算电路能够正常进行随路运算,而无需引入存储器,卷积运算中卷积核执行卷积运算的顺序是根据池化运算中池化窗口执行池化运算的顺序确定的。换句话说,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据。参阅图9,以采用最大值池化方式为例对此进行举例说明。如图9所示,假设卷积运算后获取了4×4×N的张量,池化窗口的尺寸为2×2,步长为2。如果池化窗口第一次处理的元素为1,1,5,6,第二次处理的元素为2,4,7,8,第三次处理的元素为3,2,4,9,第四次处理的元素为8,3,0,5,那么按照第一次至第四次处理的顺序,向池化运算电路输入元素/数据,具体的可以继续参阅图9进行理解。需要说明的是,本申请实施例并不限定每次池化处理的元素的输入顺序,比如,池化窗口第一次处理的元素为1,1,5,6,可以按照1,1,5,6的顺序向池化运算电路输入元素/数据,也可以按照1,5,1,6的顺序向池化运算电路输入元素/数据,还可以按照6,5,1,1的顺序向池化运算电路输入元素/数据,等等。

为了更好的理解本申请实施例提供的方案,下面结合一个具体的例子对方案进行介绍:

假设配置input size为H=4,W=4,C=16,weight配置为kernel_h=3,kernel_w=3,kernel_stride=1,kernel_output_channel=16,用于表示卷积运算电路的输入为4×4×16的矩阵,权重矩阵的尺寸为3×3,步长为1,卷积后输出的数据的维度为16。为了保持卷积运算电路的输出数据不要太小,需要对卷积运算电路的输入进行填充(padding)。关于如何进行padding已经有成熟的技术手段,本申请实施例对此不再解释。这里假设padding配置为:top_padding=botton_padding=left_padding=right_padding=1,用于表示对卷积运算电路的输入在上、下、左、右四个方向的填充方式,具体的可以参照图10a所示的阴影区域进行理解。再假设配置池化窗口的尺寸为2×2,步长为2。为了便于描述,以下将填充后的卷积运算电路的输入称为特征矩阵。

上文介绍到为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,那么卷积运算电路执行卷积运算的顺序如下:

如图10a所示,第1次卷积时,根据卷积核的尺寸从特征矩阵最左上角开始读取数据。比如,对应卷积核最左上角起始位置的坐标点,可以先读取特征矩阵中坐标(X,Y)=(0,5)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取卷积核内的特征矩阵中其他位置的元素,直到读完所有的卷积核内的特征矩阵中的元素,以保证输出一次卷积结果。

如图10b所示,第2次卷积时,根据卷积核的尺寸以及步长,在w方向向右移动一个步长,读取当前卷积核内的特征矩阵中的元素。比如,根据当前卷积核最左上角起始位置的坐标点,可以先读取特征矩阵中坐标(X,Y)=(1,5)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,以保证输出一次卷积结果。

如图10c所示,第3次卷积时,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,所以第三次卷积时,先读取特征矩阵中坐标(X,Y)=(0,4)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,以保证输出一次卷积结果。

如图10d所示,第4次卷积时,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,所以第四次卷积时,先读取特征矩阵中坐标(X,Y)=(1,4)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,以保证输出一次卷积结果。

为了更好的理解这一原理,这里再结合图9进行举例说明,由于池化窗口第一次处理的元素为1,1,5,6,所以为了能够保证池化运算电路能够正常进行第一次随路运算,需要将池化窗口第一次处理的元素都提供给池化运算电路。假设第一次卷积后获取的卷积结果相当于图9中的第一行第一列的元素1,第二次卷积后获取的卷积结果为图9中的第一行第二列的元素2。如果第三次卷积先读取特征矩阵中坐标(X,Y)=(2,5)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,那么第三次卷积获取的卷积结果为图9中的第一行第三列的元素2,将无法保证池化窗口第一次池化处理。为了保证池化运算电路能够正常进行随路运算,第三次卷积后获取的卷积结果应当为第二行第一列的元素5,所以第三次卷积时,读取特征矩阵中坐标(X,Y)=(0,4)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素。同理,第四次卷积后获取的卷积结果应当为第二行第二列的元素6。

按照上述思路,如图11所示,接下来卷积运算电路执行卷积运算的顺序如下:

第5-8次卷积时,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,所以第5-8次卷积时,分别先读取特征矩阵中坐标(X,Y)=(2,5)对应的数据/元素,坐标(X,Y)=(3,5)对应的数据/元素,坐标(X,Y)=(2,4)对应的数据/元素,坐标(X,Y)=(3,4)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,以保证输出至这几次卷积结果。

第9-12次卷积时,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,所以第5-8次卷积时,分别先读取特征矩阵中坐标(X,Y)=(0,3)对应的数据/元素,坐标(X,Y)=(1,3)对应的数据/元素,坐标(X,Y)=(0,2)对应的数据/元素,坐标(X,Y)=(1,2)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,以保证输出至这几次卷积结果。

第13-16次卷积时,为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,所以第5-8次卷积时,分别先读取特征矩阵中坐标(X,Y)=(2,3)对应的数据/元素,坐标(X,Y)=(3,3)对应的数据/元素,坐标(X,Y)=(2,2)对应的数据/元素,坐标(X,Y)=(3,2)对应的数据/元素。然后按照每次读取1xK个元素的原则,读取当前卷积核内的特征矩阵中其他位置的元素,直到读完所有的当前卷积核内的特征矩阵中的元素,以保证输出至这几次卷积结果。

如图12所示,假设经过图11的卷积运算后,再经过量化运算后,获得图9所示的卷积结果,则按照池化窗口执行池化运算的顺序向池化运算电路输入数据,具体原理已经在上文进行了论述,这里不再重复赘述。

需要说明的是,本申请实施例以池化窗口为单位,确定向池化运算电路输入数据的顺序,本申请实施例并不对池化窗口执行池化运算的顺序进行限定,示例性的,再结合一个例子对此进行说明。继续参阅图9,假设池化窗口执行池化运算的顺序和图9所示的顺序不同,具体的如果池化窗口第一次处理的元素为1,1,5,6,第二次处理的元素为3,2,4,9,第三次处理的元素为2,4,7,8,第四次处理的元素为8,3,0,5。那么为了保证池化运算电路能够正常进行随路运算,需要按照池化窗口执行池化运算的顺序向池化运算电路输入数据,那么卷积运算电路执行卷积运算的顺序如下:

第1-4次卷积时,图10a至图10d所描述的第1次卷积的过程至第4次卷积的过程进行理解。

第5-8次卷积时,按照图11所示的第5-8次卷积的过程进行理解,这里不再重复赘述。

第9-12次卷积时,按照图11所示的第9-12次卷积的过程进行理解,这里不再重复赘述。

第13-16次卷积时,按照图11所示的第13-16次卷积的过程进行理解,这里不再重复赘述。

上文介绍到第二运算电路被配置为随路执行激活运算、量化运算以及池化运算中的至少一种,具体的,包括但不限于几下几种情况:

情况1:第二运算电路被配置为随路执行激活运算、量化运算以及池化运算。

情况2:第二运算电路被配置为随路执行激活运算和量化运算。

情况3:第二运算电路被配置为随路执行量化运算。

情况4:第二运算电路被配置为随路执行激活运算。

情况5:第二运算电路被配置为随路执行量化运算和池化运算。

在一个可能的事实方式中,第二运算电路包括量化运算电路、激活运算电路以及池化运算电路。可以通过指令配置是否启动量化运算电路、激活运算电路以及池化运算电路,以适用不同的情况。下面给出一种可能的指令配置方式:

Operation.type[Xd],[Xn],[Xm],[Xu]

该条指令用于表示可以配置4种不同的参数。

Xd[31:0]:Destination ADDR。

该条指令用于表示参数[Xd]是32比特,用于表示加速器的最终计算结果所在的缓存目的地址。

Xn[31:0]:Source0 ADDR。

该条指令用于表示参数[Xn]是32比特,用于表示第一运算电路的其中一个输入所在的缓存起始地址。

Xm[31:0]:Source1 ADDR。

该条指令用于表示参数[Xm]是32比特,用于表示第一运算电路的另一个输入所在的缓存起始地址。

Xt[31:0]用于表示参数[Xu]是32比特,包括但不限于指示以下配置信息:

(1)卷积运算的类型,例如用于指示卷积运算的类型为depthwise、GEMV以及GEMM中的其中一种。

(2)用于指示是否随路执行激活运算,或者说是否启动激活运算电路。

(3)用于指示是否随路执行量化运算,或者说是否启动量化运算电路。

(4)用于指示是否随路执行池化运算,或者说是否启动池化运算电路。

需要说明的是,上述给出的指令配置方式仅为一种示例,实际上还可以采用其他的指令配置方式,以保证第一运算电路和第二运算电路的正常运行,比如:

在一个可能的实施方式中,还可以引入FM_cfg配置信息和Weight_cfg配置信息,其中,FM_cfg配置信息用于指示输入图像矩阵的尺寸以及通道数等信息,Weight_cfg配置信息用于指示卷积核的尺寸、步长等信息。

在一个可能的实施方式中,还可以引入Deq_cfg配置信息,用于指示量化的目标等信息。

在一个可能的实施方式中,还可以引入Pooling_cfg配置信息,用于指示池化窗口的窗口、池化步长等信息。

参阅图13,给出了一种设计配置指令时的流程图,首先可以载入与卷积运算电路相关的配置信息,比如上文介绍的FM_cfg配置信息和Weight_cfg配置信息。然后可以判断是否需要启动量化运算电路,如果需要启动,则配置指令启动量化运算电路,并配置载入与量化运算电路相关的配置信息,比如上文介绍到的Deq_cfg配置信息,如果不需要启动,则配置指令不启动量化运算电路。再然后判断是否需要启动激活运算电路,如果需要启动,则配置指令启动激活运算电路,并载入与激活运算电路相关的配置信息,如果不需要启动,则配置指令不启动池化运算电路。接下来,判断是否需要启动池化运算电路,如果需要启动,则配置指令启动池化运算电路,并载入与池化运算电路相关的配置信息,比如上文介绍到的Pooling_cfg配置信息,如果不需要启动,则配置指令不启动池化运算电路。

需要说明的是,图13给出的设计配置指令的流程图仅为示例性的说明,实际上配置是否启动各个电路可以有多种顺序,比如可以先判断是否需要启动激活运算电路,再判断是否需要启动量化运算电路,再判断是否需要启动池化运算电路等等。此外,还可以根据实际场景需求,设计更多或者更少的配置指令,比如上文介绍到有一些神经网络还需要执行element wise运算,则还可以配置指令用于确定是否启动逐项运算电路,以确定是否执行element wise运算,等等。

在一个优选的实施方式中,可以通过同一个电路执行卷积运算或者element wise运算。换句话说,第一运算电路除了用于执行卷积运算,还可以用于执行element wise运算。这是因为卷积运算的本质是元素乘累加(元素乘,元素加),element wise运算的本质是对元素进行加(add)、减(sub)、乘(mul)、除(div)、取最大(max),取最小(min)、等操作。所以,本质上二者在运算是有重叠的,可以用一个硬件来做,即二者的硬件资源可以复用,降低硬件的面积开销,降低设计的复杂性。当通过第一运算电路来执行element wise运算时(这里将其称之为逐项运算电路),逐项运算电路的输入包括一个向量和另一个向量,输出仍为一个向量。

参阅图14,给出了卷积运算电路和逐项运算电路复用硬件资源时的一种加速器的结构示意图,其中第二运算电路可以参照上文关于第二运算电路的描述进行理解,这里不再重复赘述。在这种实施方式中,可以通过指令配置第一运算电路执行卷积运算或者执行element wise运算。比如还可以通过上文介绍的参数Xt[31:0]来指示执行卷积运算还是执行element wise运算。在一个可能的实施方式中,还可以通过上文介绍的参数Xt[31:0]来指示element wise运算的类型,比如执行对元素进行加(add)、减(sub)、乘(mul)、除(div)、取最大值(max),取最小值(min)中的其中一种。

参阅图15,给出了另一种设计配置指令时的流程图,首先判断是否需要执行卷积运算,如果需要执行卷积运算,则配置指令启动第一运算电路执行卷积运算,并配置载入与卷积运算相关的配置信息,比如上文介绍的FM_cfg配置信息和Weight_cfg配置信息。如果不需要执行卷积运算,则配置指令启动第一运算电路执行element wise运算,并配置载入与element wise运算相关的配置信息。然后可以判断是否需要启动量化运算电路,如果需要启动,则配置指令启动量化运算电路,并配置载入与量化运算电路相关的配置信息,比如上文介绍到的Deq_cfg配置信息,如果不需要启动,则配置指令不启动量化运算电路。再然后判断是否需要启动激活运算电路,如果需要启动,则配置指令启动激活运算电路,并载入与激活运算电路相关的配置信息,如果不需要启动,则配置指令不启动池化运算电路。接下来,判断是否需要启动池化运算电路,如果需要启动,则配置指令启动池化运算电路,并载入与池化运算电路相关的配置信息,比如上文介绍到的Pooling_cfg配置信息,如果不需要启动,则配置指令不启动池化运算电路。

在一个可能的实施方式中,为了能够使本申请实施例提供的加速器能够支持更多不同结构的神经网络执行多种运算,还可以引入存储器。比如,在一个可能的实施方式中,利用第一运算电路执行卷积运算,将获取到的卷积结果写入存储器中,该卷积结果可以再次作为第一运算电路的输入,比如第一运算电路可以从存储器中获取该卷积结果,并利用该卷积结果执行element wise运算。再比如,在一个可能的实施方式中,激活运算电路、池化运算电路、量化运算电路也可以将输出的结果写入存储器中。

参阅图16,为本申请的实施例提供的一种加速方法的流程示意图,包括:对第一运算电路的输入执行卷积运算1601。其中,第一运算电路的输出接口与第二运算电路的输入接口直接连接,第一运算电路在执行卷积运算后,将输出通过第一运算电路的输出接口直接输入至第二运算电路的输入接口;第二运算电路包括以下电路中的至少一种:激活运算电路、量化运算电路或者池化运算电路。

当第二运算电路包括激活运算电路时,对激活运算电路的输入执行激活运算1602,激活运算电路的输入是从第一运算电路或者量化运算电路或者池化运算电路中获取的。当第二运算电路包括量化运算电路时,对量化运算电路的输入执行量化运算1603,量化运算电路的输入是从第一运算电路或者激活运算电路或者池化运算电路中获取的。当第二运算电路包括池化运算电路时,对池化运算电路的输入执行池化运算1604,池化运算电路的输入是从第一运算电路或者激活运算电路或者量化运算电路中获取的。

其中,第一运算电路在执行卷积运算后将输出结果输入至第二运算电路,当前运算电路的输入端与上一个运算电路的输出端连接时,上一个运算电路在执行对应的运算后将运算结果输入至当前运算电路,当前运算电路是第二运算电路中的任意一个电路,上一个运算电路为第一运算电路或者第二运算电路中的运算电路。

具体地,当激活运算电路的输入端与第一运算模型的输出端连接时,第一运算电路执行卷积操作后将输出数据输入至激活运算电路的输入端,或者,当激活运算电路的输入端与量化运算电路的输出端连接时,量化运算电路执行量化操作后将输出数据输入至激活运算电路的输入端,或者,当激活运算电路的输入端与池化运算电路的输出端连接时,池化运算电路执行池化运算后将输出数据输入至激活运算电路的输入端;

当量化运算电路的输入端与第一运算模型的输出端连接时,第一运算电路执行卷积操作后将输出数据输入至量化运算电路的输入端,或者,当量化运算电路的输入端与激活运算电路的输出端连接时,激活运算电路执行激活运算后将输出数据输入至激活运算电路的输入端,或者,当量化运算电路的输入端与池化运算电路的输出端连接时,池化运算电路执行池化运算后将输出数据输入至量化运算电路的输入端;

当池化运算电路的输入端与第一运算模型的输出端连接时,第一运算电路执行卷积操作后将输出数据输入至池化运算电路的输入端,或者,当池化运算电路的输入端与激活运算电路的输出端连接时,激活运算电路执行激活运算后将输出数据输入至池化运算电路的输入端,或者,当池化运算电路的输入端与量化运算电路的输出端连接时,量化运算电路执行量化运算后将输出数据输入至池化运算电路的输入端。

在一种可能的实施方式中,对第一运算电路的输入执行卷积运算,包括:利用卷积核遍历特征图feature map,以对卷积核中的元素和遍历区域内特征图中的元素进行卷积运算,得到多个卷积结果。对池化运算电路的输入执行池化运算,包括:池化运算电路,具体用于按照池化运算电路对多个卷积结果执行池化运算的顺序,获取多个卷积结果。

在一种可能的实施方式中,该方法还包括:对输入至第一运算电路的两个张量的对应位置的元素进行相加操作、相减操作、相乘操作、相除操作、取最大值操作或者取最小值操作。

在一种可能的实施方式中,激活运算电路的输入具体是从第一运算电路中获取的,量化运算电路的输入具体是从激活运算电路中获取的,池化运算电路的输入具体是从量化运算电路中获取的。

在一种可能的实施方式中,池化运算中池化窗口的尺寸为w×h,池化步长为stride,其中,w、h、stride的取值相同,w为大于1的正整数。

在一种可能的实施方式中,激活运算通过sigmoid函数、tanh函数、prelu函数、leay函数和relu函数中的任一种实现。

在一种可能的实施方式中,池化运算包括最大值池化运算或者平均值池化运算。

在一种可能的实施方式中,卷积运算包括深度可分卷积(depthwise separableconvolution)、矩阵与矩阵相乘的卷积GEMM以及矩阵与向量相乘的卷积GEMV。

本申请还提供一种电子设备,该电子设备中可以设置处理单元和通信接口,处理单元通过通信接口获取程序指令,程序指令被处理单元执行,处理单元用于执行上述实施例描述的加速方法。该电子设备具体可以包括各种终端或者穿戴设备等。

例如,该穿戴设备可以包括手环、智能手表、智能眼镜、头戴显示设备(Head MountDisplay,HMD)、增强现实(augmented reality,AR)设备、混合现实(mixed reality,MR)设备等。

本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质包括指令,所述指令指示执行上述实施例描述的加速方法。

本申请实施例还提供了一种计算机程序产品,所述计算机程序产品被计算机执行时,所述计算机执行前述实施例所描述的加速方法。该计算机程序产品可以为一个软件安装包,在需要使用前述任一方法的情况下,可以下载该计算机程序产品并在计算机上执行该计算机程序产品。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、训练设备或数据中心通过有线(例如同轴电缆、光纤、数字用户线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、训练设备或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的训练设备、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。

本申请实施例还提供一种数字处理芯片。该数字处理芯片中集成了用于实现上述处理器或者处理器的功能的电路和一个或者多个接口。当该数字处理芯片中集成了存储器时,该数字处理芯片可以完成前述实施例中的任一个或多个实施例的方法步骤。当该数字处理芯片中未集成存储器时,可以通过通信接口与外置的存储器连接。该数字处理芯片根据外置的存储器中存储的程序代码来实现上述实施例中神经网络加速器执行的动作。

本申请实施例还提供一种芯片,该芯片中可以部署本申请提供的神经网络加速器,芯片包括:处理单元和通信单元,所述处理单元例如可以是处理器,所述通信单元例如可以是输入/输出接口、管脚或电路等。该处理单元可执行存储单元存储的计算机执行指令,以使服务器内的芯片执行上述所示实施例描述的神经网络加速器执行的动作。可选地,所述存储单元为所述芯片内的存储单元,如寄存器、缓存等,所述存储单元还可以是所述无线接入设备端内的位于所述芯片外部的存储单元,如只读存储器(read-only memory,ROM)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(random accessmemory,RAM)等。

具体地,前述的处理单元或者处理器可以是中央处理器(central processingunit,CPU)、网络处理器(neural-network processing unit,NPU)、图形处理器(graphicsprocessing unit,GPU)、数字信号处理器(digital signal processor,DSP)、专用集成电路(application specific integrated circuit,ASIC)或现场可编程逻辑门阵列(fieldprogrammable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者也可以是任何常规的处理器等。

示例性地,请参阅图17,图17为本申请实施例提供的芯片的一种结构示意图,所述芯片可以表现为神经网络处理器NPU 170,NPU 170作为协处理器挂载到主CPU(Host CPU)上,由Host CPU分配任务。NPU的核心部分为运算电路1703,通过控制器1704控制运算电路1703提取存储器中的矩阵数据并进行乘法运算。

在一些实现中,运算电路1703内部包括多个处理单元(process engine,PE)。在一些实现中,运算电路1703是二维脉动阵列。运算电路1703还可以是一维脉动阵列或者能够执行例如乘法和加法这样的数学运算的其它电子线路。在一些实现中,运算电路1703是通用的矩阵处理器。

举例来说,假设有输入矩阵A,权重矩阵B,输出矩阵C。运算电路从权重存储器1702中取矩阵B相应的数据,并缓存在运算电路中每一个PE上。运算电路从输入存储器1701中取矩阵A数据与矩阵B进行矩阵运算,得到的矩阵的部分结果或最终结果,保存在累加器(accumulator)1708中。

统一存储器1706用于存放输入数据以及输出数据。权重数据直接通过存储单元访问控制器(direct memory access controller,DMAC)1705,DMAC被搬运到权重存储器1702中。输入数据也通过DMAC被搬运到统一存储器1706中。

总线接口单元(bus interface unit,BIU)1710,用于AXI总线与DMAC和取指存储器(instruction fetch buffer,IFB)1709的交互。

总线接口单元1710(bus interface unit,BIU),用于取指存储器1709从外部存储器获取指令,还用于存储单元访问控制器1705从外部存储器获取输入矩阵A或者权重矩阵B的原数据。

DMAC主要用于将外部存储器DDR中的输入数据搬运到统一存储器1706或将权重数据搬运到权重存储器1702中或将输入数据数据搬运到输入存储器1701中。

向量计算单元1707包括多个运算处理单元,在需要的情况下,对运算电路的输出做进一步处理,如向量乘,向量加,指数运算,对数运算,大小比较等等。主要用于神经网络中非卷积/全连接层网络计算,如批归一化(batch normalization),像素级求和,对特征平面进行上采样等。

在一些实现中,向量计算单元1707能将经处理的输出的向量存储到统一存储器1706。例如,向量计算单元1707可以将线性函数和/或非线性函数应用到运算电路1703的输出,例如对卷积层提取的特征平面进行线性插值,再例如累加值的向量,用以生成激活值。在一些实现中,向量计算单元1707生成归一化的值、像素级求和的值,或二者均有。在一些实现中,处理过的输出的向量能够用作到运算电路1703的激活输入,例如用于在神经网络中的后续层中的使用。

控制器1704连接的取指存储器(instruction fetch buffer)1709,用于存储控制器1704使用的指令;

统一存储器1706,输入存储器1701,权重存储器1702以及取指存储器1709均为On-Chip存储器。外部存储器私有于该NPU硬件架构。

其中,循环神经网络中各层的运算可以由运算电路1703或向量计算单元1707执行。

其中,上述任一处提到的处理器,可以是一个通用中央处理器,微处理器,ASIC,或一个或多个用于控制上述神经网络加速器执行的动作的程序执行的集成电路。

另外需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本申请提供的装置实施例附图中,电路之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。

通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专用CPU、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多样的,例如模拟电路、数字电路或专用电路等。但是,对本申请而言更多情况下软件程序实现是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘、U盘、移动硬盘、只读存储器(read only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。

所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。

本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

最后应说明的是:以上,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。

相关技术
  • 神经网络模型、加速器、建模方法及装置、介质及系统
  • 深度神经网络加速器故障的处理方法及装置
  • 一种同步加速器及其注入装置和注入方法
  • 一种用于加速器区域防护门联锁的急停装置和控制方法
  • 神经网络加速器的控制方法、装置及神经网络加速器
  • 神经网络加速器的控制方法、装置及神经网络加速器
技术分类

06120116500561