一种BERT中层归一化非线性函数的FPGA加速方法
文献发布时间:2023-06-19 19:28:50
技术领域
本发明属于计算机算法技术领域,尤其涉及BERT中层归一化非线性函数的FPGA加速方法。
背景技术
BERT(Bidirectional Encoder Representations from Transformers,双向编码器表示)是一个预训练模型,其结合了Transformer的优势,能生成深层的双向语言表征模型,之后只需添加一个额外的层进行微调,就能在多个自然语言处理(Natural LanguageProcessing,NLP)任务中取得极佳的结果。
BERT的高性能是以高计算复杂度和大参数量为代价的,这使得将BERT部署到计算资源和存储资源有限的边缘设备上并满足实时性的要求变得非常困难。而作为BERT重要组成之一的层归一化(Layer Normalization,LN)模块,由于其非线性的特性,再加上它在BERT中多次出现,因此层归一化模块的延时在整个BERT的延时中占比较高。因此很有必要对BERT中的层归一化模块进行加速。
在模型的压缩和加速方案中,量化是一种常见的方法。量化是指将浮点数通过函数关系转化为int型整数,然后由整数代替浮点数在模型中进行计算。将算法部署到现场可编程门阵列FPGA(Field Programmable Gate Array)上时,可实现对FPGA的加速。目前普遍采取的量化方法是将32位浮点数转化为int8型整数(即8位有符号整数),则相对于原32位浮点数而言,位宽减小为四分之一,因此可以极大压缩模型大小,从而对模型进行加速。
在现有技术中,虽然用量化方法对LN进行了加速,但是其缩放因子通常设置为常数,因此其量化策略缺乏精准性、以及运算效率不高。
发明内容
针对现有技术存在的问题,本发明提供了一种BERT中层归一化非线性函数的FPGA加速方法,具备精准性高、运算效率高的优点,解决了现有量化策略缺乏精准性、以及运算效率不高的问题。
本发明是这样实现的,一种BERT中层归一化非线性函数的一种FPGA加速方法,包括以下步骤:
通过量化公式得到非对称量化公式和对称量化公式;
运用所述非对称量化公式和所述对称量化公式,用量化方法对层归一化操作模块进行处理,得到将浮点数运算转化为整数运算以及移位操作的算法;
将所述算法部署到现场可编程门阵列FPGA上,在保证精度损失可接受的前提下,对层归一化模块进行压缩和加速,最终提高整个BERT模型的运行速度。
作为本发明优选的,通过量化公式得到非对称量化公式和对称量化公式的方法包括:
设置量化公式为:r=S(q-Z);
其中,r是一个浮点数,q是浮点数对应的整数,S是表示浮点数与整数之间的比例关系,Z表示实数中的0经过量化之后对应的整数;
将r=S(q-Z)作为非对称量化公式,得到非对称量化公式r=S(q-Z);
浮点数对应的整数公式为:
设置S和Z的公式:
采用对称量化操作,即r
r=Sq。
作为本发明优选的,对于量化后得到的整数值,还采取截取操作clip(x,min,max),使浮点数对应的整数限定在区间(min,max)内,若x大于max,则令x为max;若x小于min,则令x为min;得到
作为本发明优选的,运用所述非对称量化公式和所述对称量化公式,用量化方法对层归一化操作模块进行处理,将浮点数运算转化为整数运算以及移位操作的方法包括:
得到层归一化公式为:
其中,x
对参数γ和参数β进行对称量化,对输入X和输出Y进行非对称量化;
将非对称量化公式r=S(q-Z)和对称量化公式r=Sq代入
其中,
由式
可变换为:
其中,q
将浮点数运算转化成整数运算以及移位操作;
对两个浮点缩放因子的比值
其中,M
将
中,得到:
作为本发明优选的,在误差可接受的前提下,为提高运算效率,令n
能改写成:
作为本发明优选的,将算法部署到FPGA上的方法包括:
将所述算法部署到FPGA上;
使算法在FPGA上运行;
验证算法在FPGA上的运行状态。
作为本发明优选的,将算法部署到FPGA上的方法包括以下步骤:
对算法进行编程,得到所述算法对应的编程信息;
检查并修改所述算法对应的编程信息;
检查FPGA的工作状态,若FPGA能正常工作,将所述算法对应的编程信息部署到FPGA上;
验证所述编程信息在FPGA中能否正常运行;若不能正常运行,则返回到检查并修改所述编程信息步骤循环,直至所述编程信息在FPGA中能正常运行为止;
检测BERT的运行速度。
作为本发明优选的,对算法进行编程,得到所述算法对应的编程信息的方法包括以下步骤:
根据所述算法编程为算法对应的伪代码;
根据所述算法对应的伪代码以及对编程语言的需求,将所述算法对应的伪代码编译为算法对应的正式编码,将所述算法对应的正式编码作为所述算法对应的编程信息。
作为本发明优选的,多次逐步降低硬件资源;检测BERT的运行速度;找到硬件资源和BERT运行速度的平衡区间。
与现有技术相比,本发明的有益效果如下:
本发明用量化方法对层归一化模块进行处理,并部署到FPGA上,在保证精度损失可接受的前提下,对层归一化模块进行压缩和加速,最终提高整个BERT模型的运行速度。
附图说明
图1是本发明实施例提供的一种BERT中层归一化非线性函数的FPGA加速方法的流程示意图。
图2是本发明实施例提供的通过量化公式得到非对称量化公式和对称量化公式的方法的流程示意图。
图3是本发明实施例提供的运用非对称量化公式和对称量化公式,用量化方法对层归一化操作模块进行处理,将浮点数运算转化为整数运算以及移位操作的方法的流程示意图。
图4是本发明实施例提供的将算法部署到FPGA上的方法的流程示意图。
图5是本发明实施例提供的将算法部署到FPGA上的方法的流程示意图。
图6是本发明实施例提供的对算法进行编程,得到算法对应的编程信息的方法的流程示意图。
图7是本发明实施例提供的算法的伪代码的示意图。
图8是本发明实施例提供的找到硬件资源和BERT运行速度的平衡区间的流程示意图。
具体实施方式
为能进一步了解本发明的发明内容、特点及功效,兹例举以下实施例,并配合附图详细说明如下。
现有技术中,文献(Li J,Alvarez R.On the quantization of recurrentneural networks[J].arXiv preprint arXiv:2101.05453,2021.)对LN进行了量化。但文中直接令输入X的缩放因子为常数2
文献(Kim S,Gholami A,Yao Z,et al.I-bert:Integer-only bertquantization[C].International conference on machine learning.PMLR,2021:5506-5518.)提出用牛顿迭代法对平方根操作进行近似,并返回一个整数,这样LN函数的所有计算都是整数之间的运算了。但该文只讨论了LN中平方根操作的近似计算,对于LN其它部分的量化策略,并没有给出详细的量化策略。
下面结合附图对本发明的结构作详细的描述。
请参阅图1,本发明实施例提供的BERT中层归一化非线性函数的一种FPGA加速方法,包括以下步骤:
步骤S1、通过量化公式得到非对称量化公式和对称量化公式;
步骤S2、运用非对称量化公式和所述对称量化公式,用量化方法对层归一化操作模块进行处理,得到将浮点数运算转化为整数运算以及移位操作的算法;
步骤S3、将算法部署到FPGA上。
在该实施例中,通过运用非对称量化公式和对称量化公式,用量化方法对层归一化操作模块进行处理,得到将浮点数运算转化为整数运算以及移位操作的算法。
对于FPGA,在硬件层面,相对于CPU,FPGA延时更低,更擅长处理计算密集型任务;相对于GPU,FPGA运行能效比更好,功耗更低;相对于ASIC,FPGA前期投入成本更低。同时,FPGA不属于冯诺依曼结构,且具有可编程的特性,可以设计特定的加速架构。因此,在硬件计算平台上,FPGA并行性、低功耗、低延时和可编程的特性使得FPGA成为深度学习模型加速的极佳选择。
进一步的,请参阅图2,在步骤S1中,通过量化公式得到非对称量化公式和对称量化公式的方法包括:
步骤S11、设置量化公式为:r=S(q-Z);
其中,r是一个浮点数,q是浮点数对应的整数,S是表示浮点数与整数之间的比例关系,Z表示实数中的0经过量化之后对应的整数;
步骤S12、将r=S(q-Z)作为非对称量化公式,得到非对称量化公式r=S(q-Z);
步骤S13、浮点数对应的整数公式为:
其中,round(·)是四舍五入操作;
步骤S14、设置S和Z的公式:
步骤S15、采用对称量化操作,即r
在上述过程中,通过浮点数对应的整数公式
进一步的,请参阅图3,在步骤S2中,运用非对称量化公式和对称量化公式,用量化方法对层归一化操作模块进行处理,将浮点数运算转化为整数运算以及移位操作的方法包括:
步骤S21、得到层归一化公式为:
其中,∈为一个很小的数,为了防止除法的分母为0,在本实施例中,∈设置为0.01;γ和β分别为增益和偏移参数,是一个向量;下标i表示词向量中的其中一个数据;μ是词向量的平均值,σ
步骤S22、对参数γ和参数β进行对称量化,对输入X和输出Y进行非对称量化;
步骤S221、将非对称量化公式r=S(q-Z)和对称量化公式r=Sq代入
其中,
步骤S23、由
变换为:/>
其中,q
步骤S24、将浮点数运算转化成整数运算以及移位操作;
步骤S241、对
其中,M
步骤S242、将
中,得到:
进一步地,令n
能改写成:
请参阅图4,在步骤S3中,将算法部署到FPGA上的方法包括:
步骤S31、将算法部署到FPGA上;
步骤S32、使算法在FPGA上运行;
步骤S33、验证算法在FPGA上的运行状态。
通过该方式,可检测算法是否正确,是否能正常运行。
进一步的,请参阅图5,在步骤S31中,将算法部署到FPGA上的方法包括以下步骤:
步骤S311、对算法进行编程,得到算法对应的编程信息;
步骤S312、检查并修改算法对应的编程信息;
步骤S313、检查FPGA的工作状态,若FPGA能正常工作,将算法对应的编程信息部署到FPGA上;
步骤S314、验证编程信息在FPGA中能否正常运行;若不能正常运行,则返回到检查并修改编程信息步骤循环,直至编程信息在FPGA中能正常运行为止;
步骤S315、检测BERT的运行速度。
进一步的,请参阅图6和图7,步骤S311、对算法进行编程,得到所述算法对应的编程信息的方法包括以下步骤:
步骤S3111、根据算法编程为算法对应的伪代码;
步骤S3112、根据算法对应的伪代码以及对编程语言的需求,将算法对应的伪代码编译为算法对应的正式编码,将算法对应的正式编码作为算法对应的编程信息。
伪代码是一种非正式的,类似于英语结构的,用于描述模块结构图的语言。人们在用不同的编程语言实现同一个算法时意识到,它们的实现很不同。尤其是对于那些熟练于不同编程语言的程序员要理解一个(用其他编程语言编写的程序的)功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。这样伪代码就应运而生了。伪代码提供了更多的设计信息,每一个模块的描述都必须与设计结构图一起出现。
使用伪代码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。伪代码介于自然语言与编程语言之间,以编程语言的书写形式指明算法职能。使用伪代码,不用拘泥于具体实现。相比程序语言(例如Java,C++,C,Dephi等等),它更类似自然语言。它是半角式化、不标准的语言,可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。
在该实施例中,算法的伪代码如图7所示,通过伪代码可灵活转换为各种程序语言,例如Java,C++,C,Dephi。通过该设置,便于不同编程语言的程序员理解,普及性更高,伪代码转化为不同的编程语言也更灵活。
请参阅图8,进一步的,在算法部署到BERT上之后,进行以下操作:
步骤S316、多次逐步降低硬件资源;
步骤S317、检测BERT的运行速度;
步骤S318、找到硬件资源和BERT运行速度的平衡区间。
在FPGA上部署之后,相比于32位浮点运算的结果,本发明在精度损失可接受的前提下,所有的硬件资源均大幅下降。通过找到硬件资源和BERT运行速度的平衡区间,可便于根据需求,降低硬件资源的投入,从而在保证BERT运行速度的基础上节省硬件资源。
进一步的,在量化中,还包括:通过对
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
- 一种基于大规模FPGA芯片的计算加速系统及其加速方法
- 非线性预测控制的FPGA硬件加速控制器及其加速实现方法
- 非线性预测控制的FPGA硬件加速控制器及其加速实现方法