韩松毕业论文笔记-第六章-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING

难得跟了一次热点,从看到论文到现在已经过了快三周了,又安排了其他方向,觉得再不写又像之前读过的N多篇一样被遗忘在角落,还是先写吧,虽然有些地方还没琢磨透,但是paper总是这样吧,毕竟没有亲手实现一下,光是看永远无法理解透彻,然后又去忙别的工作,看过的都打了水漂。

第六章 EIE-用于稀疏神经网络的高效推理引擎

目测和发在ISCA2016的论文EIE: Efficient Inference Engine on Compressed Deep Neural Network 内容一致,补了一些图。是一个神经网络加速器,用硬件加速训练好的网络模型。

6.1 Introduction

为了评估EIE性能,为其建立了行为级描述和RTL级模型,并对RTL模型进行了综合和布局布线,以获得精确的功耗与时钟频率。在9个DNN benchmarks上的结果显示,EIE比未压缩的CPU快189倍,GPU快13倍。EIE在稀疏网络上的处理能力达102GOPS/s,相当于稠密网络3TOPS/s,而功耗只有600mW。

6.2 稀疏神经网络并行化

稀疏神经网络计算并行化的一种简单的方式是将稀疏矩阵恢复为稠密矩阵,然后通过稠密线性代数并行化技术加速计算。可以通过门控,跳过0操作来降低计算能耗。然而,此方法只能降低功耗,无法节省计算周期。因此,我们选择直接在稀疏模型上进行计算,可以同时节省计算时间和功耗。

6.2.1 计算

深度神经网络中的每一层通过计算b=f(Wa+v)实现,将偏置v合并到权值W里,并为向量a添加一个全1项,公式可写成如下格式:

这里a、b下标都是一维的(因为刚开始接触神经网络就是CNN,直接以为是卷积计算了,这里不是的,只是权值矩阵和向量a的点乘),形象化点的图:

深度压缩通过剪枝和权值共享对DNN进行压缩,剪枝使权值矩阵W变得稀疏,约能压缩4%~25%。权值共享将每个权值Wij用一个4bit索引Iij查找共享的向量表S,S里是16个可能的权值(S也是4bit,从0x0~0xF)。通过深度压缩,上述等式变为如下形式:

其中X是经过稀疏以后的权值W,是静态的,对于给定的模型,不会发生变化;Y是经过稀疏以后的输入a,随着输入的变化而变化。

对比公式6.1和6.2,主要两点不同:1. 用查找表S替代权值矩阵W的存储;2. 只对权值和输入同时非零的情况进行计算。

6.2.2 表达

将稀疏权值矩阵W用CSC格式存储,用v表示非0的权值,z表示索引,当两个非零权值相隔超过15时补一个0,如下所示:

再将所有的v和z成对地装在一个大数组里,用一个指针向量p进行索引,pj指向第j列的开始。

6.2.3 并行化

将一个权值矩阵拆分到N个PE里同时计算,稀疏矩阵*稀疏向量的实现方法:扫描稀疏向量a,查找其内部非零值,将非零值aj的索引j广播到每个PE,然后每个PE根据其对应的权值是否为零决定是否进行计算。举一个16行8列权值矩阵计算的例子:

对应的并行计算方式如下:

权值W按6.2.2描述的方式进行表达,并且是每个PE内排序,而不是整个W矩阵排序,作者给了个PE0的CSC示意图:

这里,W8,0和W0,0之间只隔了一个W4,0,如下所示:       

6.3 硬件实现

EIE的结构如下,图(a)用于查找非零输入,图(b)是EIE中一个PE的结构:

这个图画的很清晰,紫色是索引(地址流),蓝色是数据(数据流);绿色方框存储器,橙色方框寄存器。

除了非零输入的查找并广播到所有PE这一过程(图a),几乎其他所有计算都在独立的PE内部。但是由于大部分PE都需要对每个非零输入进行多周期计算,非零输入的查找与广播并不是关键路径(不local就不local吧,反正要等PE计算完,这个慢一点没关系)。

6.3.1 激活队列与负载平衡(对应模块Act Queue)

负载不平衡的问题描述(这一段毕业论文有,ISCA没有):

相当于木桶效应,只能等计算量最大,跑的最慢的PE计算完成才能完成一次计算,解决方案有两种负载平衡策略:

  1. 全局负载平衡在第三章剪枝中描述,用于处理非零元素在整个矩阵中分布不均匀的情况;
  2. 局部负载平衡使用队列将被挂起的任务进行排队,用于处理非零元素在矩阵某一列中分布不均匀的情况。

EIE为每个PE设计一个激活队列,有了这个激活队列以后,只要所有PE里的激活队列不满,CCU都可以放肆地广播新的非零输入;只要PE里的激活队列不空,该PE也可以任性地计算。

