基于AI神经网络加速芯片的模型量化算法

2021-03-14 00:50王骞陶青川
现代计算机 2021年36期
关键词:卷积精度芯片

王骞,陶青川

(四川大学电子信息学院,成都 610065)

0 引言

近年来,由于深度学习技术的蓬勃发展,深度卷积神经网络也被大量地运用于生活中的各种场景,例如人脸识别、人脸检测、异常检测、姿态估计,等等。尽管其应用广泛,但是其庞大的计算量和内存占用始终是深度神经网络无法全面落地的一个重要原因。很多大型深度卷积神经网络的精度非常高,但往往伴随着庞大的参数量和计算量,例如VGG[6],ResNet[5],MobileNetV3[7],ShuffleNet[8],等等。但是他们的权重模型参数巨大,从几十MB 到几个GB 不等,这使得这项技术很难在需求更加广泛的边缘计算设备上运用。众所周知,边缘计算设备是严重的计算和内存资源受限的,比如常用的嵌入式开发板,其普通的芯片算力可能只有几个GFLOPs,而上述所说的网络模型少则几个GFLOPs 的计算量,多则几十、几百GFLOPs 甚至几个TFLOPs 的计算量,而大多数应用场景又要求能够实时的计算,所以原本的网络模型根本无法在边缘嵌入式设备上进行模型部署。

针对上述问题,工业界和学术界都在努力解决,都在尽可能地将网络模型缩小,降低模型前向推理时的计算量和内存占用,并且也取得了相当不错的成果。目前主流的方法有四种:①设计轻量化的网络结构,比如使用于手机端的Mo⁃bileNet系列、ShuffleNet系列都是轻量化设计的典范,其中设计的深度可分离卷积和分组卷积效果很好,其性能在配合手机端的GPU 时非常不错。②模型剪枝[10],其基本方法是将训练好的浮点模型中的神经元根据信息量大小进行屏蔽,将网络稀疏化,达到降低内存开销,加速推理过程,剪枝方法包括结构化剪枝和非结构化剪枝。③知识蒸馏[10],即通过训练一个大的精度非常高的模型来指导一个设计好的小模型,在训练过程中通过冻结大模型的权重参数,反向传播时只更新小模型的参数,然后使得小模型在最后的输出或者中间层的输出逼近大模型的输出结果,如此便能使小模型获得和大模型相近的精度,但是在计算量上小模型较大模型却大大降低。④模型量化[4],即将训练好的浮点网络模型,通过某种算法将权重参数映射到某个定点数域内,如此网络的运算便从浮点运算变为定点运算,然后通过与特定的计算指令例如SIMD(单指令多数据流)配合,既可提高运算速度,也可以降低内存占用,可谓一举两得。

尽管压缩方法有很多,但是边缘设备的计算能力始终有限,因此本文选取了一款神经网络加速芯片并通过使用在感知量化算法[4],在训练中不指定每层的量化精度,而为每个网络层设置了一个可学习参数,用以学习该层应该采用的量化精度,使得网络以自适应的方式去选择量化的精度。并且本文设计的算法是通过异构计算的方式部署在边缘端,推理性能极高、功耗极低。实验证明,本文所设计的算法在精度,耗时和功耗上都具有很大的优势,可以很好地满足实际需求。

1 网络量化算法原理

1.1 对称量化

对称量化算法属于后量化算法的一种,这种量化算法也被广泛应用于各种边缘设备,英伟达的tensorRT 便是使用了这种量化算法。其原理如下:假设要量化网络的其中一个卷积核,量化精度为8 bit,量化范围为-128~127,卷积核的尺寸为cin×cout×k×k,那么首先就要计算出此卷积核中的权重的最大值和最小值,比较最大值与最小值的绝对值大小,保留绝对值较大的并以此作为截断极值,如图1 所示,即截断范围为-max |xi|~max |xi|,然后根据映射公式(1)将32位浮点值映射到8 bit 定点数域内,这样便完成了32 位浮点数到8 位定点数的参数量化,可以看到浮点的每个权重占的内存为4 bit,量化为8 位精度之后占用变成了1 bit,实现了模型的4 倍压缩。不仅如此,在边缘设备上,以armv8a 架构为例,以往的一条指令可以计算一个4 bit 的加法,那么量化为1 bit 之后,使用单指令多数据流的方式,一条指令可以实现4 个1 bit 数的加法,由此可见不仅仅模型的内存占用降低了4 倍,计算速度同样也会提升4倍。

