一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

利用自我修正代码减少神经网络的计算量的制作方法

2022-02-20 14:09:34 来源:中国专利 TAG:

利用自我修正代码减少神经网络的计算量


背景技术:

1.人工智能是寻求建立能够以人类的方式做出决定的智能机器的研究和工程领域。人工神经网络属于人工智能的子领域,称为机器学习。机器学习是研究赋予计算机学习能力而无需明确编程的研究领域。实现机器学习算法的程序能够学习执行任务,而不需要程序中的明确代码来解释每种可能性或所有可能的行为。
2.神经网络的架构可以包含输入层、输出层和一些中间层,通常被称为隐藏层。每一层对前一层的输出执行计算,最后一层(输出层)提供最终结果。有了更多的层,理论上,神经网络可以执行更复杂的任务,诸如语言翻译和识别(或分类)图像的内容。具有三个以上隐藏层的神经网络有时被称为深度神经网络。深度神经网络可以有许多隐藏层,诸如,例如,五层到一千多层之间。
3.神经网络可以使用中央处理单元(cpu)来执行计算。然而,cpu倾向于为顺序计算而不是并行计算进行优化,因此可能具有较差的响应时间。图形处理单元(gpu)为并行计算进行了优化,但不一定能将一个计算单元的结果直接提供给另一个计算单元。通常情况下,结果必须先写到存储器中,然后再读回。尽管gpu可以比cpu有更好的响应时间,但仍然希望能改善神经网络的执行时间。
附图说明
4.将参照附图描述根据本公开的各个实施例,其中:
5.图1图示了用于神经网络的模型的示例。
6.图2图示了包含前馈权重和递归权重的神经网络的模型的示例。
7.图3图示了二维卷积的示例。
8.图4图示了卷积神经网络的配置示例。
9.图5图示了用于神经网络的组织的示例。
10.图6图示了神经网络的组织的另一示例。
11.图7图示了神经网络的组织的又一示例。
12.图8图示了神经网络及其相关指令的示例。
13.图9图示了可使用加速引擎的主机系统的示例。
14.图10图示了可用于执行神经网络的加速器的示例。
15.图11图示了具有多个加速器的加速引擎的示例。
16.图12图示了用于减少神经网络处理中的计算的方法的示例。
具体实施方式
17.在一些神经网络中,诸如递归神经网络,由特定层或节点执行的操作被重复多次,每次都是利用基于前一次迭代的输出数据的不同输入数据。这样的神经网络可以用数据流图来表示,该数据流图具有反馈回路,其指示来自特定层/节点的输出数据被反馈为特定层/节点的输入数据(或者,更一般地说,重复的操作集可以包含单个层/节点和/或多个层/
节点)。对操作集进行的迭代次数可以是静态的,也可以是动态的,这是由神经网络的控制流决定的。例如,如果操作集在没有中断条件的“for”循环中实现,则迭代次数可以是静态的。相反,如果操作集在“while”循环中或在具有中断条件的“for”循环中实现,则除其他可能性外,迭代的数量可以是动态的。
18.许多处理器,诸如单指令多数据(simd)处理器,可能不直接支持执行具有动态长度的可重复操作集。在许多情况下,可重复操作集被编译为具有最大迭代次数的静态长度,并且来自超过所需迭代次数的任何冗余计算的输出数据被丢弃。例如,神经网络可以包含具有20次最大迭代的可重复操作集,其中断条件很可能在第20次迭代之前就被满足。尽管如此,可重复操作集的指令仍被编译为具有20次迭代。在运行期间,处理器可以执行前5次迭代,并在第5次迭代后或第6次迭代前确定退出循环。最后的15次迭代仍然由处理器执行,而产生的输出数据被丢弃。处理器在最后15次迭代中执行的计算被认为是多余的,因为这些数据对神经网络的最终结果没有影响。这种冗余的计算是低效的,并降低了工作负载的吞吐量。
19.本文描述的实施例克服了上述不支持动态控制流的处理器(诸如simd处理器)中的低效率。一些示例提供了自我修正代码,该代码在执行时触发覆写动作,该动作用无操作(nop)指令(例如,不做任何事情而不破坏处理器的定时机制的指令)覆写冗余代码块中的指令。将nop指令放在冗余代码块中可能是有利的,因为nop指令可以在比被覆写的指令更少的周期内执行。自我修正代码可以在编译过程中添加,并且可以在运行时由执行引擎执行。
20.在一些示例中,编译器可首先检测神经网络的源代码中存在具有动态长度的可重复操作集。在一些情况下,编译器扫描源代码并识别指示可重复操作集的特定模式。例如,编译器可以解析源代码中的“for”循环或“while”循环。然后,编译器为可重复操作集生成具有多个块的指令,每个块对应一次迭代,块的总数对应最大迭代数。然后,编译器可以为每个块生成附加指令。附加指令可以包含评估指令,该指令在执行时确定是否满足中断条件(例如,通过确定变量的当前值并将当前值与预定值进行比较,等等)。附加指令还可以包含覆写指令,当执行该指令时,触发覆写动作。只有当中断条件得到满足时,才可以触发覆写动作。因此,评估指令可紧接在覆写指令之前,或者,可替代地或另外地,覆写指令可包含评估指令。
21.覆写动作的触发导致随后的每个块中的指令被nop指令覆写。覆写动作可以使用直接存储器访问(dma)引擎进行,该引擎在执行引擎初始化dma引擎后立即将nop指令传输到后续块中。被覆写的指令段是由触发覆写动作的特定覆写指令的位置决定的。作为一个示例,编译器可以在一个块的末端添加额外的指令,而触发覆写动作可以导致每个后续块的指令被覆写。作为另一个示例,编译器可以在块的开始添加附加指令,并且触发覆写动作可以导致当前块和每个后续块的指令被覆写。
22.在各种实施方式中,集成电路可以包含加速引擎,以利用自我修正代码来减少集成电路需要执行的计算的数量,以便执行神经网络被训练的任务。集成电路可以包含处理引擎阵列,用于执行并行、级联计算。集成电路可以进一步包含存储器库,放置在处理引擎阵列的本地(例如,在同一个管芯上),用于快速、临时存储神经网络的权重值和指令,并存储中间结果。该集成电路可以进一步包含用于在存储器库之间执行传输的dma通道。
23.在下面的描述中,将描述各种实施方式。出于解释的目的,提出了具体的配置和细节,以提供对实施例的彻底理解。然而,对于本领域的技术人员来说,显而易见的是,实施例可以在没有具体细节的情况下进行实践。此外,众所周知的特征可以被省略或简化以免混淆所描述的实施例。
24.图1图示了神经网络的计算流模型100的示例。神经网络从人脑的运行机制中获得灵感。根据大脑的各种模型,大脑的主要计算元素是神经元。神经元与一些元素连接在一起,进入神经元的元素被称为树突,离开神经元的元素被称为轴突。神经元通过树突接受信号,对信号进行计算,并在轴突上输出信号。输入信号和输出信号被称为激活。一个神经元的轴突可以分支并与多个神经元的树突相连。轴突的分支和树突之间的连接被称为突触。
25.突触可以对穿过突触的信号进行缩放。缩放因子被称为权重,并被认为是大脑能够学习以下的方式:产生于对输入的不同响应的不同权重。学习可以改变权重,但神经元和突触的组织不需要改变来获得学习。因此,大脑的静态结构可以被用作程序的模型,而权重可以反映程序已经学会执行的任务。
26.神经网络的运作理念是,神经元的计算涉及输入值的加权和。这些加权和对应于由突触执行的值缩放和神经元中的这些值的组合。在神经元中对合并的输入进行函数运算。在大脑模型中,该运算似乎是非线性函数,只有当输入跨越某一阈值时,才会导致神经元产生输出。因此,通过类比,神经网络的节点可以对输入到节点的值的加权和应用非线性函数。
27.在图示的示例中,模型100包含输入层104,通常被称为隐藏层106的中间层,以及输出层108。每个层包含一定数量的节点102。在此示例中,输入层104的节点102与隐藏层106的每个节点102连接。在大脑模型中被称为突触的这些连接被称为权重110。同样在此示例中,隐藏层106的每个节点102与输出层的每个节点102具有连接或权重110。输入层104可以接收输入并可以将输入传播到隐藏层106。神经网络的实现可以包含多个隐藏层。由隐藏层106(或多个隐藏层)计算的加权和被传播到输出层108,该层可以向用户呈现最终输出。节点102的输出可以被称为激活,以符合大脑模型。
28.可以在示例模型100中的每层发生的计算示例如下:
[0029][0030]
在上述方程中,w
ij
是权重,xi是输入激活,yj是输出激活,f()是非线性函数,且b是偏置项。可以使用各种非线性函数来实现不同的目的。
[0031]
模型100可以被称为有向、加权图。在有向图中,通往或来自节点的每个连接表示方向(例如,进入该节点或远离该节点)。在加权图中,每个连接可以具有权重。开发神经网络的工具可以将神经网络可视化为有向、加权图,以便于理解和调试。在某些情况下,这些工具也可以用来训练神经网络并输出训练后的权重值。然后,执行神经网络就是使用权重对输入数据进行计算的问题。
[0032]
具有许多层的神经网络能够学习比浅层网络具有更多复杂性和抽象性的高层次的特征。作为示例,可以示教神经网络来识别图像。在此示例中,图像的像素可以被送入神经网络的输入层,第一层的输出可以表明图像中存在的低层次特征,诸如线条和边缘。在随
后的层中,这些特征可以被组合起来,以衡量可能存在的更高层次的特征:线条可以被组合成形状,而形状又可以进一步被组合成成组的形状。鉴于所有这些信息,神经网络可以输出高层次的特征代表特定物体或场景的概率。例如,神经网络可以输出一张图像是否含有猫或不含有猫。
[0033]
神经网络的学习阶段被称为训练神经网络。在训练期间,神经网络被教导执行任务。在学习任务的过程中,确定权重的值(可能还有偏置)。神经网络的底层程序(例如,将节点组织成层,每个层的节点之间的连接,以及每个节点执行的计算)在训练期间不需要改变。一旦训练完成,神经网络可以通过使用训练期间确定的权重值计算结果来执行任务。例如,神经网络可以输出图像含有特定物体的概率,可以输出音频序列含有特定单词的概率,可以在图像中的物体周围生成边界框,或者可以提出应该采取的行动,等等。运行神经网络的程序被称为推理。
[0034]
有多种方法可以训练权重。一种方法被称为监督学习。在监督学习中,所有的训练样本都被标记了,因此将每个训练样本输入到神经网络中会产生已知的结果。另一种方法叫做无监督学习,训练样本没有被标记,训练的目的是找到数据结构或数据聚类。半监督学习介于监督学习和无监督学习之间。在半监督学习中,训练数据的子集被标记。未标记的数据可以用来定义聚类边界,标记的数据可以用来标记聚类。
[0035]
神经网络已被用于各种应用,包含例如在图像和视频、语音和语言、医学、游戏和机器人领域。在图像和视频中,神经网络已被用于图像分类、物体定位和检测、图像分割和动作识别。在语音和语言方面,神经网络已被用于语音识别、机器翻译、自然语言处理和音频生成。在医学领域,神经网络已被用于基因组学和医学成像。在游戏方面,神经网络已被用于玩电子游戏和棋类游戏,包含诸如围棋这样有大量可能走法的游戏。在机器人领域,神经网络已被用于机器人的运动规划、视觉导航、控制稳定和自动驾驶汽车的驾驶策略。
[0036]
不同种类的神经网络已经被开发出来。神经网络的各种示例可分为两种形式:前馈和递归。图2图示了神经网络的计算流模型200的示例,该神经网络包含输入层204和隐藏层206之间的前馈权重212,以及输出层208的递归权重214。在前馈神经网络中,计算是对前一层输出的一连串操作,最后一层产生神经网络的输出。在图2所示的示例中,前馈由隐藏层206图示,其节点202只操作输入层204中的节点202的输出。前馈神经网络没有记忆,对于给定的输入的输出可以总是相同的,而不考虑以前给神经网络的任何输入。多层感知器(mlp)是只有前馈权重的神经网络的一种类型。
[0037]
相反,递归神经网络具有内部存储器,可以允许依赖性影响输出。在递归神经网络中,一些中间操作可以产生内部存储的值,并可与后期输入的处理相结合作为其他操作的输入。在图2的示例中,递归是由输出层208图示的,其中输出层208的节点202的输出被连接回输出层208的节点202的输入。这些回环连接可以被称为递归权重214。长短期记忆(lstm)是经常使用的递归神经网络变体。
[0038]
图3图示了二维卷积的示例,该示例可在图像识别期间执行。在此示例中,滤波器平面304是排列在具有高度r和宽度s的矩阵中的一组权重。可以选择滤波器平面304中的值以过滤特定的特征,诸如线、边缘、曲线、角、斑点、脊等等。滤波器平面304也可以被称为内核或特征检测器。
[0039]
滤波器平面304被应用于代表卷积输入的值的二维矩阵。该二维矩阵被称为输入
特征地图306。输入特征地图306可以包含输入的组成部分的值。例如,当输入是彩色图像时,输入特征地图306可以包含图像中每个像素的一种颜色(诸如红色)的颜色值,这些值表示颜色的强度。在此示例中,额外的特征地图可以包含像素的其他颜色值,一个为蓝色,一个为绿色。在此示例中,每个输入特征地图被当作单独的通道。在黑白图像中,每个像素值可以用表示白色和黑色之间强度的单一值来表示。因此,在一些示例中,黑白图像可以使用单个通道来表示。
[0040]
卷积操作涉及通过将每个滤波器平面304乘以相应的特征地图值并将结果相加来计算滤波器平面304在输入特征地图306上的每个可能位置的值。例如,在第一位置316,用滤波器平面304中的每个值乘以第一位置316中的每个对应值,得到矩阵{(1,0,1),(0,1,0),(0,0,1)}。在此示例中,将矩阵中的数值相加得到数值4,它被放置在输出特征地图308中相应的第一位置318。来自输入特征地图306的数值区域可以被称为输入激活。乘法与求和的结果可以被称为输出激活。输出特征地图308代表了输入特征地图306的更高层次的抽象,并具有高度e和宽度f。在各种示例中,额外的滤波器可以应用于相同的输入特征地图306,以产生额外的输出特征地图。
[0041]
图4是卷积神经网络400的示例配置。图4的示例图示了可包含在卷积神经网络中的操作,包含卷积、非线性的应用、池化或二级取样以及输出生成(例如,全连接层)。任何给定的卷积网络包含至少一个卷积层,并且可以有几十个卷积层。此外,每个卷积层后面不一定要有池化层。在一些示例中,池化层可以发生在多个卷积层之后,也可以根本不发生。图4所示的卷积网络示例将输入图像420分类为以下四个类别之一:狗、猫、船或鸟。在图示的示例中,在收到作为输入的船的图像时,该示例神经网络在输出预测414中输出“船”的最高概率(0.94)。
[0042]
为了产生图示的输出预测414,示例卷积神经网络执行第一卷积402,该卷积也可以包含非线性的应用;第一池化404操作;第二卷积406,该卷积也可以包含非线性的应用;第二池化408操作;然后使用第一全连接的410层和第二全连接的412层进行分类。第一卷积402的输出是一组一个或多个输出特征地图422,这些特征地图被作为输入提供给第一池化404操作。第一池化404操作产生一组特征地图424,作为输入提供给第二卷积406。第二卷积406也产生一组输出特征地图426,它可以在一个更抽象的层次上描述输入图像420。第二池化408步骤也产生特征地图428,其被输入到第一全连接410层。第一全连接410层累积特征地图428中的值,且结果被输入第二全连接412层。第二全连接412层的输出是输出预测414。图4是卷积神经网络的示例配置。其他示例可以包含额外的或更少的卷积操作、非线性操作、池化操作和/或全连接层。
[0043]
非线性可以在一些卷积操作之后添加。卷积是一种线性操作,而在一些示例中,假定被卷积神经网络学习的真实世界数据是非线性的。因此,非线性函数可以从元素方面应用到卷积的输出特征地图。一种这样的非线性函数是由线性整流单元(relu)提供的,其输出由output=max(0,input)给出。其他非线性函数可包含tanh和sigmoid。
[0044]
池化,也可以被称为二级取样或向下取样,可以降低特征地图的维度,同时保留最重要的信息。池化可以包含例如在特征地图的矩阵中取一个数值区域(例如,2x2的邻域,或另一个大小的邻域),并确定该区域内各数值的最大值。可替代地,可以使用平均、求和或其他函数作为池化函数。
[0045]
池化可用于逐步减少输入表示的空间大小。例如,池化可以使输入表示(例如,特征维度)更小,更容易管理。作为另一个示例,池化可以减少需要由神经网络执行的参数和计算的数量。作为另一个示例,池化可以使神经网络对输入图像中的小的变换、扭曲或平移保持不变。也就是说,输入中的小的扭曲不太可能改变池化的输出,因为最大(或平均,或求和,或其他一些操作)是在局部邻域中进行的。作为进一步的示例,池化可以帮助确定图像的几乎比例不变的表示(称为等变表示)。这意味着,无论物体在图像中位于何处,都可以在图像中检测到该物体。
[0046]
如图4的示例所示,卷积神经网络可以包含多个卷积层,每一层都对前一层提取的特征进行细化。每个卷积层都可以,但不需要,紧随其后的是池化。这些层的组合的输出代表了输入图像的高层次的特征,诸如某些形状、颜色、纹理、梯度等的存在。
[0047]
为了将这些特征地图转化为分类,卷积神经网络可以包含一个或多个全连接层。在全连接层之后,可以使用多层感知器,该感知器使用例如softmax激活函数或另一个逻辑函数。全连接层可以根据训练数据将输入图像分为各种类别。例如,图4的卷积神经网络被训练为识别狗、猫、船和鸟,并且可以将输入图像分类为包含这些类别之一。
[0048]
除了分类之外,卷积神经网络中的全连接层还可能提供一种不贵的(在计算和/或数据存储方面)方式来学习所提取特征的非线性组合。由卷积层和池化层提取的特征可能对进行分类有好处,但是特征的组合可能更好。
[0049]
在图4的示例中,输出预测414的总和为1,这是由于输出层使用softmax激活函数。softmax函数取任意实值分数的向量,并将这些值压缩为零和一之间的值的向量,其加起来为一。
[0050]
研究发现,神经网络的卷积步骤越多,该网络将能够学习识别更多的特征。例如,在图像分类的示例中,在第一层中,神经网络可以学习从原始像素中检测边缘,然后在第二层中使用边缘来检测形状,在第三层中,神经网络可能能够使用形状来确定在更高的层中的更高层次的特征,诸如面部形状。
[0051]
在卷积神经网络的训练中,诸如滤波器的数量、滤波器的大小和层的组织等参数保持不变。在训练期间,只有滤波器矩阵和连接权重的值被改变。一旦训练完成,神经网络包含在训练期间确定的权重和描述待在网络的每一层和/或节点执行的计算的指令集。在一些示例中,权重的数量可以是500万到1亿的数量。在一些示例中,权重值可以用32位数字表示,在这种情况下,500万到1亿个权重可能需要大约20兆字节(mb)到400mb来存储。在一些示例中,权重的数量可以少至150万。
[0052]
神经网络的操作(例如,进行推理)涉及获取输入数据或输入激活,为层中的每个节点并行地执行乘积和累加操作,并提供输出激活。当硬件架构能够进行高度并行计算时,就可以实现神经网络的最佳性能,以准确性和/或响应时间来衡量。中央处理单元(cpu),也可以称为一般用途处理单元,可以有多个内核,(例如,2至64个或更多内核),并可以通过使用多个执行线程来增加并行性。然而,cpu内核往往被优化为顺序处理。例如,内核的计算引擎(例如,算术逻辑单元(alu))从存储器中获得操作数,并将结果写入存储器,使得顺序计算需要存储器操作。在此示例中,每个存储器操作都需要由cpu的控制逻辑进行管理。由于这个原因和其他原因,在为神经网络进行推理时,cpu往往响应时间缓慢。
[0053]
与cpu相比,图形处理单元(gpu)通过具有数千个小而有效的内核来实现并行性,
这些内核被专门配置为进行并行计算。因此,在执行神经网络时,gpu可以实现远比cpu更好的性能。然而,单独的gpu计算引擎本质上仍然可以主要是顺序性的,这样,需要存储器操作将一个计算引擎的输出提供给另一个计算引擎的输入。
[0054]
在执行神经网络时,特殊用途的加速引擎可以实现比cpu和gpu都更好的性能。加速引擎可以采用空间架构,其中计算引擎形成处理链,并可以将数据直接从一个计算引擎传递到另一个计算引擎。这可以显著减少进行推理所需的存储器事务的数量。在一些示例中,加速引擎还可以包含芯片上缓冲区,它可以存储从处理器存储器中读取的值,并可以将值分配给加速引擎中的多个计算引擎。计算引擎可以进一步包含小型的本地寄存器文件(例如,小型的存储器)以用于存储中间结果。具有芯片上存储器的层次结构可以通过减少存储器的延迟来提高神经网络的运行效率。
[0055]
图5图示了神经网络500的组织的简化示例。本示例的神经网络500包含输入层504、隐藏层506和输出层508,其产生结果510。层506可以包含可重复操作集,这些操作被执行n次。在第一次迭代期间,来自前一层(例如,输入层504)的输出数据可以作为层506的输入数据。在随后的迭代中,来自前一次迭代的输出数据可以被用作层506的输入数据。在最后一次迭代后,输出数据被送入后续层(例如,输出层508)。层506可以包含中断条件,当满足该条件时,使层506停止重复,并且当前层的输出数据被送入后续层。神经网络500的层可以是全连接层、稀疏连接层,和/或可以包含递归权重。
[0056]
图6图示了神经网络600的组织的简化示例。神经网络600可以与神经网络500类似。例如,神经网络600可以是神经网络500的展开版本,图示了层506的每个迭代。本示例的神经网络600包含输入层604、展开的隐藏层606和输出层608,其产生结果610。隐藏层606可以包含第一层606-1、第二层606-2、第三层606-3,直到第n层606-n。第606-2层接收第606-1层的输出作为输入,第606-3层接收第606-2层的输出作为输入,等等。每个层606可以包含相同的操作集,诸如卷积操作、非线性和/或池化。可替代地或另外地,各层可以是全连接式、稀疏连接式,和/或可以含递归权重。
[0057]
示例神经网络600还包含层606-1和层606-2之间的中间操作,该中间操作可以被分组为本文所称的条件层626。在各种实施方式中,条件层626可以包含用于从层606-1的输出或从与层606-1相关的变量计算中间结果的函数622。条件层626的执行可以进一步包含针对中断条件628测试624由函数622计算的结果。当测试624确定结果不满足中断条件628时,不触发覆写动作630,神经网络的执行从层606-2开始,并继续到输出层608。当测试624确定中断条件628被满足时,在此示例中,触发覆写动作630,使层606-2到606-n被修改,如本文所述。
[0058]
在条件层626中使用的函数622可以包含逻辑函数,诸如softmax。softmax函数将任意值的向量中的值结合到加起来为1的(0,1)范围内的值的向量。softmax函数的输出可用于表示分类分布。第606-1层的部分或全部输出可以输入softmax以产生结果。在各种示例中,可以使用其他逻辑函数。
[0059]
中断条件628可以描述在什么情况下函数622的结果满足中断条件。例如,中断条件628可以包含测试值,对照该测试值测试结果。此外,在一些实施方式中,条件628可以包含将在测试624步骤中应用的测试。例如,测试可以是将结果与测试值进行比较,当结果大于(或小于,或等于,或不等于,或其他一些比较)测试值时,则满足中断条件。例如,中断条
件628可以提供90%的测试值,并且指示,当结果指示大于90%的概率时,那么中断条件628被满足。
[0060]
在一些示例中,函数622输出一组值。例如,softmax可以输出向量。在这些示例中,中断条件628可以是,来自数值集的一个或多个数值应该满足一个条件。例如,可以对集合中的五个最大的值(或两个最大的,或七个最大的,或其他数量的最大的值)进行求和,并且测试624可以确定该和是否满足条件。例如,测试624可以确定总和是否大于阈值。在这些和其他示例中,与仅针对该条件测试集合中的最大值时相比,该条件可以不那么严格。
[0061]
在一些实施方式中,测试值和/或被应用的测试可以与神经网络的定义分开指定。例如,加速引擎可以包含可以存储测试值、测试和/或测试值和/或测试适应用于哪个条件层626的寄存器或一组寄存器。在一些示例中,加速引擎可以包含对每个条件层626的测试值和/或测试,或对所有条件层的测试值和/或测试。在一些示例中,加速引擎可以包含针对神经网络被训练执行的每个任务的单独的测试值和/或测试。
[0062]
图7图示了神经网络700的组织的简化示例。神经网络700可以类似于神经网络500和600。神经网络700包含输入层704、隐藏层706和输出层708,其产生结果710。层706可以包含第一层706-1、第二层706-2、第三层706-3,直到第n层706-n。图7的示例神经网络700包含定位在每个层706之间的多个条件层726和多个覆写动作730。例如,第一条件层726-1可以定位在层706-1和706-2之间并可以触发第一覆写动作730-1,第二条件层726-2可以定位在层706-2和706-3之间并可以触发第二覆写动作730-2,等等。在一些示例中,条件层726可以被并入层706中。例如,条件层726-1可以并入层706-1,并且条件层726-2可以并入层706-2,等等。
[0063]
图8图示了示例性神经网络800和对应于神经网络800的不同层806的相关指令。神经网络800可以类似于神经网络500、600和700。层806可以包含第一层806-1、第二层806-2、第三层806-3,直到第n层806-n。当神经网络800被编译成指令时,编译器可以为层806生成n个指令块。每个指令块可以包含对应于可重复操作集的指令832,并且附加指令834可以对应于参照图6和图7描述的条件层626和726。在一些示例中,附加指令834含有评估指令和覆写指令。对于每个指令块,编译器可以在指令832之前、之后或中间添加/插入附加指令834。在图示的实施例中,附加指令834被添加在每个块的指令832之后,除了不含有任何附加指令834的最后一个块。
[0064]
在一个示例中,在运行时间期间,执行引擎可以执行指令832-1以对输入数据执行操作集。然后,执行引擎可以执行附加指令834-1的评估指令,使得执行引擎确定是否满足中断条件。如果确定满足了中断条件,则触发覆写动作730-1,使指令832-2至832-n被nop指令覆写。在一些示例中,后续块的附加指令834也可以用nop指令覆写。如果确定不满足中断条件,则不触发覆写动作730-1,执行引擎继续执行指令。
[0065]
继续上面的示例,假设没有触发覆写动作730-1,那么执行引擎可以执行指令832-2以对由指令832-1生成的层806-1的输出数据执行操作集。执行引擎可执行附加指令834-2的评估指令,使执行引擎确定是否满足中断条件。如果确定满足中断条件,则触发覆写动作730-2,使指令832-3至832-n被nop指令覆写。如果确定满足不中断条件,则不触发覆写动作730-2,执行引擎继续执行指令。
[0066]
继续上面的示例,假设没有触发覆写动作730-1和730-2,执行引擎然后可以执行
指令832-3以对由指令832-2产生的层806-2的输出数据执行操作集。执行引擎可执行附加指令834-3的评估指令,使执行引擎确定是否满足中断条件。如果确定满足中断条件,则触发覆写动作730-3,使指令832-4(未示出)至832-n被nop指令覆写。如果确定不满足中断条件,则不触发覆写动作730-3,执行引擎继续执行指令。
[0067]
图9包含图示主机系统900的示例的框图,在该主机系统上可以运行编译器930。图示的主机系统900是计算设备的示例,并且包含处理器902、处理器存储器904、至少一个存储设备906、各种输入/输出(i/o)设备908和至少一个网络接口910。在图9的示例中,主机系统900还包含加速引擎912,它是一个集成电路设备,可以加速主机系统900执行的某些操作或计算。在各种示例中,主机系统900可以实现为数据中心的服务器、台式电脑、笔记本电脑、平板电脑或智能手机,以及其他示例。在一些示例中,下面讨论的在主机系统900中执行或包含的操作或部件可以在其他计算机设备中执行或包含在其他计算机设备中。例如,编译器930可以在主机系统900上执行,而加速引擎912位于不同的主机系统处。
[0068]
处理器902是可以以指令形式执行程序代码的集成电路设备。该程序代码可用于各种软件应用或工具,诸如操作系统920。当处理器902执行程序时,该程序的指令可以存储在处理器存储器904中。指令也可以存储在其他地方,诸如存储设备906上,并可以在处理器902需要时加载到处理器存储器904中。处理器902也可以使用处理器存储器904来临时存储处理器902正在操作的其他数据。在各种示例中,处理器存储器904是易失性存储器类型,诸如随机存取存储器类型,尽管非易失性存储器类型可以替代地或另外地用于处理器存储器904。
[0069]
存储设备906是可以包含非易失性存储器的设备的示例。例如,存储设备906可以是磁盘驱动器、固态驱动器或光学驱动器,以及其他示例。存储设备906可以进一步是非暂时性的,使得当存储设备906不通电时,存储在存储设备906上的程序代码和其他数据仍然存在。
[0070]
存储设备906是外围设备的示例,外围设备是可以耦合到主机系统900以向主机系统900添加功能的部件。外围设备的其他示例包含输入/输出设备908和网络接口910。输入/输出设备908可以包含用户输入和输出设备,诸如键盘、鼠标、触摸屏、麦克风、显示屏幕、扬声器、打印机和扫描仪等示例。网络接口910可以使用网络接口卡实现,其可以提供对一个或多个网络的访问。例如,网络接口910可以包含物理端口,用于连接网线和/或无线天线,以便与wi-fi和/或蜂窝网络进行通信。网络接口910也可以被描述为i/o设备。
[0071]
加速引擎912也是另一种类型的外围设备或i/o设备。加速引擎912是专门为了执行某些可由处理器902执行,但可由加速引擎912更快地执行某些操作而构建的设备。例如,加速引擎912可以是神经网络加速器,并因此能够比由处理器902执行计算时更有效地执行神经网络的大规模、并行计算。作为另一个示例,加速引擎912可以是图形处理单元(gpu),并且可以被优化以执行图形渲染所需的计算。可以由加速引擎912实现的设备的其他示例包含加密加速器、压缩和解压缩加速器、3-d加速器、正则表达式加速器、安全加速器等。
[0072]
在各种示例中,加速引擎912可以执行程序代码以执行某些操作。例如,当加速引擎912是神经网络加速器时,加速引擎912可以被编程为执行特定的神经网络,诸如执行图像识别的神经网络或执行机器翻译的神经网络。作为进一步的示例,为了支持神经网络的执行,加速引擎912可以被编程以执行诸如将用于神经网络的数据从处理器存储器904(例
如)复制到加速引擎912、将用于神经网络的输入数据从处理器存储器904复制到加速引擎912、和/或将结果从加速引擎912复制到处理器存储器904等其他示例的操作。
[0073]
为了生成用于加速引擎912的程序代码,在各种示例中,主机系统900可以执行编译器930。一般来说,编译器是将以人类可读语言编写的程序代码翻译成可由集成电路设备读取和处理的格式(例如,机器指令)的软件程序。在图9的示例中,加速引擎912是神经网络加速器,而编译器930是用于将神经网络描述编译成在加速引擎912上执行的指令。当加速引擎912实现不同类型的加速器时,可以使用另一个编译器。
[0074]
例如,当操作系统920从输入/输出设备908接收键盘、鼠标、触摸屏、语音命令或其他输入时,编译器930可以被激活。这些输入可以进一步包含用于编译器930的参数,诸如用于编译的输入代码942和配置编译过程的选项。一旦编译器930被激活,处理器902可以将编译器930的指令加载到处理器存储器904中,并且可以执行该指令。
[0075]
在图9的示例中,编译器930包含第一级932、第二级936和第三级940,它们各自执行不同的操作以产生编译的代码944。在其他示例中,编译器930可以将第一级932、第二级936和/或第三级940的操作组合成更少的阶段,或者可以将其中一个阶段的操作分成多个阶段。
[0076]
第一级932可以接收和处理输入代码942。输入代码942可以描述高级编程语言的程序,诸如java、c 或tensorflow,以及许多其他示例。输入代码942可以描述,例如,执行图像识别、语音识别、机器翻译或其他操作的步骤。输入代码942可以例如从存储设备906获得。另外,虽然这里没有说明,但输入代码942可以位于处理器存储器904中,或者可以使用网络接口910从网络位置获得。对输入代码942的处理可以包含将输入代码942中描述的操作分层,其中一个层的输出为下一个层提供输入。处理还可以包含确定由处理器902,而不是由加速引擎912执行的步骤。例如,处理器902通过执行驱动器922,可能需要执行诸如配置用于将数据移入或移出加速引擎912的dma描述符的步骤,以及其他示例。
[0077]
第一级932的输出934可以被组织,例如,在神经网络的层、节点以及节点之间的连接中。第二级936可以对该输出934执行中间处理。例如,在任何一个层中,或在层中的任何一个节点上执行的操作可能太多,加速引擎912不能同时执行。例如,加速引擎912可能对计算所需的数据具有有限的本地存储空间,或者计算可能超过加速引擎912一次可以执行的数量。在此示例中,第一级932可以将层或节点的操作分解为较小的操作,这些操作可以适合加速引擎的本地存储器和/或可以适合加速引擎912的计算能力。第一级932的输出934的处理可以包含其他步骤,诸如调度,或确定加速引擎912和/或处理器902将执行操作的顺序,以及其他示例。
[0078]
在各种示例中,第二级936的输出938包含以步骤要被执行的顺序的要由加速引擎912的部件执行的各种步骤。输出938可以例如表示为数据流图,其中图中的节点代表存储器操作、计算和其他操作,而节点之间的边或连接代表节点之间的依赖关系,诸如数据依赖关系、存储器依赖关系或操作依赖关系,以及其他示例。
[0079]
第三级940可以对第二级936的输出938进行操作,并在产生将由加速引擎912执行的指令之前执行各种步骤。这些步骤可以包含,例如,去除冗余的依赖关系,通过在代码中插入同步指令来解决或处理节点之间的依赖关系,识别存储器使用或存储器带宽使用中可能的优化,以及其他操作。
[0080]
第三级940的输出是编译的代码944,其可以包含二进制格式的机器指令。在一些示例中,编译代码944可以被存储在处理器存储器904中。可替代地或另外地,编译代码944可以被复制到存储设备906或网络位置。如上所述,加速引擎912可以位于不同的主机系统处,在这种情况下,编译的代码944可以通过网络接口910发送到其他主机系统。
[0081]
在图9的示例中,主机系统900可以执行管理加速引擎912的驱动器922,该驱动器也可以被称为设备驱动器或运行时驱动器。驱动程序922可以提供在主机系统900(或另一主机系统)上执行的应用程序与加速引擎912之间的接口。例如,驱动程序922可以提供应用程序接口(api),该接口定义了用于将输入数据送入加速引擎912的功能,并定义了对输入数据执行的操作。在这个和其他示例中,驱动器922可以配置加速引擎912以执行该操作。例如,驱动器922可以确定加速引擎912要执行的神经网络,以及处理器存储器904中或存储设备906上用于神经网络的编译代码944所在的位置。驱动器922可以进一步加载到加速引擎912中或使加速引擎912加载编译代码944,可以加载或使加速引擎912加载神经网络要操作的输入数据,和/或可以使加速引擎912开始在输入数据上执行。一旦加速引擎912完成,加速引擎912可以通知驱动器922,并且驱动器922可以将结果送回请求该结果的应用程序。
[0082]
图10示出了加速引擎的加速器1002的示例。在各种实施方式中,对于一组输入数据,加速器1002可以执行神经网络以执行神经网络所训练的任务(例如,进行推理),包含执行条件层。在各种实施方式中,示例加速器1002是加速引擎的集成电路部件。加速器可以有其他集成电路部件,包含另外的加速引擎。在各种实施方式中,加速器1002可以包含存储器子系统1004和处理引擎阵列1010。当在操作中(例如,当为一组输入数据1050计算结果时),处理引擎阵列1010可以从存储器子系统1004读取权重1006和状态1008的值。处理引擎阵列1010可以将计算结果输出到结果缓冲区1012。在一些情况下,在结果被写入存储器子系统1004之前,示例加速器1002可以在来自处理引擎阵列1010的结果上执行激活函数(使用激活1016块)和/或池化(使用池化1018块)。
[0083]
在此示例中,权重1006是神经网络的权重值。在各种实施方式中,权重1006是训练后的权重,意味着权重1006的值是先前确定的。在此示例中,状态1008可以包含计算开始时的输入数据1050,以及反映正在进行的计算的中间值。例如,状态1008可以包含由处理引擎阵列1010确定的部分和。状态1008还可以包含用于处理引擎阵列1010的指令,其中该指令可以与特定层相关联。例如,该指令可以指示处理引擎阵列1010,以及可能还有激活1016和/或池化1018块,以执行某种计算。权重1006和状态1008可以从存储器子系统1004读取,以便由处理引擎阵列1010操作。在一些实例中,存储器子系统还可以包含用于指令的单独的存储器或缓冲区。
[0084]
在各种实施方式中,存储器子系统1004可以包含多个存储器库1014。在这些实施方式中,每个存储器库1014可以是独立访问的,这意味着一个存储器库的读取不依赖于另一个存储器库的读取。同样,对一个存储器库的写入不会影响或限制对不同的存储器库的写入。在某些情况下,每个存储器库可以同时被读取和写入。可以使用各种技术来拥有独立访问的存储器库1014。例如,每个存储器库可以有至少一个读取通道,并且可以有至少一个独立的写入通道,可以同时使用。在这些示例中,存储器子系统1004可以允许同时访问多个存储器库的读取通道或写入通道。作为另一个示例,存储器子系统1004可以包含仲裁逻辑,使得在例如多个存储器库1014的输出之间的仲裁可以导致超过一个存储器库的输出被使
用。在这些和其他示例中,虽然由存储器子系统1004全局管理,但每个存储器库可以独立于任何其他存储器库操作。
[0085]
使存储器库1014被独立地访问可以提高加速器1002的效率。例如,权重1006和状态1008可以同时被读取并提供给处理引擎阵列1010的每一行,从而整个处理引擎阵列1010可以在一个时钟周期内被使用。作为另一个示例,权重1006和状态1008可以在中间结果被写入存储器子系统1004的同时被读取。相比之下,单个存储器虽然仍然能够比片外存储器更快地向处理引擎阵列1010提供权重1006和状态1008,但可能一次只能服务于一次读取或写入。对于单个存储器,例如,在可以启动处理引擎阵列1010之前读取处理引擎阵列1010的每一行的权重可能需要多个时钟周期。
[0086]
在各种实施方式中,存储器子系统1004可以被配置为同时服务于多个客户,包含处理引擎阵列1010、激活1016块、池化1018块以及通过芯片互连1020访问存储器子系统1004的任何外部客户。在一些实施方式中,能够为多个客户提供服务可以意味着存储器子系统1004具有至少与客户数量相同的存储器库。在某些情况下,处理引擎阵列1010的每一行可以算作单独的读取客户端。在这些情况下,权重1006和状态1008可以单独存储,因此需要两次读取,或者可以串联并存储在一起,因此需要一次读取。在某些情况下,处理引擎阵列1010的每一列可以输出中间值,这样,每一列可以算作单独的写入客户端。在某些情况下,来自处理引擎阵列1010的输出可以被写入存储器库1014中,然后可以随后为处理引擎阵列1010提供输入数据。存储器库1014可以被实现,例如,使用静态随机存取存储器(sram)。
[0087]
在各种实施方式中,存储器子系统1004可以包含控制逻辑。控制逻辑可以,例如,跟踪每个存储器库1014的地址空间,确定从存储器库1014读取或写入的存储器库1014,和/或如果需要,在存储器库1014之间移动数据。在一些实施方式中,存储器子系统1004可以包含多路复用器,以用于选择哪个存储器库输出到特定的客户端和/或接收来自特定客户端的输入。在这些实施方式中,控制逻辑可以为多路复用器产生选择信号,这可以使一些或所有的存储器库1014为每个客户提供服务。在一些实施方式中,存储器库1014可以被硬连接到特定的客户端。例如,一组存储器库1014可以被硬连接以向处理引擎阵列1010的行提供权重1006和状态1008。在这些示例中,控制逻辑可以在存储器库1014之间移动数据,例如,将中间结果从写入中间结果的存储器库1014移动到将为下一轮计算读取中间结果的存储器库1014。
[0088]
处理引擎阵列1010是加速器1002的计算矩阵。处理引擎阵列1010可以例如执行并行积分、卷积、相关和/或矩阵乘法,以及其他事项。处理引擎阵列1010包含多个处理引擎1011,按行和列排列,使得处理引擎1011输出的结果可以直接输入另一个处理引擎1011。因此,不在处理引擎阵列1010的外部边缘上的处理引擎1011可以从其他处理引擎1011,而不是从存储器子系统1004接收数据以进行操作。
[0089]
在各种示例中,处理引擎阵列1010使用收缩执行,其中数据以固定的时间间隔从不同方向到达每个处理引擎1011。在一些示例中,输入数据可以从左边流入处理引擎阵列1010,并且权重值可以在顶部加载。在一些示例中,权重和输入数据可以从左边流过,而部分和可以从上到下流动。在这些和其他示例中,乘积和累加操作作为对角线波阵面在处理引擎阵列1010中移动,数据在阵列中向右和向下移动。控制信号可以在左边与权重1006同
时输入,并且可以与计算一起流过和流下。
[0090]
在各种实施方式中,处理引擎阵列1010中的列的数量决定了处理引擎阵列1010的计算能力,而行的数量决定了实现处理引擎阵列1010的最大利用率所需的存储器带宽。处理引擎阵列1010可以具有,例如,64列和256行,或其他数量的列和行。
[0091]
图10中图示了处理引擎1011的示例。如该示例所图示的,处理引擎1011可以包含乘法器-累加器电路。来自左边的输入可以包含,例如,输入数据i和权重值w,其中,输入数据是取自一组输入数据或一组中间结果的值,而权重值是来自连接神经网络的一个层到下一个层的一组权重值。一组输入数据可以是,例如,被提交用于识别或物体识别的图像、被提供用于语音识别的音频片段、用于自然语言处理或机器翻译的一串文本,或需要分析以确定下一步的游戏的当前状态,等等。在一些示例中,输入数据和权重值被输出到右边,以用于输入到下一个处理引擎1011。
[0092]
在图示的示例中,来自上方的输入可以包含从另一个处理引擎1011或从由处理引擎阵列1010进行的前一轮计算提供的部分和,p_in。当开始对一组新的输入数据进行计算时,处理引擎阵列1010的顶行可以接收p_in的固定值,诸如零。如该示例所示,i和w相乘,结果与p_in相加,产生新的部分和,p_out,它可以被输入到另一个处理引擎1011。处理引擎1011的各种其他实施方式是可能的。
[0093]
来自处理引擎阵列1010中最后一行的输出可以暂时存储在结果缓冲区1012中。该结果可以是中间结果,其可以被写入存储器库1014以提供给处理引擎阵列1010进行额外的计算。可替代地,该结果可以是最终结果,一旦写入存储器库1014,就可以通过芯片互连1020从存储器子系统1004读取以由系统输出。
[0094]
在一些实施方式中,加速器1002包含激活1016块。在这些实施方式中,激活1016块可以将来自处理引擎阵列1010的结果结合到一个或多个输出激活中。例如,对于卷积神经网络,来自多个通道的卷积可以被相加以产生单个通道的输出激活。在其他示例中,可能需要将来自处理引擎阵列1010中的一个或多个列的结果累加以产生神经网络中单个节点的输出激活。在一些示例中,激活1016块可以被绕过。
[0095]
在一些实施方式中,加速器1002可以包含池化1018块。池化是结合来自神经网络的层的节点聚类的输出。组合的输出可以被提供给下一层。合并可以包含例如计算最大值、最小值、平均值、中值或从节点群的输出中确定的一些其他值。在各种示例中,可以根据任何特定神经网络的需要,选择性地激活池化1018。
[0096]
在各种实施方式中,提供给处理引擎阵列1010的指令可以包含用于执行条件层的指令,包含配置处理引擎阵列1010以从被执行的最近的层的输出计算结果,并针对条件测试该结果。例如,包含在从存储器子系统1004读取的状态1008中的指令可以配置处理引擎阵列1010以读取前一层的输出,并从这些输出计算出结果。在此示例中,前面的层是隐藏层或除输出层以外的任何其他层。同样在此示例中,处理引擎阵列1010可以使用特定的逻辑函数来计算结果,该函数可以由指令来确定。作为进一步的示例,相同的指令或不同的指令可以包含与之比较结果的条件。在此示例中,指令可以配置处理引擎阵列1010来测试结果,以确定结果是否符合条件。例如,该条件可以要求对照测试值测试结果,其中测试是为了查看结果是否大于、小于、等于和/或不等于测试值,或进行另一种类型的比较。在一些示例中,处理引擎阵列1010可以在同一时间计算结果并测试条件。在一些示例中,处理引擎阵列
1010可以直接从正在由处理引擎阵列1010计算的中间结果中计算出结果。在一些示例中,处理引擎阵列1010可以计算结果,然后将结果存储在存储器子系统1004中,然后读取结果以测试条件。在这些和其他示例中,一旦处理引擎阵列1010针对条件测试了结果,处理引擎阵列1010就可以将测试的结果写入存储器子系统1004,或写入加速器1002中的寄存器,或写入加速器1002外的存储位置。
[0097]
在一些示例中,池化1018块可用于协助执行条件层。例如,当前一层的输出由处理引擎阵列1010计算时,池化1018块可以被配置为从输出计算出结果。在此示例中,输出和结果都可以被写入存储器子系统1004。同样在此示例中,由池化1018输出的结果可以被输入到处理引擎阵列1010,以便处理引擎阵列1010针对条件测试该结果。
[0098]
在一些示例中,激活1016块可以被配置为针对条件测试结果。例如,激活1016块可以被配置为,当结果从处理引擎阵列1010输出时,激活1016块可以针对条件测试结果。在此示例中,激活1016块可以将测试的结果写入到存储器子系统1004或写入到寄存器。
[0099]
在一些示例中,当条件需要操作多个值时,池化1018块可以被使用。例如,结果可以包含一组值,诸如可以包含在由softmax计算的向量中。在此示例中,池化1018块中的级联子块可以将集合中的值相互比较,以确定最大的两个、五个、七个或一些其他数量的值。级联中的最后一个块可以计算出最大值的总和,然后将该总和与测试值进行比较。在此示例中,比较的结果决定了是否满足条件。
[0100]
在上面讨论的各种示例中,条件层的执行以写入存储器子系统1004或寄存器的值而完成,该值表明测试条件的结果。可替代地或另外地,加速器1002可以将该值写入加速器1002之外的存储位置,诸如在处理器存储器中。在这些和其他示例中,加速器1002可以等待进一步的指令。例如,加速器1002可以等待输入数据1050和继续处理的指令。在此示例中,输入数据1050可以是加速器1002要执行的下一层的一组权重。可替代地或另外地,输入数据1050可以包含加速器1002开始新推理的指令,并且输入数据1050可以包含要操作的数据。
[0101]
在一些示例中,除了写入指示条件结果的值外,或代替写入指示条件结果的值,加速器1002可以确定要采取的下一步行动。例如,条件指令可以包含当条件满足时要执行的下一层的指示器、存储器地址或其他标识符。在此示例中,条件指令也可以包含当条件不满足时要执行的层的标识符,否则就表明应该执行下一个顺序层。在此示例中,加速器1002可以开始执行由条件指令确定的层。例如,确定的层的权重可能已经存在于存储器子系统1004中。可替代地,加速器1002可以能够请求将适当的权重加载到存储器子系统1004中。
[0102]
在一些示例中,加速器1002可以被指示停止正在进行的计算,并重置到开始状态。例如,当条件被满足并且加速器1002被指示不继续进行当前推理时,这可能会发生。为了终止正在进行的计算,加速器1002可以例如冲刷处理引擎阵列1010中的所有值并丢弃输出值。作为进一步的示例,加速器1002可以从存储器子系统1004中删除数值和/或移动数值以准备开始一个新的推理。在一些示例中,加速器1002可以立即对等待处理的输入数据1050开始新的推理。
[0103]
输入数据1050可以通过芯片互连1020到达。芯片互连1020可以将加速器1002连接到加速引擎的其他部件,诸如可以从i/o设备、存储驱动器或网络接口获得输入数据1050的dma引擎。输入数据1050可以是例如一维数据(诸如字符串或数字序列)或二维数据(诸如图
像的像素值阵列)或音频信号的频率和振幅值随时间变化。在一些示例中,输入数据1050可以是三维的,例如,自动驾驶汽车所使用的情景信息可能就是这样。在一些实施方式中,存储器子系统1004可以包含用于输入数据1050的单独缓冲存储器。在一些实施方式中,输入数据1050可以与权重1006一起存储在存储器库1014中。
[0104]
在各种实施方式中,存储在存储器子系统1004中的权重1006可以是已经通过训练神经网络以执行一个或多个任务而确定。输入数据1050可以包含指示要执行的任务的指令(例如,图像处理、语音识别、机器翻译等)。在各种实施方式中,加速器1002被配置为进行推理(例如,执行任务),而不是用于神经网络的训练。在一些实施方式中,加速器1002可用于训练,尽管也许有来自软件的协助以更新存储的权重1006。
[0105]
在各种实施方式中,存储器子系统1004可以包含足够的存储器来存储中间结果和神经网络的所有权重值。存储器子系统1004应该在存储器子系统1004中至少具有足够的存储器来存储中间结果,但是在许多情况下,存储器子系统1004可以包含比仅仅存储中间结果所需的更多的存储器库1014。这个额外的空间可以用来存储神经网络的所有权重值。例如,神经网络可以有150万个权重,当每个权重由32位表示时,可以需要大约6mb的存储器。中间结果可能需要例如最多10mb的存储空间。20mb的芯片上存储器是合理的大小,在前面的示例中,可以很容易地容纳权重值、中间结果和加速器1002在运行期间可能需要的任何其他数据。
[0106]
图11图示了加速引擎1100的示例,该加速引擎具有多个加速器1102a-1102n。每个加速器1102a-1102n可以包含存储器子系统和处理引擎阵列,并且可以执行神经网络所需的计算以执行神经网络被编程的任务。在图示的示例中,加速引擎1100包含n个加速器1102a-1102n。
[0107]
示例加速引擎1100进一步包含用于与处理器存储器通信的dram控制器1142a-1142k(在此示例中使用dram1130实现)。在图示的示例中,加速引擎1100包含k个dram控制器1142a-1142k,其中每个控制器可以能够与一组独立的dram库通信。在其他示例中,其他类型的ram技术可用于处理器存储器。dram控制器1142a-1142k也可以被称为存储器控制器。
[0108]
示例加速引擎1100进一步包含输入/输出(i/o)控制器1144a-1144p,以用于与系统中的i/o设备1132通信。加速引擎1100可以通过例如处理器总线与i/o设备通信。在一些示例中,处理器总线可以使用外围组件互连(pci)和/或pci总线协议的变化来实现。处理器总线可以将加速引擎1100连接到i/o设备1132(诸如输入和输出设备、存储器控制器、存储设备和/或网络接口卡等等)。在此示例中,加速引擎1100包含p个i/o控制器1144a-1144p,其中每个控制器可以包含单独的根复合体,并且可以与一组单独的i/o设备1132通信。在其他示例中,其他标准化的总线协议(诸如超路径互连(upi))可用于主机总线。在其他示例中,可以使用专有的总线协议。
[0109]
示例加速引擎1100进一步包含dma引擎1146a-1146d,其可以在加速器1102a-1102n、dram控制器1142a-1142k和i/o控制器1144a-1144p之间移动数据。在图示的示例中,加速引擎1100包含d dma引擎1146a-1146d。在一些实施方式中,dma引擎1146a-1146d可以被分配到特定的任务,诸如从dram控制器1142a-1142k移动数据到加速器1102a-1102n,或在i/o控制器1144a-1144p和加速器1102a-1102n之间移动数据。在一些实施方式中,至少一
个dma引擎1146a-1146d可以专门用于每个加速器1102a-1102n。在一些实施方式中,dma引擎1146a-1146d可以被视为一个池,而不是被专用于一个功能或部件,使得每当需要移动数据时,可以使用可用的dma引擎1146a-1146d。
[0110]
在示例加速引擎1100中,各种部件可以通过芯片互连1120进行通信。芯片互连1120主要包含用于在加速引擎1100的部件之间路由数据的布线。在一些情况下,芯片互连1120可以包含最小量的逻辑,诸如控制数据方向的多路复用器、用于处理时钟域交叉的触发器和时序逻辑。
[0111]
在一些示例中,每个加速器1102a-1102n可以同时执行不同的神经网络。在一些示例中,两个或多个加速器1102a-1102n可以针对不同的输入执行相同的神经网络。在一些示例中,两个或多个加速器1102a-1102n可以执行同一神经网络的部分(例如,同一层或不同层的部分)。在一些示例中,两个或多个加速器1102a-1102n可以顺序地执行神经网络的层,使得输入可以通过加速引擎进行流水作业。
[0112]
图12图示了用于减少神经网络处理中的计算的方法1200的示例。该方法1200可由上述系统实施,诸如图9的主机系统、图10的加速器和/或图11的加速引擎。方法1200的一个或多个步骤可以以不同于图示示例中所示的顺序执行,并且方法1200的一个或多个步骤可以在执行方法1200期间被省略。
[0113]
在步骤1202,编译器从用于神经网络的源代码生成指令。该神经网络可以包含可重复操作集,该操作集可以基于条件执行多达多次迭代。迭代次数可以是在条件永远不满足的情况下可执行的可重复操作集的最大迭代次数(例如,“for”循环的长度)。由编译器生成的指令可以包含多个块,其中每个块含有用于单个迭代的可重复操作集的指令。因此,由编译器生成的块的数量可以等于最大迭代数。
[0114]
在步骤1204,编译器为多个块中的至少一个生成至少一条附加指令。在一些示例中,编译器可以为多个块中的每个块生成至少一条附加指令。该至少一条附加指令可以包含评估指令,当执行该评估指令时,确定条件是否满足。该至少一条附加指令还可以包含覆写指令,当执行该指令时,在条件得到满足时触发覆写动作。覆写动作使后续块的指令被nop指令覆写。在一些示例中,覆写动作使dma引擎用nop指令覆写后续块的指令。
[0115]
在步骤1206,编译器将至少一条附加指令添加到多个块中的至少一个。在一些示例中,编译器可以将至少一条附加指令添加到多个块中的每一个。编译器可以通过覆写现有指令、在现有指令之间插入和/或修改现有指令等方式添加至少一条附加指令。至少一条附加指令可以在一个块的末端、一个块的开头或一个块的中间添加。在至少一条附加指令被添加在块的末端的示例中,编译器在添加指令时可以跳过最后一个块。在至少一条附加指令被添加在块的开始的示例中,编译器在添加指令时可以跳过第一个块。在添加至少一条附加指令之后,块可以被转移到一个或多个执行引擎以进行运行时执行。
[0116]
在步骤1208,一个或多个执行引擎执行多个块的第一块的指令。执行第一块的指令可以使一个或多个执行引擎执行单个迭代的可重复操作集。
[0117]
在步骤1210,一个或多个执行引擎执行第一块的至少一条附加指令。响应于执行第一块的评估指令,一个或多个执行引擎可以确定条件被满足。响应于执行第一块的覆写指令,一个或多个执行引擎可以触发覆写动作,使多个块的后续块的指令被nop指令覆写。在一些示例中,覆写动作还使后续块的至少一个附加指令被nop指令覆写。
[0118]
在步骤1212,一个或多个执行引擎执行一个或多个后续块的nop指令。在一些实例中,执行nop指令不会导致存储在处理器存储器中的变量改变。在一些示例中,执行nop指令不会导致存储在处理器存储器中的计算数据值改变。
[0119]
因此,本说明书和附图应以说明性而非限制性的意义来看待。然而,显而易见的是,在不脱离权利要求书中所阐述的公开更广泛的精神和范围的情况下,可以对其进行各种修改和变化。
[0120]
其他变化也在本公开的精神内。因此,虽然所披露的技术容易受到各种修改和替代结构的影响,但其某些说明性的实施例在附图中示出,并已在上文详细描述。然而,应该理解的是,无意将本公开限制在所公开的具体形式或形式上,相反,其意图是涵盖如所附权利要求书中所定义的所有落入本公开的精神和范围内的修改、替代结构和等效物。
[0121]
在描述所公开的实施例的上下文中(特别是在以下权利要求的上下文中),除非本文另有说明或与上下文明显矛盾,否则术语“一”和“一个”和“所述”以及类似的指称的使用应被解释为涵盖单数和复数。除非另有说明,否则术语“包括”、“具有”、“包含”和“含有”应被理解为开放式术语(即意味着“包含但不限于”)。术语“连接”应被理解为部分或全部含在、附接在或连接在一起,即使有东西在中间。除非本文另有说明,否则本文对数值范围的引用仅旨在用作单独提及落入该范围内的每个单独值的速记方法,并且将每个单独值并入说明书中,正如其在本文中单独引用一样。除非本文另有说明或与上下文有明显矛盾,否则本文描述的所有方法可以按任何合适的顺序执行。除非另有要求,否则使用任何和所有的示例,或本文提供的示例性语言(诸如,“例如”),仅旨在更好地阐明本公开的实施例,并不构成对本公开范围的限制。说明书中的任何语言都不应被解释为表明任何非要求保护的元素对于本公开的实践必不可少。
[0122]
除非特别说明,否则诸如“x、y或z中的至少一个”这样的非连接性语言应在上下文中理解为一般地用于提出项目、术语等可以是x、y或z,或其任何组合(例如,x、y和/或z)。因此,这样的非连接性语言一般不旨在也不应该意指某些实施例要求x中的至少一个、y中的至少一个或z中的至少一个各自存在。
[0123]
本文描述了本公开的各种实施例,包含本发明人所知的实施本公开的最佳模式。通过阅读前述描述,这些实施例的变化对于本领域的普通技术人员来说将变得显而易见。发明人希望熟练工匠能酌情使用这些变体,而且发明人意图以本文具体描述的方式以外的方式实践本公开。因此,本公开包含适用法律所允许的对所附权利要求中所述主题的所有修改和等效物。此外,除非本文另有说明或与上下文明显矛盾,否则上述要素在其所有可能的变化中的任何组合都涵盖在本公开中。
[0124]
如下所用,对一系列示例的任何引用应理解为对这些示例中的每个示例的独立引用(例如,“示例1-4”应理解为“示例1、2、3、或4”)。
[0125]
示例1是一种用于减少神经网络处理中的计算的方法,该方法包括:由编译器从源代码生成指令,以基于while循环的中断条件执行可重复操作集多达多次迭代,其中该指令包含多个代码块,该多个代码块中的每一个对应于执行可重复操作集的迭代,其中该多个代码块包含对应于神经网络的第一层的第一代码块、对应于神经网络的第二层的第二代码块以及对应于神经网络的第三层的第三代码块;由编译器生成第一代码块、第二代码块和第三代码块的覆写指令,其中,当执行覆写指令时,在满足while循环的中断条件时,使多个
代码块中的后续代码块的指令被用无操作(nop)指令覆写;由编译器向第一代码块、第二代码块和第三代码块中的每个代码块添加覆写指令;由神经网络加速器执行第一代码块的指令;由神经网络加速器执行第一代码块的覆写指令;由神经网络加速器确定满足while循环的中断条件;响应于执行第一代码块的覆写指令和确定满足while循环的中断条件,用nop指令覆写第二代码块和第三代码块的指令;以及由神经网络加速器执行第二代码块和第三代码块的nop指令。
[0126]
示例2是示例1的方法,其中,覆写指令被添加在多个代码块中的每个代码块的末端。
[0127]
示例3是示例1至2中的任一项的方法,其中,将评估指令添加到多个代码块中的每个代码块,使得当执行该评估指令时,使确定是否满足while循环的中断条件,并且其中,在多个代码块中的每个代码块中,评估指令在覆写指令之前。
[0128]
示例4是示例1至3中任一项的方法,进一步包括:响应于执行第一代码块的覆写指令,由神经网络加速器用nop指令覆写第二代码块和第三代码块的评估指令。
[0129]
示例5是示例1至4中任一项的方法,进一步包括:由编译器识别源代码中的可重复操作集,其中,覆写指令是响应于识别可重复操作集而生成的。
[0130]
示例6是一种方法,包括:由用于神经网络的编译器从源代码生成多个指令块,其中,每个指令块包含每个块共有的指令集,并且其中,该指令集基于条件被执行多达多次迭代;为多个块中的指令块生成覆写指令,其中执行覆写指令触发覆写动作,该覆写动作使多个块中的后续块的指令被无操作(nop)指令覆写;以及将覆写指令添加到指令块。
[0131]
示例7是示例6的方法,其中,所述覆写动作使直接存储器访问(dma)引擎用nop指令覆写后续块的指令。
[0132]
示例8是示例6至7中任一项的方法,其中,覆写指令被添加在指令块的末端。
[0133]
示例9是示例6至8中的任一项的方法,其中,当条件得到满足时,执行覆写指令触发覆写动作。
[0134]
示例10是示例6至9中任一项的方法,其中,指令集对应于在神经网络的节点或层中执行的可重复操作集。
[0135]
示例11是示例6至10中任一项的方法,进一步包括:生成评估指令,该评估指令在被执行时确定是否满足条件;以及将该评估指令添加到指令块。
[0136]
示例12是示例6至11中任一项的方法,其中,覆写动作使评估指令被后续块中的nop指令覆写。
[0137]
示例13是示例6至12中任一项的方法,进一步包括:由编译器识别用于神经网络的源代码中的可重复操作集,其中,覆写指令是响应于识别可重复操作集而生成的。
[0138]
示例14是示例6至13中任一项的方法,其中,编译器将覆写指令添加到多个块中的每个块。
[0139]
示例15是一种用于神经网络处理的集成电路设备,该集成电路设备包括:存储器,其能够操作以存储由编译器从实现可重复操作集的源代码生成的多个指令块,其中,可重复操作集基于条件被执行多达多次迭代,其中,多个指令块中的每个指令块对应于可重复操作集的迭代,其中多个指令块包含第一指令块和第二指令块,并且其中第一指令块包含由编译器添加的覆写指令;以及一个或多个执行引擎,其被配置为执行包括以下的操作:执
行第一指令块;执行第一指令块的覆写指令;确定条件得到满足;响应于执行第一指令块的覆写指令和确定条件得到满足,触发覆写动作,该覆写动作使第二指令块被无操作(nop)指令覆写;以及执行第二指令块的nop指令。
[0140]
示例16是一种非暂时性计算机可读存储介质,其包括指令,当指令由处理器执行时,使处理器执行包括以下的操作:由用于神经网络的编译器从源代码生成多个指令块,其中每个指令块包含每个块共有的指令集,并且其中该指令集基于条件被执行多达多次迭代;为多个块中的指令块生成覆写指令,其中执行覆写指令触发覆写动作,覆写动作使多个块的后续块的指令被无操作(nop)指令覆写;以及将覆写指令添加到指令块。
[0141]
示例17是示例16的非暂时性计算机可读存储介质,其中,覆写动作使直接存储器访问(dma)引擎用nop指令覆写后续块的指令。
[0142]
示例18是示例16至17中任一项的非暂时性计算机可读存储介质,其中,每个指令块进一步包含由编译器添加的评估指令以确定是否满足条件。
[0143]
示例19是示例16至18中任一项的非暂时性计算机可读存储介质,其中,在每个指令块中,评估指令在覆写指令之前。
[0144]
示例20是示例16至19中任一项的非暂时性计算机可读存储介质,其中,覆写动作使后续块的评估指令被nop指令覆写。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献