具有可变输出数据格式的深度神经网络的硬件实现的制作方法

文档序号:17444137发布日期:2019-04-17 05:16阅读:199来源:国知局
具有可变输出数据格式的深度神经网络的硬件实现的制作方法

本发明涉及具有可变输出数据格式的深度神经网络的硬件实现。



背景技术:

深度神经网络(dnn)是可以用于机器学习应用的一种类型人工神经网络。具体地,dnn可以用在信号处理应用中,包括图像处理和计算机视觉应用。

dnn已经在功率资源并不是重要因素的应用中实施。尽管如此,dnn应用于许多不同的技术领域,其中用来实施dnn的硬件的资源使得功耗、处理能力或硅面积受限。

因此,需要实施被配置成以有效的方式(即,以在操作时需要较少硅面积或较少处理能力的方式)实施dnn的硬件。此外,dnn可以以许多不同的方式被配置成用于多种不同的应用。因此,还需要用于灵活地实施dnn以便能够支持多种dnn配置的硬件。

仅通过实例方式提供下文描述的实施例,并且不限制解决了深度神经网络的已知硬件实现的任何或所有缺点的实现。



技术实现要素:

提供本发明内容以便介绍下文在具体实施方式中进一步描述的概念的选择。本发明内容并不意图标识所要求保护的主题的关键特征或基本特征,也不意图限制所要求保护的主题的范围。

本文中描述具有可变输出数据格式的dnn的硬件实现和相关方法。具体地,在本文所述的硬件实现和方法中,硬件实现被配置成:执行一个或多个硬件遍历(hardwarepass)来实施dnn,其中在每个遍历期间,硬件实现接收用于特定层的输入数据;根据所述特定层(以及可选地一个或多个后续层)来处理所述输入数据;并且基于在特定硬件遍历中处理的一个或多个层而输出期望格式的经处理数据。具体地,当硬件实现接收待处理的输入数据时,硬件实现还接收指示硬件遍历的输出数据的期望格式的信息,并且硬件实现被配置成在输出经处理的数据之前将输出数据转换到期望格式。

第一方面提供一种在深度神经网络“dnn”的硬件实现中的方法,所述硬件实现被配置成通过使用一个或多个硬件遍历处理数据来实施dnn,所述方法包括:接收用于硬件实现的硬件遍历的输入数据集,所述输入数据集表示用于dnn的特定层的输入数据的至少一部分;接收指示硬件遍历的期望输出数据格式的信息;根据与硬件遍历相关联的dnn的一个或多个层来处理所述输入数据集,所述一个或多个层包括dnn的特定层;以及将经处理的数据转换到硬件遍历的期望输出数据格式,以产生硬件遍历的输出数据。

第二方面提供一种深度神经网络“dnn”的硬件实现,所述硬件实现被配置成通过使用一个或多个硬件遍历处理数据来实施dnn,所述硬件实现包括:输入模块,其被配置成接收用于硬件实现的硬件遍历的输入数据集,所述输入数据集表示用于dnn的特定层的输入数据的至少一部分;解码器,其被配置成接收指示硬件遍历的期望输出数据格式的信息;处理模块,其被配置成根据与硬件遍历相关联的dnn的一个或多个层来处理所述输入数据集,所述一个或多个层包括dnn的特定层;以及输出模块,其被配置成将经处理的数据转换到硬件遍历的期望输出数据格式,以产生硬件遍历的输出数据。

dnn的硬件实现可以体现在集成电路上的硬件中。可以提供一种在集成电路制造系统处制造dnn的硬件实现的方法。可以提供一种集成电路定义数据集,所述集成电路定义数据集在集成电路制造系统中处理时将所述系统配置成制造dnn的硬件实现。可以提供一种非暂时性计算机可读存储介质,其上存储有对dnn的硬件实现的计算机可读描述,所述计算机可读描述在集成电路制造系统中处理时致使集成电路制造系统制造体现dnn的硬件实现的集成电路。

可以提供一种集成电路制造系统,其包括:非暂时性计算机可读存储介质,其上存储有对dnn的硬件实现的计算机可读描述;布局处理系统,其被配置成处理计算机可读描述,以便生成对体现dnn的硬件实现的集成电路的电路布局描述;以及集成电路生成系统,其被配置成根据电路布局描述来制造dnn的硬件实施。

可以提供用于执行如本文所述的方法的计算机程序代码。可以提供非暂时性计算机可读存储介质,其上存储有计算机可读指令,所述计算机可读指令在计算机系统处执行时致使计算机系统执行如本文所述的方法。

上述特征可以视情况组合,如技术人员将明白,并且可以与本文所述的实例的任一方面组合。

附图说明

现在将参考附图详细地描述实例,在附图中:

图1是dnn中的示例数据的示意图;

图2是具有可变输出数据格式的示例硬件实现的框图;

图3是图2中的dnn的硬件实现的示例处理模块的框图;

图4是图3的示例卷积引擎的框图;

图5是图2中的dnn的硬件实现中的处理数据的示例方法的流程图;

图6是具有可变内部数据格式的图2的dnn的硬件实现的第二示例处理模块的框图;

图7是具有可变内部数据格式的图6的dnn的硬件实现中的处理数据的示例方法的流程图;

图8是其中实施本文所述的dnn的硬件实现的示例计算机系统的框图;以及

图9是用于生成体现如本文所述的dnn的硬件实现的集成电路的示例集成电路制造系统的框图。

附图示出各种实例。技术人员应理解,附图中展示的元件边界(例如,框、框组或者其他形状)表示边界的一个实例。也许在一些实例中,一个元件可以被设计成多个元件或者多个元件可以被设计成一个元件。共同的参考标号在整个附图中在适当的情况下用来指示类似的特征。

具体实施方式

通过实例的方式呈现以下描述,以使得本领域的技术人员能够制作并使用本发明。本发明不限于本文所述的实施例,并且本领域的技术人员将明白对所公开的实施例的各种更改。仅通过实例的方式描述实施例。

深度神经网络(dnn)是包括多个级联层的人工神经网络的形式,所述级联层使得dnn能够执行信号处理任务,包括但不限于,计算机视觉任务。每个层接收输入数据、根据层来处理输入数据以产生输出数据,所述输出数据作为输入数据提供给下一层或者作为dnn的最终输出而输出。因此,第一层接收对dnn的原始输入数据(例如,图像)作为输入数据。所有其他层从前一层接收输出数据(其可以被称为中间数据)作为输入数据。

对层的输入数据执行的处理是基于层的类型。例如,dnn的每个层可以是多个不同层中的一个。每个dnn层类型包括,但不限于:卷积层、激活层、归一化层,以及池化层。本领域的技术人员将明白,这些是示例dnn层类型,并且这不是详尽列表且可以存在其他dnn层类型。针对卷积层,通过使用与该层相关联的权重对输入数据进行卷积来处理输入数据。具体地,每个卷积层与多个权重w0...wn相关联,所述权重也可以被称为滤波器权重或系数。权重可以进行分组以形成或限定一个或多个滤波器。

参考图1,该图示出dnn中使用的数据格式的示例概述。如可以在图1中看出,dnn中使用的数据格式可以由多个平面形成。输入数据可以被布置成p个数据平面,其中每个平面具有维度x×y。dnn可以包括一个或多个卷积层,每个卷积层具有与之相关联的由多个权重w0...wn形成的多个滤波器。滤波器(w0...wn)各自具有维度m×n×p,并且根据若干个步骤的卷积操作在方向s和t上应用于输入数据,如图1所示。

滤波器权重的数量和值可以在卷积层之间变化,使得针对第一卷积层,权重的数量可以被定义为并且针对第二卷积层,权重的数量可以被定义为其中第一卷积层中的权重的数量为n1且第二卷积层中的权重的数量为n2。卷积神经网络(cnn)是对图像识别和分类非常有效的一种具体类型的dnn,它通常包括多个卷积层。cnn的第一层通常但未必是卷积层。

