基于FPGA的事件抽取模型与加速器的设计实现 *
2020-11-30姜晶菲乔林波许金伟阚志刚
韩 哲,姜晶菲,乔林波,窦 勇,许金伟,阚志刚
(国防科技大学计算机学院,湖南 长沙 410073)
1 引言
随着信息技术的快速发展,电脑、手机等电子设备成为人们生活中不可或缺的工具,通过互联网了解信息也成为了人们获取信息的主要途径。然而怎样从海量的信息中快速找到人们所需要的信息却成为了大数据时代的一个难题。在这样的背景下,信息抽取(Information Extraction)技术应运而生,人们期望可以使用这项技术从海量自然语言描述的信息中,抽取出人们关心的事件,以实现对信息的自动分类、提取和重构。
为了解决这些问题,研究人员早期采用基于模式匹配[1]的方法进行事件抽取。这种方法在特定领域内性能优异,但是需要耗费大量人力来制定模板,并且很难迁移至其他领域。近些年机器学习发展迅速,机器学习在自然语言处理领域也大显神威。但是之后,深度神经网络兴起并在诸如图像[2,3]、声音[4,5]和视频[6,7]多个领域取得了极其优异的成绩。在自然语言处理领域,深度神经网络也取得了不俗的成果[8,9]。因此,当前相关研究普遍都是基于深度神经网络。目前,事件抽取相关研究多集中于英文文本[10,11],对于中文文本的研究尚在初期阶段。一般来说,事件抽取可以分为2个子任务:事件触发词的识别与分类和事件元素的识别与分类。Zhang等人[12]提出将依赖树转化为目标依赖树,在ACE 2005中文语料库上较之前的触发词分类F1值提升了4%。Ding等人[13]提出的TLNN(Trigger-aware Lattice Neural Network)动态整合了单词和字符信息,从而避免了触发器-单词不匹配的问题,其触发词分类F1值达到了67.78%。
然而,深度神经网络庞大的计算量和参数量需要耗费大量的计算资源和能源,这严重限制了深度神经网络的部署应用。大型综合数据处理中心接入的信息源种类和规模可能都十分庞大,对于这种情况,快速处理是分析的基础。FPGA(Field Programmable Gate Array)因其本身所具有的低功耗、可重构特点,可以根据算法设计硬件结构,是一种十分高效的加速方法,非常适合于上述应用环境。
基于FPGA的加速器是当前神经网络加速的热点之一,但是多数FPGA加速器只是单纯地将神经网络迁移至硬件上,而没有考虑网络结构规整性与硬件实现复杂度的关系。如果根据硬件特点对网络进一步优化、调整或者替换某些网络结构,可以降低硬件的复杂度和面积。此外,先前针对事件抽取任务的工作普遍采用长短期记忆神经网络LSTM(Long Short-Term Memory)或者其变体作为核心网络,但是受限于LSTM对时序数据进行序列处理的计算方式,LSTM不具备像卷积神经网络一样并行加速的条件。而目前的CNN加速器研究几乎都是针对图像[14,15]或视频[16,17]的加速器,针对事件抽取的专用硬件加速器研究与设计尚属空白。
基于以上几点,本文选择了当前在英文事件抽取领域效果出众的神经网络EE-DGCNN (Event Extraction based on multi-layer Dilate Gated Convolutional Neural Network)[18],在其基础上提出了一种适合FPGA加速的中文事件抽取神经网络CEE-DGCNN(Chinese EE-DGCNN)。实验结果显示,该网络在ACE 2005中文语料库上进行事件触发词分类的F1值达到了71.12%,显著优于之前的工作。同时,本文基于Xilinx XQKU115 FPGA设计实现了与之相匹配的FPGA硬件加速器,相较于Intel i7-8700k,该加速器获得了67倍的性能提升。
2 背景知识
2.1 卷积神经网络
卷积神经网络CNN(Convolutional Neural Network)是深度神经网络中最具代表性的算法之一。卷积神经网络一般由卷积层、全连接层、池化层等网络层组成。其中,卷积层是整个卷积神经网络的核心,其计算量往往占据了卷积神经网络的主要部分。因此,加速卷积神经网络关键点在于简化卷积计算或者设计合适的硬件结构以适合卷积运算,常见的方法有频域卷积、Winograd算法[19]等。
普通的卷积层通过在输入特征上滑动卷积核并进行卷积运算,生成一组特征。在每个滑动位置上,卷积核与输入特征之间进行相应元素的乘积和求和运算,将输入特征中的信息映射到输出特征中的一个元素上。卷积层的计算公式为:
(1)
其中,Xj为一个卷积窗口大小的输入,Yi为对应位置的输出,Kij为相应的部分卷积核,bias为卷积偏置,m和n均为自然数,具体的数值取决于输入的大小。假设卷积核的大小为k×k,则每个滑动窗口需要进行k×k次乘累加运算。因此,卷积神经网络往往需要耗费大量的时间用于卷积层的计算。
2.2 膨胀门卷积神经网络
膨胀门卷积神经网络DGCNN(Dilate Gated Convolutional Neural Network)是一种融合了膨胀卷积和门机制的新型网络结构。其基本结构如图1所示。
Figure 1 Structure of DGCNN图1 膨胀门卷积神经网络基本结构
在普通的卷积层中,每一个输出的特征只能通过卷积核捕获k个相邻输入特征的依赖信息,对于长距离的依赖则无能为力。如果需要获得长距离的信息,则必须扩大卷积核。对于一维卷积,其参数量和计算量与卷积核成线性关系,而对于二维卷积和其他高维卷积来说,扩大卷积核意味着计算量爆炸式增长。因此,研究人员提出了膨胀卷积的概念。如图2所示,在同样采用3层卷积层、卷积核大小同样为3的情况下,普通卷积第3层的节点至多获得相距4个节点的第1层节点信息,而膨胀卷积在第3层则可以获得相距8个节点的第1层信息,并且参数量和计算量与普通卷积是完全相同的。因为在处理自然语言的时候,往往需要结合上下文进行分析,需要考虑多个距离较远的单词信息,因此,可以使用更少的参数量和计算量获得更远距离信息的膨胀卷积比普通卷积更适合于自然语言处理领域。
Figure 2 Normal convolution vs.dilated convolution图2 普通卷积与膨胀卷积对比
门机制最早是由Gehring等人[20]提出的,其数学化表述为:
Y=Conv1D1(X)⊗σ(Conv1D2(X))
(2)
其中X为输入的向量序列,Y为输出结果,σ为Sigmoid激活函数,Conv1D1和Conv1D2为2个一维卷积,其输出大小相同,在EE-DGCNN中Conv1D1和Conv1D2使用同一个一维卷积层,因此本文使用残差结构将输入与输出相加,实现信息多通道传输。这种结构可以整体看作是一种激活函数,称为线性门单元(Gated Linear Unit)。
通过椎角逸出的等离子(氦离子、电子等)进入强磁场发生遍转,分别打在正、负极板上、接通外电路,行成电流。这叫磁流体发电。
3 网络结构优化
3.1 面向硬件的网络设计
相比于普通的CNN,DGCNN可以在相同的计算量和参数量下学习到更远距离的信息,因此本文选择了EE-DGCNN作为本文模型的骨干网。但是,一方面,EE-DGCNN是面向英文文本处理的,对于中文的处理效果还有待提升;另一方面,EE-DGCNN在设计之初并没有考虑对硬件的优化。因此,本文在EE-DGCNN的基础上进行了扩展和优化,设计了更适合于中文自然语言处理及硬件实现的CEE-DGCNN。CEE-DGCNN的网络结构如表1所示。
Table 1 Architecture of CEE-DGCNN
与原始的EE-DGCNN相比,CEE-DGCNN主要优化了以下3点:
(1)更深的网络。不同于英文单词之间有明确的界限,中文词与词之间没有明确的分割符,因此,对于更为复杂的中文文本EE-DGCNN缺乏足够的分类能力。为此,本文逐步增加了网络的层数以提高网络的分类能力。最终CEE-DGCNN包含24层DGCNN,和EE-DGCNN相比,DGCNN的层数增加了一倍。
(2)更高的数据维度。本文的识别与分类基于中文字符,因此相较于英文一个单词只需要一个词向量表示,中文一个字可能需要多个词向量来表示。这意味着每一个字都包含着比英文单词更加丰富的含义,原本的数据维度不足以满足中文表示的需要。为此,本文提高了词嵌入表示的向量长度,将其从768调整至1 024。此外,长度为1 024的向量对于硬件更为规整,可以减少在数据边界产生的资源浪费,从而降低电路复杂度。
(3)合适的膨胀系数。在CEE-DGCNN当中,本文采用1,2,4作为膨胀系数。当使用EE-DGCNN中的1,2,5作为膨胀系数时,在高并行度的情况下会因为5无法被2整除而导致数据吞吐量的不一致或计算资源的浪费。前者会导致流水线停顿,增加不必要的时间开销;后者则降低了资源利用率。本文的实验表明,将膨胀系数设置为1,2,4可以获得比1,2,5更好的性能,实验结果如表2所示。
Table 2 Effect of different dilations
3.2 定点量化
尽管使用DGCNN已经大幅减少了计算量和参数量,但是所有的计算以及数据表示都是使用的32位浮点数,这将会占用较多的计算资源,不利于缩小芯片面积。因此,本文需要在保证精度的情况下将浮点数转化为定点数表示,并尽可能缩小数据位宽。如此可以在相同的面积与功耗下,实现更高的并行度,同时进一步降低了对于访存带宽以及存储资源的压力。
本文采用的策略是通过数学统计的方式确定数据的分布区间,在此基础上确定所需要的最小数据位宽,之后进一步确定小数点的位置并通过实验进行检验。本文实验了多种数据精度组合,最终确定网络的权重仅仅需要8位即可满足精度需求,而数据以及中间计算结果,则需要16位方可保持网络精度几乎不变化。表3展示了量化带来的精度变化。
Table 3 Effect of quantization on network accuracy
4 硬件设计
4.1 整体结构
图3展示了本文设计的加速器整体结构。上位机通过访问FPGA片外存储DDR的方式与加速器进行通信。FPGA加速器主要由控制器、片上存储、输入/输出缓冲和PE(Processing Element)组成。控制器负责接收来自上位机的指令,控制加速器的状态。片上存储器由不同大小的BRAM(Block RAM)组成,用于存储中间结果和权重。输入/输出缓存由2个512 bit 位宽的FIFO组成,用于缓冲片外存储与片上存储器之间的数据。
Figure 3 Overall structure of the accelerator图3 加速器整体结构
图4展示了PE中的核心部分:DGCNN的硬件结构,PE的整体结构即由前者串联拼接而成的。具体的计算流程如下所示:
(1) 将输入重组存至输入重组缓存(Input Mapping Buffer);
(2) 输入重组缓存中数据同时传送给MAC计算阵列(MAC Array)和输入缓存(Input Buf- fer),输入缓存中的数据用于后续门结构的计算;
(3) MAC计算阵列的结果传输至Sigmoid函数模块和卷积结果缓存(Conv Buffer),后者用于后续门结构的计算;
(4) 在最后MAC阵列中对输入缓存和卷积结果缓存中的数据进行门结构的计算,并输出。
Figure 4 Main structure of PE图4 PE核心结构
4.2 层融合
本文通过融合所有的网络层来构建细粒度的层内与层间流水线执行,从而实现层间的有效重叠以降低计算延迟。
(1)层内流水线。为了计算一个输出值的所有依赖数据,对于CONV层来说,在同一个卷积窗口中采用完全并行是执行速度最快的选择。最理想的情况是同时完成一组输入的全部相关计算,一次完成一组数据的全部计算,在本文中,即同时完成1 024个输出值的计算。这不仅需要大量的乘法器,还要求有充足的访存带宽,显然完全并行处理这些操作对于硬件要求非常苛刻。因此,本文在层内建立流水线,通过流式输入数据的方式进行计算,实现硬件资源利用最大化,并对层内的循环有限地进行展开,以求兼顾资源限制与性能需求,其HLS伪代码如下所示:
for(i=0;i< 1024;i++) {
#pragma HLS UNROLLfactor=4
#pragma HLS PIPELINE
for(j=0;j< 3;j++) {
#pragma HLS UNROLLfactor=3
conv_result[i]+=kernel[j] *ifmap[i+j];
}
conv_result[i]+=bias;
sigmoid_result[i] = 1./(1.+exp(-ifmap[i]));
ofmap[i] =sigmoid_result[i] *ifmap[i]+(1-sigmoid_result[i]) *conv_result[i];
}
可以看到,整个DGCNN层完全使用流水线技术进行运算,并且同时进行4个卷积窗口的运算。
(2)层间流水线。为了降低网络整体延迟,本文设计了一种细粒度的层间流水线。使用这种流水线,所有的网络层都被融合并并行处理。以图5所示的3层网络为例,当第1层的灰色部分计算完成之后,立即开始计算第2层的灰色部分。在第2层灰色部分的最后1个数据计算完成后,立即开始第3层的计算。第3层在完成已有数据的计算后,会立即将得到的结果累加保存,从而减少不必要的数据存储。换句话说,不同层的数据是并行融合处理的,它们的延迟是重叠的。
Figure 5 Data dependency图5 数据依赖关系示意
图6分别展示了传统的层间流水线和层融合流水线,显而易见,融合后的流水线可以显著降低数据处理延迟。
Figure 6 Traditional layer pipeline vs.fusion pipeline图6 传统层间流水线与层融合流水线
图7展示了各层和整个网络的延迟,加速器的整体延迟等于单层的延迟加上等待依赖输入的时间,采用层融合流水线后网络整体延迟只有单层网络延迟的1.7倍。
Figure 7 Latencies of each layer and the overall network图7 各层和整个网络的延迟
4.3 Sigmoid函数简化
在DGCNN中,需要使用Sigmoid函数对膨胀卷积的输出进行激活。Sigmoid函数的公式表达为:
(3)
式(3)包含1个幂运算和1个除法运算,这不利于硬件实现,因此本文需要对Sigmoid函数进行简化处理,常见的处理方法有查表法和分段函数拟合法。本文通过3.2节的定点量化实验发现,在计算的过程中Sigmoid函数的输出仅仅需要8 bit位宽表示的定点小数即可满足精度需求。因此,本文采用分段查表法对Sigmoid函数进行简化,具体的策略如下所示:
(1)当输入大于4时,直接输出结果1;
(2)当输入大于或等于-4且小于或等于4时,使用输入的2位整数位、6位小数位作为地址,通过查表获得计算结果;
(3)当输入小于-4时,直接输出结果0。
简化后的函数图像如图8所示,黑色曲线为使用分段查表法简化后的Sigmoid函数曲线,灰色点状线为原始的Sigmoid函数曲线。可以看出两者之间的差异几乎可以忽略不计。
Figure 8 Comparison of Sigmoid function图8 Sigmoid函数简化对比
5 实验与结果
5.1 实验平台
本文使用ACE 2005中文语料库对CEE-DGCNN进行训练,学习率为0.001,批大小为8。取75%的数据作为训练集,其余25%作为测试集。ACE 2005语料库是一个基于真实世界语料的语料库,其语料全部来自于广播、新闻和网络博客,因此其可以较为真实地反映实际应用后的模型性能。
此外,本文基于Xilinx公司的Kintex UltraSclae开发板实现并评估了本文设计的加速器,该评估板采用XCKU115 FPGA芯片。加速器采用Verilog语言编写,并使用Xilinx Vivado 2018.3综合实现仿真。对比平台基于当前广泛使用的Intel i7-8700k中央处理器,使用C语言实现,并在任务级并行计算以充分利用CPU的多核优势。
5.2 实验结果
本文测试了CEE-DGCNN的模型性能,并与前人的工作进行对比,具体结果展示在表4中。
Table 4 Model performance comparison
从表4中可以看到,本文模型较前人工作取得了非常大的提升,尤其是在精度上,本文模型较先前的工作提升了约10%。这主要有2个原因,一方面,我们前期使用BERT(Bidirectional Encoder Representation from Transformers)[22]而非word2vec等算法对文本进行预处理,前者生成的词向量可以根据语境进行调整,相较于后者仅采用一种词向量表示有着更强的表达能力;另一方面,本文所使用的DGCNN结构有着更强的特征提取能力。
Table 5 Resource Utilization
表5列出了加速器的资源使用情况,可以看出,加速器占用资源非常少,因此可以同时满足嵌入式领域和数据中心的要求。表6列出了本文的加速器与CPU平台的性能对比。与CPU相比,本文的加速器降低了96%的延迟,提升了约67倍的吞吐量。
Table 6 Performance comparison of different platforms
6 结束语
本文针对中文事件抽取任务提出了一个适合FPGA硬件实现的神经网络模型,并进一步设计实现了其对应的硬件结构。网络模型以EE-DGCNN为基础,通过调整数据维度和网络参数的方式使其更为规整,以适合硬件实现,并且在训练完成后使用定点量化缩小存储和访存带宽要求。该网络模型最终在ACE 2005中文语料库上达到了71.71%的F1值,显著优于之前的工作。对应的加速器采用全流水结构实现提出的网络模型,并利用层融合技术降低了数据处理延迟,显著提高了数据处理效率。本文基于Xilinx XCKU115 FPGA实现该加速器,最高吞吐量达到了CPU平台上性能的67倍,性能获得了极大的提升。