如果不使用队列的话,每完成一列计算,所有PE都需要同步一次,如图6.5,跑的快的PE就需要插入延时槽(蓝色)以等待跑的慢的PE。使用了队列以后如图6.6,只有队列排满或变空时才需要插入延时槽了,这里涉及到体系结构设计里的面积换速度问题:队列大,延时槽少,占用资源多但速度快;反之,如果使用的队列小,延时槽相应会增多,导致速度慢。

6.3.2 指针读取单元(对应模块Pointer Read)

读取p

6.3.3 稀疏矩阵读取单元(对应模块Sparse Matrix Access)

根据p读取W,

6.3.4 计算单元(对应模块Arithmetic Unit )

实现操作: bx = bx+v*aj,把上一节取到的W和发射队列里的aj乘起来,并根据取到的x和对应的bx累加,再送到对应的寄存器(x就是用来索引这个寄存器的)。这里还增加了bypass,如果相邻两个计算要写的是同一个目的寄存器,就直接通过旁路给过来,又可以节省一个读等待的时间。

6.3.5 激活神经元读写单元(对应模块Act R/W)

根据索引x读写bx数据,此单元设计双缓冲(包含两组寄存器文件),可以保存本层的计算结果,同时还可以作为下一层的输入,从而实现多层前向计算。

6.3.6 分布式LNZD(对应模块LNZD)

这里感觉理解的不是很清晰,只知道是用来检查非零神经元的,为什么叫Leading非零值检测呢?是说计算出来接近零的都算是非激活神经元,然后只挑那些显著不为0的吗?

H-tree来自维基百科:

6.3.7 中央控制单元(CCU)

根节点(输入层)上的LNZD作为中央控制单元,配合CPU工作,接收CPU指令,发给PE。两种工作方式:I/O和计算。

I/O模式下,每个PE处于idle态,等待DAM把权值和神经元初值写入片上内存,这个属于一次性开销(每层计算只需要这样load一次);

计算模式下,CCU不停地通过四叉树LNZD查找非零值并广播到所有的PE,控制PE进行计算,直到达到输入长度。

CPU可以通过给定不同输入长度和起始地址,使EIE实现神经网络中不同的层的计算。

6.4 评估方法

1. 用C++实现了模拟器,把每个硬件模块抽象成一个对象,具有两种行为:传递和更新,分别对应RTL模型中的运算逻辑和翻转。该模拟器可用于体系结构设计空间搜索,同时也是RTL验证的黄金模型。

2. 为了测量面积、功耗和关键路径延时,用Verilog实现了RTL模型,并用仿真器进行了逻辑验证。然后使用Synopsys的IC编译器对45nm的工艺库进行布局布线,用Cacti对SRAM的面积和功耗进行计算,再将RTL仿真结果标到门级网标(这块涉及前仿,不是很了解,总之是用来计算如果设计成45nm工艺,性能如何)。

使用压缩前和压缩后的9个DNN模型(包括Alex、VGG、LSTM网络)分别和Core-i7 CPU、Titan X GPU以及移动GPU做了对比。

6.5 实验结果

关键路径延时设为1.15ns(870Mhz),神经元的一次激活划分为4级流水线:1)。通过访问局部寄存器对激活神经元进行读写,通过旁路技术避免流水线冲突。使用800M*64PE可实现超过102GOP/s的性能,再考虑到10倍的权值稀疏和3倍的激活神经元稀疏,需要处理能力达3TOP/s的dense DNN加速器才能达到等量吞吐性能。

每个PIE PE的SRAM容量为162KB,激活神经元SRAM2KB,用于存储权值及其索引的Spmat SRAM 128KB,每个权值4bit,其索引4bit,将权值和索引合并为8bit/组并一起寻址,

6.6 讨论

本节是对不同设计方案的讨论,都是用数据说话。

6.6.1 划分方式

稀疏矩阵乘是EIE的关键部件,这一节讨论三种划分方式的优缺点。

列划分:好处是一个aj对应一个PE,不用广播了,但是如果一个aj=0,对应的一列计算都省了,会导致忙的PE累死,闲的PE闲死。

行划分:本文的方式。

混合划分方式:行列划分矩阵W,所有PE构成2维阵列并行计算,适合通讯代价大的分布式系统,设计复杂度高。

6.6.2 可扩展性

6.7 结论

即是专用芯片,能效比肯定是相当好,跟GPU相比,对典型全连接层计算可节省3400倍的功耗。跟CPU、mobile GPU比也是绝对的碾压。

第七章 结论

觉得论文最后一段很是感人,贴在这里,向男神学习。

时间: 2024-08-28 14:44:33

韩松毕业论文笔记-第六章-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING的相关文章

cs231n spring 2017 lecture15 Efficient Methods and Hardware for Deep Learning 听课笔记