通常但未必跟随卷积层的激活层对输入数据执行一个或多个激活函数。激活函数(或非线性)采用单个数字并且对它执行某一固定的数学运算。在一些实例中,激活层可以通过实施修正线性单元(relu)函数(例如,f(x)=max(0,x))来充当relu或者通过实施带参数的修正线性单元函数(prelu)来充当prelu。归一化层被配置成对输入数据执行归一化函数,诸如局部响应归一化(lrn)。通常但未必插入在连续的卷积层之间的池化层对输入数据执行池化函数,诸如最大值函数或平均函数。因此,池化层的目的是减少表示的空间大小,以减少网络中的参数和计算的数量,并且由此也控制过度拟合。

示例dnn可以包括以下层:第一卷积层、第一激活层、第二卷积层、第二激活层、池化层、第三卷积层、第三激活层,以及另一池化层。本领域的技术人员将明白,这仅仅是实例并且其他dnn可以包括不同数量的层和层类型的不同组合。

用于dnn的硬件实现可以被配置成通过一系列的硬件遍历(也可以被称为处理遍历)来计算dnn的输出,其中在每个遍历期间,硬件实现接收用于dnn的层的输入数据的至少一部分并且根据该层(且可选地根据一个或多个随后的层)来处理接收到的输入数据,以产生经处理的数据。经处理的数据输出到存储器以用作后续硬件遍历的输入数据或者作为dnn的输出而输出。硬件实现在单个硬件遍历期间可以处理的层的数量可以是基于数据的大小、硬件实现以及层的顺序。例如,在硬件实现包括用于执行可能层类型中的每种类型的硬件的情况下,包括第一卷积层、第一激活层、第二卷积层、第二激活层以及池化层的dnn也许能够接收初始dnn输入数据且根据第一硬件遍历中的第一卷积层和第一激活层来处理该输入数据并且随后将激活层的输出输出到存储器中,然后在第二硬件遍历中从存储器接收所述数据作为输入且根据第二卷积层、第二激活层和池化层来处理所述数据,以产生dnn的输出数据。由于每个硬件遍历的输出数据的大小可以相当大,因此期望减小输出数据的大小以减少存储带宽。还期望减小硬件遍历内的数据大小,以便降低对硬件大小的需求。

发明人已经认识到,将产生的输出数据的值范围每层各不相同。由此,独立于与输出数据相关的一个或多个层而将单个输出数据格式用于所有输出数据可能不适合用在dnn的硬件实现中,因为使用单个输出数据格式可以导致一些层的输出数据中出现冗余位。例如,如果第一层的输出数据在0与31的范围之间并且第二层的输出数据在-7与253的范围之间,那么5位无符号整数将足够表示第一层的输出数据并且9位带符号整数(一个符号位加8个整数位)将足够表示第二层的输出数据。因此,如果使用9位来表示所有的输出数据值,那么第一层的每个输出数据值将浪费4位,因为最高有效的4位(假设符号位是最高有效位)将不能传递第一层的任何有用信息。

因此,本文中描述具有可变输出数据格式的dnn的硬件实现和相关方法。具体地,在本文所述的硬件实现和方法中,硬件实现被配置成:执行一个或多个硬件遍历来实施dnn,其中在每个遍历期间,硬件实现接收用于硬件遍历的表示用于特定层的输入数据的至少一部分的输入数据集;根据与硬件遍历相关联的一个或多个层(其包括所述特定层(以及可选地一个或多个后续层))来处理输入数据集;并且基于一个或多个层以期望格式输出在特定硬件遍历中处理的经处理的数据。具体地,当硬件实现接收待处理的输入数据集时,硬件实现还接收指示硬件遍历的输出数据的期望格式的信息,并且硬件实现被配置成在输出经处理的数据之前将经处理的数据转换到期望格式。如下文更详细地描述,每个硬件遍历的输出数据的适当格式可以根据经验基于与硬件遍历相关联的一个或多个层来确定。如果层将在硬件遍历中处理或部分处理的话,那么硬件遍历被称为是与所述层相关联。

将适当格式独立地用于每个硬件遍历允许显著地减小包括硬件实现的存储带宽,而同时仍保持整个dnn上的足够计算精度。减小存储带宽还可以导致具有较小占用区面积的系统、可以降低存储器消耗的功率,并且可以改善硬件实现的性能(所述性能否则可能会因较大网络带宽而已经慢下来)。

在一些情况下,硬件实现用来处理接收到的输入数据集的内部数据也可以具有可变格式。例如,在一些情况下,除了针对硬件遍历的输入数据集来接收指示对应输出数据的格式的信息之外,硬件实现还可以接收指示与硬件遍历相关联的层中的一个或多个层的输入数据和/或输出数据的期望内部格式。硬件实现随后可以被配置成执行在处理所述数据之前将用于所述层的输入数据转换到输入数据的期望格式和/或执行在将所述层的输出数据传递到下一层之前或者在将输出数据转换到期望的输出数据格式之前将输出数据转换到期望输出数据格式。这可以允许更有效地执行对层的处理。例如,如果dnn包括可以在单个硬件遍历中完成的卷积层和池化层,那么除了接收指示硬件遍历的输出数据的格式的信息(即,池化层的数据的输出)之外,硬件实现还可以接收指示卷积层和/或池化层的期望内部输入数据格式和/或期望内部输出数据格式。

现在参考图2,该图示出具有可变输出数据格式的dnn的示例硬件实现200。dnn的硬件实现200被配置成接收用于特定dnn的输入数据并且处理输入数据以实施dnn。本文中使用的短语“处理输入数据以实施dnn”意味着根据dnn的层(即,层的顺序和配置)来处理输入数据。在本文描述的实例中,硬件实现200被配置成使用一个或多个硬件遍历来处理dnn的数据,其中在每个硬件遍历中,硬件实现根据dnn的一个或多个层来处理输入数据并且输出经处理的数据作为dnn的输出或提供输出数据作为后续硬件遍历的输入。硬件实现200可以预先配置成实施特定dnn(例如,层的顺序及其配置(例如,卷积层的权重)可以预先加载到dnn中),或者硬件实现200可以动态地配置成实施多个不同dnn中的一个(例如,层的顺序及其配置(例如,卷积层的权重)可以动态地提供到硬件实现)。

示例硬件实现200包括输入模块202、处理模块204、命令解码器206,以及输出模块208。

输入模块202包括数字逻辑电路,所述数字逻辑电路被配置成接收用于硬件遍历的输入数据集并且将接收到的输入数据集提供给处理模块204以进行处理。输入数据集可以表示用于特定层的输入数据的一部分或者用于特定层的输入数据的全部。输入数据是包括用于特定层的输入数据的全部还是只包括一部分可以取决于输入数据的大小和/或输入模块202的大小。例如,在一些情况下,输入模块202可以包括用于存储接收到的输入数据的一个或多个输入缓冲器。在用于层的输入数据大于输入缓冲器的大小的情况下,用于层的输入数据便可以分成多个输入数据集,其中每个输入数据集在不同的硬件遍历中处理。这意味着可以进行不止一个硬件遍历来处理dnn的层,并且所述不止一个硬件遍历可以与同一层相关联。

用于特定层的输入数据可以采用任何合适的方式分成多个输入数据集。例如,用于dnn的特定层的输入数据可以按以下项分成多个输入数据集:(i)在x维中,使得每个集与一个或多个垂直条带相关;(ii)通过输出平面(例如,f维),以便每个集与滤波器的子集相关;(iii)通过输入平面(例如,p维),以便每个滤波器的每个集被部分处理;或者(iv)使用它们的任何组合。

在一些情况下,输入模块202可以被配置成经由存储器接口(未示出)从外部存储器(未示出)读取输入数据。如本领域的技术人员已知,存储器接口被配置成提供硬件实现200与外部存储器之间的接口。外部存储器可以被视作与硬件实现200分开的模块或者可以是硬件实现200的一部分。在一些情况下,输入模块202可以预先配置成具有用于每个硬件遍历的输入数据的外部存储器的地址。在其他情况下,输入模块202可以被配置成动态地接收指示用于每个硬件遍历的输入数据的外部存储器的地址的信息。

处理模块204包括数字逻辑电路,所述数字逻辑电路被配置成根据与硬件遍历相关联的一个或多个层来处理接收到的输入数据集,以生成经处理的数据。与硬件遍历相关联的一个或多个层包括与硬件层的输入数据相关的层以及没有后续层、一个或不止一个后续层。因此,所执行的处理取决于与当前硬件遍历相关联的层的数量和类型。例如,如果硬件遍历与卷积层相关联,那么处理模块204可以被配置成利用与卷积层相关联的滤波器/权重来执行输入数据的卷积;并且如果硬件遍历与卷积层和激活层相关联,那么处理模块204可以被配置成利用与卷积层相关联的滤波器/权重来执行输入数据的卷积,然后向卷积的输出应用激活函数。

