FPGA+MNASnet:1-算法介绍与分析

773 阅读7分钟

1.MNASnet算法介绍

MNASnet是一种轻量化的神经网络,其基于autoML生成,用于实现图像分类任务,Pytorch的torchvision库中有MNASnet乘各种系数的官方实现。在ImageNet-1K测试集下,各种系数(系数乘在channel维度)的准确率和权值量如下所示:

通道系数TOP1准确率TOP5准确率参数量
0.567.734%87.49%2.2M
0.7571.18%90.496%3.2M
1.073.456%91.51%4.4M
1.376.506%93.522%6.3M

MNASnet-0.5的参数量仅有2.2M,如果使用float16数据类型,总参数量也只有4.4MB,适合使用轻量级的FPGA实现,本次将尝试MNASnet-0.5网络映射到FPGA上。

2.关键算法组件

MNASnet结构中具有两个和硬件具有较大关系的算法组件,分别为:

  • 深度可分离卷积:用于替代先升通道、再降通道的全点数卷积,常用于轻量化网络中,可以减少运算量和参数量

  • 残差结构:ResNet中的残差结构,一个或多个卷积构成的卷积块的输出为卷积结果和输入值的加法,用于解决深层次网络的梯度消失问题,目前广泛应用在各类卷积神经网络中

2.1. 深度可分离卷积

深度可分离卷积如下图所示:

2022-08-03-23-56-54-image.png

一次深度可分离卷积包括三次卷积,分别为:

  • Layer 1:1x1卷积,输入通道为Ci,输出通道为T,一般T>Ci,将输入的feature map做通道扩张

  • Layer 2:分组数为T的分组卷积,即每个通道为一组,一般为3x3或5x5卷积,stride为1或2(软池化),这种卷积的参数量和运算量都很低

  • Layer 3:1x1卷积,输入通道为T,输出通道为Co,一般T>Co,将分组卷积的feature map做通道恢复

另一种理解为1x1卷积处理不同通道之间的关系,分组卷积处理通道内部的信息。现在考虑参数量,这里一共有三个卷积,总参数量如下所示,其中K为分组卷积的卷积核尺寸,一般为3和5:

Wnum=Ci×T+T×K×K+T×CoW_{num} = C_i \times T + T \times K \times K + T \times C_o

计算量(乘法次数)如下所示,其中W和H分别为输入/输出feature map的宽和高:

Cnum=W×H×T×(Ci+K×K+Co)C_{num} = W \times H \times T \times (C_i + K \times K + C_o)

对比向扩展通道、再缩减通道的常规卷积而言,大大减少了参数量和运算量。

2.2. 残差结构

残差结构用于解决深度学习(多层神经网络)梯度消失的问题,将深度学习的层数从几十级推动到了几百级,现在已经成为了卷积神经网络的一种通用结构,其公式如下所示:

Y(x)=x+Conv(x)Y(x) = x + Conv(x)

示意图如下图所示:

2022-08-05-00-09-40-image.png

对于硬件实现而言,残差结构的加入提升了系统复杂度,主要包括:

  • 计算上,需要增加两个张量对应位置相加的算子,且增加了W×H×CW \times H \times C次加法运算

  • 存储上,不能运算一层丢一层,需要另外开辟存储空间存储输入feature map

3.MNASnet网络结构

3.1.网络结构

这里简述一下MNASnet的网络结构,用于后续需求的分析和硬件计算能力的确定。论文中,MNASnet的结构被简述为一张图片,如下所示:

2022-08-07-23-15-05-image.png

网络基本由三类block和基本的卷积组件构成,这里实现的是channel*0.5版本的网络,具体参数与图中有一些差异,如下表所示:

blocklayer输入尺寸运算类型运算参数参数数量输入数据量
B1conv-13x224x224convk3s2c16432148512
B2conv-116x112x112dw-convk3s1c16144200704
conv-216x112x112k1-convk1s1c8128200704
B3conv-18x112x112k1-dw-k1k3s2,C8-24-16192+216+384100352->301056->75264
B4/B5conv-116x56x56k1-dw-k1k3s1,C16-48-16768+432+76850176->150528->150528
add-116x56x56res-add--150528x2
B6conv-116x56x56k1-dw-k1k5s2,C16-48-24768+1200+115250176->150528->37632
B7/B8conv-124x28x28k1-dw-k1k5s1,C24-72-241728+1800+172818816->56448->56448
add-124x28x28res-add--18816x2
B9conv-124x28x28k1-dw-k1k5s2,C24-144-403456+3600+576018816->112896->28224
B10/B11conv-140x14x14k1-dw-k1k5s1,C40-240-409600+6000+96007840->47040->47040
add-140x14x14res-add--7840x2
B12conv-140x14x14k1-dw-k1k3s1,C40-240-489600+2160+115207840->47040->47040
B13conv-148x14x14k1-dw-k1k3s1,C48-288-4813824+2592+138249408->56448->56448
add-148x14x14res-add--9408x2
B14conv-148x14x14k1-dw-k1k5s2,C48-288-9613824+7200+276489408->56448->14112
B15/B16/B17conv-196x7x7k1-dw-k1k5s1,C96-576-9655296+14400+552964704->28224->28224
add-196x7x7res-add--4704x2
B18conv-196x7x7k1-dw-k1k3s1,C96-576-16055296+5184+921604704->28224->28224
B19conv-1160x7x7k1k1s1,C12802048007840
meas-11280x7x7-k7-62720
fc-11280x1x1-1280->100012800001280

3.2.网络结构分析

从网络结构分析的表中可以发现,以下信息:

  • MNASnet尽可能的在网络的深层(feature map尺寸小)时进行多次计算

  • 基本符合feature map越来越小,参数量越来越大的特征

  • 在深度可分离卷积中,第二层(分组卷积层)和第三层(k1卷积层)的输入feature map很大,避免存储

  • 随着网络层次的加深,在卷积参数量上,分组卷积层的比重越来越小,k1卷积层的比重越来越大

  • 最大参数出现在B19-fc-1,参数量达到1.28M个,是个全连接层

  • 最大feature map输入(不包括深度可分离卷积内部的卷积输入)出现在B2输入层,达到0.2M个

因此,对于FPGA加速器,提出了一下几点设计基础:

  • 尽可能将深度可分离卷积中的三个卷积作为一个算子设计,并避免完全存储第二个和第三个卷积的输入feature map

  • 需要权值和数据共享存储

  • 权值存储需要更偏向便于K1卷积的参数提取,最多为55K个,而分组卷积的参数量最大仅有14K

  • 非必要不进行重复计算,会影响加速效果(增加了网络的计算量)