机器学习加速器文献整理

2023-11-17

William J. Dally 团队

Dally团队除了对神经网络处理器进行硬件优化,也提出了很多算法上的优化。包括

  • 提出了一种训练方法,在训练过程中对神经网络进行剪枝,可以增加网络的稀疏性,(可以减少9x到13x的互联weight)。
  • 对稀疏后的weight进行量化,这样数据就少了,可以使用LUT存储,在weight的量化过程中使用了K-means聚类算法。量化可以将weight的表示从32为降低为5位。
  • 量化后的weight,以及其稀疏编码的index的分布是非均匀的,通过分析这种非均匀性,使用huffman这种压缩编码来进行存储,节省20-23%存储空间。
  • 又提出在稀疏的时候,可以间隔着的稀疏,比如稀疏掉特定的一个滤波器,这样可以使稀疏后的数据更规整,利于加速。
    这里写图片描述

文献一:SCNN: An Accelerator for Compresse d-sparse Convolutional Neural Networks1

作者:Angshuman Parashar,William J. Dally
摘要

  • 对卷积层进行优化
  • 探索activation 和weight中的0来优化结构。在训练过程中通过将小于一定阈值的weight归零来增加weight矩阵的稀疏性。
  • 将卷积运算分布到几个子PE中运算。
  • activation和weight都使用稀疏编码来计算。

结构及优化分析
本文提高,CNN网络的稀疏性表现在两个方面:weight的稀疏性和activation的稀疏性。Weight的稀疏性可以通过一些剪枝算法来实现,比如韩松等人提出的剪枝算法。Activation的稀疏性来自于ReLU运算。
Weight和activation中的0不会对结果产生影响。因此通过利用CNN的稀疏性可以得到以下两个好处:1、压缩数据,通过使用压缩编码消除数据中的0,可以减小需要存储的数据量;2、消除不必要的计算,当weight和activation中有0时,我们既可以关闭计算单元来节省能耗,也可以直接跳过该运算,这样既节省能耗又节约时间。CNN硬件设计就需要充分利用这两个好处。
这里写图片描述
一个典型的CNN卷积层运算的数据结构和算法如上图所示,为一个7层嵌套的循环,其核心运算为滤波中的乘累加。硬件设计就是要对该循环进行并行加速。
首先假设数据的非稀疏的,先根据卷积运算的7层循环的特点来优化结构。由于weight和activation都很大,要进行分块处理。对于卷积运算,有两种循环方式:固定activation,循环weight;固定weight,循环activation。该文使用的前者,因此首先对weight进行分组,将k个通道(channel)的weight按照每组Kc个通道来分组,weight分组后的计算单元变为:
这里写图片描述

该文的结构SCNN由多个PE组成,因此对于以上的计算单元,又对activation进行分块。将WxH的activation平面,按照Wt × Ht的格子进行分割,每个PE计算的activation数量为C ×Wt × Ht。weight通过广播的方式同时广播到每个PE,每个PE完成各自部分的乘累加运算。
在activation分割成格子的时候,会出现data halo问题,即在未分割的时候,卷积是在整个WxH平面上进行的,分割之后,卷积在在小格子的边界附近就无法得到完整结果,因为有一部分数据是在另一个PE里面。解决的办法有两种:1、在每个PE的输入的activation比Wt × Ht略大一些,通过activation来解决data halo问题;2、在每个PE计算完的累加缓存做的比Kc × Wt × Ht大一些,多出来的部分存储着不完全的累加值,然后通过相邻计算单元间的通信再得到完整结果。两种方案资源消耗相当,该论文选择的是第二种方案。
然后在每个PE里面要计算通过一个二维的乘法矩阵单元计算,F个weight和I个activation依次相乘,得到FxI个结果。然后这些结果在一个累加单元里累加,得到最终的输出结果。
通过以上几步,得到并行化后的对于非稀疏CNN卷积的优化算法,伪代码如下。
这里写图片描述