与每个硬件遍历相关联的层的数量和类型通常是预先确定的,并且可以是基于层的顺序以及一个或多个其他因素。例如,在一些情况下,除非根据一个或多个后续层的处理可以在无需将前一层的数据写入到两者之间的存储器的情况下执行,否则处理模块204可以被配置成处理每硬件遍历单个层。在一些情况下,处理模块204可以预先配置成具有指示与每个硬件遍历相关联的层(且因此哪些处理函数)的信息。在其他情况下,处理模块204可以被配置成动态地接收指示每个硬件遍历与哪些层(且因此哪些处理函数)相关联的信息。

在一些情况下,处理模块204可以包括多个子处理模块,每个子处理模块被配置成执行对一种类型的层的处理的全部或部分。例如,处理模块204可以包括一个或多个以下子处理模块:被配置成对输入数据执行卷积的卷积引擎、被配置成将激活函数应用于接收到的数据的激活模块、用于对接收到的数据执行池化的一个或多个池化模块等。在下文参考图3描述处理模块204的示例实现。一旦输入数据已经根据与当前硬件遍历相关联的层进行处理,经处理的数据便提供到输出模块208或者存储以用于后续硬件遍历。

命令解码器206包括数字逻辑电路,所述数字逻辑电路被配置成接收指示当前硬件遍历的输出数据的期望格式的信息。命令解码器206从接收到的信息中标识当前硬件遍历的输出数据的期望格式并且将格式提供到输出模块208。在一些情况下,命令解码器206(或硬件实现200的另一部件)可以被配置成经由存储器接口(未示出)从外部存储器(未示出)检索指示当前硬件遍历的输出数据的格式的信息。在其他情况下,命令解码器206可以被配置成从硬件实现的内部存储器或者可以预先加载有指示每个硬件遍历的输出数据的期望格式的信息的另一类型的存储设备(例如,寄存器)中检索指示当前硬件遍历的输出数据的格式的信息。

在一些情况下,可以(例如,在dnn的训练阶段期间或者在dnn层被映射到硬件遍历时的映射阶段期间)使用一个或多个软件工具来确定每个硬件遍历的适当或最佳输出数据格式。这可以包括标识与硬件遍历相关联的层中的一个或多个层的适当或最佳数据格式。例如,在一些情况下,确定硬件遍历的适当或最佳输出数据格式可以包括标识与硬件遍历相关联的最后层(即,将在硬件遍历中最后处理的层)的适当或最佳输出数据格式。例如,如果硬件遍历与层a相关联,那么按照列出的顺序处理层b和层c然后确定硬件遍历的最佳数据格式可以包括确定层c的适当或最佳数据格式。由于最佳输出数据格式在层之间可以不同,因此最佳数据格式在硬件遍历之间可以不同。

特定层的适当或最佳数据格式(例如,与硬件遍历相关联的最后层)可以采用任何适当的方式确定。例如,在一些情况下,典型输入的训练数据集或已知样本可以经过dnn,并且记录每个层的输出数据的最小值和最大值且使用它们来标识表示由最小值和最大值限定的值的范围的适当或最佳格式。在dnn将用于视觉应用的情况下,用来估计分布的输入数据可以采取样本输入图像的形式。这样的方法在样本输入图像包括预期输入数据的良好表示时特别有效。

如上文所述,在一些情况下(例如,当对层的输入数据太大而无法在单个硬件遍历中处理时),可以通过多个硬件遍历来处理层。在这些情况下,一个或多个硬件遍历可以只与层的一部分(例如,输入数据的一部分)相关,并且因此只有与层的该部分相关的输出输入可以用于标识硬件遍历的适当或最佳输出数据格式。这可以导致与同一层相关联的两个硬件遍历具有不同的期望输出数据格式。

硬件遍历的输出数据格式可以是浮点格式或定点格式。软件工具可以基于例如输出数据的目的地来确定用于特定层(并且因此用于特定硬件遍历)的输出数据格式将是浮点格式还是定点格式。如下文更详细地描述,在一些情况下,使用定点格式来执行dnn处理可能比较有利。在这些情况下,如果特定层的输出数据将要馈送回到dnn(例如,作为另一层的输入或作为另一硬件遍历的输入),那么软件工具可以标识定点格式作为输出数据的最佳数据格式。相反,如果层的输出数据将馈送到另一模块,诸如中央处理单元(cpu)或图形处理单元(gpu),因为例如输出数据是dnn的最终输出数据,那么软件工具可以标识浮点格式作为输出数据的适当或最佳数据格式。

如本领域的技术人员已知,定点格式在小数点(例如,十进制小数点或二进制小数点)之后具有固定数量的数字。相反,浮点数表示并不具有固定的小数点(即,它可以“漂浮”)。换言之,小数点可以置于表示内的任何地方。

最常见的浮点标准是电气与电子工程师协会(ieee)浮点运算标准(ieee-754)。ieee-754规定,浮点数由三个数表示:符号、指数和尾数(s、exp、mant)。通常,针对固定整数bias,解译三个数(s、exp、mant),如等式(1)所示:

(-1)s2exp-bias1.mant(1)

ieee-754为具有不同精度的浮点数定义表1中示出的四个基本格式。具体地,分别用16位、32位、64位和128位进行编码。

表1

在一些情况下,在硬件遍历的输出格式是浮点格式的情况下,可以将硬件遍历的适当或最佳浮点格式选择为可以用来表示硬件遍历预期的输出值范围的最低ieee浮点格式(f16、f32、f64或f128)。

以浮点格式来表示数字的常见格式是q格式,q格式指定预定数量的整数位n和小数位m。因此,数字可以表示为qn.m,其需要总共n+m+个位(包括符号位)。示例q格式在下表2中示出。

表2

然而,q格式的缺点在于,用来表示数字的位中的一些位可能被视作冗余。在实例中,数字范围[-0.125,0.125]将表示3位的精度。用于这个示例范围和精度的要求q格式是q0.5。然而,如果假设提前知道值的范围,那么数字的前两位将从不用于确定以q格式表示的值。例如,表示的前两位并不有助于最终的数字,因为它们分别表示0.5和0.25并且因此落在要求的范围之外。然而,归因于相对位位置,它们用来指示第三位位置的值(即,0.125及以上)。上述q格式是用在dnn的硬件实现内的低效定点格式,因为一些位可能并未传递有用信息。

因此,在一些实例中,代替使用q格式,可以使用带符号整数尾数与常用固定二次幂指数格式。这个定点格式由整数位的数量和指数限定。在一些情况下,带符号整数可以用二进制补码格式表示,并且在其他情况下,可以使用其他带符号整数格式。在整数/常用指数定点格式用于特定硬件遍历的输出数据的情况下,所述硬件遍历的适当或最佳定点格式便可以包括标识可以用来表示所述硬件遍历预期的输出数据值的范围的适当指数和最小整数位长度组合。

在一些情况下,代替存在硬件遍历的单个期望输出数据格式(即,并非所有的经处理的数据都可以转换到相同的输出格式),可以存在硬件遍历的多个期望输出数据。具体地,在一些情况下,可以存在与经处理的数据的不同部分相关的多个期望输出数据格式。在这些情况下,指示期望输出硬件格式的信息可以指示用于经处理的数据的至少两个不同部分的不同输出数据格式。

输出模块208被配置成接收来自处理模块204的经处理的数据,并且将经处理的数据转换到期望输出数据格式,以产生输出数据。经处理的数据通常(但未必)采用定点格式,并且因此取决于期望的输出数据格式是浮点格式还是定点格式,输出模块208可以被配置成执行定点到浮点转换或者定点到定点转换。在一些情况下,输出模块208还可以被配置成将输出数据写入到存储器(未示出)或另一存储模块(未示出)。在存在硬件遍历的多个期望输出数据格式的情况下,输出模块208便可以被配置成执行多次格式转换,使得经处理的数据的不同部分转换成不同的期望输出数据格式。

