卷积神经网络的制作方法

文档序号:15739717发布日期:2018-10-23 22:05阅读:212来源:国知局
卷积神经网络的制作方法

本发明涉及一种具有改进的图像缓存的卷积神经网络。



背景技术:

典型卷积神经网络(CNN)的处理流程如图1所示。通常,CNN的输入是对应于来自图像的感兴趣区域(ROI)的至少一个2D图像/映射10。图像/映射可仅包括图像强度值,例如,来自YCC图像的Y平面;或者图像/映射可包括来自图像的颜色平面的任何组合;或者另选地或除此之外,图像/映射可包含从图像得出的值,诸如PCT申请No.PCT/EP2015/073058(参考号:FN-398)中描述的梯度直方图(HOG)映射,其公开内容以引用方式并入本文,或积分图像映射。

CNN处理包括两个阶段:

○特征提取(12)-卷积部分;并且

○特征分类(14)。

CNN特征提取12通常包括多个处理层1…N,其中:

·每层包括卷积,然后是可选的子采样;

·每层产生一个或(通常)更多个映射(有时称为信道);

·每个卷积层之后的映射大小通常通过子采样来减少(其示例是池化或最大池化);

·第一卷积层通常执行原始2D图像/映射的2D卷积以产生其输出映射,而后续卷积层使用由前一层产生的输出映射作为输入来执行3D卷积。但是,如果输入包括先前从图像中导出的多个映射;或多个颜色平面,例如,图像的RGB或YCC;或者图像的多个版本,则第一卷积层可以与连续层完全相同的方式操作,对输入图像/映射执行3D卷积。

图2示出了由图1的后续特征提取卷积层执行的具有3×3×3核的示例性3D卷积。3×3×3意味着使用三个输入映射A、B、C,因此需要来自每个输入映射的3×3像素块,以便计算输出映射内的一个像素。

卷积核还具有在CNN的训练阶段期间预先计算的3×3×3=27个值或权重。使用点积函数20将输入映射像素值的三次方16与卷积核值18组合。在计算点积之后,应用激活函数22以提供输出像素值。激活函数22可包括简单除法,如通常用于卷积,或者更复杂的函数,诸如s型函数或整流线性单位(ReLU)激活函数,其形式为:zj=h(aj)=max(0,aj),如通常用于神经网络。

在这种情况下,对于2D卷积,在使用单个输入图像/映射的情况下,将使用3×3核扫描输入图像/映射以产生对应输出映射的像素。

重新参考图1,CNN特征分类14中涉及的层通常如下:

·由最后一个卷积层产生的映射在单个向量(V输入)中连接;

·V输入是多层完全连接网络的输入,包括一系列完全连接的网络层,每个网络层处理向量输入并提供向量输出;

·完全连接网络的输出包括分类评分的向量或表示根据CNN训练的输入图像/映射的特征向量。

CNN被训练为将输入ROI分类为一个或多个类别或者用图像检测对象。例如,对于可能包含面部的ROI,可以使用CNN来确定面部是属于成人还是儿童;面部在微笑、眨眼还是皱眉。对于可能包含身体的ROI,可以使用CNN来确定身体的姿势。

一旦确定了CNN的结构,即输入映射、卷积层的数量;输出映射的数量;卷积核的大小;子采样的程度;完全连接层的数量;以及其向量的范围—将在卷积层核和用于特征分类的完全连接层中使用的权重是通过对包含给定类别的正和负标记实例(例如,标记为微笑的面部和包含非笑脸的感兴趣区域)的样本数据集进行训练来确定的。用于促进CNN训练的合适平台可得自:PyLearn,其基于Theano和MatConvNet,MatConvNet进而基于Caffe;Thorch;或TensorFlow。然而,应当理解,选择用于训练的结构可能需要迭代地调整以优化由CNN提供的分类。

在任何情况下,CNN引擎结合到图像处理系统内将是有用的,使得可在采集到图像时或者至少很快之后立即执行特征分类。例如,CNN可结合到图像采集系统内,例如在2015年8月26日提交的美国临时申请No.62/210,243(参考号:FN-469)、PCT申请WO2014/005783(参考号:FN-384)和US2015/262344(参考号:FN-384-CIP)中所述的图像采集系统,其公开内容以引用方式并入。

但是,为了做到这一点,需要合理化CNN的响应性和存储器要求。



技术实现要素:

根据第一方面,提供了一种用于根据权利要求1所述的图像处理系统的卷积神经网络引擎。

本发明的该方面的实施例提供了一种CNN引擎,其容易结合到图像处理系统内,并且其中CNN引擎可以可编程的方式被配置为利用变化的特征提取卷积层以及特征分类层来操作。CNN引擎包括具有流水线架构的图像缓存,其能够快速地向卷积引擎提供输入映射信息,使得可在最小数量的时钟周期中执行涉及给定数量的输入映射的3D卷积。

在第二方面,提供了根据权利要求28所述的图像处理系统。

该方面的实施例提供了一种可配置系统,其中可从图像缓存同时读取不同大小的像素块,用于处理以产生输出数据。

