0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA芯片用于神经网络算法优化的设计实现方案

454398 来源:AI加速微信公众号 作者:AI加速微信公众号 2020-09-29 11:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

AI芯片(这里只谈FPGA芯片用于神经网络加速)的优化主要有三个方面:算法优化,编译器优化以及硬件优化。算法优化减少的是神经网络的算力,它确定了神经网络部署实现效率的上限。编译器优化和硬件优化在确定了算力的基础上,尽量最大化硬件的计算和带宽性能。经历了一年多的理论学习,开始第一次神经网络算法优化的尝试。之所以从一个FPGA开发者转向算法的学习,有几个原因:

第一是神经网络在AI芯片上的部署离不开算法的优化。一个浮点数的计算(加法或者乘法)和定点数的计算消耗的资源差距很大,对于FPGA这样逻辑资源有限的芯片而言,定点计算更加友好,而且能够提升几倍于浮点计算的性能。

第二是神经网络量化压缩需要密切的结合FPGA硬件的特点,需要考虑到FPGA的存储资源,计算符号是否能够被FPGA友好的实现等。在AI加速器项目中,算法和FPGA都有各自的开发者,FPGA会对算法组提出要求,比如激活函数量化,normalization如何做等,然后算法组在这些特定要求下去进行算法优化。如果一个人对FPGA和算法都比较熟悉的话,那么就会更容易发现算法优化的点。

第三是FPGA开发方式的趋势是多样化。使用RTL语言仍然是主要的开发方法,需要一个人有一定的数字电路基础。这种开发方式最底层,所以最灵活,可以更好的去调优。但是同时,FPGA一直渴望去突破固有的开发方式,让一个不懂得硬件的软件开发人员也可以很容易的上手,同时能够缩短开发周期,比如HLS。我相信,随着HLS的发展和FPGA芯片的演进,使用这种方式的开发者会越来越多。在那些算法复杂,更新较快的项目中,HLS更有优势,而在一些对资源,时序,功耗要求更高的项目中,RTL更有优势。当硬件平台逐渐软件化后,必然会对FPGA开发者的算法能力提出更高的要求。

Transformer网络结构

Google在《Attention is all your need》的文章中,提出了使用全attention结构替代LSTM的transformer模型,在翻译任务上取得了更好的成绩。这个网络结构计算量大,计算符号相对简单,有一定的应用,所以适合用于网络加速的展示。结构整体模型如下:

1 embedding

包含了input和output的embedding层,完成词汇到网络输入向量的转化,embedding的矩阵大小取决于词汇量的多少,对于翻译来讲,通常都是巨大的,所以其不适合放在FPGA上进行加速,没有量化的必要。Input和output以及softmax前的linear层都共享相同的参数,这样做的目的,是因为共享input和output权重能够降低word level perplexity,当然也降低了参数存储量。最后的linear使用embedding的权重是为了将网络向量转化为词语出现的logits。

2 positional encoding

Transformer是没有循环网络,为了获取词汇位置关系信息,对词汇进行位置编码。其实就是给每个词汇加上位置偏移,位置偏移函数选择了sin和cos函数:

Pos是词汇位置,i是词汇向量的维度位置。

3 encoder

由多层的multi-head attention和linear组成,multi-headattention和linear之间由norm和add,add是一个residual连接。

Multi-head attention结构如下:

Q,K,V分别是query,key和value,这是attention机制中抽象出来的三个重要变量,通过计算q和k的相似度,得到每个k对应的v的权重系数,然后对value进行加权求和就得到了attention值。这个是attention机制的本质思想。Transformer中使用softmax函数来描述相似度,当然还有很多其它方法来描述。

这里添加了一个scale1/squart(dk),这其实是一个参数的调节,防止矩阵乘法得到结果太大而导致softmax函数的梯度太小。

这里还要注意transformer网络没有对Q,K,V直接进行单一的attention计算,而是对这三个变量进行了拆分,平行计算拆分后的变量,得到的attention值最后在拼接在一起。

4 decoder

Decoder和encoder也有类似的结构,不同的是,在decoder中由三层:mask-multi-head attention,multi-head attention以及FC构成。带mask的multi-head是为了屏蔽target句子词之后的词,因为对句子的翻译应该是由前向后进行的,后边的词语不应该出现在前边词语的预测之中。

量化方法

量化实际是一个仿射变换:

其中s是scale,q是量化后的数据,z是偏移,如果采用对称变换,令z为0,那么就有:

去除中心z,可以消除矩阵计算中的交叉项。接下来就是如何获得q和s。q和s通过如下方式获得:

Clip操作是在最小值n和最大值p之间获得x/s的向下整数值,如果x/s向下整数值超过n或者p就取n和p。

