Cambricon-X: An Accelerator for Sparse Neural Networks
一、引入
我们以前提到的深度学习网络都属于稠密网络。经过研究发现,神经元间的连接很多都是冗余连接,剪枝后反而有助于精度提升。目前网络的稀疏度可以达到90%以上。举个例子来说,原来一个100MB参数的网络,压缩后,只有不到10MB的参数,大大减少了存储和运算量。
对于稀疏网络加速器设计来说,剪枝后带来的一个问题是网络不规则性。如果不能较好的解决该问题,就不能从剪枝中获得理想收益。
二、几种常用的压缩方法
下面我们简单介绍几种在算法层面常见的压缩方法:
1.结构设计:最常见的是轻量型网络设计,比如Mobilenet网络中采用了深度可分离卷积(depthconv),相比普通卷积节省了很多运算量。
2. 剪枝:如下图所示,分为权值剪枝,神经元剪枝(静态神经元剪枝,动态神经元剪枝)。剪枝还有一种划分方法,即结构化剪枝和非结构化剪枝。
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/8120d3262f0da3da0277bc2fe88bfb73.png)
3. 量化:低比特量化(16bit,8bit)、二值量化。
4. 知识蒸馏:属于迁移学习的一种,将训练好的大网络作为教师网络,指导小网络(学生网络)的训练。本质上是使得小网络训练的更准确。
三、本文稀疏处理器架构
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/9702fe9c1d27713ae2655fd1a61f9763.png)
控制单元:同Diannao架构类似,都是采用指令集驱动执行的。
计算单元:16个以Fat-tree总线形式连接的、可以异步执行的PE单元。单个PE架构如下图所示,每个PE单元内部可以并行执行16次乘法运算,还包含了加法树单元。
异步执行的优势:稀疏网络架构是不规则的,也就是对于每个输出神经元,其计算次数不不尽相同。如果采用同步计算模式,必然会浪费较多运算周期,采用异步计算模式则可以解决该问题。
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/34eeb2fcd1107f8bccadd6e07273953d.png)
存储单元:NBin,NBout和SB是单独实现。需要注意的是SB单元被划分为多个,每个计算单元PE单元都有一个自己的SB单元,每个SB单元大小为2KB。权值数据是以压缩形式存储在SB中的;输入、输出数据是全部存储在NBin、NBout中的。
Buffer Controller:这里是针对稀疏加速器特别引入的模块,结构如下图所示。该架构可以支持稀疏和稠密两种网络的执行。
稀疏网络:输入数据input会传输到选择IM单元中,IM模块会根据索引选择PE计算所需要的数据。每个PE都有一个这样的index选择模块。
稠密网络:输入数据input通过BCFU单元直接传输到PE中进行计算,跳过IM选择模块。
输出数据output可以经过BCFU单元处理,也可以直接写回到NBout中。
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/5bc973410f36f9c9898b27e8ac0c24c8.png)
四、稀疏存储与映射
稀疏映射(for input):
1.direct indexing
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/fdb7d303df93b4ff1d3f61572f830c12.png)
2.step indexing
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/48943b8d48014817dd66a08bd3bf2ce9.png)
本文作者经过实验对比后,选取了第二种映射方法—Step indexing。
稀疏存储(for SB):假设每个PE计算单元中包含4个并行乘法单元,则左图神经元连接对应的SB中权值存储方式如右图所示。对于神经元0来说,只需一次加载就可以完成计算;对于神经元1来说,需要两次加载过程完成计算。从这里我们也能看出PE计算单元选择异步执行的好处,神经元0不需等待神经元1计算完成。
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/ba752417e4c70bf32539c8fcbb0c6096.png)
五、实验结果
参数 | Diannao | Cambricon-X |
---|---|---|
工艺 | 65nm | 65nm |
面积 | 3.02mm2 | 6.38mm2 |
频率 | 0.98GHz | 1GHz |
乘法运算单元 | 16*16(同步) | 16*16(异步) |
算力 | 482Gop/s | 544Gop/s |
能耗 | 485mW | 954mW |
片上缓存 | 44KB | 56KB |
位数 | 16bit | 16bit |
总结:Cambricon-X实现了一个稀疏处理器,其能耗是Diannao的2倍。从下面图中可以看出,稀疏处理器的能耗很大一部分都花在了IM选择模块上。与其稀疏后所获得的收益相比,能耗增大还是可以接受的。
![图1 pipeline](https://i-blog.csdnimg.cn/blog_migrate/07ef44b0fcbbdc52ee1b8b70315600e8.png)
六、思考
非结构化剪枝->结构化剪枝
本文采用的是非结构化剪枝方法,也就是以神经元连接作为剪枝粒度,剪枝后的连接是乱的,带来了网络不规则性问题。由此一些研究人员提出了结构化剪枝方法,将剪枝的粒度提升到块block层次(例如Cambricon-S处理器设计),还有一些研究人员将剪枝粒度提升到了特征图feature map层次,也就变成了通道剪枝方法。这些思路为稀疏处理器的设计指出一些新思路。
多PE异构执行:这是一个值得借鉴的思路。异步架构控制起来更加复杂。但如果能与流水线或者稀疏结合起来,就可能会获得比同步架构更好的性能。
Finished.
PS:加速器架构设计来源于文章。引入,思考等都是自己写的,算是简单总结一下。