在一些情况下,除了支持可变输出数据格式之外,硬件实现200还可以支持可变权重格式。如上所述,诸如卷积层等一些层可以与用来处理对层的输入数据的一组权重或系数相关联。具体权重和因此权重值的范围在层之间变化,因此出于与上文相对于输出数据描述的类似原因,将标准格式用于所有的权重可能并不有效,因为这可以导致一些层的权重的冗余位。因此,不同的格式可以用于不同层的权重。

权重传统上使用浮点格式来表示,但如上所述,在硬件中处理浮点数比较复杂,从而与处理定点数的硬件相比,往往增加硬件的硅面积和复杂性。因此,使用定点格式表示权重可以更有效。在一些情况下,可以使用由指数和整数位长度限定的定点格式。在这些情况下,用来表示权重的指数和/或整数位长度可以随着层变化。例如,第一卷积层的权重可以采用由指数a和整数位长度b限定的定点格式,并且第二卷积层的权重可以采用由指数c和整数位长度d限定的定点格式。允许不同的层将不同的格式用于权重可以减少用来存储权重的空间量并且可以允许更有效地执行对此类层的处理。

在一些情况下,与层相关联的权重进行分组以形成多个滤波器。在这些情况下,除了允许不同层使用不同权重格式之外,权重格式可以在层内(例如,在滤波器之间)变化。例如,卷积层可以与分组以形成第一滤波器和第二滤波器的一组权重相关联,并且第一格式可以用于第一滤波器的权重且第二不同格式可以用于第二滤波器的权重。这可以允许将更多的位分配到对结果的准确性来说更重要的滤波器。

在硬件实现支持可变权重格式的情况下,软件(其可以是与用来标识每个硬件遍历的适当或最佳输出数据格式的软件相同的软件或不同的软件)可以被配置成确定每个相关层(即,具有相关联的权重的每个层,诸如卷积层)的权重的(一个或多个)适当或最佳格式。具体地,软件可以确定层的所有权重的适当或最佳单个权重格式,或者层的每个滤波器的适当或最佳权重格式。指示由特定层使用的权重格式的信息便提供到硬件实现,以允许硬件实现正确地处理权重。在一些情况下,指示每个此类层(例如,每个卷积层)的权重格式的信息可以存储在由硬件实现读取的存储器中。在其他情况下,指示权重格式的信息可以相对于硬件实现本地存储(例如,存储在寄存器中)或者以另一方式动态地提供到硬件实现。

现在参考图3,该图示出可以用作图2的处理模块204的示例处理模块300。图3的示例处理模块300包括卷积引擎302、累加缓冲器304、按元素操作模块306、激活模块308、归一化模块310、池化模块312,以及输出交错模块314。每个模块或引擎实施或处理至少一种类型的层的全部或一部分。具体地,卷积引擎302和累加缓冲器304可以共同实施或处理卷积层。激活模块306处理或实施激活层。归一化模块310处理或实施归一化层。池化模块312实施池化层并且输出交错模块314处理或实施交错层。

卷积引擎302被配置成使用与特定卷积层相关联的权重来对接收到的输入数据执行卷积操作。dnn的每个卷积层的权重可以存储在如图3所示的系数缓冲器316中,并且当特定卷积层由卷积引擎302处理时,特定卷积层的权重可以提供到卷积引擎302。在硬件实现支持可变权重格式的情况下,卷积引擎302便可以被配置成接收指示所处理的当前卷积层的权重的一个或多个格式的信息,以允许卷积引擎适当地解译和处理接收到的权重。

卷积引擎302可以包括多个乘法器(例如,128个)和多个加法器,所述加法器将乘法器的结果相加以产生单个总和。卷积引擎302的示例实现在图4中示出,其包括多个乘法器402和多个加法器404。尽管图3中示出单个卷积引擎302,但在其他实例中,可以存在多个(例如,8个)卷积引擎,以便可以同时处理多个窗口。卷积引擎302的输出馈送到累加缓冲器304。

累加缓冲器304被配置成接收卷积引擎的输出并且将它加到累加缓冲器304的当前内容。通过这种方式,累加缓冲器304将卷积引擎302的结果累加起来。尽管图3中示出单个累加缓冲器304,但在其他实例中,可以存在多个(例如,8个,每卷积引擎一个)累加缓冲器。累加缓冲器304将累加结果输出到按元素操作模块306,所述按元素操作模块取决于是否将在当前硬件遍历期间处理按元素层而可以或可以不对累加结果进行操作。

按元素操作模块306被配置成接收用于当前硬件遍历的输入数据(例如,当不在当前硬件遍历中处理卷积层时)或者来自累加缓冲器304的累加结果(例如,当在当前硬件遍历中处理卷积层时)。取决于是否在当前硬件遍历中处理按元素层和/或取决于是否将在按元素层之前处理激活层,按元素操作模块306可以处理接收到的输入数据或者将接收到的输入数据传递到另一模块(例如,激活模块308和/或归一化模块310)。当按元素操作模块306被配置成处理接收到的输入数据时,按元素操作模块306对接收到的数据执行按元素操作(可选地,利用另一数据集(其可以从外部存储器得到))。按元素操作模块306可以被配置成执行任何合适的按元素操作,诸如但不限于,加、乘、最大值和最小值。取决于是否将在按元素层之后处理激活层,按元素操作的结果随后提供到激活模块308或归一化模块310。

激活模块308被配置成接收以下项中的一个作为输入数据:对硬件遍历的原始输入(经由按元素操作模块306)(例如,当不在当前硬件遍历中处理卷积层时);累加数据(经由按元素操作模块306)(例如,当在当前硬件遍历中处理卷积层并且不在当前硬件遍历中处理按元素层或者在当前硬件遍历中处理按元素层但在激活层之后时)。激活模块308被配置成将激活函数应用于输入数据并且将输出数据提供回到按元素操作模块306,其中所述输出数据直接地或在按元素操作模块306处理之后转发到归一化模块310。在一些情况下,应用到由激活模块308接收的数据的激活函数可以按照激活层而变化。在这些情况下,为每个激活层指定将应用的激活函数的一个或多个性质的信息可以进行存储(例如,存储在存储器中),并且用于在特定硬件遍历中处理的激活层的相关信息可以在硬件遍历期间提供到激活模块308。

在一些情况下,激活模块308可以被配置成将表示激活函数的数据存储在查找表的条目中。在这些情况下,输入数据可以用来查找查找表中的一个或多个条目并且输出表示激活函数的输出的值。例如,激活模块308可以被配置成通过在从查找表读取的两个或更多个条目之间进行内插来计算输出值。

在一些实例中,激活模块308可以被配置成通过实施修正线性单元(relu)函数来作为relu操作。在relu函数中,通过标识最大值来计算输出元素yi,j,k,如等式(2)中列出,其中对于小于0的x值,y=0:

yi,j,k=f(xi,j,k)=max{0,xi,j,k}(2)

在其他实例中,激活模块308可以被配置成通过实施带参数的修正线性单元(prelu)函数来作为prelu操作。prelu函数执行与relu函数类似的操作。具体地,在是常量的情况下,prelu被配置成生成输出元素yi,j,k,如等式(3)中列出:

yi,j,k=f(xi,j,k;w1,w2,b1,b2)=max{(w1*xi,j,k+b1),(w2*xi,j,k+)b2}(3)

归一化模块310被配置成接收以下项中的一个作为输入数据:用于硬件遍历的原始输入数据(经由按元素操作模块306)(例如,当不在当前硬件遍历中处理卷积层并且不在当前硬件遍历中处理按元素层或激活层时);累加输出(经由按元素操作模块306)(例如,当在当前硬件遍历中处理卷积层并且不在当前硬件遍历中处理按元素层或激活层时);以及按元素操作模块和/或激活模块的输出数据。归一化模块310随后对接收到的输入数据执行归一化函数,以产生归一化数据。在一些情况下,归一化模块310可以被配置成执行局部响应归一化(lrn)函数和/或局部对比归一化(lcn)函数。然而,本领域的技术人员将明白,这些仅仅是实例,并且归一化模块310可以被配置成实施一个或多个任何合适的归一化函数。不同的归一化层可以被配置成应用不同的归一化函数。