S的值通过训练获得,为了保证能够很好的在FPGA上计算,s的值最好可以取得2的幂次。

由于s和x都是需要训练的参数,所以我们需要求得他们的梯度值,梯度值比较简单,对q(x, s)的x和x进行求导,有:

对x的梯度使用的是hinton提出的strait-through estimator,这样做是因为可以消除量化引入的噪声,更快的训练。

实践

transformer中有dense,matmul等操作,需要量化的数据有dense中的权重,matmul中的Q,V,K变量。第一次没有什么经验,还是一点点来。首先选择其中一个dense进行量化。从github上下载了一个transformer的实现源码https://github.com/Kyubyong/transformer,这个代码写的很简洁,容易看懂。官方的实现代码比较复杂,需要安装的库较多,曾经也尝试过,因为某些库无法安装成功,所以放弃了。在使用Kyubyong的transformer的时候,也遇到了一个问题,训练可以完成,但是在eval的时候,报了维度的错误,后来找到是在positional encoding的embedding中,经过查找,源码中存在一个bug,就是eval的数据集的maxlen是设置了10000,但是在embedding中传入的查找表维度是从hparams传入的,两者不相同。不知道作者为什么会有这个bug。经过改正可以正常完成eval了。

量化第一步是需要将量化插入到tensorflow的图结构中,即在要量化的权重数据之后。这需要重新定义op和梯度,tensorflow中提供了tf.custom_gradient装饰函数来对梯度和op进行定义,所以我定义了如下梯度:

其中STE_clip中的y计算了对x的量化值,grad函数是对x和s进行梯度计算。X和s分别是传入的(d, d)权重和scale。dy是传入的上一个节点的梯度,所以完成和STE_cllip节点梯度的乘积,这是由函数梯度计算的传递性质决定的。这里需要注意的是,s是一个标量,q(x,s)对s梯度是一个矩阵向量,需要和dy进行点积和。

在tensorflow图构建中,将这个节点插入如下:

这里还添加了tf.print用于打印量化后的数据。

语法错误修正:

1 定义的custom_gradient函数中报NoneType object is not iterable,因为函数没有返回值,默认返回none。

2 TypeError: Input 'e' of 'Select' Op has type float32 that does not match type int32 of argument 't'. 因为使用tf.greater(x, y)x和y应该有相同数据类型。

3 ValueError: Shapes must be equal rank,tf.greater中数据必须具有相同的rank,即维度。

4 ValueError: Shape must be rank 1 but is rank 2,tf.tile(x, axis)中x必须是具有维度的,不能够是0维。

5 ValueError: Shape must be rank 2 but is rank 3,tf.matmul中两个矩阵维度必须相同。

6 TypeError: Failed to convert object of type to Tensor. Contents: [None]. Consider casting elements to a supported type。使用tf.tile的时候,shape必须为tensor量。

7 TypeError: Expected int32, got None of type '_Message' instead. 这是因为输入为[N, T, d_model],其中N开始是none的,所以当使用tf.constant([N,1,1])的时候就会出现错误,因为N是none类型。

8 Incompatible shapes between op input and calculated input gradient。输入的数据和对该输入数据的梯度维度不一致。

9 使用tf.print无法打印出数据。这是因为print是tensorflow中的一个节点,需要将这个节点加入图中,然后才能输出。而且只有计算流经这个print节点,其才会发挥作用。形象的描述应该是:

功能问题:

1 首先就是发现在训练过程中scale和量化数据都没有更新,一直保持不变,而且量化值和权重数据以及scale计算的数据不相同。目前还在查找当中。

引用文献

1 Learning Accurate Integer Transformer Machine-Translation Models,Ephrem Wu

2 Trained uniform quantization for accurate and efficient neural network inference on fixedpoint hardware,Sambhav R. Jain, Albert Gural, Michael Wu, and Chris Dick

3 Attention Is All You Need,Ashish Vaswani,Noam Shazeer,Niki Parmar

