层数kernel个数每个kernel进行卷积次数每个kernel一次卷积运算量浮点乘加次数第1层963025(1x363)x(363x1)96x3025x363=105M=210MFLOP第2层256729(1x1200)x(1200x1)256x729x1200=224M=448MFLOP第3层384169(1x2304)x(2304x1)384x169x2304=150M=300MFLOP第4层384169(1x1728)x(1728x1)384x169x1728=112M=224MFLOP第5层256169(1x1728)x(1728x1)256x169x1728=75M=150MFLOP第6层14096(1x9216)x(9216x1)4096x9216=38M=76MFLOP第7层14096(1x4096)x(4096x1)4096x4096=17M=34MFLOP第8层11000(1x4096)x(4096x1)1000x4096=4M=8MFLOP总和1.45GFLOP表2.1Alexnet浮点计算量
2.2Alexnet卷积运算特点
Alexnet的卷积运算是三维的,在神经网络计算公式:y=f(wx+b)中,对于每个输出点都是三维矩阵w(kernel)和x乘加后加上bias(b)得到的。如下图2.2所示,kernel的大小M=Dxkxk,矩阵乘加运算展开后y=x[0]*w[0]+x[1]*w[1]+…+x[M-1]*w[M-1],所以三维矩阵运算可以看成是一个1x[M-1]矩阵乘以[M-1]x1矩阵。图2.2Alexnet三维卷积运算
每个三维矩阵kernel和NxN的平面上滑动得到的所有矩阵X进行y=f(wx+b)运算后就会得到一个二维平面(featuremap)如图2.3所示。水平和垂直方向上滑动的次数可以由(N+2xp-k)/s+1得到(p为padding的大小),每次滑动运算后都会得到一个点。
a)N是NxN平面水平或者垂直方向上的大小;
b)K是kernel在NxN平面方向上的大小kernel_size;
c)S是滑块每次滑动的步长stride;
图2.3kernel进行滑窗计算
Kernel_num个kernel经过运算后就会得到一组特征图,重新组成一个立方体,参数H=Kernel_num,如图2.4所示。这个卷积立方体就是卷积所得到的的最终输出结果。
图2.4多个kernel进行滑窗计算得到一组特征图
3.AlexNet模型的FPGA实现
3.1FPGA异构平台
图3.1为异构计算平台的原理框图,CPU通过PCIe接口对FPGA传送数据和指令,FPGA根据CPU下达的数据和指令进行计算。在FPGA加速卡上还有DDRDRAM存储资源,用于缓冲数据。图3.1FPGA异构系统框图
3.2CNN在FPGA的实现
3.2.1将哪些东西offload到FPGA计算?
在实践中并不是把所有的计算都offload到FPGA,而是只在FPGA中实现前5层卷积层,将全连接层和Softmax层交由CPU来完成,主要考虑原因:(1)全连接层的参数比较多,计算不够密集,要是FPGA的计算单元发挥出最大的计算性能需要很大的DDR带宽;
(2)实际运用中分类的数目是不一定的,需要对全连阶层和Softmax层进行修改,将这两部分用软件实现有利于修改。
3.2.2实现模式
Alexnet的5个卷积层,如何分配资源去实现它们,主要layer并行模式和layer串行模式:(1)Layer并行模式:如图3.2所示,按照每个layer的计算量分配不同的硬件资源,在FPGA内同时完成所有layer的计算,计算完成之后将计算结果返回CPU。优点是所有的计算在FPGA中一次完成,不需要再FPGA和DDRDRAM直接来回读写中间结果,节省了的DDR带宽。缺点就是不同layer使用的资源比较难平衡,且layer之间的数据在FPGA内部进行缓冲和格式调整也比较难。另外,这种模式当模型参数稍微调整一下(比如说层数增加)就能重新设计,灵活性较差。
图3.2layer并行模式下资源和时间分配示意图
(2)Layer串行模式:如图3.3所示,在FPGA中只实现完成单个layer的实现,不同layer通过时间上的复用来完成。优点是在实现时只要考虑一层的实现,数据都是从DDR读出,计算结果都写回DDR,数据控制比较简单。缺点就是因为中间结果需要存储在DDR中,提高了对DDR带宽的要求。