在第三方面,提供了用于根据权利要求34所述的图像处理系统的CNN。

该方面的实施例减少了CNN对系统总线的访问,使得CNN可以处理更大和/或更深的网络。

在第四方面,提供了用于根据权利要求40所述的图像处理系统的CNN。

该方面的实施例减少了图像缓存的占用面积,再次使得CNN可以处理更大和/或更深的网络。

附图说明

现在将结合附图以举例的方式描述本发明的实施例,在附图中:

图1示出了典型的卷积神经网络(CNN);

图2示出了具有3×3×3核的示例性3D卷积;

图3是根据本发明的实施例的CNN的框图;

图4示出了图3的图像缓存内的图像和映射的示例性存储器组织;

图5示出了图3的图像缓存内的特定图像/映射的示例性存储器组织;

图6示出了图3的图像缓存的内部结构;

图7示出了根据本发明另一实施例的将存储网络配置信息的闪存存储器结合到CNN内;

图8示出了图7的闪存存储器和CNN的其余部分之间的冗余连接方案;

图9示出了根据本发明又一实施例的将双缓冲图像缓存结合到CNN内;并且

图10示意性地示出了在本发明的一些实施例中采用的单晶体管存储器单元的位架构。

具体实施方式

图3示出了在图像采集系统内根据本发明实施例实现的CNN引擎30的框图。CNN引擎30连接到系统总线42并且可访问主(DRAM)存储器40,由系统采集的图像被写入该存储器中。在将图像写入到DRAM 40之前或之后获得并可能预处理图像的图像采集流水线是众所周知的,这里不再详细描述,但是在上面提到的2015年8月26日提交的美国临时申请No.62/210,243(参考号:FN-469)、PCT申请WO2014/005783(参考号:FN-384)和US2015/262344(参考号:FN-384-CIP)中描述了这种系统的示例。

因此,由系统CPU 50执行的应用程序(未示出)可通过系统总线42向CNN引擎30内的控制器60发信号通知存储在DRAM 40中并由CPU 50指示的图像的感兴趣区域(ROI)将被分析并分类。控制器60可以实现为固定状态机,或者它可以是可编程的(CPU)。在任一情况下,由CPU 50通过经由系统总线42设置控制器60内的寄存器来确定由CNN引擎30执行的可配置的连续特征提取和分类操作。

一旦被配置,控制器60随后与CNN引擎30内的各种模块通信,以从DRAM 40读取所需的图像或图像映射信息和CNN权重信息,并在向DRAM和/或随后使用的调用应用程序提供图像信息的分类之前处理该信息。

CNN引擎30包括以下模块:

图像缓存31将数据输入端口(din)和数据输出端口(dout)暴露给CNN引擎30的其余部分。数据通过数据输入端口(din)从DRAM 40经由读取控制器36或从卷积引擎32的输出端经由子采样器34读取到由控制器60在图像缓存的地址端口处指定的地址。(注意,在本说明书中,使用术语卷积引擎32,然而,从下文的描述应当理解,在实施例中,引擎32可以实现卷积层和其他形式的层两者,例如完全连接层(其在任何情况下都可被视为卷积层的一种形式,其中核大小(宽×高×信道)等于它所应用的(多信道)映射的大小)用于多层神经网络,例如图1所示。)提供开关35以使图像/映射数据能够最初经由读取控制器36由DRAM 40提供,但随后用于将由卷积引擎32/子采样器34的各层生成的信息读回到图像缓存31中,如下所述。

现在参见图4,首先将初始ROI图像/映射加载到图像缓存31中,并且该初始ROI图像/映射通常从图像缓存的地址0×00延伸,偏移量为0。需注意,缓存以2D方式寻址,其地址包括地址行和地址处的偏移量。在特征提取的第一卷积和子采样层之后,生成多个映射,在这种情况下数量为5,第1层映射0…第1层映射4。在这种情况下,这些被写入到图像缓存31中在初始ROI图像/映射的最后地址位置之后的地址线。由于这些映射通常相对于初始ROI图像/映射以2的比例进行子采样,因此可以在与初始ROI图像/映射相同的地址范围内写入这些映射中的两个映射。还要注意,由于这些映射的宽度是ROI图像/映射的宽度的一部分,因此可以将多个第1层映射写入相同的地址空间,相对于彼此以一个映射宽度的偏移量移位。如将看到的,随着处理的进行,对于每个新层,映射的数量可以更大,但是映射的大小通常由于子采样而减小。在该示例中,卷积层2从由卷积层1产生的5个映射生成10个映射,但是没有进行子采样。由卷积层2生成的新映射可以覆写图像缓存的由初始ROI图像/映射使用的区域,因为处理后续层不再需要该区域。再次需注意,第2层映射1…3在缓存内相对于彼此和映射0连续移位;映射5…7也相对于映射4连续移位。另请注意,第2层映射8和9写入到第1层映射的地址空间内,但相对于这些映射移位。尽管如此,如果图像缓存足够大,则可以保留初始ROI图像/映射以用于其他处理,例如,如果需要新的分类或者如果缓存与其他处理引擎共享。在图4的示例中,卷积层3由层2的10个映射产生20个子采样映射。同样,这些可以覆写第1层的映射,因为不再需要这些映射。