将上述针对非稀疏CNN卷积的分析过渡到稀疏CNN,有两方面的修改。
1、首先,weight和activation都是稀疏表示的,因此输入输出的地址都要通过index计算。为了地址计算的方便,稀疏表示的weight和activation的压缩也是分组进行的,每一个Kc × R × S块中的weight压缩成一组,每一个Wt × Ht区域内的activation压缩成一组。在处理的时候,数据也是按这样的组进行的。
2、稀疏表示后,输出矩阵并不像上图一样是规整的Kc ×Wt × Ht矩阵,也是稀疏的(有些地方没有0)。因此,累加单元不能直接对输出结果进行累加,这里将乘法矩阵输出的IxF个数据,通过一个crossbar输入到一个加法累加buffer中,通过crossbar使属于同一个输出位置的乘法结果输出到同一个累加buffer中,每个累加buffer最后将结果累加得到最后的输出。
以下是最终的系统结构图。
这里写图片描述
简评
优点
1、weight、activation稀疏表示;
2、探索卷积运算的多次循环的可并行性,通过多PE结构进行并行计算;
3、计算后的结果如果能作为下一次的activation,则保存在本地PE,避免了重复存取。Tips,这里感觉有个潜在不足,就是每一层的输出其实矩阵是和前一层不一样的,因此,这里的activation应该是所有PE一起的一个整体的调整,可能没有直接存在PE本地那么简单,可以仔细研究一下。
不足
1、对于卷积层的计算优化的很好了,但是对于全连接层优化有限。

文献二:EIE: Efficient Inference Engine on Compressed Deep Neural Network2

作者:Han Song,William J. Dally
摘要

  • 对FC层进行优化(全连接层没有卷积层那样的重复,矩阵带宽最大)
  • 对weight、activation进行稀疏表示
  • weight 有限精度 4bit
  • 将weight按行分配到每一个PE中,计算时将activation广播到所有PE,
    这样分配可以使每个PE计算后就直接得到相应位置的输出。

结构优化及分析
对于卷积层的加速已经有很多人做,但是对于RNN和LSTMs来说,存在着大量的全连接层(FC),RNN广泛应用于图像捕捉和自然语言识别等领域。本文对FC层进行加速。FC层的特点是所有的输出和所有的输入都有连接,在较大的层里,内存读写就是主要瓶颈。对此本文做了以下优化:

  • 稀疏表示activation和weight,使其可以片上SRAM存储;
  • 共享weight,即每个PE里weight固定,然后和不同的输入activation运算,不用反复读取weight
  • weight使用查找表存储稀疏后的weight值,通过4bit的index索引
  • 对于系数矩阵运算,使用分布式存储,分布式运算的方法来在多个PE中并行计算。该方法可以实现各PE的负载均衡

稀疏表示的weight存储结构如图所示,可以看到,weight是按列存储的,且一个PE核对应的weight存在对应PE里。如对于PE0,存储一次是第一列的绿色非零weight,第二列的非零weight。这样就可以每进来一个activation都可以把和他相关的weight运算都算完。按列存储的好处是可以更好的处理activation的稀疏性,只要将非零的activation乘以对应列中非零weight即可。
这里写图片描述

在运算的时候,activation被广播到所有PE,与每个PE对应列处的非零weight进行计算。
这样计算的话,每个PE的计算量可能不同,进而导致load imbalance。为了解决这一问题,在activation输入每个PE后存储在一个队列里面,如果有一个PE的activation队列满了,则停止输入activation的广播。(tips,这种做有个缺点是,当有一个PE计算量大的时候,其他PE的队列已经空了,这时候就要停下来等他,有没有可能把负载过重的PE工作分配到别处?或者在训练的时候就保证weight的均衡性)。
PE计算完后,通过ReLU会出现0,也就是说对于下一层计算的activation也需要先稀疏表示,这个工作通过LNZD模块完成。LNZD的连接是四叉树型结构(如下图左边),每个LNZD接收4个PE的值,稀疏表示后再依次送到上一级的LNZD节点。LNZD这样的树型结构可以保证增加节点的时候线宽可以保持一致(tips,方便扩展)。
该加速器整体结构如下图所示
这里写图片描述

简评
优点
1、稀疏矩阵的乘法中,weight按列存取,多核计算更方便;
2、PE的输入activation使用队列缓存,可以进行负载均衡控制;
3、对于输出activation进行稀疏表示的时候,使用了一个树型结构,方便结构的扩展。
不足
1、对于全连接层的计算优化的很好了,但是对于卷积层几乎没有优化
2、文中自己提高一个不足,weight按行分配到PE中,activation需要广播到每个PE中,这样对于相应列没有计算的PE也需要接受activation,并做判断。
但是如果列存储,每个PE计算后的结果,还需要最后有一个单元来进行汇总。也可以将weight分块,就可以结合以上两种方式的优点,但是结构就会很复杂。因此这个问题上有个取舍,或许还有更好的方案。

寒武纪团队

文献一:DianNao: A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning3

摘要

  • 没有使用多个PE核的结构
  • 寒武纪注重数据并行化方面的优化,加速器使用一个三级的流水结构:乘,加,sigmoid。
  • 可以支持多种神经网络结构 (MLP, CNN, RNN, LSTM, Autoencoder, Sparse Autoencoder, Boltzmann machines (BM), Restricted boltzmann machine (RBM), Self-organizing maps (SOM), Hopfield neural network (HNN))。

