热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习加速器文献整理

  • William J Dally 团队
    • 文献一SCNN An Accelerator for Compresse d-sparse Convolutional Neural Networks1
    • 文献二EIE Efficient Inference Engine on Compressed Deep Neural Network2
  • 寒武纪团队
    • 文献一DianNao A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning3
    • 文献二Cambricon-X An Accelerator for Sparse Neural Networks4
  • 参考文献

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 ↩

推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
金牛梁浩_934
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有