需注意,出于图像缓存访问的目的,将由特征分类层产生的向量视为包含像素值的1×W单元的1D映射。

在每种情况下,控制器60根据从CPU 50接收的配置确定起始位置,包括图像缓存31内的图像/映射、映射或向量的基址和移位范围、偏移量。

出于以下描述的目的,我们将描述每个映射内的相对地址以及如何确定这些地址,假设将起始位置添加到这些相对地址。

在任何情况下,将看到图像缓存31最初加载有来自DRAM 40的输入图像/映射。然后,可以仅使用该图像缓存31执行所有处理,而不需要访问外部DRAM以获得图像信息,直到分类完成为止。在每个卷积/子采样阶段之后,中间图像映射/向量被写回到由控制器60确定的不同图像缓存区域。然后,在将另外的中间或最终映射/向量写回到不同的图像缓存区域之前,可以读取那些映射/向量以供下一个处理层处理。写回到图像缓存31的映射/向量可以覆写来自多于1个先前迭代的映射/向量,例如,第2层输出映射可以覆写原始输入图像/映射,因为后续层不需要原始输入图像/映射。

在图3的具体实施中,数据可从输出端口dout读取或者写入到像素的N×M窗口中的图像缓存31的输入端口din,像素范围从1×1(单个像素)到5×5,并且取决于对准,最高至从窗口的(相对)基址延伸的8×8像素。因此,对于8位像素值,数据端口是512(8×8×8)个像素宽。尽管如此,应当理解,本发明同样可以用与8位不同分辨率的像素来实现。

需注意,一旦特征提取/分类完成,任何生成的映射/向量都可经由写入控制器39写回到DRAM 40。尽管如此,控制器39或控制器60可能仅需要提供最终的分类值,因此写入控制器39不是必需的,或者至少写入控制器39可能仅需要提供最终的分类值。

类似于图像缓存31的权重缓存37存储在特征提取和特征分类二者中使用的权重。如上所述,对于特征提取,权重是卷积核值;而对于特征分类,权重是完全连接层神经元/连接权重值。权重缓存的读取控制器38在处理每个层之前从DRAM 40取出权重值。例如,在特征提取卷积层中,如果存在5个输入映射并且核大小是5×5,则必须在生成每个输出映射之前从DRAM取出5×5×5(75)个权重。在特征分类中,可能需要比权重缓存37中可用的最大空间更多的权重。如果是,则使用填充权重缓存37的第一个权重集来进行处理,然后在使用新权重继续处理之前从DRAM 40取出下一权重。例如,如果待分类的向量具有2048个元素并且输出向量具有15个元素,则完全连接层需要15×2048个权重,即输出向量的每个元素需要2048个权重。如果权重缓存的大小为1024,则用于权重缓存37的读取控制器38取出计算输出向量的第一元素所需的前1024个权重,使用这些权重进行计算,然后读取控制器38取出计算该元素所需的接下来1024个权重,计算继续,然后它取出计算输出向量的第二元素所需的前1024个权重,依此类推。

应当理解,如果具体实施采用典型的8位浮点(FP)表示权重值,例如,将1位用于符号,4位用于指数,3位用于尾数,则一些权重值可能倾向于归零或饱和。

因此,在一些具体实施中,不是通过使用16位或更多位进行权重表示来增加存储要求、存储器带宽和计算要求,而是将默认FP指数偏差改变为自定义值。在标准FP表示中,默认指数偏差计算为2exp-1-1,其中exp是用于指数表示的位数(在这种情况下为4);从指数的二进制表示中减去这个偏差,得到实际的指数;所以对于指数的4位,指数值的值范围是0到15D;减去偏差(在这种情况下为7D)得到-7D到8D的实际指数值范围;与-7D相等的指数表示低于正常的权重;8D的指数不是FP表示中的数字(NaN);因此,可能指数的实际范围是-6D到7D(即,2-6:27)。这是对称表示,其可用于在表示小编号权重值和大编号权重值之间创建平衡。

然而,在一些实施例中,为了为更常见的较小编号权重值提供更好的表示,指数偏差被改变为更大的值,从而导致小编号和大编号之间的不对称表示;例如,使用等于12D的指数偏差,实际指数值将从-11D到2D,从而得到用于表示较小编号权重值的更好精度(即,2-11:22)。

通过使用所提出的权重表示,在典型情况下,网络的性能保持与使用具有较大位数但具有默认偏差的浮点表示的情况相同。

关于引擎30、30'内的权重值的处理,还可以进行进一步的改进。例如,可以使用权重压缩技术来减小完全连接层权重的大小,并因此减少用于在权重缓存37中传送并且/或者存储权重值的存储器访问要求。因此,例如,可以采用RLE(游程长度编码)来压缩层的权重值中的一个或多个零的序列。当使用这样的方案时,优选地对于大多数神经网络层压缩零值,权重的高达70%或更多可以四舍五入到零,而对神经网络的性能影响最小。这种小值权重的修剪具有从神经网络中移除(修剪)对应连接的效果。此外,这种编码可利用负零和低于正常的浮点值,它们都可被归零;而NaN(非数字)和正/负无穷大值可以饱和达到最大的正/负有效值,如下表所示:

