DeepBurning: automatic generation of FPGA-based learning accelerators for the neural network family
Title
DeepBurning: automatic generation of FPGA-based learning accelerators for the neural network family
Proceedings of the 53rd Annual Design Automation Conference
contribution:
-
根据Caffe脚本生成RTL加速器代码(same)
-
on-line控制流实现空间和时间的折叠(具体的算法是啥呢?)
-
优化输入数据与权重的存储布局,利用存储的局部性实现地址生成单元(具体方式?)
Preliminaries and Observation
包含四层的一个卷积网络
多层感知机(MLP)的硬件加速例子:
Architecture of DeepBurning
组件库
数据驱动相关
-
时间折叠:单个组件,在不同的时间被不同的网络层复用
-
空间折叠:单个网络层,拆分成不同的段,在不同的事件共享一个组件
地址生成单元(AGU)
(有点像DMA)
-
Main AGU:on-chip与off-chip之间的数据通信
-
Data AGU: 从on-chip内存中取输入数据或特征数据
-
起始地址offset
-
布局:feature=[div_tile_num, width, height, K]
-
-
Weight AGU: 从on-chip内存中取权重数据
- weight=[out_channel, kernel_x, kernel_y, div_tile_num, K]
Approx LUT Generation
近似LUT用于实现激活函数,输入放入LUT的索引中,预先存储输出结果,通过存储的有限样本近似激活函数来进行模拟。编译器解析复杂函数,选择采样点,计算Approx LUT中填写的值。
命中LUT的输入就直接输出LUT的结果,否则通过线性插值生成输入的近似结果
Dynamic Control flow
动态控制流:用数据将实例化的IP核连接运行起来,控制从AGU里取数据,放入IP核里进行计算,得到输出数据,通过AGU写入内存,再调用下一个IP核通过AGU取数据运行,反复上述
硬件感知的数据布局
57*57
的特征图,12*12
的卷积核,步长为4
问题:如果按照行布局,带宽的利用率很低,取一整行,只有前12个数被用到
方法:
- 特征图分块为大小为
12*12
的块tile,块中的数据是被连续放在内存中的,所以就利用了数据的局部性 - 按照步长分区,减少数据访问次数,提高数据的重用。需要进一步使用partition分区将
12*12
切割成3*3
个块,每个块里面有4*4
个点,这16个点连续的放在内存中。
具体的局部算法:
- k=d,对数据分块,分块大小为
k*k
- (s=1怎么办?数据重复访问了)
- k=d=2:
2
2
2
- k=d=2:
- (s=1怎么办?数据重复访问了)
- k!=d, s=cd(k, d) ,数据的分块大小为
s*s
,tile可以重用,减少重复访问- (按照步长分块确实减少了重复的访问,那么数据的重用是否有缓冲区的建立?)
- k=6,d=4:
2*2
2*2
- k=6,d=4:
- (按照步长分块确实减少了重复的访问,那么数据的重用是否有缓冲区的建立?)
- else:f=cd(k,d,s),分块大小为k,d,s的公约数。交错布局
- k=12,d=6,s=4,那么f=2,造成了带宽的浪费
- d=6,f=2:
2*2+2
2+2*2
- d=6,f=2:
- k=12,d=6,s=4,那么f=2,造成了带宽的浪费
Evaluation
用于测试的网络模型
一轮前向传播的运行速度的比较:
- custom:同一个人手动优化定制的加速模型
- CPU:Xeon 2.4Ghz
- DB-S: 低资源开销Z-7020
- DB-L:高资源
- DB:中等资源
比CPU快4.7倍
功耗比较:
DB比custom多1.8倍,DB-L和DB-S和custom差不多,CPU功耗比DB多58倍
精度比较:
和CPU精度差不多,甚至更好(近似技术可能会消除噪声或抑制过拟合)
通常,DB比CPU的差距为1.5%
硬件开销:
本文来自博客园,作者:xiongyuqing,转载请注明原文链接:https://www.cnblogs.com/xiongyuqing/p/16873302.html