1. 深度学习面临的问题: 1)模型越来越大,很难在移动端部署,也很难网络更新. 2)训练时间越来越长,限制了研究人员的产量. 3)耗能太多,硬件成本昂贵. 解决的方法:联合设计算法和硬件. 计算硬件可以分为通用和专用两大类.通用硬件又可以分为CPU和GPU.专用硬件可以分为(FPGA和ASIC,ASIC更高效,谷歌的TPU就是ASIC). 2. Algorithms for Efficient Inference 1)Pruning,修剪掉不那么重要的神经元和连接.第一步,用原始的网络训练:第

MySQL cookbook读书笔记第六章

1,修改MySQL中的日期的格式 在显示一个日期值时,如果没有特别指定,MySQL按照ISO格式显示日期即(CCYY-MM0DD).如果不希望按照MySQL的默认格式输出时间和日期值,可以使用date_format()或者time_format()函数按照用户期望的格式重写日期或者时间值 date_format(),time_format()和str_to_date()三个函数都接受格式化串作为参数: 2,设置客户端时区 如果客户端和服务器处在不同的时区,那么客户端在服务器上保存timestam

《Linux Shell脚本攻略》 笔记 第六章:打包压缩

<Linux Shell脚本攻略> 笔记 第六章:打包压缩 //1.打包.解包 [[email protected] program_test]# tar -cf output.tar 11.txt 22.txt 33.txt [[email protected] program_test]# tar -xf output.tar -C ./tar-file/  //-C指定要提取到哪个路径? //列举出归档文件中的内容 [[email protected] program_test]# ta

构建之法阅读笔记05-第六章

阅读笔记 第六章:敏捷流程 第六章敏捷流程主要介绍了什么是敏捷流程及其原则,还有什么时候可以选择敏捷的开发方法,什么时候选择其他方法. 敏捷的流程是指一系列价值观和方法论的集合.介绍了一些敏捷开发原则,比如,经常发布可用的软件,业务人员和开发人员在项目开发过程中应该每天共同工作,面对面的交流始终是最有效的沟通方式,不断关注技术和设计,保持简明,团队要学会自我管理,时时总结如何提高团队效率,并付诸行动. 敏捷流程的方法论---Scrum方法论.首先第一步需要找出完成产品需要做的事情,然后决定当前的

《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

<Microsoft Sql server 2008 Internals>索引目录: <Microsoft Sql server 2008 Internals>读书笔记--目录索引 在第五章主要学习了table的内部存储结构,第七章<Special storage>中将继续深入学习存储机制,那将是本书最难理解的一章.第六章主要介绍index的基础知识,第八章是<query Optimizer>,下面我们先来看看第六章:Indexes:Internals an

深入理解 C 指针阅读笔记 -- 第六章

Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_ /*<深入理解C指针>学习笔记 -- 第六章*/ typedef struct __person { char* name; char* title; unsigned int age; }person; /*结构体内存的释放问题*/ void __struct_memory_test(); #endif Chapter6.cpp #include "Chapter6.h&quo

APUE读书笔记-第六章 系统数据文件和信息

昨天看完了,今天来看看第六章.感觉第六章的内容不是非常重要.简单看看吧 6.2 口令文件 口令文件其实就是/etc文件夹下的passwd文件,但处于安全性的考虑,我们无法直接读取它.就是通过直接限制权限的方式对其进行保护,passwd文件具体权限如下: -rw-r--r-- 1 root root 可以看到只有root用户具有读写权限,与root同组的用户与其他用户仅具有读权限. 不过为了解决以上问题,Linux中给出了一系列数据结构与函数帮助我们操纵口令文件,首先是关键数据结构,定义位于/in

《从0到1》笔记 第六章 成功不是中彩票

第六章 成功不是中彩票----长期规划及其重要 初创公司的创立者只有在对公司没有确切规划的时候才会主动卖掉公司.2006年7月,当雅虎公司出价10亿要收购Facebook时,我认为如果是我们,至少会考虑一下.但是马克.扎克伯格在会议上宣布:“好了,伙计们,这个会议只是走个程序,10分钟也不用,我们显然不会把Facebook卖掉”马克清楚他能够领导公司开创出怎样的未来,而雅虎不清楚. 初创企业是你可以明确掌握最大努力的机会.在这里,你不只拥有自己生命的代理权,还拥有这个世界上某个重要角落的代理权.

Android学习笔记—第六章 Asynctask异步加载

第六章 Asynctask 异步加载 1.好处:不需要创建线程就可管理线程 缺点:步骤多 2.步骤: (1)创建一个类继承Asynctask<xxx,xxx,xxx>; 三个泛型参数: 第一个:决定了execute()方法的传入值类型,决定了doInBackground()方法的传入值类型 第二个:决定了publishProgress()方法的传入值类型,决定了onProgressUpdate()方法的传入值类型 第三个:决定了doInBackground()方法的返回值类型,决定了onPos