低于正常、NaN和无穷大值的归零/饱和意味着相当多的可能浮点值(由上表中的x的排列表示)不再正常使用。这些其他未使用的值可用于编码1到64个连续零值的可变长度序列,如下所示:

·符号位是所编码数字的MSB(最高有效位);

·所有指数位组合成下一位(MSB-1位置);

·尾数位构成所编码数字的LSB(最低有效位)部分;

·结果数字加1,结果数字编码零数。

还应注意,可以对从一层到另一层的权重值使用不同的格式。因此,对于给定层,可在一种格式中更好地压缩的权重可以该形式使用,而对于另一层,权重可以使用不同的格式。格式的最简单变化涉及为每个特定层选择最佳指数偏差,不一定是如上所述的7D或12D。在任何情况下,沿着上述线的压缩可应用于任何这样的格式。

需注意,在一些实施例中,读/写控制器36、38和39中的每一者可在一个时钟周期中从/向系统存储器40读取或写入多于1个像素/重量/单元。例如,如果系统总线42包括64位,则可以在一个时钟周期中跨总线42传送8个像素/权重/单元。因此,可以在一次事务中从或向缓存31或37读取/写入8×1个像素窗口、权重集或向量。具体地讲,对于64位宽的系统总线42,其中在系统总线上的突发事务内,每个时钟周期产生新数据,如果总线42和缓存31都以相同的时钟频率工作,则控制器60可以使输入数据在图像缓存31内正确对准的方式工作,因此可在一个时钟周期中将8×1个像素写入缓存31。实际上,利用上述权重的数据压缩,每个时钟周期可读取更多权重,这在完全连接层的情况下是有用的,在完全连接层中每个时钟周期读取尽可能多的权重可为有用的。

3D卷积引擎32具有两种操作模式:

·特征提取模式

·特征分类模式。

在特征提取模式中,由读取控制器38从DRAM 40读取生成当前输出映射所需的权重;并且输入图像/映射最初由读取控制器36读取。将每个输出映射像素的输入数据和权重提供给卷积引擎32。在给定的时钟周期中从图像缓存31读取每个输入映射的N×M像素值的窗口,而每个输出映射仅需要提供一次输出映射的权重。卷积引擎32执行多个标量(点)积,接着执行激活函数以产生像素值。如果在卷积层之后存在下采样,则子采样器34执行最大下采样,并且将得到的数据提供给子采样器数据输出接口,准备好写回到图像缓存31。(也可以使用其他子采样方案,诸如平均。)最常见的子采样比例在x方向和y方向都是2。这意味着在卷积引擎32之后的2×2像素块被组合成提供给子采样器数据输出接口的一个像素。如果不需要子采样,则由卷积引擎处理层生成的数据可以直接发送到子采样器数据输出接口。然后,可以与从读取控制器36提供的数据相同的方式将数据经由开关35从子采样器数据输出接口写入到图像缓存31。

在特征分类模式中,利用读取控制器38从DRAM 40读取权重。待分类的输入向量被组织在图像缓存31中,类似于在特征提取中使用的映射,但是具有1行的大小和等于特征向量的长度的宽度(W)。因此,如果需要,仍然可以在多个像素的窗口中从存储器读取向量数据。然而,假设可能需要每个向量单元的权重多于可适合权重缓存37的权重,则在单个时钟周期中读取多个向量单元的数据可能不是非常有利。尽管如此,对于每个向量单元,卷积引擎32执行多个标量积,接着执行激活函数;如前所述,将得到的数据发送到子采样器数据存储器接口,以便写入图像缓存31中。重复这一过程,直到计算出整个输出向量并将其写入图像缓存31中。最后,包括ROI的分类的最终输出向量由写入控制器39发送到DRAM 40以进行进一步处理。

如上所述,特别是在特征提取期间,卷积引擎32可在每个时钟周期处理由图像缓存31提供的N×M像素的窗口。为了在给定的输出映射中产生一个输出像素,卷积引擎32需要:用于2D卷积的一个时钟周期;或者等于3D卷积的输入映射的数量的多个时钟周期。相同的卷积架构可用于特征提取和分类。对于特征分类,完全连接层的每个神经元/连接将具有不同的权重,因此权重数量通常将大于卷积特征提取的权重数量,在卷积特征提取中当计算新映射的每个像素时应用相同的卷积核。一旦图像数据和权重在图像缓存31和权重缓存37内可用,则卷积引擎32执行多个标量积以产生输出像素值。应当理解,使用更加并行化的缓存31可以通过例如并行计算输出映射的像素来加速该过程,但是这会过度增加卷积引擎32的大小。

如下面将更详细描述的,以及通过在图像分类期间从DRAM读取图像部分仅一次来减少访问系统DRAM 40的带宽要求;图像缓存31被布置成通过产生N×M像素的矩形窗口来加速处理,以便在尽可能少的时钟周期中并且优选地在单个时钟周期中在卷积引擎32内使用。