池化模块312可以接收来自归一化模块310的归一化数据或者可以经由归一化模块310来接收对归一化模块310的输入数据。在一些情况下,数据可以经由xbar318在归一化模块310与池化模块312之间传递。本文中使用术语“xbar”来指代含有以动态方式将多个模块连接在一起的路由逻辑的简单硬件模块。在这个实例中,取决于在当前硬件遍历中将在哪些层上进行处理,xbar可以动态地连接归一化模块310、池化模块312和/或输出交错模块314。因此,xbar在每个遍历中可以接收指示将连接到哪些模块310、312、314的信息。

池化模块312被配置成对接收到的数据执行池化函数,诸如但不限于,最大值函数或平均函数,以产生池化数据。池化层的目的是减少表示的空间大小,以减少网络中的参数和计算的数量,并且由此也控制过度拟合。在一些实例中,在按照池化层限定的滑动窗口上执行池化操作。

输出交错模块314可以接收来自归一化模块310的归一化数据、对归一化函数的输入数据(经由归一化模块310),或者来自池化模块312的池化数据。在一些情况下,数据可以经由xbar318在归一化模块310、池化模块312与输出交错模块314之间传递。输出交错模块314被配置成执行重排操作,以产生按预定顺序的数据。这可以包括存储和/或更换接收到的数据。由层中的最后层生成的数据提供到输出模块208,其中所述数据转换到当前硬件遍历的期望输出格式。

归一化模块310、池化模块312以及输出交错模块314可以各自访问共享缓冲器320,所述共享缓冲器可以由这些模块310、312和314用来写入数据和从中检索数据。例如,共享缓冲器320可以由这些模块310、312、314用来重排接收到的数据或生成的数据的顺序。例如,这些模块310、312、314中的一个或多个可以被配置成向共享缓冲器320写入数据并且按不同的顺序读出相同数据。在一些情况下,尽管归一化模块310、池化模块312以及输出交错模块314中的每个可以访问共享缓冲器320,但归一化模块310、池化模块312以及输出交错模块314可以被分配只有它们可以访问的共享缓冲器320的一部分。在这些情况下,归一化模块310、池化模块312以及输出交错模块314中的每个也许只能够从共享缓冲器320中读出它们已经写入共享缓冲器320中的数据。

如上文所述,在任何硬件遍历期间使用或活动的处理模块300的模块是基于在所述硬件遍历期间处理的层。具体地,只有与在当前硬件遍历期间处理的层相关的模块或部件被使用或活动。如上文所述,在特定硬件遍历期间处理的层是基于dnn中的层的顺序以及可选地一个或多个其他因素(诸如数据的大小)来确定(通常由例如软件工具提前确定)。例如,在一些情况下,除非可以在无需将数据写入层之间的存储器的情况下处理多个层,否则硬件实现可以被配置成执行每硬件遍历处理单个层。例如,如果第一卷积层之后紧跟第二卷积层,那么卷积层中的每个将必须在单独的硬件遍历中执行,因为来自第一卷积层的输出数据需要在它可以用作对第二卷积层的输入之前写入存储器。在这些硬件遍历的每个中,只有与卷积层相关的模块、部件或引擎(诸如,卷积引擎302和累加缓冲器304)可以被使用或活动。

尽管图3的处理模块204示出排列模块、引擎等的特定顺序以及因此数据的处理如何流过处理模块,但将了解,这仅仅是实例并且在其他实例中,模块、引擎可以按不同方式排列。此外,其他处理模块可以实施附加或替代类型的dnn层,并且因此可以包括不同的模块、引擎等。

现在参考图5,该图示出可以由图2的硬件实现实施以根据dnn来处理输入数据的示例方法500。方法500在框502处开始,其中硬件实现接收用于硬件实现的硬件遍历的输入数据集。所述数据集表示用于dnn的层的输入数据的至少一部分。如上文所述,在一些情况下,可以从外部存储器检索所述数据集。一旦已经接收到所述数据集,方法500便行进到框504。

在框504处,硬件实现200(例如,命令解码器206)接收指示硬件遍历的期望输出数据格式的信息。期望输出数据格式可以是定点格式或浮点格式。在期望输出数据格式是定点格式的情况下,具体的定点格式可以由指数和整数位长度标识。在期望输出数据格式是浮点格式的情况下,具体的浮点格式可以被标识为ieee浮点格式中的一个。硬件遍历的特定输出格式是基于将在硬件遍历中处理的层。如上文所述,dnn的每个硬件遍历的输出数据格式可以由软件基于例如用来预测dnn的每个层的输出范围的训练数据集预先确定。特定硬件遍历的输出数据格式便可以基于将在当前硬件遍历中处理的最后层的输出数据的预测范围。

如上文所述,在一些情况下,硬件实现(例如,命令解码器206)可以从外部存储器获得输出数据格式(例如,作为配置数据的一部分);并且在其他情况下,硬件实现可以预先配置(例如,在寄存器或其他本地存储装置中)成具有硬件遍历的期望输出数据格式。一旦硬件实现200接收指示期望输出数据格式的信息,方法500便行进到框506。

在框506处,硬件实现200(例如,处理模块204)根据与当前硬件遍历相关联的dnn的一个或多个层来处理接收到的输入数据集,其中一个或多个层包括与输入数据相关的dnn的层以及没有后续层、一个或不止一个后续层。所执行的处理因而是基于在当前硬件遍历期间处理的层的类型。例如,如果处理卷积层,那么对输入数据执行卷积,并且如果处理按元素层,那么直接地对输入数据执行按元素操作或在输入数据被另一层处理之后对它执行按元素操作。将在每个硬件遍历中处理的层或一组层通常是基于dnn中的层的顺序和硬件实现的能力。如上文所述,将特定dnn应用于输入数据的硬件遍历的数量以及在每个硬件遍历中处理的层可以由软件预先确定。具体地,软件可以基于dnn的层的顺序和输入数据的大小来将层分成一些硬件遍历。一旦硬件实现(例如,处理模块204)已经处理接收到的输入数据集,方法500便行进到框508。

在框508处,硬件实现200(例如,输出模块208)将经处理的数据转换到当前硬件遍历的期望格式,以生成输出数据。如上文所述,在很多情况下,经处理的数据将采用定点格式(例如,由指数和整数位宽度限定),因此在期望格式也是定点格式(例如,由指数和整数位宽度限定)的情况下,将经处理的数据转换到期望输出格式可以包括执行定点到定点转换;并且在期望格式是浮点格式的情况下,将经处理的数据转换到期望输出格式可以包括执行定点到浮点转换。输出数据(采用期望输出数据格式)随后可以存储在存储器中(例如,外部存储器)。

在当前硬件遍历中处理的最后层是dnn的最后层的情况下,方法500便可以结束并且输出数据表示dnn的输出数据。然而,在当前硬件遍历中处理的最后层不是dnn的最后层的情况下,便存在dnn的更多层要处理,并且针对一个或多个后续硬件遍历中的每个来重复框502至508。在这些情况下,在当前硬件遍历中输出的数据变成用于至少一个后续硬件遍历的输入数据。

如上文所述,除了支持可变输出数据格式(即,输出数据的格式可以在硬件遍历之间变化)的硬件实现之外,硬件实现还可以支持可变内部数据格式。本文中使用的术语内部数据是指在硬件遍历期间生成或使用的任何数据并且包括输入到任何层(或与之相关的任何子处理模块)的数据和从任何层(或与之相关的任何子处理模块)输出的数据。在一些情况下,内部数据集中的任何所有数据都可以具有可变格式。在其他情况下,只有内部数据集的子集可以具有可变格式。

在硬件实现支持可变内部数据格式的情况下,除了硬件实现被配置成接收标识硬件遍历的期望输出数据格式并将硬件遍历中的经处理的数据转换到期望输出数据格式外;硬件实现还可以被配置成接收标识一个或多个内部数据集的期望内部数据格式的信息并且将内部数据集转换到期望格式。

如上文所述,不同的层通常具有不同的输入和输出范围。因此,具有可变内部数据格式允许在同一硬件遍历期间处理的不同层使用不同的数据格式,从而可以提高处理这些层的效率。例如,在硬件遍历被配置成处理卷积层和按元素层的情况下,硬件实现可以被配置成接收以下项中的一个或多个:标识卷积层(或其部分)的期望内部输入数据格式的信息;标识卷积层(或其部分)的期望内部输出数据格式的信息;标识按元素层的期望内部输入数据格式的信息;以及标识按元素操作的期望内部输出数据格式的信息,其中这些格式中的每个格式独立于彼此。