图1 对称量化原理

然而,对于对称量化算法,如果权重值的分布为非均匀分布,那么浮点值分布比较密集的区域的值会被映射到值域很窄的定点数范围,而当浮点值大部分集中在max ( |xi|)附近而-max ( |xi|)~min(xi)之间并没有分布太多的参数时,那么在对应的量化范围内的量化值就会被浪费掉,这就会导致网络的精度有很大的下降幅度。

线性量化的一般步骤为:①求取尺度因子:②舍入小数;②截断超界值。首先对步骤1,量化首先要将量化前的32位浮点值wf映射到整点数域内:

例如对于8 比特对称量化来说,zmax= 127,zmin= -128,wmax为待量化权重的最大值,wmin为待量化权重的最小值,wq为缩放后的权重值,scale为求取的尺度因子。对浮点权值进行缩放后我们得到的权值仍然为浮点数,此时再通过公式(3)将浮点数近似到定点数。

然而在进行了缩放和取整运算之后由于小数位可能会向上取整,故取整后的值会存在超界问题,所以在取整之后再通过公式(4)对整数值进行截断即可。

1.2 非对称量化

由图2 所示,与对称量化算法对比,非对称量化算法的最大值与最小值的选取不是求得了最大绝对值之后取对称区间,而是直接由将最大值与最小值包围的权值分布区间映射到定点数的数域。与对称量化不同的是,非对称量化的零点的求取不是直接令其等于0 而是根据映射公式(1),(2)求得,这是因为零点值在网络计算过程中具有特殊意义,比如对卷积的补边操作,在量化之后我们不能简单的将原来应该补0 的地方量化后仍然填充为0,此时在非对称量化中我们就将计算的零点偏移值作为浮点中的零点值。由图2 可知,采用非对称量化后将原浮点模型映射到定点数后,因为没有空余的浮点数域,那么在定点数区间上浪费的定点值会更少,如此非对称量化的鲁棒性会更好。

图2 非对称量化原理

1.3 感知量化

感知量化算法对比于对称和非对称量化算法,它不是在浮点模型训练好后再对权重参数进行量化,而是在训练过程中通过定义量化器(量化函数),对参数进行实时训练,如图3所示。

图3 模拟量化示意图

模拟量化操作即为将浮点数通过映射公式将原本的浮点值映射到定点数域,但是模拟量化仅仅是将定点数用浮点数来保存,此时还不是真正的定点数,就是仅存有定点数的信息的浮点数,只有在网络训练好将权重转为定点数之后,那么此时网络模型就是真正的定点数。由此可见,在整个感知量化训练过程中,最重要的是如何定义模拟量化函数。在卷积神经网络中,模型训练通过反向传播算法进行训练,因此这个模拟量化函数也必须可以进行反向传播,而如果在训练时就真正的将浮点数保存为定点数,那么反向传播就无法完成,即网络无法训练,所以实际的做法就是将32 位浮点数通过量化公式量化到定点数域,但此时的权重仍然是32位精度的,但是取值为定点数取值。

2 改进的量化算法

2.1 加速芯片选取

目前已经有很多优秀的AI加速芯片可以选择,例如华为的昇腾系列;英伟达的TX、TK系列,英特尔的Movidius 神经加速棒,但是这些芯片由于算力很强导致体积和功耗很高,在综合考虑后本文选择了一款极低功耗的、由Gyrfalcon Technology公司生产的加速芯片。此芯片采用的是自研的APiM 架构(存储和计算融合一体的本地并行AI 计算),大大节省了数据搬运环节的时延,有极高的计算密度。此款芯片有近30000个并行计算核心,但是功耗仅仅只有180 MW,在单张输入图片尺寸为224×224 的情况下,基于VGG16 的推理时间仅有5 ms,而VGG16在PC机上做一次推理需要3 s,由此可见此芯片在边缘计算领域有很强的优势,这也是本文选择这款芯片的主要原因。

2.2 算法改进