嵌入式应用程序的卷积核的典型大小是5×5,但是应当理解,这可能会有所不同。本发明的实施例能够以在位于图像缓存31中的任何(x,y)位置处的窗口上操作的任何大小的核操作,所述大小最多至5×5,并且取决于输入/输出映射内的对准可能最多至8×8像素。

参考图5,在本发明的实施例中,图像缓存31包括交叉存储器架构,允许在一个时钟周期中读取和写入像素块。在该实施例中,存在4个SRAM实例-SRAM0至SRAM3。

在图5中,左侧示出了64×64像素图像区域的图像缓存的2D组织。在图5中,像素索引以00开头,并且图像缓存地址以0×00开头。这些都可以是图像、图像ROI或图像缓存31内的相对地址,而绝对地址包括相对地址加上由控制器60确定的起始位置,如上文结合图4所解释的。

图5的右侧示出了图像数据如何存储在每个SRAM中。在每个(x,y)SRAM地址坐标处,存储4×4像素的块。因此,在SRAM2的地址0×00处,存储从索引40到73的4×4像素值的块。类似地,在SRAM3的地址0×01处,存储从索引4c到7f的4×4像素值的块。在该示例中,正在寻址从像素48延伸到8c的地址(8,4)处的5×5窗口,并且每个像素内的数字表示输入/输出窗口中该像素的索引。这种布置允许在仅一个时钟周期中读取和写入像素块,如下所示:

可以从任何位置读取大小为1×1最多至5×5像素的块或将其写入任何位置。可以看出,在某些情况下,大于5×5像素的窗口,例如来自地址(7,3)的窗口将需要从SRAM0、SRAM1和SRAM3的多于2个地址读取的数据。因此,为了在单个时钟周期中读取/写入窗口信息,只能从偶数x和y坐标读取6×6像素的窗口块;而7×7和8×8像素的窗口块只能从x和y坐标为4的倍数的位置读取。高于8×8像素的窗口大小需要多于1个时钟周期才能从图像缓存31中读取。尽管如此,也可以访问非矩形像素块,其具有x和y方向的独立的最大大小限制。

对于嵌入式应用程序,5×5卷积核非常适合缓存的最大窗口大小限制。如上所述,对于较大的核大小,可以使用2或4像素的步长读取;如果不是,则必须从图像缓存31进行多次读取。在任何情况下,使用该图像缓存31简化了CNN引擎30,因为可以在每个时钟周期访问馈送卷积引擎32的大像素块。

尽管不是必需的,但是在图像缓存31内的新起始地址处写入任何新映射可能更方便。

缓存的内部结构如图6所示。包括输出寄存器(dout),在该具体实施中有三个流水线级。(当然可以有更少或更多的寄存器,增加或减少缓存的流水线长度(和延迟)。在本实施例中仅使用三个,因为它在面积和性能之间提供了良好的折衷。)由于图像缓存31可在每个时钟周期提供新的N×M窗口,如果卷积引擎32也可在一个时钟周期中处理这样的窗口,则数据可通过流水线移动一个窗口,每个时钟周期写入一个点积和一个输出寄存器。因此,当执行读取操作时,输出数据可在3个时钟周期后可用,但此后,可在每个时钟周期执行连续的读取操作。当然,新的读取和写入操作可在每个时钟周期启动,并且读取和写入操作也可按任何顺序混合。

图6的具体实施包括以下子模块:

·缓存控制块(62):

○接收读取或写入操作的x,y坐标和窗口大小(w,h);并且

○计算输入数据解复用器和输出数据多路复用器选择信号(MS,BS);

○将x、y、w和h输入转换为四个SRAM中每一个的地址(ADDR)和字节(像素)使能(BE)控制信号。

·输入数据解复用器(64)和输出数据多路复用器(66):

○块64、66将每个输入/输出像素数据路由至/自正确的SRAM,并且路由至每个SRAM数据输入和数据输出端口内的正确像素位置。如所指出的,由读取控制器36或子采样器数据输出接口在din端口处或由图像缓存31在dout端口处呈现的输入和输出数据被组织在包括最多至8×8像素的数据的2D窗口中,其中(x,y)窗口地址指的是窗口原点,

它位于左上角。

地址计算

分别用于每个存储器实例SRAM0到SRAM3的地址ADDR0到ADDR3可由缓存控制块62使用以下公式(使用类似Verilog的语法)来计算。

·ADDR0={(y+4)>>(sqrt(n)-1),(x+4)>>(sqrt(n)-1)}

·ADDR1={(y+4)>>(sqrt(n)-1),x>>(sqrt(n)-1)}

·ADDR2={y>>(sqrt(n)-1),(x+4)>>(sqrt(n)-1)}

·ADDR3={y>>(sqrt(n)-1),x>>(sqrt(n)-1)}

其中{A,B}表示与B连接的A,其中A和B是一个或多个位的信号,因此如果A和B是4位信号,则{A,B}将是8位信号;并且其中n是4×4块中的图像缓存存储器的宽度,因此在当前示例中n=16以容纳64像素宽的图像。