硬件实现便可以被配置成将对应的内部数据集转换到期望格式。例如,硬件实现可以被配置成:在处理输入数据之前将输入到卷积层的任何数据转换到卷积层的期望内部输入数据格式;在将输出提供到按元素层之前将由卷积层生成的任何数据转换到卷积层的期望内部输出数据格式;在处理输入数据之前将接收作为对按元素层的输入的任何数据转换到按元素层的期望输入数据格式;并且在将按元素层的输出提供到输出模块之前将由按元素层生成的数据转换到按元素层的期望输出数据格式,在所述输出模块中,所述输出数据可以进一步转换到硬件遍历的输出层格式。

内部数据格式独立于硬件遍历的输出数据格式。内部格式指定硬件实现内的数据格式,而硬件遍历的输出数据格式指定硬件遍历的待从硬件实现输出的数据的格式。因此,尽管由硬件遍历的最后层生成的数据可以最终被输出模块转换到硬件遍历的期望输出数据格式,但可以存在所述层的输出数据的内部格式,所述内部格式可以不同于硬件遍历的期望输出数据格式。例如,由硬件遍历的最后层生成的数据可以首先转换到内部输出数据格式,采用内部输出数据格式的数据随后可以在内部(即,在硬件实现内)提供到或传输到输出模块,在所述输出模块中,所述数据转换到硬件遍历的输出数据格式并且最终以所述格式从硬件实现输出。

许多dnn是使用浮点格式的数据来实施,然而,与用于实施对应的定点计算的硬件相比,归因于被配置成实施浮点操作的硬件的复杂性,在硬件中执行浮点操作在硅面积上可以较大并且具有显著的功耗。因此,为了减小dnn硬件实现的面积、功耗和存储带宽,期望层中的一个或多个层被配置成接收和/或生成定点格式的数据。已经证明上述定点格式对减少数据和提高处理数据的效率特别有效,其中数据集由常用指数和具有一定位宽度的整数表示。因此,在一些实施方案中,期望内部数据格式中的一个或多个可以是由指数和整数位宽度限定的定点数据格式。

允许可变内部数据格式的硬件实现还可以允许使用不同的格式来实施层的各方面。例如,在包括共同用来处理或实施卷积层的卷积引擎和累加缓冲器的处理模块(诸如图3所示)中,可变内部数据格式允许将不同的格式用于卷积和累加。如上文所述,通常有益的是执行定点格式的dnn计算,然而,已经证明难以准确地执行定点的计算,因此允许可变内部数据格式的硬件实现可以以有效的方式允许卷积引擎是定点卷积引擎并且累加缓冲器是浮点累加器。

内部数据的期望格式可以由软件按照确定硬件遍历的输出数据格式的相同或类似格式来预先确定。例如,在一些情况下,典型输入的训练数据集或已知样本经过dnn,并且记录每个层(或层的一部分)的输入数据和输出数据的最小值和最大值且使用它们来标识表示由最小值和最大值限定的值的范围的最佳格式。在dnn将用于视觉应用的情况下,用来估计分布的输入数据可以采取样本输入图像的形式。这样的方法在样本输入图像包括预期输入数据的良好表示时特别有效。

现在参考图7,该图示出在具有可变内部数据格式的硬件遍历期间处理数据的示例方法700。方法700是图5的框506的示例实现。方法700在框702处开始,其中硬件实现将硬件遍历的输入数据(例如,从输入模块接收的输入数据)设置为当前输入数据。方法700随后行进到框704,其中硬件实现标识待处理的硬件遍历的下一层。如上文所述,每个硬件遍历与一个或多个层相关联,并且硬件实现可以接收指示与当前硬件遍历相关联的层及其顺序的信息。一旦已经标识硬件遍历的下一层,方法700便行进到框706,其中硬件实现标识用于所标识的层的下一硬件模块。如上文所述,层可以由一个或多个子处理模块处理。例如,卷积层可以由两个子处理模块(卷积引擎和累加缓冲器)处理或实施;而按元素层可以由单个子处理模块(按元素操作模块)处理或实施。一旦已经标识用于当前层的下一子处理模块,方法700便行进到框708。

在框708处,硬件实现确定对所标识的子处理模块的输入数据的内部格式是否可变。如果不可变,那么方法700直接行进到框714。如果可变,那么方法700行进到:框710,其中硬件实现接收标识针对子处理模块的输入数据的期望内部格式的信息;以及框712,其中硬件实现将当前输入数据转换到输入数据的期望内部格式。方法700随后行进到框714,其中在子处理模块处处理输入数据(经转换或未转换)以生成输出数据。方法700随后行进到框716。

在框716处,硬件实现确定当前子处理模块的输出数据的内部格式是否可变。如果不可变,那么方法700直接行进到框722。如果可变,那么方法700行进到:框718,其中硬件实现接收标识针对子处理模块的输出数据的期望内部格式;以及框720,其中硬件实现将输出数据转换到用于子处理模块的输出数据的内部格式。方法700随后行进到框722,其中将输出数据(经转换或未转换)设置为当前输入数据。方法700随后行进到框724。

在框724处,硬件实现确定是否存在用于当前层的另一子处理模块。如上文所述,层可以具有一个或不止一个子处理模块以处理或实施所述层。如果存在用于当前层的另一子处理模块,那么方法700行进回到框706。然而,如果没有用于当前层的其他子处理模块,那么方法700行进到框726,其中硬件实现确定是否存在待处理的另一层。如果存在的话,那么方法700行进回到框704,否则,方法700结束。

现在参考图6,该图示出第二示例处理模块600,所述处理模块是具有可变内部数据格式的图3的处理模块300的变体且可以用作dnn的硬件实现中的图2的处理模块。处理模块600包括卷积引擎602、累加缓冲器604、按元素操作模块606、激活模块608、归一化模块610、池化模块612以及输出交错模块614,除了它们可以包括用于支持可变数据格式的一个或多个格式转换模块外,它们对应于图3的处理模块300的卷积引擎302、累加缓冲器304、按元素操作模块306、激活模块308、归一化模块310、池化模块312以及输出交错模块314。具体地,图6的卷积引擎602、累加缓冲器604、按元素操作模块606、激活模块608、归一化模块610、池化模块612以及输出交错模块614具有如图3所示且上文描述的对应模块的所有特征和功能,但这些模块或引擎中的一个或多个可以被配置成将数据集转换到期望格式。

图6示出具有可变格式且其中硬件实现被配置成执行内部数据到期望格式的转换的一些内部数据集,然而,本领域的技术人员将明白,图6中的每个可变内部数据集和对应转换模块对与图6中的其他可变内部数据集和对应转换模块对分开,并且因此可以独立地在dnn的硬件实现中实施。换言之,dnn的硬件实现可以包括图6所示且参考其描述的可变内部数据集和对应转换模块对的任何组合。

卷积引擎602接收来自输入模块202(例如,输入缓冲器)的定点数据和来自系数缓冲器616的定点权重,并且对定点数据和定点权重执行卷积,以产生提供到累加缓冲器604的定点输出数据。