结构优化及分析
改论文分析了CNN和DNN等深度神经网络,提取出三类关键算法层:分类层(classifier layer,优点类似全连接层),卷积层,pooling layer。对应的通用算法有:乘法,累加,以及sigmoid等特殊运算。根据对这些运算分析,提出了一个三级流水的结构,分别进行乘法,累加,sigmoid运算。
这里写图片描述

对于分类层,需要用到乘法、累加、sigmoid都会用到;对于卷积层,也是所有级都用到,最后一级的sigmoid也可以变为其他核函数;对于pooling layer,没有乘法,第三级的运算也不是sigmoid,可以是求平均或者求最大值。
在该结构中,为了对大型网络进行运算,使用了输入输出队列来保持activation和weight。输入数据根据队列的大小分块输入。输入activation有时候需要复用,因此activation对应的输入队列NBin被设计出circular buffer。因为输入是按块输入的,因此输出的累加值不是最终结果,为了不重复存取,第二级(NFU-2)有一个delicated register来存储累加值。

简评
感觉整体上是一个中规中矩的处理器设计思路:算法抽象,提取kernel,设计处理器。三级结构比较直观。不足是感觉整个结构是直接的算法映射,由于设计的比较通用,所以可能针对特定算法的结构优化就少一些。
这个结构追求的通用性更强一些,不太适合短时间跟进

文献二:Cambricon-X: An Accelerator for Sparse Neural Networks4

摘要
在DianNao基础上加入稀疏编码模块,只选择不为零的activation进行计算;
该结构对classifier layer加速明显,但是对conventional layer加速有限。
结构优化及分析
该结构是在DianNao结构基础上的改进,添加了对activation和weight稀疏的支持。
这里写图片描述

可以看到,主要的改进是在输入/输出缓存和运算单元之间,加了一个buffer controller。Buffer controller里有两个单元,BCFU用来存储根据IM选择的神经元。IM(indexing module)是稀疏表示的关键,用来根据索引来确定需要计算的神经元,并将对应的数据分配给各个PE计算。文中给出了其根据稀疏表示的index寻址的结构(结构可以借鉴)。

简评
该结构对输入数据的稀疏性进行了处理,但是对于输出后新产生的稀疏数据没有进行处理。

参考文献


  1. Parashar A, Rhu M, Mukkara A, et al. SCNN: An Accelerator for Compressed-sparse Convolutional Neural Networks[J]. 2017:27-40.
    https://arxiv.org/abs/1708.04485
  2. Han S, Liu X, Mao H, et al. EIE: Efficient Inference Engine on Compressed Deep Neural Network[C]// International Symposium on Computer Architecture. IEEE Press, 2016:243-254.
    https://arxiv.org/abs/1602.01528
  3. Chen Y, Chen Y, Chen Y, et al. DianNao: a small-footprint high-throughput accelerator for ubiquitous machine-learning[C]// International Conference on Architectural Support for Programming Languages and Operating Systems. ACM, 2014:269-284.
    http://sist.shanghaitech.edu.cn/faculty/zhoupq/Teaching/Spr17/Guest-Lecture/Diannao-CAS-ASPLOS14.pdf
  4. Zhang S, Du Z, Zhang L, et al. Cambricon-X: An accelerator for sparse neural networks[C]// Ieee/acm International Symposium on Microarchitecture. IEEE, 2016:1-12.
    http://cslt.riit.tsinghua.edu.cn/mediawiki/images/f/f1/Cambricon-X.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习加速器文献整理 的相关文章