因此,y被抽取以提供地址行的最高有效位;而x被抽取以提供地址行的最低有效位。

因此,可以看出,为了实现上述寻址方案,缓存宽度应该是2的幂。

另一方面,图像缓存31中的行数应理想地至少与第一输入图像/映射一样大,并且有用地,行数应该足以容纳输入图像/映射和至少一个卷积层的输出映射两者。在图5和图6的示例中,对于64行图像,256行足以存储输入图像/映射、来自至少一个层的输出映射和特征提取向量。

然而,应当理解,在实践中,图像可能大于64×64像素,因此上述示例中的n可能远大于16。

可以注意到,只需要两个加法器来计算地址:x+4和y+4。通过3次操作的移位转换为在硬件实现中不需要逻辑门的简单位选择。

如果图像缓存存储器宽度不是2的幂,那么将需要比上面概述的更复杂的逻辑来确定每个SRAM所需的图像缓存地址线。

存储器选择

通过缓存控制块62执行对要从/向图像缓存31读取或写入的窗口的任何像素的存储器SRAM0…SRAM3的选择。取决于(x,y)地址,din/dout端口内的每个像素对应于四个存储器实例SRAM0…SRAM3中的一个。四个存储器选择信号MS00…MS11中的每一个具有两个位,编码对应的存储器:

·00-SRAM0

·10-SRAM1

·01-SRAM2

·11-SRAM3

缓存控制块62使用两组信号:存储器选择(MS)和字节选择(BS)来计算存储器SRAM0…SRAM3的字节使能信号BE0…BE3。

用于从(x,y)原点延伸最多至8×8像素的窗口像素的存储器选择(MS)信号的公式可使用Verilog风格语法描述如下:

·MS00={(y[2]==0),(x[2]==0)}

·MS01={((y+1)[2]==0),(x[2]==0)}

·MS02={((y+2)[2]==0),(x[2]==0)}

·MS03={((y+3)[2]==0),(x[2]==0)}

·MS04={((y)[2]==1),(x[2]==0)}

·MS05={((y+1)[2]==1),(x[2]==0)}

·MS06={((y+2)[2]==1),(x[2]==0)}

·MS07={((y+3)[2]==1),(x[2]==0)}

·MS10={(y[2]==0),((x+1)[2]==0)}

·MS11={((y+1)[2]==0),((x+1)[2]==0)}

·MS12={((y+2)[2]==0),((x+1)[2]==0)}

·MS13={((y+3)[2]==0),((x+1)[2]==0)}

·MS14={((y)[2]==1),((x+1)[2]==0)}

·MS15={((y+1)[2]==1),((x+1)[2]==0)}

·MS16={((y+2)[2]==1),((x+1)[2]==0)}

·MS17={((y+3)[2]==1),((x+1)[2]==0)}

·…

·MS44={((y)[2]==1),((x+4)[2]==0)}

·…

·MS70={(y[2]==0),((x+7)[2]==0)}

·MS71={((y+1)[2]==0),((x+7)[2]==0)}

·MS72={((y+2)[2]==0),((x+7)[2]==0)}

·MS73={((y+3)[2]==0),((x+7)[2]==0)}

·MS74={((y)[2]==1),((x+3)[2]==1)}

·MS75={((y+1)[2]==1),((x+3)[2]==1)}

·MS76={((y+2)[2]==1),((x+3)[2]==1)}

·MS77={((y+3)[2]==1),((x+3)[2]==1)}

其中A[2]表示信号A的位2(第3最低有效位)。

因此,在图4的示例中,为像素59选择的存储器(从像素48延伸到8c的窗口的MS 11)是:

y+1=5D=0101h,x+1=9D=1001h,

而为像素5c选择的存储器,即窗口的MS14是:

y=4D=0100h,x+1=9D=1001h

并且为像素8c选择的存储器,即窗口的MS44是:

y=4D=0100h,x+4=9D=1100h

同样,可以注意到,仅需要x+1,x+2,x+3和y+1,y+2,y+3和来计算所有存储器选择(MS)信号。

MS00…MS77向缓存控制块62指示其N×M输入/输出数据输出接口的每个像素将被读取自/写入到的SRAM。现在,缓存控制块62需要为SRAM中的每一个断言字节(像素)使能信号BE0…BE3,以发信号通知16个像素中存储在任何给定存储器地址的哪些特定像素将被读取自/写入到其中。(需注意,在这种情况下,术语字节与8位像素同义使用,但是,这在使用不同像素分辨率的实施例中会有所不同。)

再看图5的示例,可以看出,需要来自SRAM2的地址0×01的所有16个像素,而当读取或写入所示的5×5窗口时,仅需要来自SRAM1的地址0×09的像素0。因此,除了知道要向或从哪个存储器写入或读取像素之外,缓存控制块62还需要确定要向或从给定存储器地址内的哪个偏移读取或写入像素。