4 Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations,Itay Hubara,Matthieu Courbariaux,Daniel Soudry

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22281

    浏览量

    630050
  • 神经网络
    +关注

    关注

    42

    文章

    4827

    浏览量

    106767
  • 算法优化
    +关注

    关注

    0

    文章

    4

    浏览量

    6402
  • AI芯片
    +关注

    关注

    17

    文章

    2061

    浏览量

    36558
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NMSIS神经网络库使用介绍

    :   神经网络卷积函数   神经网络激活函数   全连接层函数   神经网络池化函数   Softmax 函数   神经网络支持功能   该库具有
    发表于 10-29 06:08

    在Ubuntu20.04系统中训练神经网络模型的一些经验

    , batch_size=512, epochs=20)总结 这个核心算法中的卷积神经网络结构和训练过程,是用来对MNIST手写数字图像进行分类的。模型将图像作为输入,通过卷积和池化层提取图像的特征,然后通过全连接层进行分类预测。训练过程中,模型通过最小化损失函数来
    发表于 10-22 07:03

    液态神经网络(LNN):时间连续性与动态适应性的神经网络

    1.算法简介液态神经网络(LiquidNeuralNetworks,LNN)是一种新型的神经网络架构,其设计理念借鉴自生物神经系统,特别是秀丽隐杆线虫的
    的头像 发表于 09-28 10:03 651次阅读
    液态<b class='flag-5'>神经网络</b>(LNN):时间连续性与动态适应性的<b class='flag-5'>神经网络</b>

    无刷电机小波神经网络转子位置检测方法的研究

    摘要:论文通过对无刷电机数学模型的推导,得出转角:与三相相电压之间存在映射关系,因此构建了一个以三相相电压为输人,转角为输出的小波神经网络实现转角预测,并采用改进遗传算法来训练网络
    发表于 06-25 13:06

    神经网络专家系统在电机故障诊断中的应用

    的诊断误差。仿真结果验证了该算法的有效性。 纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:神经网络专家系统在电机故障诊断中的应用.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版
    发表于 06-16 22:09

    基于FPGA搭建神经网络的步骤解析

    本文的目的是在一个神经网络已经通过python或者MATLAB训练好的神经网络模型,将训练好的模型的权重和偏置文件以TXT文件格式导出,然后通过python程序将txt文件转化为coe文件,(coe
    的头像 发表于 06-03 15:51 887次阅读
    基于<b class='flag-5'>FPGA</b>搭建<b class='flag-5'>神经网络</b>的步骤解析

    BP神经网络与卷积神经网络的比较

    BP神经网络与卷积神经网络在多个方面存在显著差异,以下是对两者的比较: 一、结构特点 BP神经网络 : BP神经网络是一种多层的前馈神经网络
    的头像 发表于 02-12 15:53 1301次阅读

    如何优化BP神经网络的学习率

    训练过程中发生震荡,甚至无法收敛到最优解;而过小的学习率则会使模型收敛速度缓慢,容易陷入局部最优解。因此,正确设置和调整学习率对于训练高效、准确的神经网络模型至关重要。 二、学习率优化算法 梯度下降法及其变种 : 标准梯
    的头像 发表于 02-12 15:51 1418次阅读

    BP神经网络实现步骤详解

    BP神经网络实现步骤主要包括以下几个阶段:网络初始化、前向传播、误差计算、反向传播和权重更新。以下是对这些步骤的详细解释: 一、网络初始化 确定
    的头像 发表于 02-12 15:50 1116次阅读

    BP神经网络的优缺点分析

    自学习能力 : BP神经网络能够通过训练数据自动调整网络参数,实现对输入数据的分类、回归等任务,无需人工进行复杂的特征工程。 泛化能力强 : BP神经网络通过训练数据学习到的特征表示
    的头像 发表于 02-12 15:36 1551次阅读

    什么是BP神经网络的反向传播算法

    BP神经网络的反向传播算法(Backpropagation Algorithm)是一种用于训练神经网络的有效方法。以下是关于BP神经网络的反
    的头像 发表于 02-12 15:18 1269次阅读

    BP神经网络与深度学习的关系

    ),是一种多层前馈神经网络,它通过反向传播算法进行训练。BP神经网络由输入层、一个或多个隐藏层和输出层组成,通过逐层递减的方式调整网络权重,目的是最小化
    的头像 发表于 02-12 15:15 1338次阅读

    BP神经网络在图像识别中的应用

    BP神经网络在图像识别中发挥着重要作用,其多层结构使得网络能够学习到复杂的特征表达,适用于处理非线性问题。以下是对BP神经网络在图像识别中应用的分析: 一、BP
    的头像 发表于 02-12 15:12 1179次阅读

    深度学习入门:简单神经网络的构建与实现

    深度学习中,神经网络是核心模型。今天我们用 Python 和 NumPy 构建一个简单的神经网络神经网络由多个神经元组成,神经元之间通过
    的头像 发表于 01-23 13:52 838次阅读

    人工神经网络的原理和多种神经网络架构方法

    在上一篇文章中,我们介绍了传统机器学习的基础知识和多种算法。在本文中,我们会介绍人工神经网络的原理和多种神经网络架构方法,供各位老师选择。 01 人工神经网络   人工
    的头像 发表于 01-09 10:24 2232次阅读
    人工<b class='flag-5'>神经网络</b>的原理和多种<b class='flag-5'>神经网络</b>架构方法