一种基于FPGA实现稀疏化GRU神经网络的硬件加速器及方法与流程

文档序号:11177856阅读:588来源:国知局
一种基于FPGA实现稀疏化GRU神经网络的硬件加速器及方法与流程
本申请要求于2016年8月22日提交的美国专利申请no.15/242,622、于2016年8月22日提交的美国专利申请no.15/242,624、于2016年8月22日提交的美国专利申请15/242,625的优先权。其全部内容在此参考并入。发明领域本发明涉人工智能领域,特别地,本发明涉及一种基于fpga实现稀疏化gru神经网络的硬件加速器及方法。
背景技术
:rnn简介循环神经网络(rnn)是一类人工神经网络,其中单元之间的连接形成有向循环。这创建了网络的内部状态,其允许其展现动态的时间行为。rnn可以通过具有循环隐藏状态来处理可变长度序列,其中每个时刻的激活依赖于先前时刻的激活。传统地,标准rnn以如下方式计算下一步骤的隐藏层:ht=f(w(hh)ht-1+w(hx)xt)其中f是平滑的有界函数,例如逻辑s形函数(logisticsigmoidfunction)或双曲正切函数。w(hh)是状态到状态的循环权重矩阵,w(hx)是输入到隐藏权重矩阵。输入序列是x=(x1,...,xt)。我们可以将任意长度的序列的概率分解为:p(x1,...,xt)=p(x1)p(x2|x1)p(x3|x1,x2)…p(xt|x1,...,xt-1)然后,如图1所示,我们可以训练rnn来对该概率分布建立模型,给定隐藏状态ht,使其预测下一个符号xt+1的概率。其中ht是所有先前符号x1,x2,...xt的函数:p(xt+1|x1,…,xt)=f(ht)隐藏层激活通过从t=1到t和从n=2到n重复以下等式来计算:其中w项表示权重矩阵(例如wihn是将输入连接到第n个隐藏层的权重矩阵,wh1h1是第一隐藏层的循环连接,等等),b项表示偏置向量(例如by是输出偏置向量),h是隐藏层函数。给定隐藏序列,输出序列的计算如下:其中y是输出层函数。因此,完整网络定义了这样一个函数,由权重矩阵作为参数,从输入历史序列x(1:t)到输出向量yt。图2示出了rnn的基本网络框架,其中上一次隐藏层的输出作为这一次隐藏层的输入,即当前层的输出仅和上一层的隐藏层、当前层的输入有关。gru简介门控循环单元(gatedrecurrentunit,gru)是rnn的一种。gru可以根据输入信号来记忆或者忘记状态。gru的结构如图3所示。rt=σ(w(r)xt+u(r)ht-1)其中,重置门rt的计算如下:更新门的计算与重置门相似,如下:zt=σ(w(z)xt+u(z)ht-1)候选激励值的计算和传统rrn相似,如下:如果重置门是一个全部元素都为零的向量,那么丢掉以前的记忆,只保留新信息。gru在时间t时的激励值是在先激励值和候选激励值之间的线性插值。神经网络的压缩近年来,神经网络的规模不断增长,公开的比较先进的神经网络都有数亿个连接,属于计算和访存密集型应用。现有方案这些算法通常是在通用处理器(cpu)或者图形处理器(gpu)上实现。随着晶体管电路逐渐接近极限,摩尔定律也受到了极大的挑战。在神经网络逐渐变大的情况下,模型压缩就变得极为重要。模型压缩将稠密神经网络变成稀疏神经网络,可以有效减少计算量、降低访存量。稀疏化矩阵的编码:crs和ccs如前所述,对于稀疏矩阵的处理,为了减少内存,往往需要对矩阵进行压缩存储,比较经典的存储方法包括:行压缩(compressedrowstoragecrs)和列压缩存储(compressedcolumnstorageccs)。为了利用激励函数的稀疏性,可以将编码稀疏权重矩阵w存入压缩列存储(ccs)格式的变量中。对于w矩阵每列wj,我们存储一个包含非零权重的向量v,以及等长向量z,向量z用于编码v的相应条目之前零的个数,v和z各自由一个四位数值表示。如果超过15个零出现在一个非零的条目,在向量v中添加一个零。例如,以下列被编码为:[0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3]v=[1,2,0,3],z=[2,0,15,2]。所有列的v和z的都存储在一对大阵列中,其中指针向量p指向每个列的向量的开始。p指针向量中的最后一项指向超过最后一个向量元素,这样pj+1-pj给出了第j列中的非零数(包括填补的零)。通过压缩列存储格式(ccsformat)中列存储稀疏矩阵,使得利用激励函数的稀疏性变得容易。只需要用每个非零激励与其相应列中的所有非零元素相乘。美国专利uspatent9317482“universalfpga/asicmatrix-vectormultiplicationarchitecture”中更详细地披露了如何使用compressedsparserow(csr)在基于cpu和gpu的方案中,其中也采用compressedvariablelengthbitvector(cvbv)format。稀疏神经网络存储需要编码,计算之前需要解码。但是,现有通用处理器(例如gpu或cpu)并不能从稀疏化技术中获得较好的收益。已公开实验表明模型压缩率较低时,现有通用处理器的加速比有限。因此,希望专有定制电路(例如fpga)可以解决上述问题,以使得处理器在较低压缩率下获得更好的加速比。本发明的目的之一是采用高并发流水线设计来设计gru专有定制电路,从而能够有效处理稀疏gru神经网络,从而获得更好的计算效率,更低的处理延时。技术实现要素:本发明提供了一种用于实现稀疏化gru神经网络的装置,包括:输入接收单元,用于接收多个输入向量,并将多个输入向量分配到多个计算单元;多个计算单元,从所述输入接受单元获取输入向量,读取神经网络权值矩阵数据,将其解码后与输入向量进行矩阵运算,并将矩阵运算结果输出至隐含层状态计算模块;隐含层状态计算模块,从所述计算单元pe获取矩阵运算结果,计算出隐含层状态;控制单元,用于进行全局控制。此外,所述每个计算单元进一步包括:稀疏矩阵读取单元,用于读取所述神经网络的权重矩阵w,其中所述权重矩阵w被用于表示所述神经网络中的权重;运算单元,用于执行所述神经网络的乘法运算和加法运算;运算缓存单元,用于存储从所述运算单元中输出的矩阵运算的中间结果以及最终计算结果,并将矩阵运算中间结果输出至运算单元,并且将矩阵运算最终计算结果输出至数据组合单元。此外,所述隐含层状态计算模块进一步包括:数据组合单元,用于接收从各个计算单元中的缓存单元输出的矩阵运算的结果,并将其组合成一个完整的运算结果输出至加法器;选择器,从数据组合单元模块和从点乘器接收数据,选择其中之一输入到加法器;wx缓存单元,接收并存储从数据组合单元中输出的矩阵运算计算结果,再根据控制单元的指令将相应运算结果输出至加法器进行计算;加法器,针对分配到所述多个计算单元的各个输入向量,完成gru神经网络算法中的向量累加操作;函数单元,与所述加法器连接,用于实现激活函数;点乘器,从数据组合单元和函数单元接收数据,进行点乘运算,并将运算结果输出至选择器。本发明还提供了一种实现稀疏gru神经网络的方法,所述gru神经网络的矩阵包括:wz,wz是更新门作用于输入数据的权值矩阵,wr,wr是重置门作用于输入数据的权值矩阵,w,w是输入数据变换矩阵,wx,wx是wz、wr和w合并后的结果uz,uz是更新门作用于隐含层的权重矩阵,ur,ur是重置门作用于隐含层的权值矩阵,u,u是隐含层变换矩阵,以及uh,uh是uz、ur和u合并后的结果,输入序列是x=(x1,...,xt),所述方法包括:初始化步骤,完成数据的初始化,包括:将计算wxxt所需所有的数据读入fpga片上内存,包括输入向量x,和输入向量x对应的权值矩阵wx的所有信息;步骤1,计算单元(pes)开始计算wxx,同时将计算uhht-1所需的数据读入fpga片上内存,其中ht-1是隐含层对上一个输入向量的激励值;步骤2,计算单元(pes)计算uhht-1,同时将计算下一个wxx所需数据读入fpga片上内存。;迭代重复执行上述步骤1和步骤2。本发明还提供了一种基于fpga实现压缩后rnn神经网络的方法,包括以下步骤:接收数据,从外部存储器将计算权值矩阵运算所需要的数据加载到fpga片上存储器,所述数据包括输入向量,以及压缩后的权值矩阵数据;解压数据,根据上述接收数据步骤读取的数据以及权值矩阵的压缩方法,利用fpga片上处理器解压出权值矩阵原始数据,并存储至fpga片上存储器;矩阵运算,使用fpga片上乘法器和加法器进行权值矩阵和向量的乘加运算,并把结果向量存储至fpga片上存储器,所述向量包括输入向量以及隐含层的激励值向量;向量加法运算,使用fpga片上加法器进行向量加法运算,并将结果存储在fpga片上存储器,所述向量包括上述矩阵运算的结果向量和偏置向量;激活函数运算,对上述向量加法运算的结果进行激活函数运算,并将结果存储在fpga片上存储器;迭代上述接收数据、解压数据、矩阵运算、向量加法运算、激活函数运算步骤,算出rnn网络的激励值序列,再根据激励值序列利用fpga片上乘法器和加法器进行矩阵运算和向量加法运算计算出gru输出序列。附图说明图1显示了包含隐藏状态的神经网络的模型的例子。图2显示了包含隐藏状态的rnn神经网络的模型例子。图3显示了包含隐藏状态的gru神经网络的模型例子。图4显示了一种用于实现压缩神经网络的高效的硬件设计。图5进一步显示了基于图3所示的硬件设计方案来把工作任务分配到多个计算单元。图6显示了对应图4的某个计算单元(pe0)的矩阵压缩(例如ccs)格式。图7显示了图3的硬件设计方案中的解码器(weightdecoder)部分,用于对编码的矩阵进行解码。图8显示了根据本发明实施例的在一个信道的多个计算单元(pe)的布置。图9显示了根据本发明的实施例的状态机的状态转移。图10a,10b,10c,10d显示了根据本发明的实施例计算输出ht的过程。图11显示了矩阵稀疏性不平衡对计算资源利用的影响。图12显示了根据本发明一个实施例的特定硬件设计来实施神经网络运算的例子。具体实施方法发明人之前的研究成果:采用eie并行处理压缩神经网络本发明的发明人之一曾经提出了一种高效的推理引擎(eie)。为了更好的理解本发明,在此简要介绍eie的方案。图4显示了一种高效的推理引擎(eie),适用于用于机器学习应用的压缩深度神经网络模型,尤其是采用上述ccs或crs格式存储的压缩dnn。中央控制单元(ccu)控制pes的阵列,每个pes计算压缩网络中的一片(slice)。ccu从分布式前置零检测网络接收非零输入激励,并把它们广播给pes。上述方案中,几乎所有eie中的计算对于pes是局部的,除了向所有pes广播的非零输入激励的集合。然而,激励集合和广播的时间并不是关键的,因多数pes需要多种周期来完成每个输入激励的计算。激励队列和负载平衡输入激励向量aj的非零元素和相应的指标索引j被ccu广播到每个pe中的激励队列。如果任何一个pe有一个完整的队列,广播失效。在任何时间,每个pe处理在其队列头部的激励。激励队列:允许每个pe建立一个工作队列,以消除可能出现的过载不平衡。因为在一个给定列j中的非零的数量可能对于不同pe会有所不同。指针读取单元:在激励队列头部的条目的索引j被用来查找开始和结束的指针pj和pj+1,对应于第j列的v和x阵列。为了允许在一个周期中读取两个指针且使用单口sram阵列,在两sram内存库中存储指针,使用地址的lsb在内存库之间进行选择。pj,pj+1总会在不同的内存库中。eie指针的长度是16位。稀疏矩阵读取单元:稀疏矩阵读取单元使用指针的pj,pj+1从稀疏矩阵sram读ij列的该pe片(slice)的非零元素(如果有的话)。sram中的每个条目是8位长度,包含v的4位数据和x的4位数据。为了效率,编码的稀疏矩阵i的pe的片(slice)被存储在64位宽的sram中。因此,每次从sram读取8条。当前指针p的高13位用于选择sram行,低3位选择该行中的八条之一。单个(v,x)条被提供给每个周期的算术单元。运算单元:算术单元从稀疏矩阵读取单元接收(v,x)条,执行乘法累加操作bx=bx+v×aj。索引x是用来索引一个累加器阵列(目的地激励寄存器),而v乘以在激励队列头部的激励值。因为v以4位编码形式存储,它首先通过查表(codebook)扩展成16位定点数。如果在两个相邻的周期上选择相同的累加器,则提供旁路通路,将加法器的输出导向其输入。激励读/写:激励读/写单元包含两个激励寄存器文件,分别容纳一轮fc层计算期间的源激励值和目的地激励值。在下一层,源和目标寄存器文件交换它们的角色。因此,不需要额外的数据传输来支持多层前馈计算。每个激励寄存器文件拥有64个16位激励。这足以容纳64pes的4k激励向量。更长的激励向量可容纳在2kb的激励sram中。当激励向量大于4k长度时,m×v将分批次(batch)完成,其中每个批次的长度是4k或更少。所有本地减法是在寄存器完成,sram只在批次的开始时被读取、在结束时被写入。分布式前置非零检测:输入激励分层次地分布于各个pe。为了利用输入向量稀疏性,我们使用前置非零检测逻辑来选择第一个正向(positive)的结果。每一组4pes进行输入激励的局部前置非零检测。结果被发送到前置非零检测节点(lnzd节点),如图4所示。4个lnzd节点找到下一个非零激励,并发送结果给lnzd节点树。这样的布线不会因为添加pes而增加。在根lnzd节点,正向激励是通过放置在h树的单独导线被广播给所有pes。中央控制单元:中央控制单元(ccu)是根lnzd节点。它与主控器,如cpu通讯,通过设置控制寄存器来监控每个pe的状态。中央单元有两种模式:i/o和计算。在i/o模式,所有的pes闲置,每个pe的激励和权重可以通过与中央单元连接的dma访问。在计算模式,ccu会持续地从源激励存储库顺序收集和发送数值,直到输入长度溢出。通过设置指针阵列的输入长度和起始地址,eie将被指示执行不同的层。图5显示了如何使用多个处理单元(pes),交织计算矩阵w的各个行,分配矩阵w和并行化矩阵向量计算。对于n个pes,pek拥有所有列wi,输出激励bi和输入激励ai,因子i(modn)=k。pek中的列wj的部分被存储为ccs格式,但计数的零仅指这个pe的列的子集的零。每个pe有自己的v,x和p阵列,v,x和p阵列用于编码其所计算的稀疏矩阵的一部分。图5中,显示了矩阵w和向量a和b在4pes交错。相同颜色的元素都存储在相同的pe里。图5中,将输入激励向量a(长度为8)乘以一个16×8权重矩阵w产生一个输出激励向量b(长度为16)在n=4的pes上。a,b和w的元素根据他们的pe配置情况进行颜色编码。每一个pe拥有w的4行,a的2个元素,和b的4个元素。通过扫描向量a以找到它的下一个非零值aj,依据索引j向所有pes广播aj,进行稀疏矩阵×稀疏向量运算。每个pe再将aj乘以在列wj部分的非零元素,在累加器中累加各个部分和,以输出激励向量b中的每个元素。在ccs表示中,这些非零权重被连续存储,每个pe只需沿着其v阵列从位置pj到pj+1-1加载权重。为了寻址输出累加器,通过保持x阵列条目的运行总和,产生对应于每个权重wij的行数i。在图5的例子中,第一个非零是pe2上的a2。a2的值和其列索引2向所有pes广播。每个pe将a2乘以其列2部分中的每个非零值。pe0将a2乘以w0,2和w12,2;pe1在列2中全为零,故不执行乘法;pe2将a2乘以w2,2和w14,2,等等。将每个点积的结果相加到相应的行累加器。例如,pe0计算b0=b0+w0,2a2和b12=b12+w12,2a2。在每层的计算前,累加器被初始化为零。交错(interleaved)ccs表示法有助于利用激励向量a的动态稀疏性,权重矩阵w的静态稀疏性。通过仅广播输入激励a的非零元素,利用了输入激励的稀疏性。a中对应于零的列被完全跳过。交错(interleaved)ccs表示法允许每个pe迅速在每列找到非零并乘以aj。这种组织方式也保持了所有的计算在本地pe,除了广播输入激励以外。图5中的矩阵的交错ccs表示法如图6所示。图6显示了对应图5的pe0的相对索引的存储器布局、间接加权和交错的ccs格式。相对行索引(relativerowindex):当前非零权值与前一个非零权值之间的零元素的个数;列位置(columnpointer):当前“列位置”与前一个“列位置”之差=本列的非零权值的个数。基于图6的编码方式来读取非零权值方式:(1)读取2个连续的“列位置”,求差,该差值=本列的非零权重的个数(2)利用相对行索引,获得该列的非零权重的行位置,从而获得非零权重的行、列位置信息。此外,图6所示的权重值是被进一步压缩后得到的虚拟权重(virtualweight)。图7示出了根据eie的硬件结构中的解码器(weightdecoder)部分。如图7所示,权重查找表(weightlook-up)和索引(indexaccum)对应于图3的权重解码器(weightdecoder)。通过权重查找表和索引,解码器把虚拟权重(例如,4bit)解码为真实权重(例如,16bit)。这是因为压缩dnn模型具有稀疏性,以索引方式存储和编码。在对输入数据进行处理时,压缩dnn的编码权重被解码,通过权重查找表被转换为真实权重,再进行计算。本发明提出的改进现有技术方案中gru算法通常是采用通用处理器(cpu)或者图形处理器(gpu)来实现的,稠密gru网络需要较大io带宽、较多存储和计算资源。近年来晶体管电路逐渐接近极限,摩尔定律快走到尽头,同时神经网络的规模还在不断增大,这都给现有处理器带来了挑战。为了适应算法需求,模型压缩技术变得越来越流行。模型压缩后的稀疏神经网络存储需要编码,计算需要解码。当前通用处理器或图形处理器没有硬编解码电路,无法充分享受网络稀疏化带来的好处。因此,本发明的目的在于提供一种稀疏gru网络加速器的实现装置和方法,以便达到提高计算性能、降低响应延时的目的。为此,本发明设计了一种专用电路,支持稀疏化gru网络,采用ping-pong缓存并行化流水线设计,有效平衡io带宽和计算效率,从而获得较好的性能功耗比。图8示出了根据本发明实施例的多个计算单元(pe)的布置.如图8所示,主要包括如下模块:输入接收单元110:该模块用于接收并存储稀疏神经网络的输入向量,并把输入向量发送至运算单元140。该模块还包含多个先进先出缓存单元(fifo),每个计算单元pe对应一个fifo,从而在相同输入向量的情况下能够有效平衡多个计算单元之间计算量的差异。多个计算单元pe可以共享输入向量。fifo深度的设置可以选取经验值,fifo深度过大会造成浪费资源,过小又不能有效地平衡不同pe之间的计算差异。如图8所示,每个计算单元pe还进一步包括如下子模块。位置单元120:该模块用于读取并存储压缩后的稀疏神经网络的指针信息,并将指针信息输出至解码单元130。例如,如果稀疏矩阵采用ccs存储格式,那么位置单元120存储列指针向量(即图6中的第3行)。其中,在输入接收单元110头部的条目的索引j被用来查找开始和结束的列指针pj和pj+1。向量中的pj+1-pj值表示第j列中非零元素的个数。在本发明的一个实施例中,位置单元120包括一对乒乓结构缓存(ping-pongbuffer)。解码单元130:该模块用于存储压缩后的稀疏神经网络的权重信息,并将其输出至运算单元140。在本发明的一个实施例中,权重信息包括相对索引值和权重值等(即图6中的前两行)。在本发明的一个实施例中,信息的读取和处理也由一对乒乓结构缓存(ping-pongbuffer)并行处理。此外,该模块基于位置单元120输出的pj+1和pj值读取权重矩阵中对应的权重值,系统从指针pj移动至pj+1-1即可加载j列的权重值。运算单元140:该模块用于实现乘累加计算,其根据输入接收单元110输出的向量和解码单元130输出的相对索引值以及权重值进行矩阵运算,并把运算结果输出至运算单元缓存150。该运算单元140主要进行以下两步计算:第一步,读取神经元的输入向量和权重值以进行对应的乘法计算;第二步,根据相对索引值读取运算单元缓存150中对应位置历史累加结果,再与第一步结果进行加法运算。运算单元缓存150:该模块用于存储从运算单元140中输出的矩阵运算的中间结果以及最终计算结果,并将矩阵运算中间结果输出至运算单元140,并且将矩阵运算最终计算结果输出至数据组合单元160。在本发明的实施例中,为提高下一级的计算效率,运算单元缓存140也采用一堆乒乓结构缓存(ping-pongbuffer)设计,进行流水线操作。此外,图8所示的如下模块由所述多个计算单元pe所共用。数据组合单元160:该模块用于接收从各个pe中运算缓存单元150输出的矩阵运算的结果,然后将其组合成一个完整的运算结果,再根据矩阵运算的类型,将结果输出至选择器170,wx缓存180或点乘器210中。由于本发明的并行设计,每个pe都将矩阵中的部分行与输入向量进行乘累加运算,得到结果向量的一部分。数据组合单元160将这些部分组合成一个完整的结果向量。选择器170:该模块从数据组合单元160和从点乘器210接受数据,并从中选择一组数据输入到加法器190中。wx缓存单元180:该模块接收状态1阶段从数据组合单元160中输出的计算结果wxxt(合并后更新门、重置门权重矩阵以及变换矩阵与输入向量相乘的结果即w(z)xt、w(r)xt和wxt合并后的结果),并在下一个状态1阶段时将w(z)xt、w(r)xt和wxt分别输出至加法器190计算出重置信号rt,更新信号zt或新的记忆加法器190:该模块从选择器170和wx缓存180接收数据,进行加法运算后,讲结果输出至激活函数模块200。函数单元200:该模块用于实现算法中的sigmoid/tanh激活函数运算。当加法器190完成了各组权重与向量的叠加运算后,经该激活函数后可获得最终的计算结果。点乘器210:该模块从数据组合单元160和函数单元200接受数据,进行点乘运算,并将运算结果输出至选择器。缓存单元220:该模块接收并存储函数单元200输出的结果,并将其输出至点乘加单元240,用于计算隐含层状态ht.zt缓存单元230:该模块接收并存储函数单元200输出的zt结果,并将其输出至点乘加单元240,用于计算隐含层状态ht.点乘加单元240:该模块从缓存单元220,zt缓存单元230以及向量缓存单元260读取zt以及ht-1进行点乘及加法运算,计算出隐含层状态ht。向量缓存单元250:该模块用于存储各个隐含层的计算结果ht。控制单元260:该模块负责全局控制。本发明设计gru状态机,通过状态机的状态转移,实现gru网络操作的高速流水运行。状态机的控制包括,控制指针向量的读取、控制输入向量与权值矩阵的信号同步、控制内部乒乓结构缓存(ping-pongbuffer)的切换、控制运算单元140的计算,控制pe外部各个运算单元及缓存。在根据本发明的一个实施例中,对于含有相同向量的矩阵运算,采用合并的方式计算。具体而言,在下面的公式中,w(z)、w(r)和w都要与xt相乘,u(z)、u(r)和u都要与ht-1相乘。本发明在矩阵运算阶段,将w(z)、w(r)和w合并为一个矩阵wx与xt相乘,将u(z)、u(r)和u合并为一个矩阵uh与ht-1相乘。rt=σ(w(r)xt+u(r)ht-1)zt=σ(w(z)xt+u(z)ht-1)在这个实施例中,只需要加载一次向量xt和ht-1即可完成矩阵运算,提高了计算效率。本发明的实施例中,定制电路的并行化流水线设计体现在对状态机的控制上,流水线设计可以有效地平衡io带宽与计算性能。已知,在数据加载时间小于计算时间的情况下,计算单元pe效率可以最大化。如下公式所示,左侧是每个计算单元pe需要完成的计算复杂度,右侧是所需的io带宽。其中data_size为权值矩阵的大小,通常是mxn维度,compress_ratio是gru网络压缩率,pe_num是计算矩阵乘向量的计算单元并发度,freq_pe是计算单元运行的时钟频率,data_bit是权值矩阵量化后的定点位宽,ddr_width是计算单元与内存控制模块的数据位宽,freq_ddr是计算单元与内存控制模块数据的时钟频率。如上公式所示,左侧大于右侧io是瓶颈,左侧小于右侧计算是瓶颈。通过上述公式可以推算不同io带宽下需要计算单元的个数。图9示出了根据本发明的实施例的状态机的状态转移。具体而言,在每个状态中包括数据读取和计算。前三行操作是获取权重、指针、输入向量,以准备下一次计算。第四行中的操作是矩阵向量乘法,包括合并w(z)、w(r)和w与输入向量xt的操作,合并u(z)、u(r)和u与上一帧隐层ht-1的操作。第五行中的操作是涉及求和以及激活函数等的计算。水平方向上的操作必须被顺序执行,垂直方向上的操作同时执行。在本发明的一个实施例中,状态机包括三个状态。在初始化状态,完成数据的初始化,准备计算whxxt所需的数据。其中,xt为输入向量,wx(w(z)、w(r)和w合并后的结果)包含向量对应权重矩阵的所有信息,例如,在采用ccs压缩时,包含指针信息、相对索引值和权重值等数据;状态1,计算单元pes开始计算wxxt,同时从内存读取uh(u(z)、u(r)和u合并后的结果)。在下一个状态1时依次计算zt,rt,(rt。uht-1),和ht;状态2,计算单元pes计算uhh(t-1),io读取下一帧或者下一层的wx(w(z)、w(r)和w)、指针以及输入向量。如图9所示,状态1和状态2交替进行,当一层对应的稀疏矩阵与向量的运算完成后,在计算下一层的矩阵运算(图9中第4行)的同时,进行加法树和激活函数等运算(图9中第5行),从而达到高效流水的目的。xt的准备由输入接收单元110完成,wx的准备由位置单元120和解码单元130完成。在本发明的一个实施例中,使用上述模块实现稀疏gru网络加速器过程如下:步骤1:初始化依据全局控制信息读取gru权值矩阵的位置信息。步骤2:根据步骤1的位置信息读取稀疏神经网络的位置索引、权重值。步骤3:根据全局控制信息,输入接收单元110把输入向量广播给多个计算单元pe。步骤4:运算单元140把解码单元130发送来的权重值与输入接收单元110送来的输入向量对应元素做乘法计算,得到矩阵运算的中间结果,存储至运算缓存单元150中。步骤5:运算单元140根据步骤2的位置索引值读取运算缓存单元150中相应位置的中间结果,然后将其与步骤4的乘法结果做加法计算。步骤6:根据步骤2的索引值把步骤5的加法结果写入运算缓存单元150中。步骤7:重复步骤1-6,依次计算wxxt和uht-1,计算完wxxt后先缓存到wx缓存单元180中,如图10a所示,计算完uhht-1后的下一个状态读取wx缓存单元180中的w(z)xt与u(z)ht-1结果计算zt并存储在zt缓存单元230中。步骤8:如图10b所示,从wx缓存单元180读取w(r)xt与运算缓存单元150中的u(r)ht-1计算rt,如图10c所示,然后rt再与运算缓存单元150中uht-1做点乘操作。步骤9:如图10d所示,步骤8中的点乘结果和wx缓存单元180中的wxt计算求得并存储在缓存单元230中步骤10:如图10d所示,从zt缓存单元230读取zt,从缓存单元230读取并将它们输出至点乘加单元240进行点乘和加法计算,最终得到ht。具体实施例例1接下来,以2个计算单元(processelement,简称pe)pe0和pe1计算一个矩阵向量乘,采用列存储(ccs)为例,简要说明基于本发明的硬件进行相应运算的基本思路。压缩后gru中矩阵稀疏度并不平衡,这导致计算资源的利用率降低。如图11所示,假设输入向量a包含6个元素{a0,a1,a2,a3,a4,a5},权值矩阵包含8×6个元素。2个pe(pe0和pe1)负责计算a3×w[3],这里a3是输入向量第4个元素,w[3]是权值矩阵的第4列。从图11中可见,pe0和pe1的工作负载并不相同,pe0进行3次乘法运算,pe1只进行一次。在现有技术中,系统会使pe1完成a3的运算后处于等待状态,直至pe0完成3次加法运算后,再开始进行a4的运算。本发明在输入接收单元110加入先入先出缓存单元(fifo),将输入向量a的一部分加载到fifo中。在本发明实施例中,pe1完成a3的运算后,会从fifo中读取a4继续计算。这样的设计提高了计算资源的利用率。参见图12,假设权值矩阵w和输入向量x如图12所示,奇数行元素由pe0完成,偶数行元素由pe1完成,输出向量的奇数元素由peo计算所得,输出向量的偶数元素由pe1计算所得。输入向量x会被广播给两个计算单元pe0,pe1。针对pe0中的操作如下:表1为pe0对应的权重,相对索引位置和列位置信息。权值w00w20w41w62w43w04w24w45w26相对行索引004421042列位置023457899表1位置单元120:存储奇数行非零元素的列位置信息,其中p(j+1)-p(j)为第j列中非零元素的个数。解码单元130:存储奇数行非零元素的权值和相对行索引。输入接收单元110:存储输入向量xt,该模块把输入向量广播给两个计算单元peo和pe1,为了平衡计算单元间元素稀疏度的差异,每个计算单元的入口都添加先进先出缓存(fifo)来提高计算效率。解码单元130读取矩阵元素,例如w00,将其输出至运算单元140,计算出w00·x00的结果存储在运算缓存单元150中。待本行计算完毕后,运算缓存单元150将中间结果(w00·x00和w04·x04)输出至运算单元140,计算出矩阵运算最终结果y0并输出。数据组合单元160将peo输出的y0,y2,y4,y6和pe1输出的y1,y3,y5,y7组合成完整的输出向量y。例2通过本实施例,旨在阐释本发明的io带宽与计算单元平衡。如果内存控制器用户接口是512bit,时钟为250mhz,那么需要的pe并发度为512*250mhz=(pe_num*freq_pe*data_bit),如果定点成8bit权值,pe计算模块时钟频率为200mhz,需要pe数量为80个。针对2048*1024输入为1024的网络,在不同稀疏度下,计算耗时最大的依然是矩阵乘向量。对稀疏gru网络zt,rt,以及对ht的计算可以被矩阵向量乘wxt和uht-1的计算所掩盖。由于后续的点乘和加法操作是串行流水线设计,所以需要的资源也相对较少。综上本发明充分结合稀疏矩阵向量乘,io和计算平衡,串行流水线设计,可高效提供稀疏gru网络的算法加速。技术效果基于上述技术方案可知,根据本发明的稀疏gru网络加速器的实现装置和方法,通过采用定制电路,流水线设计,有效地平衡了io带宽与计算,从而提高了计算性能、降低了响应延时。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1