用于神经网络实现的块浮点的制作方法
未命名
10-21
阅读:99
评论:0
用于神经网络实现的块浮点
1.本技术是2017年12月01日提交的申请号为201780076041.0、名称为“用于神经网络实现的块浮点”的发明专利申请的分案申请。
技术实现要素:
2.公开了用于块浮点(bfp)实现的方法、装置和计算机可读存储设备,包括在人工神经网络(nn)中使用这种bfp实现。存储尾数值阵列的矩阵和向量可以共用针对两个或更多个元素的共同指数。例如,行中、列中或整个阵列中的所有元素可以具有不同的尾数并共用共同指数。在一些示例中,矩阵或向量的两个或更多个元素的指定组合和子组合可以共用共同指数。在一些示例中,矩阵或向量的两个或更多个元素的任意组合可以共用共同指数。在一些示例中,使用共同指数允许减少存储器使用、简化乘法器和其他浮点矩阵处理电路的硬件实现、减少能量和/或改进计算性能而几乎不损失或不损失精度。通过利用bfp表示执行数学运算而产生的输出矩阵和向量然后可以使用经更新的(多个)共同指数并使其尾数相应地移位。公开了用于选择经更新的共同指数的合适方法和装置的示例。
3.在所公开的技术的一些示例中,神经网络包括多个节点,这些节点具有相关联的值并且适于使用具有各自的尾数和一个或多个共用共同指数的bfp表示的运算来更新相关联的节点值的至少一部分。用于这种神经网络bfp实现的合适应用的示例包括但不限于:执行图像识别、执行语音识别、分类图像、将语音转换成文本和/或其他语言、面部或其他生物识别、自然语言处理、自动语言翻译、搜索引擎中的查询处理、自动内容选择、分析电子邮件和其他电子文档、关系管理、生物医学信息学、标识候选生物分子、提供推荐或其他分类任务。在所公开的技术的一些示例中,系统包括用于实现bfp神经网络的硬件。硬件可以包括但不限于通用处理器(包括实现向量指令集的处理器)、定制集成电路、专用集成电路(asic)、包括现场可编程门阵列(fpga)的可编程逻辑器件、图形处理单元(gpu)、神经网络处理器和/或数字信号处理组件。
4.提供本发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步描述。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。此外,本文所使用的任何商标均为其各自所有者的产权。从通过参考附图进行的以下详细描述中,所公开的实施例的前述和其他目的、特征和优点将变得更加明显。
附图说明
5.图1是概述可以在所公开的技术的某些示例中执行的用于矩阵
×
向量乘法的块浮点实现的示例数据流的框图。
6.图2是概述可以在所公开的技术的某些示例中实现的包括多个神经网络核的示例多处理器的框图。
7.图3a和图3b是概述可以在所公开的技术的某些示例中执行的在脉动阵列矩阵乘法运算期间执行的运算的图。
8.图4是描绘根据所公开的技术的某些示例的用于执行矩阵乘法的硬件的框图。
9.图5是概述可以在所公开的技术的某些示例中使用的示例数字信号处理块的框图。
10.图6是概述可以在所公开的技术的某些示例中使用的用于图像处理的深度神经网络的示例实现的框图。
11.图7是概述可以在所公开的技术的某些示例中使用的示例fpga的框图。
12.图8是进一步详述可以在所公开的技术的某些示例中使用的fpga内的逻辑组件的图。
13.图9是图示可以在所公开的技术的某些示例中实现的用altera fpga实现的信号处理器的实现的示意图。
14.图10是图示可以在所公开的技术的某些示例中实现的用altera fpga实现的信号处理器的示例实现的示意图。
15.图11是概述可以在所公开的技术的某些示例中执行的使用一个或多个共用共同指数执行数学运算的示例方法的流程图。
16.图12是概述可以在所公开的技术的某些示例中执行的配置可重新配置的逻辑器件以利用神经网络执行数学运算的示例的流程图。
17.图13是图示其中可以实现所公开的技术的某些实现的示例计算环境的图。
具体实施方式
18.i.一般考虑
19.在代表性实施例的上下文中阐述本公开,代表性实施例不旨在以任何方式限制。
20.除非上下文另有明确规定,否则如本技术中所使用的,单数形式“一”、“一个”和“该”包括复数形式。另外,术语“包括”意指“包含”。此外,术语“耦合”涵盖将项目耦合或链接在一起的机械、电学、磁性、光学以及其他实际方式,并且不排除在耦合的项目之间的中间元件的存在。此外,如本文所使用的,术语“和/或”意指短语中的任何一个项目或项目的组合。
21.本文所描述的系统、方法和装置不应该被解释为以任何方式限制。相反,本公开涉及单独地以及以彼此的各种组合和子组合的方式的各种公开实施例的所有新颖和非显而易见的特征和方面。所公开的系统、方法和装置不限于任何特定方面或特征或其组合,所公开的内容和方法也不要求存在任何一个或多个特定优点或解决了问题。此外,所公开的实施例的任何特征或方面可以以彼此的各种组合和子组合而被使用。
22.尽管为了方便呈现,以特定的顺序次序描述了所公开方法中的一些的操作,但是应该理解,除非下面阐述的特定语言要求特定的排序,否则这种描述方式涵盖重新布置。例如,在一些情况下,顺序描述的操作可以被重新布置或同时执行。此外,为了简单起见,附图可能未示出所公开的内容和方法可以与其他内容和方法结合使用的各种方式。另外,描述有时使用如“产生”、“生成”、“执行”、“选择”、“接收”、“发射”、“验证”、“执行”和“发起”之类的术语来描述所公开的方法。这些术语是对所执行的实际操作的高级别描述。对应于这些术语的实际操作将取决于具体实现而变化,并且由受益于本公开的本领域普通技术人员容易地可辨别。
23.出于更好理解的目的,提供了本文中参考本公开的装置或方法呈现的运算理论、科学原理或其他理论描述,并且不旨在限制范围。所附权利要求中的装置和方法不限于以这种运算理论所描述的方式起作用的那些装置和方法。
24.可以将任何所公开的方法实现为存储在一个或多个计算机可读介质(例如,计算机可读介质,诸如一个或多个光学介质盘、易失性存储器组件(诸如dram或sram)、或非易失性存储器组件(诸如硬盘驱动器))上并且在计算机(例如,任何商业可用计算机,包括智能电话或包括计算硬件的其他移动设备)上执行的计算机可执行指令。可以将用于实现所公开的技术的任何计算机可执行指令以及在所公开的实施例的实现期间创建和使用的任何数据存储在一个或多个计算机可读介质(例如,计算机可读存储介质)上。计算机可执行指令可以是例如专用软件应用或经由web浏览器或其他软件应用(诸如远程计算应用)访问或下载的软件应用的一部分。例如,可以在单个本地计算机上(例如,利用在任何合适的商业可用计算机上执行的通用和/或专用处理器)或在网络环境中(例如,经由因特网、广域网、局域网、客户端-服务器网络(诸如云计算网络)、或其他这样的网络)使用一个或多个网络计算机来执行这样的软件。
25.为清楚起见,仅描述了基于软件的实现的某些所选择的方面。省略了本领域公知的其他细节。例如,应该理解,所公开的技术不限于任何特定的计算机语言或程序。例如,所公开的技术可以由用c、c++、java或任何其他合适的编程语言所编写的软件来实现。同样地,所公开的技术不限于任何特定的计算机或硬件类型。合适的计算机和硬件的某些细节是公知的,并且不需要在本公开中详细阐述。
26.此外,可以通过合适的通信方式上载、下载或远程访问任何基于软件的实施例(包括例如用于使计算机执行任何所公开的方法的计算机可执行指令)。这种合适的通信方式例如包括因特网、万维网、内联网、软件应用、电缆(包括光纤电缆)、磁通信、电磁通信(包括rf、微波和红外通信)、电子通信、或其他这样的通信方式。
27.ii.对所公开的技术的介绍
28.神经网络(nn)被应用于人工智能中的许多应用,包括图像识别、语音识别、搜索引擎和其他合适的应用。对于这些应用的处理可以在诸如个人计算机或手机之类的各个设备上进行,但是也可以在大型数据中心中执行。同时,现场可编程门阵列(fpga)由于其灵活的性质和每单位计算的低功耗而被部署到数据中心中。
29.在fpga设备上的计算的一个特性是:它通常缺乏硬件浮点支持。可以以使用灵活逻辑的代价来执行浮点运算,但是在fpga实现中通常支持浮点所需的逻辑量是禁止的。已经开发了支持浮点计算的一些较新的fpga,但即使在这些设备上,如果在整数模式下使用该较新的fpga,则相同设备每单位时间也可以产生两倍那么多的计算输出。通常,nn是在考虑浮点计算的情况下创建的,但是当fpga针对nn处理时,如果可以使用整数算术来表达神经网络,则将是有益的。所公开的技术的示例包括块浮点(bfp)的硬件实现,包括在nn、fpga和其他硬件环境中的bfp的使用。
30.计算机系统中的典型浮点表示由三部分组成:符号(s)、指数(e)和尾数(m)。符号指示该数是正还是负。指数和尾数被用于科学记数法:
31.值=s
×m×2e
ꢀꢀꢀꢀ
(等式1)
32.可以在尾数的精度限制内表示任何数。由于指数将尾数以2的幂进行缩放,就好像
指数在科学记数法中以10的幂进行缩放,所以可以表示非常大的数的量级。表示的精度由尾数的精度确定。典型的浮点表示使用宽度为24或53位的尾数。量级大于2
53
的整数可以以浮点格式被近似,但由于尾数中没有足够的位,因此它无法被准确表示。对于任意分数,可以发生类似的效果,其中分数由尾数的位来表示,其取2的负幂的值。存在许多无法被准确表示的分数,因为它们在二进制数系统中是无理的。在这两种情形下都可能有更准确的表示,但它们可能要求尾数包含更多位。最终,需要无限数目的尾数位来准确地表示一些数(例如,)。在通用计算机中,24位(单精度浮点数)和53位(双精度浮点数)尾数限制是尾数存储要求与表示精度的常见折衷。
33.出于本公开的目的,术语“块浮点”意指跨两个或更多个值共用单个指数的数系统,每个值由符号和尾数对表示(存在显式符号位或者尾数本身是带符号的)。在一些示例中,矩阵或向量的一个或多个行或列的所有值,或矩阵或向量的所有值,可以共用共同指数。在其他示例中,bfp表示可以是无符号的。在一些示例中,矩阵或向量bfp表示中的一些但不是所有元素可以包括被表示为整数、浮点数、定点数、代号(symbol)或与用符号、尾数和指数表示的数混合的其他数据格式的数。在一些示例中,矩阵或向量bfp表示中的一些或所有元素可以包括具有两个或更多个部分的复元素,例如:具有虚部的复数(a+bi,其中);包括分子和分母的分数,极坐标(r,θ)或其他多分量元素。
34.块浮点(bfp)可以被用来以在某些方面与普通浮点类似的方式权衡精度和存储要求。首先,不是针对每个浮点数存储指数,而是一组数可以共用相同的指数。为了在维持高准确度的同时共用指数,数应该具有接近相同的量级,因为在尾数中表达量级的差异。如果量级差异太大,则对于较大的值,尾数将上溢,或者对于较小的值,尾数可能为零(“下溢”)。取决于特定应用,一些量的上溢和/或下溢可能是可接受的。
35.可以调整尾数的大小以适合特定应用。这可能影响所表示的数的精度,但潜在的收益将来自减少的表示大小。例如,普通的单精度浮点数具有4字节的大小,但是对于所公开的技术的某些实现,仅使用2个字节来表示每个值的符号和尾数。
36.在所公开的技术的某些示例中,等式(1)中表达的表示被用来从表示中推导出原始数,但是针对一组数仅存储单个指数,每个数由带符号的尾数表示。每个带符号的尾数可以用2个字节或更少的字节表示,因此与四字节浮点相比,存储器存储节省约2倍。此外,加载和存储这些值的存储器带宽要求也大约是普通浮点的一半。
37.在所公开的技术的一些示例中,浮点硬件实现使用宽乘法器(24位
×
24位)、宽加法器(48位+48位)、移位器单元和指数处置硬件。对于bfp,每个并行实例采用更窄的乘法器(16位
×
16位)和加法器(16位+16位),所有这些都可以共用共同指数处置硬件。可以很容易地将这种类型的拓扑映射到fpga硬件资源,以及向量指令集,诸如intel sse和avx处理器指令。在一些示例中,甚至可以使用8位操作数或甚至更小的带符号的尾数表示以进行进一步改进。
38.神经网络运算被用于许多人工智能运算中。通常,在实现神经网络中执行的大部分处理运算是执行矩阵
×
矩阵或矩阵
×
向量乘法。这样的运算是计算密集和存储器带宽密集的,其中矩阵的大小例如可以是1000
×
1000个元素(例如,1000
×
1000个数,每个数包括符号、尾数和指数)或更大并且有很多矩阵被使用。如本文所讨论的,可以将bfp技术应用于
这样的运算,以减少对于给定系统中的计算和存储器带宽的需求,无论该给定系统是fpga、cpu还是其他硬件平台。如本文所使用的,术语“元素”在本文中的使用是指这样的矩阵或向量的成员。
39.在所公开的技术的某些示例中,用于神经网络的权重矩阵的所有值被编码为共用共同指数的bfp数。使用该共同指数,权重矩阵的每个值然后由带符号的尾数表示,该尾数占用存储器的2个字节。同样,向量的所有值可以与2字节带符号尾数共用共同指数。对于某些cpu和fpga实现,这也是方便的大小,因为cpu通常支持向量指令(例如,由intel和amd处理器提供的avx指令),它将以2字节整数运行。这些向量指令可以被用来执行乘法累加函数,该乘法累加函数被用来计算矩阵
×
向量乘法的每个输出元素所需的点积。例如,使用avx-256指令,每个指令可以执行16次这样的16位乘法,并且随着avx-512指令、以及甚至更大位宽度的指令被开发,可以执行甚至更多的并行乘法。在fpga的情况下,对于fpga内的数字信号处理器(dsp),通常在硬件以及宽累加器寄存器中支持16
×
16位或18
×
18位整数乘法。这些乘法器很容易接受2字节带符号尾数格式。当计算对于矩阵
×
向量乘法的输出向量时,输出向量的指数是矩阵的指数和对于输入向量的指数的和。由于指数本身是名义上的16位或更少,因此该计算在大多数硬件平台上是低开销运算。
40.iii.矩阵
×
向量乘法的示例bfp实现
41.图1是图示矩阵
×
向量乘法的示例bfp实现100内的数据流的框图10。注意,向量输入也可以用矩阵输入来替换,以执行矩阵
×
矩阵乘法:
42.m
×
v=r
43.其中矩阵m由具有单个指数e1的带符号的整数尾数(m
11
...m
ij
)的i
×
j矩阵表示,向量v是具有单个指数e2的带符号的整数尾数(v1...vj)的j长度向量,并且r是带符号的整数尾数(r1...ri)和单个指数e3的i长度结果向量。
[0044][0045]
在一些示例中,尾数可以是无符号的,并且在bfp实现之外考虑符号分量。
[0046]
如图1中所示,矩阵输入110包括矩阵尾数m的集合和单个矩阵指数e1。向量输入120包括向量尾数v的集合和单个向量指数e2。将矩阵尾数m和向量尾数v发送到尾数乘法器单元140。在所公开的技术的一些示例中,矩阵输入110和/或向量输入120可以(临时地)存储在fpga的ram单元中。例如,根据所公开的示例,块ram(xilinx)或存储器块(altera)可以被用来存储矩阵和向量或使矩阵和向量成队列,包括矩阵输入110和/或向量输入120。在一些示例中,以允许容易访问用于计算的连续元素的布置,例如通过用计数器生成地址,以在ram中存储矩阵和向量的元素或使这些元素成队列。在一些示例中,其他fpga存储器单元或外部存储器被用来存储用于矩阵和向量的数据。
[0047]
尾数乘法器单元130将两个输入矩阵的尾数相乘并产生结果尾数r的矩阵。在一些fpga示例中,利用fpga的可编程查找表(lut)中的逻辑来实现尾数乘法器单元130。在一些示例中,fpga包括专用乘法器或算术和逻辑单元(alu)逻辑,其可以被执行以执行乘法。在一些示例中,在fpga中提供数字信号处理器(dsp)功能,其可以被配置为提供乘法运算。在一些示例中,尾数乘法器单元130包括用于从存储器中选择多个输入值以用于一系列乘法
运算的逻辑。将单个指数e1和e2发送到指数加法器140,该指数加法器140将两个指数相加并产生结果指数e3。在一些fpga示例中,利用fpga的可编程查找表(lut)中的逻辑来实现指数加法器140。在一些示例中,fpga包括专用加法器或算术和逻辑单元(alu)逻辑,其对指数加法器140执行加法。将结果指数e3发送到输出指数选择器145,产生所选择的结果指数e4,其被输入到输出尾数移位器150。输出尾数移位器150接受尾数乘法器的结果r,输出尾数移位器150可以在该结果r上执行附加函数(如下面进一步解释的)。结果矩阵r和所选择的结果指数e4形成向量结果155,其可以由bfp单元100输出。可以以与输入矩阵或向量类似的方式存储结果矩阵r。因此,在一些fpga示例中,将向量结果155存储在提供bfp实现10的fpga内的ram中,而在其他示例中,将向量结果存储在耦合到fpga的输出的外部ram中。
[0048]
在其他示例中,bfp实现使用通用处理器、数字信号处理器(dsp)、图形处理单元(gpu)、神经网络处理器(nnp)或其他合适的处理器。例如,可以提供用于这些合适处理器中的任何一个的计算机可执行指令,以实现用于浮点运算的bpu表示。在一些示例中,可以有利地提供专用指令,例如单指令多数据(simd)或诸如由英特尔高级向量扩展(avx)指令提供的那些的其他向量指令,以改善用于合适处理器的bfp实现的性能。在一些示例中,制造专用集成电路(asic)以实现所公开的bfp运算。
[0049]
在一些示例中,并且特别是在一些基于nn的示例中,通常可以通过偏置加法器单元160将偏置向量b与向量结果相加,从而产生r+b。在图1中以虚线描绘用于执行这种选项偏置向量加法运算的合适组件:160、170、180、185和/或190,以用结果r和指数e3执行附加运算。例如,为了执行偏置加法,使用可选组件160、170、180和185。为了计算附加函数,使用可选组件190。为了利用附加函数执行偏置加法,使用组件160、170、180、185和190。如受益于本公开的本领域普通技术人员将容易理解的,取决于正在执行的特定运算,可以修改诸如指数加法器140、输出指数选择器145和/或输出尾数移位器150的其他组件的运算。
[0050]
在一个示例中,通过偏置尾数移位器180移位输入偏置向量b 170的尾数以匹配中间结果向量r的尾数。可以由指数减法器185从偏置指数e5中减去由指数加法器140产生的指数e3以产生指数e6。偏置尾数移位器180使用指数e6以将偏置尾数b与中间结果向量尾数r对齐。偏置加法器单元160将经移位的偏置向量输入b与尾数乘法器130的输出相加。在这种情况下,将偏置加法器单元160的r+b输出发送到输出尾数移位器150,以便生成向量结果155而不是仅生成结果向量r,如在没有偏置加法的示例中所使用的那样。
[0051]
在一些示例中,通过附加函数单元190将附加函数(诸如线性函数、非线性函数、激活函数、传递函数或针对特定应用选择的其他函数)应用于向量结果155。例如,在某些nn处理配置中,经常将sigmoid、双曲正切(tanh)或其他类似函数应用于向量结果155。附加函数单元还接受指数e3,因为用于部分结果r+b的指数使用r+b的元素和e3两者以相应地产生输出f(r+b)。(在没有偏置向量加法的示例中,产生输出f(r))。在神经网络处理示例中,附加函数可以是用于神经网络的节点的激活函数。部分结果指数e3和可选的结果元素f(r+b)进入输出指数选择器145以确定最终输出指数e4。输出指数e4可以是固定值或f(r+b)的元素的函数。输出尾数移位器150将部分结果向量f(r+b)的元素与输出指数e4对齐,并产生最终结果向量。在一些示例中,应用偏置向量b和附加函数两者。可以在应用附加函数之前或之后应用偏置向量b。在其他示例中,仅应用偏置向量b或附加函数中的一个。在其他示例中,既不应用偏置向量b也不应用附加函数。在一些示例中,可以以比输出精度更高的精度执行内
部运算,以避免从使用较低位尾数和/或指数执行多个运算中引入精度损失。
[0052]
被发送到乘法器单元130并作为向量结果输出的尾数的值不一定同时和并行地产生,但是可以以串行的方式产生。例如,乘法器单元130可以包括用于顺序选择输入矩阵和向量的元素的控制逻辑。向量结果由指数选择器单元190采样,该指数选择器单元190产生指数调整信号,该指数调整信号被用来调整用于向量输出的(多个)单个指数。在一些示例中,指数选择器190选择向量结果值的绝对最大值作为下面用于计算(多个)共用指数的等式2的绝对最大值。在一些示例中,指数选择器连续地从向量结果中采样平均值和标准偏差信息,以便生成指数调整信号。例如,可以对最后n个输入和/或输出值进行采样以提供平均值和标准偏差数据,其中n可以是任何合适的值,包括但不限于:512、1024或8192个值。在一些示例中,本文公开的表查找或其他技术可以被用来生成指数调整信号。
[0053]
如受益于本公开的相关领域的普通技术人员将容易理解的,上面针对图1讨论的矩阵乘法运算是示例运算,其可以用bfp单元来执行并且可以容易地被修改以执行其他运算。例如,可以通过相应地修改所公开的运算来执行矩阵除法、加法或减法,例如通过在相除时执行指数减法或者在执行加法或减法运算时执行指数对齐。此外,可以使用所公开的bfp表示和硬件来执行附加的矩阵运算。例如,可以使用适于使用所公开的bfp表示和硬件的方法来执行矩阵求逆、矩阵转置、行列式计算以及其他矩阵和向量运算。下面的表1中总结了根据各种示例性运算(矩阵乘法m
×
v、矩阵除法m
÷
v、矩阵加法m+v和矩阵减法m-v)对bfp单元中的组件执行的函数的修改。
[0054][0055]
表1
[0056]
表1示出了作为整体矩阵计算的一部分所执行的尾数和指数运算。例如,当执行矩阵乘法时,将所公开的bfp表示中的输入矩阵/向量的尾数元素相乘,并且(例如,通过将两个共同指数相加)调整输入的相关联的共同指数。在图1中将这些运算描绘为分别由尾数乘法器130和指数加法器140执行。对于矩阵加法,根据相加的两个矩阵之间的指数差异,移位输入矩阵/向量的尾数。输出指数相应增加。类似地,对于矩阵减法,对尾数进行移位和相减,并相应地调整输出指数。在一些示例中,并且如下面进一步详述的,可以以更复杂的方式选择输出指数,以增加得到的bfp表示的总体准确度。
[0057]
如受益于本公开的相关领域的普通技术人员将容易理解的,图1的bfp实现示出了可选地使用偏置向量输入和可选附加函数的矩阵乘法的示例,其可以适于执行例如包括表1中描述的那些的其他矩阵运算。
[0058]
应该注意,取决于矩阵或向量中的值,可以不执行一些运算。例如,当可以在不移位尾数或向量移位或相加的情况下表示中间值时,那么不会针对特定运算而移位那些值。在一些示例中,静态地选择被选择要被执行的运算和相关联组件的运算。在其他示例中,可
以在各个运算或运算的集合之间动态地选择运算。
[0059]
可以将用于矩阵和共用指数的值存储在任何合适的存储器存储设备中。例如,可以将矩阵和共用指数存储在可寻址存储器(例如,动态随机存取存储器(dram,包括ddr、ddr2等,dram)、嵌入式dram(edram)或静态随机存取存储器(sram)、锁存器阵列、正反器阵列、寄存器文件、块随机存取存储器(block ram)(有时称为“存储器块”)、先进先出(fifo)缓冲器或移位寄存器中。在一些示例中,将用于矩阵的值存储在可寻址存储器或寄存器文件中,并且将用于共用指数的值存储在多个正反器或锁存器中。因此,可以避免分配完整的存储器来存储用于共用指数的数据。在一些示例中,诸如正反器或寄存器的存储器被分配以静态地存储用于共用指数的值(例如,一个寄存器存储bfp处理的特定级处的所有指数值,或者矩阵的每列/行分配一个寄存器)。在一些示例中,存储器被分配以动态地存储指数。在一些示例中,可以通过执行表查找来访问指数值(例如,通过使用矩阵的行、列对作为索引来标识共用指数存储位置)。
[0060]
用图示的bfp实现解决的一个问题是共用共同指数的值的动态范围。如果被分组在共同指数下的所有值都在相对窄的动态范围内,则bfp表示适用,其中与理想的无限精度相比,很少或没有精度损失。如果值具有相对较宽的动态范围,则可能发生精度损失。神经网络中表示的值通常在量级上接近。例如,常用的sigmoid激活函数在[-1,1]之间变化,并且在使用sigmoid的层上,该层的每个输出的最终表示将落入该范围中。合适的sigmoid激活函数的一个示例是:
[0061][0062]
然而,如受益于本公开的本领域普通技术人员将容易理解的,可以使用其他合适的激活函数。神经网络的初始输入被归一化到小动态范围或来自具有小动态范围的数集合(诸如像素rgb值[0,255])也是常见的。存在窄动态范围假设对神经网络无效的一些情况,并且会发生一些精度损失。饱和度可以被用来减轻这种影响。
[0063]
iv.共同指数选择的示例
[0064]
对用于bfp表示中的一组数的指数的选择可以影响使用该组数的计算的精度。如果指数太大,则许多尾数值将下溢,只有少数低阶位为非零。例如,考虑一个bfp示例,其中表示了以下表2中的值:
[0065]
十进制值13107225610.50.125理想十六进制值0x20000.00x0100.00x0001.000x0000.80x0000.216位尾数(指数+3)0x40000x00200x00000x00000x000016位尾数(指数-3)0x00000x08000x00080x00040x0001
[0066]
表2
[0067]
在该示例中,与尾数的动态范围相比,值的动态范围相对宽。在被标记为“十进制值”的行中示出了每个值的熟悉表示,并且在它下面的行(“理想十六进制值”)中示出了相同的数的准确十六进制表示形式。给出了针对表2中的数的16位bfp表示的两个示例。在以下两行中示出了指数的两个选择+3和-3以及它们的尾数等价物。当指数为+3时,两个最大值可以用完全精度明确地表示,但是三个较小的数字下溢并且简单地被表示为0(第三行中三个带下划线的尾数0x0000)。当指数为-3时,最大值上溢并被表示为0(第四行中带下划线
的尾数0x0000),而所有较小的数字都被如实地表示。
[0068]
因此,在该示例中,动态范围对于16位尾数来说太大而无法准确地捕获所有值。在许多情况下,优选下溢而不是上溢,因为下溢值小并且倾向于对结果具有较小的影响,尤其是在诸如神经网络之类的某些应用中。如前所述,在神经网络中,便于分组在单个指数下的值倾向于具有相当窄的动态范围。存在确实出现宽动态范围的情况,并且在那些情况下,指数选择可以考虑上溢和下溢。
[0069]
存在计算用于bfp表示的(多个)最佳指数的若干不同的方式。当给出值的集合时,诸如对于神经网络的主要输入,通常已知最大和最小可能值。例如,这些值通常是具有范围为[0,1]的浮点数或范围为[0,255]的整数。如果使用16位尾数,则通过首先计算最大值中前导1的位位置可以简单地在尾数内将值左对齐:
[0070][0071]
其中x值xi∈{x1,x2,
…
,xn}并且内括号是绝对值。然后,前导一位置被计算如下,
[0072][0073]
其中外括号指示整数floor函数。然后将指数计算为前导一位置和尾数宽度的函数:
[0074]
指数=前导一位置-(尾数宽度-2)
ꢀꢀꢀ
(等式4)
[0075]
使用用于指数的绝对最大值保留了用于数表示的最可能的位而不上溢,并允许用于符号位的空间。例如,假设尾数宽度=16,下面的表3示出了将等式2-4应用于各个值xi的结果:
[0076][0077][0078]
表3
[0079]
为了进一步解释表3:列1是根据等式2的值的绝对最大值(无符号值本身),列2是根据等式3的与二进制点(基数2“小数点”)相关的前导一的位位置,列3是根据等式4的指数值。例如,对于xi=255,二进制表示的前导一位置是二进制点(位7)左边的8位,指数为-7,并且得到的带符号的16位尾数为0x7f80。列4包含基于对应的指数、在转换列1中示出的准确数后的带符号尾数的十六进制值。列5包含由列4中的带符号尾数和来自列3的指数所表示的实际值。
[0080]
应该注意,负指数对应于向右移位尾数,并且正指数对应于向左移位尾数。通过选择保留最大值的指数,丢失了一些精度,如针对最后两种情况的值表示的列中所示,但所表示的实际值接近起始值。
[0081]
因此,公开了用于在给定预期的值的绝对最大值的情况下计算指数的方法。这种方法适用于神经网络输入,以及具有已知输出范围的层输出,诸如sigmoid()、双曲正切tanh()等。但是,存在函数的输出范围可能具有宽动态范围的情况,导致上面讨论的精度误差。例如,如果神经网络层的输出是纯线性的而没有应用激活函数,则可能发生这种情
况。在这样的网络层中,输出是纯矩阵
×
向量乘积。
[0082]
解决该问题的一种方式是假设给定已知矩阵的最坏情况输入向量值并计算可能的输出向量值的极值。在实践中,由于输出向量的动态范围仍然很宽,因此这给出差的结果。可以部分地基于对被建模的特定问题的理解来改进块浮点表示。例如,神经网络部分地基于统计产出来运算。因此,如果误差很少发生,则生成误差可能是可接受的。因此,经修改的方法涉及确定针对给定输出向量的指数,该指数在大多数时间捕获正确的结果。
[0083]
这可以通过使用实际输入向量计算矩阵
×
向量乘积并记录有关可能输出的统计数据来实现。通过计算跨许多实际输入向量的输出的绝对值的平均值和方差,可以为输出向量的实际绝对最小值和最大值将统计置信度区间构建到期望置信度。通常用与平均值的标准偏差数来表达置信度区间。例如,如果我们假设输出向量具有平均值μ=10和标准偏差σ=0.5:
[0084] 低范围高范围置信度μ
±
1σ10
–
0.5=9.510+0.5=10.568.27%μ
±
2σ10
–
1=910+1=1195.45%μ
±
3σ10
–
1.5=8.510+1.5=11.599.73%μ
±
4σ10
–
2=810+2=1299.99%
[0085]
表4
[0086]
表4图示了:对于高斯分布,取决于偏离平均值的标准偏差数,可以用已知的统计置信度建立多少值将落在该范围内。例如,在3σ处,我们知道99.73%的值的绝对值将落在8.5和11.5的范围内。
[0087]
因此,跟踪输出向量值的绝对值的平均值和标准偏差允许通过选择动态范围的宽度与所引入的误差的影响来控制。较大的置信度值(较少的误差)对应于值中较宽的动态范围,较低的置信度值(较多的误差)对应于较窄的动态范围。在给定实例中的μ和σ的准确值将建立在动态范围宽度对置信度方面的选择。在选择了给定置信度之后,就可以将高范围值(μ加所选择的σ倍数)用作等式(3)中的绝对最大值以计算指数。
[0088]
例如,如果从上面的表4中选择99.73%置信度区间(3σ),以及相同的平均值(10)和标准偏差(0.5)以及16位的尾数宽度,则将如下计算指数:
[0089]
绝对最大值=μ+3σ=10+1.5=11.5
[0090][0091]
指数=3-(16-2)=-11
[0092]
由于潜在地存在大量的输出向量要跟踪,因此可以以流的方式跟踪平均值和标准偏差。对于平均值,通过维持跨将要共用共同指数的统计相关的值的集合的累计和并除以值的数目,这很容易实现。在一些示例中,如果值的数目是2的幂,则可能是方便的,因为可以通过移位运算来执行除法。可以通过使用以下等式以累计的方式计算标准偏差:
[0093][0094]
x的期望值被标志为e(x),其是平均值μ。e(x2)是x2的期望值(或平均值),其可以使用与用于平均值的相同程序但是使用平方x2值来计算。在所公开的技术的一些示例中,维持值的两个累计和(例如,最近的512、1024、8192或其他数目的值),一个跨x值,并且另一个
跨x值平方。例如,可以将两个累计和值维持在用链式锁存器、正反器或存储器实现的寄存器中。在累计结束时,x和除以值的数目(使用除法器或移位器),其给出平均值e(x)。以类似的方式对x2值的和进行除法,其给出e(x2)。可以使用e(x)、e(x2)和等式5来计算值σ(x)。
[0095]
如受益于本公开的本领域普通技术人员将容易理解的,可以将类似的指数选择方法应用于矩阵
×
矩阵情况。此外,可以调整要在单个指数下被分组的值的数目。因此,虽然前述示例是根据共用相同指数的整个输出向量来构建的,但是对于可以使不同分组更有利的不同应用,存在许多考虑。例如,一个或多个矩阵的各个行可以与单个指数相关联。在其他示例中,矩阵的二维部分可以与单个指数、矩阵对角线相关联,或者可以实现用于将矩阵或矩阵的部分与指数相关联的其他合适的划界。
[0096]
v.示例神经网络多处理器
[0097]
图2是可以在所公开的技术的一些示例中实现的神经网络多处理器200的框图。多处理器200包括一个或多个神经处理核中的多个210,包括各个nn处理器核,其包括一个或多个bfp单元(例如,bfp单元100)。多处理器200可以作为定制或专用集成电路(例如,包括片上系统(soc)集成电路)、现场可编程门阵列(fpga)或其他可重新配置的逻辑、或作为由物理通用处理器主存的软处理器虚拟机而被实现。例如,支持向量指令的通用处理器,诸如支持sse、sse2或avx指令集的x86_64处理器,可以被用来实现bfp单元。
[0098]
如图2中所示,多个神经处理器核210经由互连220彼此连接。互连220承载各个核、存储器接口240和输入/输出(i/o)接口250之间的数据和控制信号。互连220可以使用电、光、磁或其他合适的通信技术来发射和接收信号,并且可以取决于特定的期望配置提供根据多种不同拓扑布置的通信连接。例如,互连220可以具有交叉开关、总线、点对点总线或其他合适的拓扑。在一些示例中,多个核210中的任何一个可以连接到任何其他核,而在其他示例中,一些核仅连接到其他核的子集。例如,每个核可以仅连接到最接近的4、8或20个相邻核。互连220可以被用来传输去往和来自核的输入/输出数据,以及传输去往和来自核的控制信号和其他信息信号。例如,每个核可以接收和发射信号量(semaphore),该信号量指示当前由每个相应核执行的运算的执行状态。此外,可以经由互连在核之间共用矩阵和向量值。在一些示例中,互连220被实现为连接核和存储器系统的线,而在其他示例中,核互连可以包括用于在(多个)互连线、开关和/或路由组件上复用数据信号的电路装置,包括活动信号驱动器和中继器,或其他合适的电路装置。在所公开的技术的一些示例中,在多处理器200内和/或去往/来自多处理器200的信号不限于全摆幅电数字信号,而是处理器可以被配置为包括差分信号、脉冲信号或用于发射数据和控制信号的其他适合信号。
[0099]
在图2的示例中,多处理器的存储器接口240包括被用来连接到存储器245的接口逻辑,存储器245例如是位于除多处理器200之外的另一集成电路上的存储器(例如,存储器可以是静态ram(sram)或动态ram(dram))或嵌入在与处理器相同的集成电路上的存储器(例如,嵌入式sram或dram(edram))。存储器接口240和/或主存储器可以包括高速缓存(例如,n路或关联高速缓存)以改善存储器访问性能。在一些示例中,使用静态ram(sram)来实现高速缓存,并且使用动态ram(dram)来实现主存储器245。在一些示例中,存储器接口240被包括在与多处理器200的其他组件相同的集成电路上。在一些示例中,存储器接口240包括允许在存储器中传送数据块的直接存储器访问(dma)控制器。在一些示例中,存储器接口240管理虚拟存储器的分配,扩展可用主存储器245。在一些示例中,编程信息(例如,配置比
特流)可以被存储在存储器245中,并且然后被应用以配置多个神经处理核210的可重新配置的逻辑资源。
[0100]
i/o接口250包括用于接收和发送输入和输出信号到其他组件255的电路装置,诸如硬件中断、系统控制信号、外围接口、协处理器控制和/或数据信号(例如用于图形处理单元、浮点协处理器、物理处理单元、数字信号处理器或其他协处理组件的信号)、时钟信号、信号量或其他合适的i/o信号。i/o信号可以是同步的或异步的。在一些示例中,使用存储器映射的i/o技术结合存储器接口240来实现i/o接口的全部或一部分。在一些示例中,i/o信号实现不限于全摆幅电数字信号,而是i/o接口250可以被配置为提供差分信号、脉冲信号或用于发射数据和控制信号的其他合适信号。
[0101]
多处理器200还可以包括控制单元260。控制单元260监督多处理器200的运算。可以由控制单元260执行的运算可以包括对用于执行运算的神经处理核的分配和解除分配,包括矩阵和向量乘法、任何核、对存储器接口240和/或i/o接口250之间的输入数据和输出数据的控制、对控制流中的执行流其他变化的修改。控制单元260可以包括用以实现控制单元260的一些或所有控制功能的通用中央处理单元265(例如,arm、mips或x86-64处理器)。例如,被存储在存储器中的指令可以由cpu 265执行以分配、解除分配和发送数据到多个神经处理核210中的一个或多个。
[0102]
在一些示例中,至少部分地使用以下中的一个或多个来实现控制单元260:硬连线有限状态机、可编程微代码、可编程门阵列或其他合适的控制电路。
[0103]
vi.示例脉动阵列矩阵运算
[0104]
图3a是图示了可以在所公开的技术的某些示例中执行的具有偏置向量加法的矩阵乘法的示例的图300。对于给定的输入矩阵i 310,矩阵w 320中的权重集合乘以输入矩阵,并且与偏置向量b 330相加,从而产生结果矩阵c 340。
[0105]
图3b是描绘矩阵(c
00
...c
12 360)的六个值的图350,其通过将来自权重矩阵w 370的六个值乘以来自输入矩阵i 380的九个值并且加上来自偏置向量b 390的六个值来产生。在实践中,在每个输出矩阵位置c
00
,c
01
,
…
,c
12
处存在乘法累加单元。针对每个的累加器被初始化为0。在每个时间步长上,i的行向下推进,并且w的列向右推进。当w和i元素中的每对在乘法器矩阵c中相遇时,在该位置中将它们相乘和累加。例如,要相遇的第一对元素将是在时间1处的在位置c
00
处的w
00
和i
00
。在时间2处,元素w
01
和i
10
将在c
00
处相遇,并且它们的乘积将被添加到累加器。在时间3处,对于w
02
和i
20
也会发生同样的情况。到时间4,计算c
00
所需的所有元素对乘法将都已发生,并且累加器将保持w的第一行和i的第一列的点积。类似地,所示出的c的其他5个元素将在它们相应的元素相遇并相乘时被计算出。在最后的元素对相乘(w
12
和i
22
)之后,权重矩阵w乘以列向量i的乘法完成,并且累加器保持输出矩阵。最后的步骤是将偏置向量b与矩阵的每列相加,以便产生c的最终值。
[0106]
在不同通道中通过脉动阵列乘法器对输出矩阵c的子区域执行乘法是可能的。fpga的资源限制了每个时钟周期可能发生的乘法数目,这迫使我们做出这种妥协。在我们的情况下,每列(如图4中420和422所示)对应于输出矩阵c的一列。这些列(420、422等)中的每列并行执行32次乘法,针对输出矩阵的16行中的每行执行两次。因此,实际上,通过示例性公开的实现的每个列(420、422)的每个通道正在计算输出矩阵c的16行
×
1列部分。
[0107]
如受益于本公开的相关领域的普通技术人员将容易理解的,上面针对图3a和图3b
讨论的矩阵乘法运算是示例应用并且可以容易地进行修改以执行其他运算。例如,可以通过相应地修改所公开的运算来执行矩阵除法、加法或减法,例如通过在相除时执行指数减法或者在执行加法或减法运算时执行指数对齐。此外,可以使用所公开的bfp表示和硬件来执行附加的矩阵运算。例如,可以使用适于使用所公开的bfp表示和硬件的方法来执行矩阵求逆、矩阵转置、行列式计算以及其他矩阵和向量运算。
[0108]
vii.用于脉动阵列矩阵乘法器的示例硬件
[0109]
图4是图示可以在所公开的技术的某些示例中使用的脉动阵列矩阵乘法器的架构视图的框图400。如图所示,定序器410被用来向第一乘法器列420提供权重和输入。第一乘法器列420计算来自先前示例的输出矩阵c的列的部分或全部。还可以复制乘法器列以并行地计算输出矩阵c的附加列的部分或全部。例如,第一乘法器列420从定序器410接收w矩阵的元素,并且可以将它们传递到第二乘法器列422。在一些示例中,仅提供单个乘法列420。乘法列包括:双输入16位输入缓冲器430,其包含i矩阵的单个列,形成脉动阵列列的16个dsp单元(m
×
v)的列,两个32位输入;16位乘法器单元432;偏置加法器单元434,其将偏置向量与乘法器结果相加;以及32位激活函数436。将激活函数436应用于m
×
v+b的结果。将激活函数436发送到中继器440,中继器440可以将输出值发送到下一列的中继单元。中继器还可以将一对16位输出发送到输出缓冲器450,然后可以将其重新输入回输入缓冲器430。如图所示,权重矩阵在专用512位路径上从左侧从定序器410进入而没有流量控制。用于脉动阵列矩阵乘法函数的i的每个输入列向量进入每列的顶部,并且如果存在更多层要处理,则所产生的输出可以被循环回顶部以用于计算神经网络中的下一层。如果已经计算了神经网络的最终层,则可以替代地将输出发送到下一列422的中继器440,其然后将它们转发到后续列,直到它们到达定序器410为止。单个32位中继路径可以被用来将输入、输出、偏置和其他相关联的值移入和移出乘法列。
[0110]
在所公开的技术的一些示例中,通过配置图5中所示的altera fpga dsp基元来实现m
×
v脉动阵列乘法器列432。dsp单元在逻辑上被布置为垂直列,使得当输入数据垂直向下穿过列时,权重数据w可以水平地穿过列。在每个时钟周期上,每个dsp单元将两个16位尾数对相乘,并同时将前一时钟周期的乘法对的结果添加到64位累加器530。因此,在每个时钟周期上,每个dsp消耗权重矩阵w的两行元素和列向量i的两列元素,并且64位累加器530将在运算结束时包含输出矩阵的一个元素。由于存在垂直堆叠的16个dsp,所以存在每个时钟周期消耗的w矩阵的16
×
2=32个元素,每个时钟周期总共消耗w矩阵数据的32
×
16位=512位。在所选择的fpga中,这与目标fpga的本机外部ddr存储器带宽相匹配。
[0111]
输入缓冲器430和输出缓冲器450都从altera存储器块被构造。某些实现利用了双端口altera存储器模块,这允许从两个源同时读取和写入存储器。因此,使用单个较大的存储器块结构来容纳输入缓冲器430和输出缓冲器450两者是可能的。使用单个较大的存储器块可以在存储器的使用中提供更大的灵活性,因为程序员可以然后在输入或输出数据较小的情况下更有效地使用存储器。结果是,实现相同功能总共需要更少的fpga存储器块资源。
[0112]
中继器440是芯片上的环形网络的示例。存在许多方式可以在定序器410和列420和422之间移动数据,但是具有单个环形网络比一些其他实现使用更少的资源。在一些示例中,环形网络通信带宽可以低于其他中继实现,但是在某些应用中,与经由环形网络传送去往/来自列420和422的数据所花费的时间相比,计算时间相对长。此外,可能的是,在从列中
产生每个输出集合时,传输来自列420和422的输出数据,而不是等到整个计算完成。这允许了对输出数据传输和计算的管线化,并有效地减轻较长的数据传输时间。在必须将相同数据发送到所有列的一些示例中,诸如对于偏置数据,中继网络可以被配置为支持广播,使得可以利用来自定序器的单个传输将相同的数据发送到所有列,这进一步减少了通信延迟。
[0113]
viii.用于执行矩阵运算的示例数字信号处理瓦片
[0114]
图5是概述可以被用来根据所公开的技术执行矩阵乘法运算的示例数字信号处理(dsp)瓦片的框图500。如图所示,第一16位输入i 510乘以第一16位权重输入w 515。第二16位输入i 520乘以第二16位权重w 525。两次乘法的结果相加并且可以可选地与附加偏置量相加并被存储在64位累加器acc 530中。在利用dsp瓦片执行多次乘法迭代之后,将输出提供给输出递送器540,输出递送器540可以将输出发送到其他矩阵列或将结果作为矩阵乘法结果输出。图5中所示的所有功能都可以由fpga或asic中的单个dsp瓦片提供,包括输出递送器540。在其他示例中,输出递送器540被提供为连接到dsp瓦片的输出的附加逻辑。应该注意,图5中所描绘的交叉线都不表示连接。
[0115]
构造altera dsp块使得乘法及其和都在单个时钟周期中执行,并且累加运算需要第二个时钟周期。因此,dsp相乘累加运算具有两个时钟周期的延迟。然而,乘法+求和运算可以与累加运算管线化,使得在每个时钟周期上可以接受两个输入-权重对以进行最大计算。
[0116]
输出递送器540未在图4中示出,但是,它被包含在m
×
v块432内,并且是将16个累积输出结果的集合传递到偏置加法函数434的装置。
[0117]
ix.示例神经网络实现
[0118]
以上关于图1-图5讨论的bfp实现可以适于用神经网络执行运算。例如,图6图示了深度神经网络(dnn)600的简化拓扑,其可以被用来使用所公开的bfp实现来执行增强的图像处理。可以使用用于bfp矩阵/向量运算的所公开的技术来实现一个或多个处理层,包括在上述多处理器200中使用多个神经网络核210中的一个或多个。应该注意,本文公开的bfp实现的应用不限于dnn,而是还可以与其他类型的神经网络一起使用,诸如卷积神经网络(cnn),包括具有长短期存储器(lstm)或门控再循环单元(gru)的实现、或者可以适于使用本文公开的bfp方法和装置的其他合适的人工神经网络。
[0119]
如图6中所示,第一节点集合610(包括节点615和616)形成输入层。集合610的每个节点连接到第一隐藏层中的每个节点,第一隐藏层由第二节点集合620(包括节点625和626)形成。第二隐藏层由包括节点635的第三节点集合630形成。输出层由第四节点集合640(包括节点645)形成。每个节点通过将权重应用到从前一节点生成的每个输入并收集权重以产生输出值来产生输出。在一些示例中,每个单独节点可以具有被应用的偏置和/或激活函数。可以使用bfp实现100的实例(例如,如针对隐藏节点635所示)来实现每个节点。例如,任何经适当编程的处理器或fpga可以被配置为实现所描绘的神经网络600中的节点。
[0120]
用于这种神经网络bfp实现的合适应用的示例包括但不限于:执行图像识别,执行语音识别,分类图像,将语音转换成文本和/或其他语言、面部或其他生物识别,自然语言处理,自动语言翻译,搜索引擎中的查询处理,自动内容选择,分析电子邮件和其他电子文档,关系管理,生物医学信息学,识别候选生物分子,提供建议或其他分类任务。
[0121]
对于受益于本公开的相关领域的普通技术人员将显而易见的是,本文公开的bfp
矩阵乘法技术,包括共同指数的选择以及一个或多个中间和最终输出级,可以被用来实现所图示的神经网络的一些或所有层。
[0122]
在一些示例中,每个卷积层中的并行相乘-累加(mac)单元的集合可以被用来加速计算。而且,并行乘法器单元可以被用在完全连接和密集矩阵乘法级中。也可以使用并行的分类器集合。这种并行化方法具有以增加的控制复杂性为代价进一步加速计算的潜力。对于受益于本公开的相关领域的普通技术人员将显而易见的是,本文公开的bfp矩阵乘法技术,包括共同指数的选择以及一个或多个中间和最终输出级,可以被用来实现所图示的神经网络的一些或所有层。
[0123]
如受益于本公开的本领域普通技术人员将容易理解的,bfp实现的应用可以被用于使用神经网络的不同方面,无论是单独的还是彼此组合或子组合的。例如,所公开的bfp实现可以被用来经由用于神经网络的梯度下降和/或反向传播运算来实现神经网络训练。此外,所公开的bfp实现可以用于评估神经网络。
[0124]
x.示例现场可编程门阵列架构
[0125]
图7是描绘被配置为实现所公开的技术的某些示例的示例现场可编程门阵列(fpga)架构的框图700。例如,可以将上面关于图2讨论的多处理器200映射到图7的fpga架构。
[0126]
fpga包括以阵列布置的可重新配置的逻辑块阵列。例如,fpga包括第一行逻辑块和第二行逻辑块,第一行逻辑块包括逻辑块710、711和719,第二行逻辑块包括逻辑块720、721和729。每个逻辑块包括可以被重新配置以实现任意逻辑函数的逻辑并且还可以包括顺序逻辑元件,诸如锁存器、正反器和存储器。使用包括多个互连开关的路由结构来彼此互连逻辑块,这些互连开关也可以是可编程的。例如,存在位于第一行可重新配置的逻辑块和第二行可重新配置的逻辑块之间的第一行开关块730、731、732等。开关可以被配置以便改变承载可重新配置的逻辑块之间的信号的线连接。
[0127]
fpga还包括许多更复杂的组件。例如,逻辑块包括多个块ram,例如,块ram 740和块ram 749。块ram通常包含更大数目的存储器位,例如,通过将地址应用到存储器并且从一个或多个读取端口进行读取来访问的几千个存储器位。在一些示例中,块ram可以包括两个或更多个写入端口以及两个或更多个读取端口。在其他示例中,块ram可以仅具有单个读取和/或单个写入端口。虽然通常通过应用地址并读取对应数据来访问块ram,但是在一些示例中,块ram可以被配置有附加电路装置,该附加电路装置允许实现更复杂的函数,包括移位寄存器和先进先出(fifo)缓冲器。
[0128]
所图示的fpga还包括多个硬宏块,包括硬宏块750和硬宏块759。这些宏块可以包括更复杂的功能性,诸如处理器功能性、数字信号处理功能性、加速器或被认为是所期望的其他功能。例如,数字信号处理块,诸如上面关于图5所描述的那些,可以被实现为fpga的一个或多个硬宏块。所图示的fpga还包括配置端口760,其可以被用来对fpga中的逻辑器件进行重新编程。在一些示例中,可以直接寻址和读取/写入存储用于逻辑器件的配置信息的配置存储器。在其他示例中,扫描链架构被用来以串行的方式存储配置信息。
[0129]
fpga还被i/o环770包围,i/o环770可以耦合到逻辑块,块ram和/或硬宏块,以便接收信号并将信号发送到远离fpga的组件。在一些示例中,i/o信号是全轨电压信号,而其他示例使用差分信号。在一些示例中,i/o端口可以被多路复用(例如,时分复用),以便支持比
fpga上可用的引脚数目更多的信号的输入和输出。
[0130]
虽然通常通过使用电可擦除存储器可以将fpga的许多示例重新配置任意次数,但是在其他示例中,可以使用一次性可编程逻辑元件。例如,逻辑块和开关可以使用熔丝、反熔丝或rom掩模被编程,以在逻辑函数不易求逆时对其进行编程。
[0131]
在可重新配置的情况下,fpga通常具有配置端口,该配置端口根据被称为比特流的文件或配置比特流来接收数据。比特流数据被读入到设备中并被用来对逻辑块、开关、块ram和/或硬宏进行编程和配置。当期望新设计时,可以擦除配置并将新设计配置在设备中。在一些示例中,可以部分地重新配置fpga以便节省编程时间。例如,可以在现场动态地重新配置逻辑块、开关或块ram的子集,而无需重新编程整个设备。
[0132]
使用所公开的技术,可以实现更高的性能和/或更高效的结构。此外,应该容易理解,虽然fpga的一些示例是独立的集成电路,但是在其他示例中,fpga可以被不同地封装,例如被封装在多芯片模块(mcm)中,或者作为定制或基本片上系统(soc)被封装在相同的电路管芯上。
[0133]
图8是图示可以被配置来形成示例fpga集成电路的逻辑结构的一部分的四个可重新配置的逻辑块810、811、812和813的框图800。所示的可重新配置的逻辑块内部的组件是相同的或同类的,但是应该容易理解,在其他示例中,在单个fpga上可以存在多于一种类型的可重新配置的逻辑块。
[0134]
第一可重新配置的逻辑块810包括六输入查找表(lut)820,其耦合到进位逻辑830、多个多路复用器840和845、以及存储元件(这里是d正反器)850。可以使用小存储器(例如,如图所示的具有六个地址位和两个输出位的存储器)来实现lut 820。因此,任何六输入布尔函数都可以通过使用单个lut来实现。在一些示例中,可以组合lut的输出,或者可重新配置的逻辑块可以具有多个lut,多个lut可以连接在一起以便执行更复杂的逻辑函数。在一些示例中,除了lut之外,还可以提供共同逻辑函数。例如,进位逻辑830可以被配置为执行用于加法器的进位传播逻辑。多路复用器被用来选择来自其他组件中的各种输出。例如,多路复用器840可以被用来选择lut 820或进位逻辑830的输出,而多路复用器845可以被用来选择lut 820或多路复用器840的另一输出。在一些示例中,多路复用器被用来选择状态元件(例如正反器850)的顺序输出或者查找表的组合输出。对于受益于本公开的本领域普通技术人员来说应该容易理解,可以在可重新配置的逻辑元件中采用不同的逻辑函数、lut大小和顺序元件。因此,用于将神经网络映射到这种可重新配置的逻辑的技术可以取决于特定目标fpga架构而变化。可以使用fpga的配置端口对可重配置的逻辑块内部的逻辑的配置进行编程。在一些示例中,lut不被编程一次,而是可以被配置为充当存储神经网络中使用的某些数据的小存储器。
[0135]
在所公开的技术的一些示例中,逻辑综合工具(逻辑编译器)被用来将针对bfp函数的规范转换为配置比特流,该配置比特流可以被应用于fpga的配置端口以配置用以实现多处理器200或神经网络的一部分的逻辑。在一些示例中,设计者可以使用rpm(经关系地放置的宏)方法来改善面积和互连延迟并实现可重复布局,以便于在模块组成和大规模复制下容易地路由和时序收敛。例如,通过包括结构rtl实例化模块并将它们平铺到调度器中,可以将用于指令调度器的逻辑锁定到单个lut的集合,允许fpga内的紧凑的集群和逻辑放置。
[0136]
xi.到商业fpga的示例映射
[0137]
图9是来自用于stratix v fpga的altera公司数据表的框示意图900,其图示了来自图5的dsp块及其数据路径。输入寄存器(510、515、520和525)被示出在左手侧,乘法器和求和运算位于中心,并且累加器寄存器530被示出在右侧。
[0138]
图10是示例框示意图1000,其进一步详述了与altera公司制造的示例fpga中实现的相同dsp的资源的利用。输入寄存器(510、515、520和525)被示出在左侧,但是将权重从左到右传递并且将输入从上到下传递的数据路径未被示出。由于altera stratix v fpga的实现细节,不可能在dsp中包含这些区域,并且它们是使用dsp外部的逻辑来实现的。
[0139]
xii.利用共用共同指数的矩阵的示例运算方法
[0140]
图11是概述用矩阵和/或向量执行数学运算的示例方法的流程图1100,该矩阵和/或向量的元素在它们相应的矩阵或向量的两个或更多个值之间共用共同指数。将尾数值存储在每个矩阵或向量中。
[0141]
在过程框1110处,由矩阵或向量产生块浮点(bfp)表示,其中相应矩阵或向量的至少两个元素共用共同指数。例如,矩阵或阵列中的一个或多个可以包括16位尾数值并且引用共同指数。产生bfp表示可以包括对尾数移位,以便符合所选择的共同指数。在一些示例中,多个矩阵或向量中的每个包括带符号或无符号的尾数的阵列。在一些示例中,将共用共同指数存储在存储器中的单个位置处。在一些示例中,共同指数应用于被存储在相应矩阵或向量中的所有值。在其他示例中,可以将共同指数应用于相应矩阵或向量的多个行的集合。例如,每行可以具有其自己的相关联的共同指数。在一些示例中,矩阵的一部分与共同指数相关联。例如,可以将矩阵划分成四等分,并且矩阵的每个部分(例如,左上、右上、左下、右下)可以与不同的共同指数相关联。如受益于本公开的本领域普通技术人员将容易理解的,在一些示例中,向量矩阵的一些元素共用共同指数,而矩阵或向量的其他元素可以共用不同的共同指数,而另外的其他元素可以与唯一的指数相关联。在一些示例中,可以以不同的表示形式将矩阵或向量的一些元素例如表达为固定点数、整数、代号或其他形式。
[0142]
在过程框1120处,在矩阵和/或向量上执行数学运算以产生输出矩阵或向量。例如,矩阵可以与矩阵相乘,矩阵可以与向量相乘,向量可以与向量相乘,或者向量可以与矩阵相乘。其他合适的运算,包括sigmoid函数、双曲正切、矩阵求逆、除法、加法、减法或其他合适的矩阵运算,可以作为数学运算的至少一部分而被执行。在一些示例中,执行数学运算包括将被存储在多个矩阵或向量中的第一矩阵或向量中的尾数与被存储在多个矩阵或向量中的第二矩阵或向量中的尾数相乘。执行数学运算的一些示例包括将用于多个矩阵或向量中的第一矩阵或向量的第一共同指数与用于多个矩阵或向量中的第二矩阵或向量的第二共同指数相加。在一些示例中,执行数学运算包括对第一矩阵或向量中的尾数与被存储在第二矩阵或向量中的尾数执行脉动阵列矩阵乘法。
[0143]
在过程框1130处,选择用于在过程框1120处产生的输出矩阵或向量的全部或一部分的一个或多个经更新的指数。在一些示例中,基于跨输出矩阵或向量中的元素的每个子集的最大绝对值来选择一个或多个指数。在一些示例中,通过确定用于输出矩阵或向量的绝对值的平均值和标准偏差来选择经更新的(多个)共同指数。在一些示例中,基于用于跨矩阵或向量的每个相应子集的值的置信度区间来选择指数中的至少一个。在一些示例中,选择基于由针对输出矩阵或向量的相应部分的预期的所选择的经更新的共同指数所引入
的经评估的误差值和/或动态范围的宽度。例如,可以在表示性的值的动态范围的宽度和输出矩阵与针对输出矩阵的所选择的经更新的(多个)共同指数所引入的误差之间进行折衷。在一些示例中,通过检查上溢条件并调整经更新的(多个)共同指数来选择(多个)共同指数,以避免或最小化这种上溢或下溢条件。在一些示例中,通过使用输出矩阵或向量的预定义的数目的先前元素值来确定(多个)经更新的(多个)共同指数。因此,当执行计算以生成输出矩阵或向量时,(多个)共同指数可以基于值的滚动(rolling)集合。在一些示例中,选择(多个)共同指数包括针对输出矩阵或向量所计算的元素值的一部分计算平均值、标准偏差和/或方差。例如,滚动数目的输出值可以被用于计算滚动平均值、标准偏差或方差。
[0144]
在过程框1140处,针对经更新的矩阵或向量产生bfp表示,其中经更新的矩阵或向量的至少两个元素共用共同指数。在一些示例中,在产生经更新的矩阵或向量之后,可以执行附加的数学运算和/或可以针对数学运算的每次连续迭代更新共同指数。如受益于本公开的本领域普通技术人员将容易理解的,在一些示例中,向量矩阵的一些元素共用共同指数,而矩阵或向量的其他元素可以共用不同的共同指数,而另外的其他元素可以与唯一的指数相关联。在一些示例中,可以以不同的表示形式将矩阵或向量的一些元素例如表达为固定点数、整数、代号或其他形式。
[0145]
在一些示例中,图11中概述的方法可以被用来更新用于神经网络内的节点的相关联的值。由于神经网络中的节点值或权重不一定需要100%准确,因此通过使用共用共同指数引起的舍入或其他误差对于特定神经网络应用可能是可接受的。例如,图11中概述的方法可以被用来更新包括卷积神经网络的神经网络内的一层节点值。对于后续运算,实现可以重复上述在过程框1120、1130和/或1140处的运算,以使用bfp表示来执行附加运算。例如,存储bfp表示的存储器可以重新用于后续运算。可以将过程框1140处的bfp表示乘积转换为另一表示以供其他应用使用。例如,可以将所产生的bfp表示转换为以浮点或定点格式表示的矩阵/向量。此外,在一些示例中,得到的和其他矩阵/向量可以保留在bfp表示中以被用作神经网络评估中的后续级的输入,而不转换为另一表示。
[0146]
xiii.使用自定义功能块配置逻辑器件的示例方法
[0147]
图12是概述如可以在所公开的技术的某些示例中执行的配置可重新配置的逻辑器件的示例方法的流程图1200。例如,上面关于图8和图9讨论的fpga可以被配置为实现图2的多处理器200的全部或一部分,包括神经网络核的一些或全部。
[0148]
在过程框1210处,映射对多处理器组件的描述以重新配置fpga的逻辑器件组件。例如,过程设计者可以以硬件描述语言(诸如systemverilog、systemc、vhdl、verilog或任何其他合适的硬件描述语言的组合)指定对多处理器的描述。在一些示例中,以诸如c、c++或opencl的传统编程语言编写的描述被用来描述多处理器的至少一部分。对多处理器的描述可以包括上面讨论的任何组件。在一些示例中,设计者可以指定要由神经网络硬件的元件作为目标的特定fpga单元。例如,设计者可以指定将脉动矩阵运算映射到fpga的dsp资源。在一些示例中,程序员可以使用由fpga供应商提供的可用宏来实现定制函数单元、fifo缓冲器、移位寄存器以及使用针对该fpga的经济映射的其他组件。在一些示例中,基于对应的fpga结构的宽度来选择尾数的宽度或指数。这可以提高某些fpga实现的效率(例如,通过选择对应于fpga的16或32位宽结构的16位或32位宽格式。
[0149]
在过程框1220处,产生配置比特流,以用于实现包括神经网络节点和层的多处理
器200的电路。例如,可以编译以硬件描述语言表达的对多处理器的描述以生成网表,并且网表继而被用来生成比特流文件。可以将比特流文件中指示的信号应用于fpga的配置接口,以便配置fpga以执行用于根据所公开的技术实现多处理器的功能。
[0150]
在过程框1230处,使用在过程框1220处生成的比特流来配置可重新配置的逻辑器件。例如,一些fpga具有配置端口,其被用来将数据流式传输到fpga的配置存储器中,从而配置fpga。在一些示例中,通过并行或其他可寻址端口来寻址fpga的配置存储器。在一些示例中,具有与fpga类似的结构的可配置的逻辑器件可以被配置一次,但是不被重新配置。在其他示例中,可以电擦除并重写fpga以便提供新配置。在一些示例中,每当集成电路被重新供电时就重新配置fpga,而在其他示例中,fgpa配置维持跨重复的电力循环的状态。
[0151]
xiv.示例计算环境
[0152]
图13图示了合适的计算环境1300的一般化示例,其中可以实现所描述的实施例、技术和科技,包括配置多处理器。例如,计算环境1300可以实现所公开的技术,其用于配置处理器以实现所公开的多处理器架构和神经网络,和/或将代码编译成用于执行如本文所述的包括神经网络的这种运算的计算机可执行指令和/或配置比特流。
[0153]
计算环境1300不旨在对技术的使用范围或功能性提出任何限制,因为技术可以在不同的通用或专用计算环境中实现。例如,所公开的技术可以用其他计算机系统配置来实现,包括手持设备、多处理器系统、可编程消费电子产品、网络pc、小型计算机、大型计算机等。所公开的技术还可以在分布式计算环境中实践,其中由通过通信网络链接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中。
[0154]
参考图13,计算环境1300包括至少一个处理单元1310和存储器1320。在图13中,该最基本配置1330被包括在虚线内。处理单元1310执行计算机可执行指令,并且可以是真实或虚拟处理器。在多处理系统中,多个处理单元执行计算机可执行指令以增加处理能力,并且如此,多个处理器可以同时运行。存储器1320可以是易失性存储器(例如,寄存器、高速缓存、ram)、非易失性存储器(例如,rom、eeprom、闪速存储器等)、或两者的某种组合。存储器1320存储软件1380、图像和视频,其可以例如实现本文所描述的技术。计算环境可以具有附加特征。例如,计算环境1300包括存储装置1340、一个或多个输入设备1350、一个或多个输出设备1360、以及一个或多个通信连接1370。诸如总线、控制器或网络之类的互连机制(未示出)互连计算环境1300的组件。通常,操作系统软件(未示出)为在计算环境1300中执行的其他软件提供操作环境,并协调计算环境1300的组件的活动。
[0155]
存储装置1340可以是可移除的或不可移除的,并且包括磁盘、磁带或盒、cd-rom、cd-rw、dvd或可以被用来存储信息并且可以在计算环境1300内被访问的任何其他介质。存储装置1340存储用于软件1380的指令,其可以被用来实现本文所描述的技术。
[0156]
(多个)输入设备1350可以是触摸输入设备,诸如键盘、小键盘、鼠标、触摸屏显示器、笔或轨迹球、声音输入设备、扫描设备或向计算环境1300提供输入的另一设备。对于音频,(多个)输入设备1350可以是接受模拟或数字形式的音频输入的声卡或类似设备,或者是向计算环境1300提供音频样本的cd-rom读取器。(多个)输出设备1360可以是显示器、打印机、扬声器、cd刻录机或提供来自计算环境1300的输出的另一设备。
[0157]
(多个)通信连接1370实现通过通信介质(例如,连接网络)与另一计算实体进行通信。通信介质递送诸如计算机可执行指令、压缩图形信息、视频或经调制的数据信号中的其
他数据之类的信息。(多个)通信连接1370不限于有线连接(例如,兆位或千兆位以太网、infiniband、电或光纤连接上的光纤信道),而是还包括无线技术(例如,经由蓝牙的rf连接、wifi(ieee 802.11a/b/n)、wimax、蜂窝、卫星、激光、红外线)和用于为所公开的方法提供网络连接的其他合适的通信连接。在虚拟主机环境中,(多个)通信连接可以是由虚拟主机提供的虚拟化网络连接。
[0158]
可以使用在计算云1390中实现所公开技术的全部或一部分的计算机可执行指令来执行所公开的方法的一些实施例。例如,利用位于计算环境中的服务器来实现所公开的编译器、处理器和/或神经网络,或者可以在位于计算云1390中的服务器上实现所公开的编译器、处理器和/或神经网络。在一些示例中,所公开的编译器在传统的中央处理单元(例如,risc或cisc处理器)、扩展到包括向量处理指令的中央处理单元或向量处理器上执行。
[0159]
计算机可读介质是可以在计算环境1300内访问的任何可用介质。作为示例而非限制,利用计算环境1300,计算机可读介质包括存储器1320和/或存储装置1340。如应该容易理解的,术语计算机可读存储介质包括用于数据存储的介质,诸如存储器1320和存储装置1340,而不是诸如经调制的数据信号之类的传输介质。
[0160]
xv.所公开的技术的附加示例
[0161]
如受益于本公开的本领域普通技术人员将显而易见的,取决于要被执行的期望应用或功能,所公开的方法、装置和计算机可读存储介质可以以各种组合和子组合彼此组合。例如,在所公开的技术的一些示例中,一种方法包括:产生多个矩阵或向量的块浮点(bfp)表示,其中相应矩阵或向量的至少两个元素共用共同指数;在多个矩阵或向量中的两个或多个矩阵或向量上执行数学运算;产生输出矩阵或向量;基于输出矩阵或向量,选择针对输出矩阵或向量的至少两个或更多个元素的经更新的共同指数;以及产生经更新的矩阵或向量的bfp表示,经更新的矩阵或向量的至少两个元素共用共同指数。在该方法的一些示例中,在两个矩阵上执行数学运算。在一些示例中,在矩阵和向量上执行数学运算。在一些示例中,在两个向量上执行数学运算。在一些示例中,数学运算是矩阵乘法、除法、加法或减法之一。在一些示例中,数学运算包括标量向量(例如,偏置向量)的加法或减法。在一些示例中,数学运算包括其他矩阵运算,诸如求逆、分解、转置或行列式的计算。
[0162]
在所公开的技术的一些示例中,利用bfp实现执行的矩阵或向量运算包括:通过将针对两个矩阵(或矩阵和向量、或向量和向量)的尾数元素相乘并调整针对两个矩阵的输出共同指数来执行矩阵乘法,以产生输出的经相乘的矩阵(或向量)。例如,可以将两个共同指数相加。在其他示例中,采用选择共同指数的不同方式(例如,通过选择指数来减少输出bfp表示中的误差)。一些示例包括:通过除以针对两个矩阵的多个尾数元素中的每个尾数元素并且调整相应的共同指数来执行矩阵除法,从而产生输出的经相除的矩阵。例如,可以从一个共同指数中减去另一共同指数。在其他示例中,采用选择共同输出指数的不同方式(例如,通过选择指数来减少输出bfp表示中的误差)。一些示例包括将一个矩阵的尾数移位并将经移位的尾数与第二矩阵的尾数元素相加。选择经更新的共同指数来表示得到的输出矩阵(例如,通过相应地增大指数)。在一些示例中,通过将一个矩阵的尾数移位并减去尾数元素,从第二矩阵中减去一个矩阵,然后选择经更新的共同指数以表示得到的输出矩阵(例如,通过相应地减小指数)。在一些示例中,可以选择结果中的不同共同指数以提高结果矩阵的精度。
[0163]
在所公开的技术的一些示例中,多个矩阵或向量包括带符号或无符号的尾数的阵列。在一些示例中,将共用共同指数存储在存储器中的单个位置处。在一些示例中,共同指数应用于被存储在相应矩阵或向量中的所有值。在其他示例中,可以针对相应矩阵或向量的多个行的集合应用共同指数。例如,每行可以具有其自己的相关联的共同指数。在一些示例中,矩阵的一部分与共同指数相关联。例如,可以将矩阵划分为四等份,并且矩阵的每个部分,例如,左上、右上、左下、右下,可以与不同的共同指数相关联。可以将用于矩阵和共用指数的值存储在任何合适的存储器存储设备中。例如,可以将矩阵和共用指数存储在可寻址存储器(例如,动态随机存取存储器(dram,包括ddr、ddr2等,dram)、嵌入式dram(edram)或静态随机存取存储器(sram)、锁存器阵列、正反器阵列、寄存器文件、块随机存取存储器(block ram)(有时称为“存储器块”)、先进先出(fifo)缓冲器或移位寄存器中。在一些示例中,将用于矩阵的值存储在可寻址存储器或寄存器文件中,并且将用于共用指数的值存储在多个正反器或锁存器中。在一些示例中,诸如正反器或寄存器的存储装置被分配以静态地存储用于共用指数的值(例如,一个寄存器存储bfp处理的特定级处的所有指数值,或者矩阵的每列/行分配一个寄存器)。在一些示例中,存储装置被分配以动态地存储指数。在一些示例中,可以通过执行表查找来访问指数值(例如,通过使用矩阵的行、列对作为索引来标识共用指数存储位置)。
[0164]
在所公开的技术的一些示例中,一种执行数学运算的方法还包括:将针对多个矩阵或向量中的第一矩阵或向量的第一共同指数与针对多个矩阵或向量中的第二矩阵或向量的第二共同指数相加。在一些示例中,执行数学运算还包括:对被存储在多个矩阵或向量中的第一矩阵或向量中的尾数与被存储在多个矩阵或向量中的第二矩阵或向量中的尾数执行脉动阵列矩阵乘法。在一些示例中,执行数学运算还包括:将偏置向量与多个矩阵或向量的乘积相加或相减。在一些示例中,执行数学运算还包括:对多个矩阵或向量的乘积执行附加函数。附加函数可以是线性函数、非线性函数、激活函数、传递函数或针对特定应用选择的其他函数。在用于神经网络处理的方法的示例中,经常将sigmoid、双曲正切(tanh)或其他类似函数应用于向量结果。
[0165]
在所公开的技术的一些示例中,选择经更新的共同指数包括:计算针对输出矩阵或向量所计算的部分但不是所有输出元素值的平均值、标准偏差和/或方差。在示例中,选择经更新的共同指数包括:评估由针对输出矩阵向量的所选择的经更新的共同指数引入的误差。在所公开的技术的一些示例中,针对bfp表示中的矩阵或向量中的所有值选择单个共同指数。在一些示例中,共同指数被用于多个矩阵或向量中的相应矩阵或向量中的一些但不是所有值。在一些示例中,行中、列中或整个阵列中的所有元素可以具有不同的尾数并且共用共同指数。在一些示例中,矩阵或向量的两个或更多个元素的指定组合和子组合可以共用共同指数。在一些示例中,矩阵或向量的两个或更多个元素的任意组合可以共用共同指数。在一些示例中,诸如正反器或寄存器之类的存储装置被分配以静态地存储用于共用指数的值(例如,一个寄存器存储bfp处理的特定级处的所有指数值,或者矩阵的每列/行分配一个寄存器)。在一些示例中,存储装置被分配以动态地存储指数。在一些示例中,可以通过执行表查找来访问指数值(例如,通过使用矩阵的行、列对作为索引来标识共用指数存储位置)。
[0166]
在一些示例中,所执行的数学运算包括:执行矩阵乘法,并且将针对多个矩阵或向
量中的第一矩阵或向量的第一共同指数与针对多个矩阵或向量中的第二矩阵或向量的第二共同指数相加。在一些示例中,数学运算包括:执行矩阵除法,并且从针对多个矩阵或向量中的第二矩阵或向量的第二共同指数中减去针对多个矩阵或向量中的第一矩阵或向量的第一共同指数。在一些示例中,数学运算包括:执行矩阵加法或减法,并且对多个矩阵或向量中的至少一个矩阵或向量的尾数移位。在一些示例中,将偏置向量与数学运算的结果相加。在一些示例中,激活函数被应用于数学运算的结果。在一些示例中,将偏置向量与结果相加,并且将激活函数应用于具有经相加的偏置向量的结果。
[0167]
在所公开的技术的一些示例中,该方法还包括:利用由执行数学运算所产生的元素值来更新用于神经网络的节点值。在一些示例中,神经网络是dnn、cnn、lstm或gru。在一些示例中,使用通用处理器来实现神经网络,通用处理器包括适于使用诸如sse、sse2或avx x86_64指令的向量或simd指令的通用处理器。用于所公开的方法的神经网络硬件还可以包括向量处理器、定制集成电路、专用集成电路(asic)、现场可编程门阵列(fpga)、图形处理单元(gpu)、神经网络处理器和/或数字信号处理组件。
[0168]
在一些示例中,该方法还包括重复以下动作:执行数学运算,选择经更新的共同指数,以及利用经更新的共同指数产生经更新的矩阵或向量的bfp表示。
[0169]
在该方法的一些示例中,使用用于矩阵乘法的装置,执行数学运算。在一些示例中,使用用于共同指数更新的装置,执行通过选择经更新的共同指数来执行数学运算。在一些示例中,使用用于产生矩阵或向量的bfp表示的装置,执行通过产生经更新的矩阵或向量的bfp表示来执行数学运算。在一些示例中,采用用于执行数学运算的前述技术中的任何两个或全部三个技术。
[0170]
在一些示例中,该方法包括对可重新配置的逻辑器件和/或数字信号处理组件进行编程以执行所述方法动作中的一个或多个。例如,配置存储器可以被用来在发起所述方法动作的执行之前对fpga进行编程。
[0171]
在所公开的技术的一些示例中,一种方法包括在多个矩阵或向量中的两个或更多个矩阵或向量上执行数学运算;产生块浮点表示(bfp)输出矩阵或向量,相应矩阵或向量的至少两个尾数共用共同指数;以及针对输出矩阵或向量的两个或更多个值选择经更新的共同指数。在该方法的一些示例中,在两个矩阵上执行数学运算。在一些示例中,在矩阵和向量上执行数学运算。在一些示例中,在两个向量上执行数学运算。在一些示例中,数学运算是矩阵乘法、除法、加法或减法之一。在一些示例中,数学运算包括标量向量(例如,偏置向量)的加法或减法。在一些示例中,数学运算包括其他矩阵运算,例如求逆、分解、转置或行列式的计算。
[0172]
在该方法的一些示例中,多个矩阵或向量包括带符号或无符号的尾数的阵列。在一些示例中,将共用共同指数存储在存储器中的单个位置处。在一些示例中,共同指数应用于被存储在相应矩阵或向量中的所有值。在其他示例中,可以将共同指数应用于相应矩阵或向量的多个行的集合。例如,每行可以具有其自己的相关联的共同指数。在一些示例中,矩阵的一部分与共同指数相关联。
[0173]
在该方法的一些示例中,选择经更新的共同指数包括:确定针对输出矩阵或向量的平均值、标准偏差或绝对值的平均值和标准偏差。在一些示例中,该方法包括:基于针对输出矩阵或向量的值的置信度区间来选择指数。在一些示例中,选择经更新的共同指数基
于针对输出矩阵或向量所计算的预定数目的先前输出元素值。对于该示例,预定数目可以是任何合适数目的值,包括:1、2、4、8、16、32、48、64、128、256、512、1024或8192。在一些示例中,先前的输出元素值不是动态地被计算的,而是在对bfp表示执行运算之前被静态地指派。在该方法的一些示例中,对于多个矩阵或向量中的相应矩阵或向量中的一些但不是所有值应用共同指数。在一些示例中,使用单个共同指数。在一些示例中,针对矩阵的每行或列指派共同指数。在一些示例中,选择经更新的共同指数包括:评估由针对输出矩阵向量的所选择的经更新的共同指数引入的误差。例如,可以计算误差量级并将其与预定值进行比较,以确定是否调整所选择的共同指数。
[0174]
在所公开的技术的一些示例中,用于使用bfp表示来执行矩阵和/或向量运算的系统包括被配置为控制神经网络的运算的通用处理单元和存储器;以及
[0175]
在所公开的技术的一些示例中,系统被配置为利用由执行数学运算所产生的元素值来更新用于神经网络的节点值。在一些示例中,神经网络是dnn、cnn、lstm或gru。在一些示例中,使用通用处理器来实现神经网络,通用处理器包括适于使用诸如sse、sse2或avx x86_64指令的向量或simd指令的通用处理器。用于所公开的方法的神经网络硬件还可以包括向量处理器、定制集成电路、专用集成电路(asic)、现场可编程门阵列(fpga)、图形处理单元(gpu)、神经网络处理器和/或数字信号处理组件。在不使用神经网络的其他应用的示例中,可以采用类似的硬件来对bfp表示进行运算,包括上述通用或专用处理器、asic、soc、fpga、和/或dsp。
[0176]
在系统的一些示例中,可以将针对矩阵和共用指数的值存储在任何合适的存储器存储设备中。例如,可以将矩阵和共用指数存储在可寻址存储器(例如,动态随机存取存储器(dram,包括ddr、ddr2等,dram)、嵌入式dram(edram)或静态随机存取存储器(sram)、锁存器阵列、正反器阵列、寄存器文件、块随机存取存储器(block ram)(有时称为“存储器块”)、先进先出(fifo)缓冲器或移位寄存器中。在一些示例中,将用于矩阵的值存储在可寻址存储器或寄存器文件中,并且将用于共用指数的值存储在多个正反器或锁存器中。在一些示例中,诸如正反器或寄存器的存储装置被分配以静态地存储用于共用指数的值(例如,一个寄存器存储bfp处理的特定级处的所有指数值,或者矩阵的每列/行分配一个寄存器)。在一些示例中,存储装置被分配以动态地存储指数。在一些示例中,可以通过执行表查找来访问指数值(例如,通过使用矩阵的行、列对作为索引来标识共用指数存储位置)。
[0177]
在一些示例中,系统还被配置为执行运算,包括在多个矩阵或向量中的两个或更多个矩阵或向量上执行数学运算;产生输出矩阵或向量;基于输出矩阵或向量,选择经更新的共同指数;以及产生经更新的矩阵或向量的bfp表示,经更新的矩阵或向量的至少两个元素共用共同指数。在一些示例中,系统被配置为将多个共同指数中的一个共同指数指派给用于矩阵或向量中的每个元素的相应尾数。
[0178]
在一些示例中,利用可重新配置的逻辑器件(包括例如fpga)来执行运算。利用可重新配置的逻辑器件执行的运算可以包括:将针对一系列输出矩阵或向量的尾数和/或指数存储在存储器中,其中选择经更新的共同指数基于被存储在存储器中的尾数和/或指数。用于存储矩阵和/或向量的存储器可以包括以下中的任何一个或多个:可寻址存储器、寄存器文件、块随机存取存储器(ram)、fifo缓冲器或移位寄存器。在一些示例中,系统还执行:将针对多个矩阵或向量中的第一矩阵或向量的第一共同指数与针对多个矩阵或向量中的
第二矩阵或向量的第二共同指数相加。
[0179]
在一些示例中,数学运算是矩阵乘法、除法、加法或减法之一。在一些示例中,数学运算包括标量向量(例如,偏置向量)的加法或减法。在一些示例中,数学运算包括其他矩阵运算,诸如求逆、分解、转置或行列式的计算。在一些示例中,运算包括多个运算。
[0180]
在所公开的技术的一些示例中,该系统包括具有多个神经处理核的多处理器。在一些示例中,该系统包括定序器。在一些示例中,该系统包括耦合到单个函数列(例如,乘法器列)的定序器。在其他示例中,两个或更多个函数列(例如,两个或更多个乘法器列)耦合到定序器并被用来执行bfp表示运算,包括脉动阵列乘法。在一些示例中,函数列包括输入缓冲器,其被配置为从被存储在存储器中的矩阵或向量接收操作数。在一些示例中,乘法器列包括乘法器和加法器。在其他示例中,代替乘法器和加法器或者除了乘法器和加法器之外还提供其他函数单元,包括减法器、除法器、加法器或移位器。在一些示例中,乘法器列包括被配置为对输入元素执行所选择的运算的一个或多个算术和逻辑单元(alu)。在一些示例中,提供函数单元以将激活、传递或其他函数应用于列中的先前函数单元的输出。在使用两个或更多个函数列的示例中,可以使用中继将操作数从第一列发送到第二列,或者发送去往和来自耦合列的操作数。在一些示例中,函数列包括输出缓冲器,以用于将列的操作数输出到例如定序器。
[0181]
在所公开的技术的一些示例中,一个或多个计算机可读存储设备或存储器存储计算机可读指令,该计算机可读指令在由计算机执行时使计算机执行所公开的方法中的至少任一个方法。在一些示例中,系统被配置为执行所公开的方法中的至少任一个方法。在一些示例中,系统耦合到存储计算机可读指令的计算机可读存储设备或存储器,该计算机可读指令在被执行时使系统执行所公开的方法中的至少任一个方法。
[0182]
鉴于可以应用所公开的主题的原理的许多可能的实施例,应该认识到,所图示的实施例仅是优选的示例,并且不应被视为将权利要求的范围限制于那些优选的示例。而是,所要求保护的主题的范围由以下权利要求来限定。因此,我们将落在这些权利要求及其等同物的范围内的全部都要求保护为我们的发明。
技术特征:
1.一种方法,包括:利用包括与可重新配置的逻辑设备、处理器或被配置为实现神经网络的神经网络组件通信的存储器的装置执行以下操作:由所述装置对被存储为块浮点(bfp)表示的多个矩阵或向量执行数学运算,所述块浮点表示包括针对所述多个矩阵或向量的每个元素的相应尾数以及由所述多个矩阵或向量的所述元素中的至少两个元素共享的相应共同指数;由所述装置将所述执行所述数学运算的结果作为输出矩阵或向量存储在所述存储器中;由所述装置利用加法器电路产生结果指数,所述加法器电路接收所述多个矩阵或向量的所述相应共同指数中的至少两个共同指数,并且将所述结果指数存储在所述存储器中;由所述装置基于所述结果指数以及基于包括所述输出矩阵或向量中的值的绝对值集合的平均值和标准偏差来更新针对所述输出矩阵或向量的至少两个或更多个元素的所述相应共同指数,由此产生经更新的共同指数;以及由所述装置将经更新的矩阵或向量的bfp表示存储在所述存储器中,所述经更新的矩阵或向量的至少两个元素共享所述经更新的共同指数。2.根据权利要求1所述的方法,其中,所述更新所述共同指数包括对所述输出矩阵或向量的预定数量的元素进行采样。3.根据权利要求1所述的方法,还包括通过维持将共享共同指数的值的累计和并且除以值的数量来确定所述平均值。4.根据权利要求1所述的方法,还包括通过以累计方式计算值来确定所述标准偏差。5.根据权利要求1所述的方法,还包括将所述绝对值集合存储在先进先出(fifo)缓冲器或移位寄存器中。6.根据权利要求1所述的方法,其中,所述经更新的共同指数被确定为保留所述输出矩阵或向量的最大值。7.根据权利要求6所述的方法,其中,所述经更新的共同指数是通过计算所述最大值的log2来确定的。8.根据权利要求7所述的方法,其中,所述经更新的共同指数是进一步通过利用对所述最大值的log2计算而计算整数下限函数或整数上限函数来确定的。9.根据权利要求1所述的方法,还包括通过以下操作来确定所述绝对值集合中的一些绝对值:对被存储为块浮点(bfp)表示的多个矩阵或向量执行数学运算,所述块浮点表示包括由所述多个矩阵或向量的至少两个元素共享的共同指数,由此产生输出矩阵或向量。10.根据权利要求1所述的方法,其中,所述共同指数是由所述多个矩阵或向量中的至少一个矩阵或向量的所有元素共享的。11.一个或多个存储计算机可读指令的计算机可读存储介质,所述计算机可读指令当由处理器运行时使得所述处理器执行根据权利要求1所述的方法。12.一种装置,包括:处理器,其被配置为实现神经网络;以及存储器,其被配置为存储针对所述神经网络的至少一部分的节点值,所述节点值中的
至少两个节点值包括相应尾数并且共享被存储在所述存储器中的共同指数;其中,所述处理器还被配置为使用所存储的节点值来执行针对所述神经网络的操作,所述操作包括:通过重复地对至少一个矩阵执行连续操作并且确定针对所述至少一个矩阵的连续元素的期望值来更新所述共同指数,由此产生经更新的共同指数,产生具有块浮点(bfp)表示的经更新的矩阵,所述块浮点表示包括通过根据所述共同指数对尾数进行移位而确定的至少一个值,以及将所述经更新的共同指数存储在所述存储器中。13.根据权利要求12所述的设备,其中:所述存储器包括存储器的至少一个子单元,其包括以下中的至少一项:锁存器阵列、正反器阵列、寄存器堆、块随机存取存储器、先进先出(fifo)缓冲器或移位寄存器;并且所述连续元素被存储在所述存储器的子单元中以用于确定所述期望值。14.根据权利要求12所述的装置,其中,所述存储器存储针对所述连续元素的累计和。15.根据权利要求12所述的装置,还包括用于控制所述操作的执行的定序器。16.根据权利要求12所述的装置,还包括:指数加法器,其被配置为将向量指数与矩阵指数相加并且输出结果指数:输出指数选择器,其被耦合以从所述指数加法器接收所述结果指数并且执行所述更新所述共同指数,由此输出所述共同指数;以及输出尾数移位器,其被耦合以从所述输出指数选择器接收所述经更新的共同指数并且被配置为使用所述经更新的共同指数来执行所述移位所述尾数以产生所述经更新的矩阵。17.根据权利要求12所述的装置,其中,所述处理器或所述存储器中的至少一个是使用以下中的至少一项来实现的:向量处理器、定制集成电路、专用集成电路(asic)、现场可编程门阵列(fpga)、可重新配置的逻辑设备、图形处理单元(gpu)、神经网络处理器或数字信号处理组件。18.一种存储计算机可读指令的计算机可读存储设备,所述计算机可读指令当由可重新配置的逻辑设备、处理器或神经网络组件运行时,使得所述处理器实现用于实现神经网络训练或评估的方法,所述指令包括:用于执行操作以产生具有块浮点(bfp)表示的至少一个矩阵的指令,所述块浮点表示包括具有尾数并且共享共同指数的值的块;用于存储基于针对所述块的所述尾数的第一最大绝对值的滚动值的指令;用于基于以下中的至少一项来预测针对执行操作的下一次迭代的第二最大绝对值的指令:所述第一最大绝对值、所存储的滚动值的标准偏差、所存储的滚动值的平均值或所述共同指数;用于基于所预测的第二最大绝对值来调整所述共同指数的指令;用于产生具有包括来自所述至少一个矩阵的一个或多个值的块浮点(bfp)表示的经更新的矩阵的指令,所述值中的至少一个值具有根据经调整的共同指数而移位的尾数;用于将针对所述经更新的矩阵的尾数值存储在随机存取存储器中的指令;以及用于将所述共同指数存储在寄存器或正反器中的指令。19.根据权利要求18所述的计算机可读存储设备,其中,用于调整所述共同指数的所述
指令还包括用于确定针对所述至少一个矩阵的所述连续元素的平方的期望值的指令。20.根据权利要求18所述的计算机可读存储设备,其中,所述共同指数是基于针对所述连续元素而确定的置信区间来调整的。21.根据权利要求18所述的计算机可读存储设备,其中,用于调整所述共同指数的所述指令包括用于计算误差幅度并且比较所计算出的误差幅度以确定是否根据针对所述至少一个矩阵的所述连续元素的先前共同指数来调整所述共同指数的指令。22.根据权利要求18所述的计算机可读存储设备,其中,所述共同指数应用于被存储在所述至少一个矩阵中的所有所述值。23.根据权利要求18所述的计算机可读存储设备,其中,所述共同指数是通过检查上溢条件或下溢条件并且调整所述共同指数以避免或最小化所述上溢条件或所述下溢条件来调整的。24.根据权利要求18所述的计算机可读存储设备,还包括用于将所述经更新的矩阵存储在计算机可读存储设备或存储器中的指令。25.根据权利要求18所述的计算机可读存储设备,其中,针对所述矩阵或向量的所述相应尾数被存储在所述可重新配置的逻辑设备的块ram或存储器块中。26.根据权利要求25所述的计算机可读存储设备,其中,所述相应共同指数被存储在luts、正反器或寄存器中,而不被存储在块ram或存储块中。27.根据权利要求18所述的计算机可读存储设备,其中,针对所述矩阵或向量的所述相应尾数被存储在块ram或存储块中,并且所述相应共同指数不被存储在块ram或存储器块中。28.根据权利要求18所述的计算机可读存储设备,还包括用于在所述执行所述数学运算之前通过以下操作选择所述相应共同指数的指令:计算针对多个矩阵或向量中的至少一个矩阵或向量的所述绝对值的最大值;基于所述绝对值的所述最大值的log2来计算前导一位置;以及选择所述相应共同指数作为所述前导一位置减去所述尾数的宽度加二。29.根据权利要求28所述的计算机可读存储设备,其中,所述尾数是16位尾数,并且所述共同指数是5位。30.根据权利要求28所述的计算机可读存储设备,还包括:用于检测针对所述尾数在所述矩阵中共享共同指数的上溢条件或下溢条件的指令,并且响应于所述检测:用于根据所述上溢条件或所述下溢条件来移位所述矩阵中的尾数的指令。31.根据权利要求30所述的计算机可读存储设备,还包括:用于响应于所述检测而清除所述滚动值的指令。
技术总结
公开了包括在神经网络的实现中的用于执行块浮点(BFP)运算的装置和方法。一个或多个矩阵或向量的全部或一部分可以共用一个或多个共同指数。公开了用于选择共用的共同指数的技术。在所公开的技术的一些示例中,方法包括:产生矩阵或向量的BFP表示,相应矩阵或向量的至少两个元素共用共同指数;在多个矩阵或向量中的两个或更多个矩阵或向量上执行数学运算;以及产生输出矩阵或向量。基于输出矩阵或向量,选择一个或多个经更新的共同指数,并且产生经更新的矩阵或向量,其具有共用经更新的共同指数的一些元素。同指数的一些元素。同指数的一些元素。
技术研发人员:R
受保护的技术使用者:微软技术许可有限责任公司
技术研发日:2017.12.01
技术公布日:2023/10/19
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/