随机推荐

  • vi命令修改文件及保存的使用方法

    简单点 vi文件名 按 I 进入insert模式 可以正常文本编辑 编辑好之后按 esc 退出到 命令模式 再按 shift 进入 底行模式 按 wq 保存退出 还一种 把文件复制到本地修改好上传上去 vi编辑器是所有Unix及Linux系
  • 每日一练:用java打印水仙花数

    需求 在控制台输出所有的 水仙花数 解释 什么是水仙花数 水仙花数 指的是一个三位数 个位 十位 百位的数字立方和等于原数 例如153 3 3 3 5 5 5 1 1 1 153 思路 获取所有的三位数 准备进行筛选 最小的三位数为100
  • cp1.php969.net,eDrawings

    OzsgSFNGIFYxMy4wNSAKSQAAAABCAGDlUL0Spb29AAAAAGXlUD13vp89x0rNPVp42uy9B0AUSdMw3LMzsxHYJeec8 6SdoGVJagoiAFBMAOimNDDhBHMeqen
  • 怎么批量安装服务器的操作系统,批量安装服务器操作系统

    弹性云服务器 ECS 弹性云服务器 Elastic Cloud Server 是一种可随时自助获取 可弹性伸缩的云服务器 帮助用户打造可靠 安全 灵活 高效的应用环境 确保服务持久稳定运行 提升运维效率 三年低至5折 多种配置可选了解详情
  • 数组(持续更新后续)

    目录 数组定义 数组的组成部门 案例一 案例二 案例三 增强for循环 语法结构 执行规律 注意 案例 案例 案例 数组定义 变量 存储数据的空间 装数据的容器 变量中只能存储一个数据 数组 存储数据的空间 装数据的容器 数组中可以存储多个
  • sojson JS 逆向一 (简单版)

    背景 现在市面上很多web网页都是使用sojson加密的 所以 爬虫小伙伴对sojson的学习迫在眉睫 js 加密源码 var a b function w d w info 这是一个一系列js操作 d warning 如果您的JS里嵌套了
  • 202206-3 角色授权

    第三题 题干 角色授权 include
  • svn更新有问题svn: The working copy at' ' is too old

    SVN the working copy needs to be upgraded svn 低版本SVN检出代码 高版本SVN提交不了解决方法如下 项目右键 team Upgrade 即可 如下图 参考URL https blog csdn
  • Python:流动爱心图案

    from turtle import 导入了Python标准库中的turtle模块 并使用通配符 导入了该模块中的所有函数和变量 turtle模块提供了一个绘图窗口和一些绘图函数 可以用来绘制简单的图形 from math import s
  • python-爬虫初识-采集汽车资讯信息案例(一)

    目录 一 什么是爬虫 二 初识爬虫 采集汽车资讯信息 三 requests和BeautifulSoup模块基本使用 requests import requests BeautifulSoup from bs4 import Beautif
  • 数学模型——数学与人类文明的桥梁

    序言 数统治着宇宙 Pythagoras 数学一词在西方源于古希腊语 意思是通过学习获得知识 显然 早期数学涵盖的范围比我们今天要广得多 人类科学发展至今 衍生出生物科学 信息科学 金融学 计算机科学等不胜枚举的领域与分支 而数学模型正是数
  • Word打印或打印预览或另存为PDF时出现“错误!未定义书签!”的解决办法

    出处 http blog sina com cn s blog 5ee0924f0101a05l html 今天在单独打印一份三页的目录Word文档时 所有目录的页码全部变为 错误 未定义书签 很是奇妙 一开始还以为是打印问题 又重新打印了
  • 如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例

    文章目录 步骤1 创建 Google Cloud Platform GCP 账户 步骤2 设置 GCP 项目 步骤3 启用 Google Compute Engine API 步骤4 安装 Google Cloud SDK 步骤5 创建虚拟
  • sql中使用union 或者union all语句时,两边的列的顺序必须保持一致

    sql中使用union 或者union all语句时 两边的列的顺序必须保持一致
  • [HashMap源码学习之路]---hashcode的作用及数组长度为什么是2的n次幂

    HashMap中的hashcode作用 HashMap是Java 中很重要的一个概念 工作中使用的频率也非常广泛 需要对其进行了解 看源码是很枯燥的 但是看懂了 却有种豁然开朗的感觉 觉得特别棒 本篇只说hashcode的作用及数组长度为什
  • Java Thread synchronized同步锁简介说明

    转自 Java Thread synchronized同步锁简介说明 下文笔者讲述Thread synchronized同步锁的简介说明 如下所示 java中 每一个对象只有一个同步锁 同步锁放置在对象头上 当我们调用一个对象的synchr
  • VS2019中搭建QT 5.15.2开发环境

    接触QT VS一年多 对于环境搭建的一些细节已有些遗忘 最近又要重新搭建环境 就以此文章来记录一下搭建的细节 方便日后查询 1 VS2019与QT5 14 2的安装 VS2019的安装链接下载 Visual Studio Tools 免费安
  • 在keil工程中删除编译文件的方法

    在实际工作中coding的工作是一方面 但是作为最终的输出是要提交源码作为成果来管理和上传的 不管是Git也好SVN也好 一般都要求只保存源码和工程文件 针对单片机MCU类的项目 对于Linux下的项目没有工程文件一说 只有配置信息和整个工
  • unity粒子系统

    添加粒子系统 按照GameObject gt Effect gt Particle System顺序 添加粒子系统 效果如下 粒子系统有其独特的组件 Particle System 展开上面的一系列属性中的Particle System 调
  • 机器学习加速器文献整理

    William J Dally 团队 文献一SCNN An Accelerator for Compresse d sparse Convolutional Neural Networks1 文献二EIE Efficient Inferen