本发明的一个实施例首先开始于以与上述存储器选择(MS)信号类似的方式确定起始于指定的(x,y)地址的字节选择信号(BS)的8×8阵列。然后,特别是取决于被写入的窗口的大小(这对于读取而言不是那么重要),将屏蔽一些BS信号以生成字节使能信号BE0…BE3。例如,对于7×7窗口,其中x=0...7和y=0…7的BS信号BS×7和BS7y将被屏蔽,以防止数据被写入到8×8窗口的最后一个行和列(或可能从其读取),从而覆写图像缓存31内的数据。对于5×5窗口,BS发信号通知,其中a=5…7并且其中b=0…7的BSab和其中c=0…7并且其中d=5…7的BScd将被屏蔽,防止数据被写入到8×8窗口的最后3个行和列(或从其读取)。

可以在缓存控制块62内利用BS00的固定旋转移位(对应于窗口原点)计算所有像素的字节选择(BS),如下所示。这意味着可以在不需要逻辑门的情况下计算所有字节选择信号。

以下是Verilog风格语法中的字节选择计算公式:

在这种情况下,(x,y)地址的两个最低有效位可用于确定根据给定存储器地址处的16个像素中的哪个像素将读取对应于(x,y)地址的窗口像素,实质上这包括像素所在的给定存储器地址内的偏移。可以使用独热函数将(x,y)地址的四(2×2)位映射到16个像素中的这一个。(独热指的是一组位,其中值的合法组合仅是具有单个高(1)位并且所有其他值为低(0)的那些。)然后可以看出,字节选择(BS)矩阵的剩余像素的相对地址在循环之前移位4个为1的步长。

因此,查看图5的示例中的BS00,y[1:0]=00h,x[1:0]=00h,因此选择来自SRAM2的地址0×01的字节0(SRAM2已使用MS矩阵确定并且Addr 0×01已如上所述确定)。如果所选窗口的原点向左移位到地址(7,4),则独热函数将指示要选择{00,11}=字节3(属于来自SRAM3的地址0×00)。

字节选择(BS)矩阵的所有剩余元素都可从BS00的值得出,因为它们以4×4的步长与正被寻址的窗口的移位原点一起移位。

因此,在根据窗口的大小(w,h)屏蔽临时信号以确定最终的BE0…BE3值之前,组合MS和BS矩阵临时指示每个SRAM0…SRAM3的字节使能信号BE0…BE3。

单独地,MS和BS矩阵值中的每一个被提供给输入数据解复用器64和输出数据多路复用器66(可能根据访问是读取还是写入),使得来自BE的能够在SRAM内被寻址的值可通过数据输入端口(din)处提供的或者被提供给数据输出端口(dout)的数据而被选择并连接。

在上述示例中,由缓存控制块62为每个输入/输出(I/O)请求确定MS和BS矩阵。然而,应当理解,在缓存控制块62内实现的功能可以根据需要移位到解复用器64或多路复用器66,反之亦然。

在另选的具体实施中,可以进一步并行化图像缓存31以使得能够同时扫描输入映射,使得可以每时钟周期1的速率生成输出映射像素。但是,增加可并行读取的像素的数量会大大增加多路复用/解复用逻辑的大小(对于此缓存,多路复用/解复用逻辑的门数已经约为30KGates),而这可能不是可取的。

图5和图6中所示的存储器布置已被描述用于在图像缓存31内实现,使得图像或映射像素的N×M窗口或向量单元的1×W窗口可以在单个时钟周期中提供给卷积引擎32。应当理解,权重缓存37可以类似的方式实现,尤其是使得卷积核可在图像或映射或向量处理的开始时尽可能快地提供给卷积引擎32的方式。

在上述实施例的更进一步的变型中,图像缓存31可与不同于卷积引擎32的其他形式的图像处理器一起使用。例如,图像缓存可用于任何高性能图像或2D映射处理应用程序,其中映射元素(像素)需要以有效方式从随机位置以矩形块的形式(每个时钟周期在缓存中的任何位置的一个块)访问(读取或写入)。这种处理可能不需要权重缓存37;或者另选地,可以使用权重缓存的等效物来存储图像处理器采用的通用核值。尽管图像缓存内的交叉存储器的数量保持不变,但是在任何给定时钟周期中在图像缓存和图像处理器之间传送的像素块的大小可被配置用于由CPU诸如CPU 50执行的任何给定应用程序,使得例如可将不同大小的核应用于输入图像以产生输出图像的不同效果。

可以看出,本发明的实施例可通过主控制器60实现,仅需要最少数量的命令,包括:

RD-从系统存储器中读取映射

WR-将映射写入系统存储器

CONV-卷积

END

这允许引擎30以非常合理的方式实现。

上述实施例的更进一步的变型是可能的。应当理解,当实时处理多个视频帧(例如每秒超过30个)时,每个帧需要通过多个卷积层进行处理,缓存31内的层信息的持续仅需要非常短时间,可能是毫秒级,即它最少只需要足够短以便最初或在层处理之后被写入图像缓存中,然后从图像缓存读回到系统存储器40或用于进一步的层处理。