在一些实例中,接收到的数据可以是msb对齐格式,这意味着接收到的数据的指数是:(input_intern_exponent–(hw_pipeline_bitdepth–input_intern_bitdepth)),其中input_intern_exponent是从输入模块(例如,输入缓冲器)接收的数据的指数,input_intern_bitdepth是从输入模块(例如,输入缓冲器)接收的数据的整数位深度,并且hw_pipeline_bitdepth是由硬件实现用来在模块或引擎之间传输数据值的位数(在一些情况下,这可以是16位);而接收到的权重可以是msb对齐格式,这意味着权重的指数为:(coeff_mem_exponent–(hw_pipeline_bitdepth–coeff_mem_weight_bitdepth),其中coeff_mem_exponent是接收到的权重的指数并且coeff_mem_weight_bitdepth是接收到的权重的整数位深度。在这些情况下,输出值的指数可以是(input_inter_exponent–(hw_pipeline_bitdepth–input_intern_bitdepth))+(coeff_mem_exponent–(hw_pipeline_bitdepth–coeff_mem_weight_bitdepth)。

累加缓冲器604接收来自卷积引擎602的数据并且对它进行累加。在这个实例中,累加由浮点累加器实施。由于从卷积引擎接收的数据是定点格式,因此累加缓冲器604包括定点到浮点转换器630。定点到浮点转换器630可以被配置成接收指示对累加缓冲器604的输入的期望内部浮点格式的信息。在一些情况下,指示期望内部浮点格式的信息可以包括指示将使用ieee浮点格式中的哪些格式的信息。在一些情况下,在输入数据的格式也可以是可变的情况下,定点到浮点转换器630还可以被配置成接收指示从卷积引擎602接收的数据的格式的信息(accum_input_exponent)。在一些情况下,如上文所述,accum_input_exponent可以等于(input_intern_exponent–(hw_pipeline_bitdepth–input_intern_bitdepth))+(coeff_mem_exponent–(hw_pipeline_bitdepth–coeff_mem_weight_bitdepth)。

一旦定点到浮点转换器630将数据转换成浮点数据,浮点数据便添加到累加器的当前值以生成期望浮点格式的更新累加器值。累加缓冲器604重复这个过程,直到所有的值都已经累加,并且将数据输出到按元素操作模块606。

由于按元素操作模块606预期定点数据,因此累加缓冲器604还包括浮点到定点转换器632。浮点到定点转换器632可以被配置成接收指示对累加缓冲器604的输出的期望内部固定格式的信息。在一些情况下,指示对累加缓冲器604的输出的期望内部固定格式的信息可以指示将用于定点格式的指数(accum_output_exponent)。

如上文所述,按元素操作模块606被配置成接收累加缓冲器604的输出或来自输入缓冲器的输入数据且可选地接收来自存储器的第二数据集,并且对可以包括第二数据集的输入数据执行按元素操作。

为了提高按元素模块606的效率,按元素操作模块包括第一定点到定点转换器634,以将从累加缓冲器604接收的累加数据从定点格式转换成期望的内部定点格式。第一定点到定点转换器634可以被配置成接收指示来自累加缓冲器604的数据的期望内部固定格式的信息。在一些情况下,指示来自累加缓冲器604的数据的期望内部定点格式的信息可以指示将用于期望内部定点格式的指数(ewo_exp_calc_a)。在来自累加缓冲器604的数据可以具有可变格式的情况下,定点到定点转换器634还可以接收指示从累加缓冲器604接收的数据的格式的信息。在一些情况下,指示从累加缓冲器接收的数据的格式的信息可以指示接收到的数据的指数(ewo_exp_in_a)。

按元素操作模块606还可以包括第二定点到定点转换器636,以将从存储器接收的第二数据集从定点格式转换成期望的内部定点格式。定点到定点转换器636可以被配置成接收指示来自存储器的数据的期望内部固定格式的信息。在一些情况下,指示来自存储器的数据的期望内部固定格式的信息可以指示将用于期望内部定点格式的指数(ewo_exp_calc_b)。在来自存储器的数据可以具有可变格式的情况下,定点到定点转换器636还可以接收指示从存储器接收的数据的格式的信息。在一些情况下,指示从累加缓冲器接收的数据的格式的信息可以指示接收到的数据的指数(ewo_exp_in_b)。

按元素操作模块606还可以包括第三定点到定点转换器638,以将经处理的数据(在逐位操作之后)从定点格式转换成期望的内部定点格式。定点到定点转换器638可以被配置成接收指示经处理的数据的期望内部固定格式的信息。在一些情况下,指示来自存储器的数据的期望内部定点格式的信息可以指示将用于期望内部定点格式的指数(ewo_exp_out)。

按元素操作模块606的定点到定点转换器634、636、638的操作可以是基于执行哪个按元素操作。例如,在按元素操作是加法、最大值或最小值操作的情况下,那么优选地两个输入(来自累加缓冲器的输入/来自输入模块(例如,输入缓冲器)的输入,以及来自存储器的输入)都转换到相同格式,并且结果也是相同格式。因此,当由按元素操作模块606执行的按元素操作是加法、最大值或最小值操作时,优选地以下项为真:

●ewo_exp_in_a=accum_output_exponent|input_intern_exponent|activation_lut_exp,具体取决于从哪里接收数据

●ewo_exp_in_b是在输入被写入存储器时(例如,在先前的硬件遍历中)使用的指数

●ewo_exp_calc_a=ewo_exp_calc_b=ewo_exp_calc_result

●ewo_exp_out可以是任何合适的值

然而,在由按元素操作模块606执行的按元素操作是乘法操作的情况下,优选地对乘法器的输入并不改变并且结果的指数是两个输入的指数之和。因此,当由按元素操作模块606执行的按元素操作是乘法时,优选地以下项为真:

●ewo_exp_in_a=accum_output_exponent|input_intern_exponent|activation_lut_exponent,具体取决于从哪里接收数据

●ewo_exp_in_b是在输入被写入存储器时(例如,在先前的硬件遍历中)使用的指数

●ewo_exp_calc_a=ewo_exp_in_a

●ewo_exp_calc_b=ewo_exp_in_b

●ewo_exp_calc_result=ewo_exp_calc_a+ewo_exp_calc_b

●ewo_exp_out可以是任何合适的值

在一些情况下,由按元素操作模块606执行的按元素操作是组合操作,例如,加法操作之后是乘法操作(add_mult)或者乘法操作之后是加法操作(mult_add)。在这些情况下,优选地遵循上述规则,使得对于mult_add操作,对乘法的两个输入的指数优选地不变;对加法器的第二输入的指数转换成其他两个输入的指数之和;并且结果的指数设置为同一值。类似于,对于add_mult操作,对加法器的两个输入的指数优选地转换成同一值;对乘法器的第二输入的指数不变;并且结果的指数设置为加法器的指数与对乘法器的第二输入的指数之和。

如上文所述,归一化模块610、池化模块612以及输出交错模块614能够将数据写入共享缓冲器620并且从中读取数据。在一些情况下,写入共享缓冲器620的数据可以在多个不同的位深度处打包,以便使可以存储到可用缓冲器空间中的数据元素的数量与所存储的数据的精度进行折衷。因此,归一化模块610、池化模块612以及输出交错模块614中的每个可以包括用来将数据钳位到期望格式(例如,位深度)的钳位模块640、642、644。每个钳位模块640、642、644可以被配置成接收指示将要使用的位深度的信息,并且钳位模块640、642、644使用这个信息来确定如何将数据格式化以便存储在共享缓冲器620中。在一个实例中,指示数据的期望格式的信息是可以设置为0、1和2中的一个的be_pk信号,并且当be_pk设置为0时,它表明存储了16位的值,且当数据值是16位时导致钳位模块640、642、644将数据保持原样;当be_pk设置为1时,它表明2×8位值打包在一起且当数据值是16位时导致钳位模块640、642、644将16位数据值钳位到8位,从而保留8个最低有效位;并且当be_pk为2时,它表明4×4位值打包在一起且当数据值是16位时导致钳位模块640、642、644将16位数据值钳位到4位,从而保留四个最低有效位。在这个实例中,钳位模块640、642、644并不更改数据的指数。

图8示出计算机系统,其中可以实施本文所述的dnn的硬件实现。计算机系统包括cpu802、gpu804、存储器806以及其他装置814,诸如显示器816、扬声器818和相机820。dnn的硬件实现810(对应于dnn的硬件实现200)可以在gpu804上实施,如图8所示。在其他实例中,处理块810可以独立于cpu或gpu来实施,并且可以具有到通信总线822的单独连接。在一些实例中,可以不存在gpu,并且cpu可以将控制信息提供到硬件实现810。计算机系统的部件可以经由通信总线822与彼此通信。

dnn的硬件实现以及图2、图3和图6的处理模块被示为包括许多功能块。这仅仅是示意性的,并且不意图限定此类实体的不同逻辑元件之间的严格区分。可以以任何合适的方式提供每个功能块。应理解,在本文中被描述为由dnn的硬件实现或处理模块形成的中间值在物理上无需由dnn的硬件实现或处理模块在任何点生成,并且可以只表示方便地描述由dnn的硬件实现或处理模块在其输入与输出之间执行的处理的逻辑值。

本文所述的dnn的硬件实现和处理模块可以体现在集成电路上的硬件中。本文所述的dnn的硬件实现可以被配置成执行本文所述的方法中的任一个。通常,上述功能、方法技术或部件中的任一个可以在软件、固件、硬件(例如,固定逻辑电路)或它们的任何组合中实施。本文中使用的术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”通常可以表示软件、固件、硬件或它们的任何组合。在软件实现的情况下,模块、功能、部件、元件、单元、块或逻辑表示在处理器上执行时实施指定任务的程序代码。本文所述的算法和方法可以由一个或多个处理器执行,所述处理器执行可以致使处理器执行所述算法/方法的代码。计算机可读存储介质的实例包括随机存取存储器(ram)、只读存储器(rom)、光盘、闪存、硬盘存储器,以及可以使用磁技术、光技术和其他技术来存储指令或其他数据并且可以由机器访问的其他存储装置。

本文中使用的术语计算机程序代码和计算机可读指令指代用于处理器的任一种可执行代码,包括用机器语言以及解释语言或脚本语言表达的代码。可执行代码包括二进制代码、机器代码、字节码、限定集成电路的代码(诸如,硬件描述语言或网络列表),以及用诸如c、java或opencl等编程语言代码表达的代码。可执行代码可以是例如任一种软件、固件、脚本、模块或库,它们在虚拟机处或其他软件环境下适当地执行、处理、解译、编译、执行时致使支持可执行代码的计算机系统的处理器执行由代码指定的任务。

处理器、计算机或计算机系统可以是具有处理能力的任一种装置、机器或专用电路或者它们的集合或部分,使得它可以执行指令。处理器可以是任一种通用或专用处理器,诸如,cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)等。计算机或计算机系统可以包括一个或多个处理器。

还意图涵盖限定如本文所述的硬件的配置的软件,诸如hdl(硬件描述语言)软件,如用于设计集成电路或用于配置可编程芯片,以执行期望的功能。也就是,可以提供计算机可读存储介质,所述计算机可读存储介质上编码了采用集成电路定义数据集的形式的计算机可读程序代码,所述计算机可读程序代码在集成电路制造系统中处理(即,运行)时将所述系统配置成制造被配置成执行本文所述的方法中的任一个的dnn的硬件实现,或者制造包括本文所述的任何设备的dnn的硬件实现。集成电路定义数据集可以是例如集成电路描述。

因此,可以提供一种在集成电路制造系统处制造如本文所述的dnn的硬件实现的方法。此外,可以提供一种集成电路定义数据集,所述集成电路定义数据集在集成电路制造系统中处理时致使执行制造dnn的硬件实现的方法。

集成电路定义数据集可以是计算机代码的形式,例如,作为网络列表、用于配置可编程芯片的代码、作为定义适合在集成电路中在任何级处制造的硬件的硬件描述语言,包括作为寄存器传送级(rtl)代码、作为诸如verilog或vhdl的高级电路表示,以及作为诸如oasis(rtm)和gdsii的低级电路表示。在逻辑上定义适合在集成电路中制造的硬件的较高级表示(诸如rtl)可以在被配置成软件环境的背景下生成集成电路的制造定义的计算机系统处处理,所述软件环境包括电路元件的定义和用于组合这些元件的规则,以便生成由表示定义的集成电路的制造定义。如软件在计算机系统处执行以便定义机器的一般情况下,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便被配置成生成集成电路的制造定义的计算机系统执行定义了集成电路的代码,便生成所述集成电路的制造定义。

现在将参考图9的方面来描述在集成电路制造系统处处理集成电路定义数据集以便将所述系统配置成制造dnn的硬件实现的实例。

图9示出被配置成制造如本文中的实例中的任一实例中描述的dnn的硬件实现的集成电路(ic)制造系统902。具体地,ic制造系统902包括布局处理系统904和集成电路生成系统906。ic制造系统902被配置成接收ic定义数据集(例如,定义如本文中的实例中的任一实例中描述的dnn的硬件实现)、处理ic定义数据集,并且根据ic定义数据集(例如,其体现如本文中的实例中的任一实例中描述的dnn的硬件实现)来生成ic。对ic定义数据集的处理将ic制造系统902配置成制造体现如本文中的实例中的任一实例中描述的dnn的硬件实现的集成电路。

布局处理系统904被配置成接收并处理ic定义数据集,以确定电路布局。从ic定义数据集中确定电路布局的方法是本领域中已知的,并且例如可以涉及合成rtl代码来确定将要生成的电路的门级表示,例如,就逻辑部件而言(例如,nand、nor、and、or、mux和flip-flop部件)。通过确定逻辑部件的位置信息可以从电路的门级表示中确定电路布局。这可以自动地完成或者在用户参与下完成,以便优化电路布局。当布局处理系统904已经确定电路布局时,它可以向ic生成系统906输出电路布局定义。电路布局定义可以是例如电路布局描述。

ic生成系统906根据电路布局定义来生成ic,如本领域中已知。例如,ic生成系统906可以实施半导体装置制造过程来生成ic,这可以涉及多步骤序列的光刻和化学处理步骤,在此期间通常在由半导体材料制成的晶片上形成电子电路。根据电路定义,电路布局定义可以是掩模的形式,所述掩模可以用在光刻过程中用于生成ic。或者,提供到ic生成系统906的电路布局定义可以是计算机可读代码的形式,ic生成系统906可以使用所述计算机可读代码来形成用于生成ic的合适掩模。

由ic制造系统902执行的不同过程可以全都在一个位置实施,例如,由一方实施。或者,ic制造系统902可以是分布式系统,使得过程中的一些过程可以在不同位置执行,并且可以由不同方执行。例如,以下阶段中的一些阶段可以在不同位置执行和/或由不同方执行:(i)合成表示ic定义数据集的rtl代码以形成待生成的电路的门级表示,(ii)基于门级表示来生成电路布局,(iii)根据电路布局来形成掩模,以及(iv)使用掩模来制造集成电路。

在其他实例中,在集成电路制造系统处对集成电路定义数据集的处理可以将系统配置成在不处理ic定义数据集的情况下制造cnn的硬件实现,以便确定电路布局。例如,集成电路定义数据集可以定义诸如fpga等可配置处理器的配置,并且对所述数据集的处理可以将ic制造系统配置成生成具有所定义的配置的可编程处理器(例如,通过将配置数据加载到fpga)。

在一些实施例中,在集成电路制造系统中处理的集成电路制造定义数据集可以致使集成电路制造系统生成装置,如本文所述。例如,由集成电路制造定义数据集以上文关于图9描述的方式对集成电路制造系统进行配置可以致使制造如本文所述的装置。

在一些实例中,集成电路定义数据集可以包括在数据集处定义的硬件上运行或者与在数据集处定义的硬件结合的软件。在图9所示的实例中,ic生成系统还可以被集成电路定义数据集配置成在制造集成电路时根据在集成电路定义数据集处定义的程序代码将固件加载到集成电路上,或者以其他方式为集成电路提供程序代码,以便与集成电路一起使用。

与已知的实现相比,本申请中陈述的概念在装置、设备、模块和/或系统中(以及在本文中实施的方法中)的实施可以引起性能提高。性能提高可以包括以下一个或多个:计算性能提高、延迟减少、吞吐量增大,和/或功耗减少。在此类装置、设备、模块和系统的制造期间(例如,在集成电路中),性能提高可以与物理实现进行折衷,从而改善制造方法。例如,性能提高可以与布局面积进行折衷,从而匹配已知的实现的性能但使用较少的硅。这可以例如通过以连续的方式重新使用功能块或者在装置、设备、模块和/或系统的元件之间共享功能块来完成。相反,为了提高性能,可以将引起装置、设备、模块和系统的物理实现的改善(诸如硅面积减小)的本申请中陈述的概念进行折衷。这可以例如通过在预定义面积预算内制造模块的多个实例来完成。

申请人在此孤立地公开本文所述的每个单独特征以及两个或更多此类特征的任何组合,使得能够总体上根据本领域的技术人员的公知常识基于本申请来执行此类特征或组合,而不管此类特征或特征的组合是否解决了本文中公开的任何问题。鉴于以上描述,本领域的技术人员将明白,尅在本发明的范围内作出各种更改。

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