本文采用的基准网络为VGG16,因为此网络的参数量大,浮点模型的性能很好。由图4 算法流程图可知,本文设计的算法将VGG16切分为两部分,第一部分为主干网,此部分的网络为从图片输入到第五层池化层,第二部分为第五层池化层之后的所有的层为分类头。由网络结构可知,网络的计算负载90%都在第一部分,因此我们将第一部分放在神经网络加速芯片上去计算。而对于第二部分网络由于做分类或者回归任务时我们的分类头或者回归头需要有很宽的数域,故这部分我们未对它进行量化,仍然使用浮点计算,这样可以最大程度地保留网络的精度。而我们对于需要量化的层都设置一个系数α,这个系数会随着网络的训练而不断的变化,但是会被控制在1~8 范围内,而每次计算的是其的滑动平均值,当网络训练结束后我们再对它进行四舍五入得到的整数值便是本层的量化精度。

图4 算法流程

2.3 训练流程

由图5可知,对于我们的算法,训练共分为4步。首先,我们在训练集上训练浮点模型,当浮点模型达到精度要求后,将浮点模型权重当成量化卷积训练的预训练模型,并在同一训练集上进行训练。接下来我们再用量化卷积模型作为预训练模型去训练量化激活层,注意此时的卷积核中的权重已经是浮点数表示的定点数了。当量化激活层训练完成后,我们再使用一个很小的学习率,本文采用的是1e-7 来对网络进行一个微调,但这一步并非必须。最后我们便得到了量化后的模型,再使用加速芯片供应商提供的转换库,即可将我们的量化模型转换为芯片特有模型数据格式(.model),然后即可将此模型用于芯片推理。

图5 算法训练流程

3 实验结果分析

本地训练和测试的计算机硬件配置为:CPU为Intel Core i5-7400,主频为3.0 GHz,内存8 GB;GPU为NVIDIA Geforce GTX1080 Ti,显存为11 GB;操作系统为Ubuntu 16.04,开发环境为Pytorch 1.7.0,Python 3.7。网络的主干网权值初始化使用了在ImageNet 数据集上预训练的模型,网络的图片输入尺寸为224×224 的RGB 图片。在数据预处理上做了色彩抖动,随机裁剪,随机反转,每批次图片为16 张,并使用1e-3 为初始学习率,每50个训练集迭代减小0.5倍,共训练了300轮,图6 显示了量化模型在四步训练过程中的损失和准确率的变化情况。边缘计算设备我们使用的是ROC-3399-PC;CPU 为RK3399,处理器为ARM Cortex-A72(双核)及Cortex A53(四核),GPU 为Mali T860(四核),主频为2.0 GHz,内存为2 GB,操作系统为Ubuntu18.04。且除芯片计算的模型以外的所有模型,在CPU 的前向推理我们都使用Ncnn开源框架完成。

图6 模型在cifar100数据集上的损失和准确率变化

由表1 可知,在本文所采用的实验环境下,在Cifar10 上效果最好的网络为MobileNetV3 精度达到了95.2%,本文所提出的量化模型的精度为93.6%,在Cifar100 数据集上标准的VGG16 取得了最好的结果为82.8%,本文提出的量化模型的精度为82.1%。模型参数量最大的是标准的VGG16 达到了528 MB,本文的量化模型的参数量为6.5 MB。且在将模型转换为推理模型后,部署到开发板上测得的速度所提出的量化模型取得了最快的推理速度,单张图片的前向推理速度为28 ms,实验证明本文提出的算法可以在计算和内存资源极其受限的边缘嵌入式设备上达到实时推理性能。

表1 网络准确率对比

4 结语

本文针对深度学习模型参数量大,计算耗时难以在边缘计算设备上部署的问题,选用了一款神经网络前向推理加速芯片,并基于VGG16设计了一种自适应的量化精度选择算法。实验证明本文所提出的量化算法在公开数据集上的测试性能略低于浮点精度模型,但是经过量化后的模型的大小远远低于浮点模型,且由部署实验可知,量化后的模型在边缘计算设备上的单张图片推理性能为28 ms,远远优于浮点模型,证明了所提出算法的实用性和有效性。

猜你喜欢
卷积精度芯片
基于不同快速星历的GAMIT解算精度分析
芯片会议
基于全卷积神经网络的猪背膘厚快速准确测定
基于图像处理与卷积神经网络的零件识别
基于深度卷积网络与空洞卷积融合的人群计数
装错芯片的机器人
近似边界精度信息熵的属性约简
电力系统短期负荷预测方法与预测精度
什么是AMD64
浅谈ProENGINEER精度设置及应用