因此,在本发明的一些实施例中,图像缓存31用单个晶体管单元实现,其中每个编程单元的电荷存储在寄生晶体管或衬底电容中。图10中示出了这种单元的浮体变型的示例性架构。这种单元能够将电荷施加到一些存储器上,但是包括这种单元的存储器阵列不需要用于刷新存储器的电路,如在传统DRAM中那样。在美光科技公司(Micron Technology)的US 8518774、US 8014195和US 8325515中也公开了单晶体管存储单元的其他示例,但是这些布置中的一些仍然涉及提供刷新和保持功能,而WO2008/054987中公开了无刷新DRAM的另一个示例。可以看出,单元的大小以及电容确定了给定单元的最大存储时间,并且因此CNN增加了其处理层的速度,例如当网络深度或帧速率增加时,单元可以变得更小,因此可增加图像缓存的阵列大小和/或密度以处理更大的网络。因而,这种单元设计在缓存31内实现了大得多的存储密度,因此允许CNN引擎30实现大得多的网络。

然而,处理较大的网络会对CNN引擎30的其余部分产生影响,因为CNN引擎30实现的网络越大和/或越深,网络的网络配置信息就变得越广泛。

如果每次初始化CNN引擎时要通过系统总线42从DRAM 40读取该信息,则这可能严重地限制系统性能。

另一方面,一旦网络被训练,则包括网络的层拓扑定义和权重的网络配置信息基本上保持相同。

现在参考图7,示出了另一变型,其中CNN引擎30'包括板载闪存存储器80。存储器80仅需要用给定网络的网络配置信息编程一次,因此读取控制器38可直接从存储器80获得权重信息,并且如前所述不使用系统总线42便能将其提供给缓存37。(尽管未示出,但是存储器80也可以被控制器60访问,使得它不使用系统总线42便可获得网络配置信息,例如,层拓扑定义。)

在一个实施例中,闪存存储器80可以在一个芯片上实现,并且这可以堆叠在实现CNN引擎30'功能的其余部分的一个或多个另外的芯片上。用于堆叠这种芯片的方法包括由Invensas a Tessera公司提供的ZiBond和DBI,这些方法提供3D晶圆/芯片接合解决方案,使晶圆与晶圆、芯片与晶圆或芯片与芯片的接合和互连成为可能。

现在参考图8,示意性地示出了在一个芯片上实现的CNN引擎30'的其余部分的逻辑,该CNN引擎连接到在另一个芯片上实现的闪存存储器80。用于HDIO互连的片上I/O垫太精细,无法在生产测试仪上进行测试。这意味着芯片之间的HDIO互连只能在组装后进行测试。而且,在组装两个芯片时会出现缺陷,导致互连线中断。

为了解决该问题,在一个具体实施中,提供了芯片之间的冗余物理连接。然后,在生产测试仪上使用边界测试,找到良好的连接,并且使用相应的选择寄存器82和84将两个芯片之间的信号路由通过这些连接线。因此,对于N个逻辑信号,M个物理连接可用,其中M>N。根据技术产量选择M和N之间的比率。选择寄存器82、84可以是根据测试结果在生产测试仪上编程的熔丝寄存器。

现在参考图9,前述实施例的图像缓存31可用包括缓存31-A和31-B的双缓冲图像缓存代替(每个缓存包括与如图6和图7所示的缓存31等效的元件)。每个缓存31-A、31-B的输出端口Dout经由开关(多路复用器)70连接到写入控制器39(如图3所示)。每个缓存31-A、31-B的输入端口Din经由开关(多路复用器)72连接到读取控制器36(如图3所示)。如图3所示,另一个开关35确定新的图像数据是从系统存储器40写入还是从卷积引擎32的输出(为简单起见,子采样器34未在图3中示出)写入到选定的缓存31-A或31-B。

图9的布置使控制器60能够确定31-A或31-B中的哪个图像缓存将图像/映射信息提供给卷积引擎32(或提供回到系统存储器),以及当正在执行卷积的每一层时,将向哪个图像缓存,即31-A或31-B中的另一个写入所得的映射。每层的交替读取和写入选择允许一层的写入库充当后续层的读取库。然而,由于采用了两个单独的存储器,这使得能够同时读取图像/映射信息并将映射信息写入缓存31-A、31-B,从而可能使处理速度加倍。

最后,同样可以理解,在少至一个存储周期中从图像缓存31读取和/或向该图像缓存写入N×M像素的窗口的能力,意味着在卷积层中卷积X个图像/映射的操作在可以执行卷积之前,需要来自读取图像缓存的X个存储周期。

在一些实施例中,代替在一个映射地址处仅存储一个像素,来自若干映射信道(例如,16个信道)的像素被存储在给定地址处。这对于将多信道3D映射用于卷积层的CNN特别有用,这意味着可以在单个存储周期中从图像缓存读取多个信道的图像/映射信息,因此匹配所得层可被写入的速度进而最大化吞吐量。需注意,在3D卷积中,每个输入信道都对每个输出信道有贡献。这意味着使用该技术,可以执行的MAC(乘法累加器)操作的数量随着信道的数量而平方地增加。因此,通过每个时钟周期从多于一个源映射(信道)读取像素,可以增加3D卷积运算的吞吐量,而不会使对图像缓存31(31-A、31-B)的写入/读取操作过度复杂化。

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