出品 | 智东西公开课
讲师 | 童志军 阅面科技合伙人&CTO
提醒 | 点击上方蓝字关注我们,并回复关键词 嵌入式04,即可获取课件。
导读:
4月17日,阅(yue)面(mian)科技合(he)伙人&CTO童志军在(zai)智东西公(gong)开课(ke)进(jin)行(xing)了嵌(qian)入式(shi)AI合(he)辑第(di)四讲(jiang)的直播讲(jiang)解,主题为《面(mian)向嵌(qian)入式(shi)设备的轻量级神经网络模型(xing)设计》。
在(zai)(zai)本次讲解中(zhong),童(tong)志军老师从(cong)(cong)神经网(wang)络模型在(zai)(zai)嵌入(ru)式设备运行的挑战(zhan)、神经网(wang)络模型从(cong)(cong)“特(te)征驱动”、“数(shu)据驱动”、“精度(du)优先(xian)”到“速度(du)优先(xian)”等不同阶(jie)段的发展历程(cheng),并通过实际(ji)案(an)例解读如(ru)何在(zai)(zai)嵌入(ru)式设备上实现神经网(wang)络模型的高效部署(shu)和运行。
本文为此次课程主讲环节的(de)图文整理:
正文:
大(da)家好,我是(shi)阅面(mian)科技(ji)合伙人&CTO童志(zhi)军,很高兴能在智(zhi)东西公开课和大(da)家一起分(fen)(fen)享(xiang)今天的课题。我今天分(fen)(fen)享(xiang)的主题为(wei)《面(mian)向嵌入式设备的轻量(liang)级神经网络模(mo)型(xing)设计(ji)》,主要分(fen)(fen)为(wei)以下(xia)4个(ge)部分(fen)(fen):
1、神经网络模型在嵌入式设备运行的挑战
2、从“特征驱动”到“数据驱动”的大型神经网络模型设计
3、从“精度优先”到“速度优先”的轻量级神经网络模型设计
4、在嵌入式设备(bei)实(shi)现神经网络模(mo)型(xing)的高效部署(shu)与运行
神经网络模型在嵌入式设备运行的挑战
目前(qian),在(zai)所看见的(de)嵌入式设备上,很(hen)(hen)大一部分会有(you)AI的(de)算法的(de)身影。在(zai)我们身边也有(you)很(hen)(hen)多应用,比(bi)如刷脸(lian)(lian)解锁(suo)手机、刷脸(lian)(lian)支付、家(jia)用的(de)摄像头(tou)(tou),或马路上随处可见的(de)公共安(an)防摄像头(tou)(tou)等。
嵌(qian)入(ru)式设备在(zai)我们(men)身边(bian)无孔不(bu)入(ru),这些(xie)设备分为两种,一(yi)种是(shi)只做视频的(de)抓取(qu)没(mei)有计算(suan)(suan),只是(shi)把视频传到后(hou)(hou)台服(fu)(fu)务(wu)器(qi),然后(hou)(hou)做分析;另(ling)一(yi)种是(shi)设备上(shang)会(hui)带有AI计算(suan)(suan)能力,一(yi)些(xie)算(suan)(suan)法会(hui)在(zai)前端(duan)设备上(shang)去计算(suan)(suan),然后(hou)(hou)把计算(suan)(suan)得到的(de)结(jie)构(gou)化(hua)数据(ju)再传到后(hou)(hou)端(duan)服(fu)(fu)务(wu)器(qi)去做进一(yi)步分析。

上图左(zuo)边列举了(le)一些主流(liu)的(de)(de)神(shen)经(jing)网(wang)络(luo)模型(xing),包括(kuo)计(ji)(ji)算量(liang)及(ji)参数量(liang),相(xiang)应在(zai)Imagenet公开数据集上Top-1的(de)(de)精度(du)(du)。上图横坐标代(dai)表(biao)的(de)(de)是计(ji)(ji)算的(de)(de)浮点计(ji)(ji)算量(liang),然后(hou)纵坐标是精度(du)(du)。可以看到神(shen)经(jing)网(wang)络(luo)模型(xing)的(de)(de)精度(du)(du)与模型(xing)的(de)(de)计(ji)(ji)算量(liang)成(cheng)正比(bi),随着模型(xing)计(ji)(ji)算量(liang)越(yue)来越(yue)大,精度(du)(du)也(ye)越(yue)来越(yue)高。
但也(ye)可以看(kan)到(dao),网络模型(xing)(xing)(xing)的(de)(de)(de)精(jing)度(du)与模型(xing)(xing)(xing)的(de)(de)(de)参数量(liang)(liang)是(shi)没(mei)有完(wan)全(quan)呈(cheng)正(zheng)比(bi)。比(bi)如VGG网络,它的(de)(de)(de)参数量(liang)(liang)很大(da),但是(shi)精(jing)度(du)不是(shi)特别(bie)高。在嵌(qian)(qian)式设(she)备上运行(xing)神(shen)经网络,首先要(yao)(yao)求(qiu)模型(xing)(xing)(xing)的(de)(de)(de)精(jing)度(du)要(yao)(yao)非常高,只有模型(xing)(xing)(xing)的(de)(de)(de)精(jing)度(du)达到(dao)一定(ding)的(de)(de)(de)准确率(lv)才能(neng)满足(zu)人们实(shi)际使用(yong)的(de)(de)(de)需求(qiu)。由于嵌(qian)(qian)入式设(she)备的(de)(de)(de)功耗、存储(chu)及计算(suan)资源都非常有限,如何在有限的(de)(de)(de)计算(suan)资源下(xia)把高精(jing)度(du)的(de)(de)(de)模型(xing)(xing)(xing)运行(xing)为实(shi)时动态的(de)(de)(de)效(xiao)果是(shi)非常重要(yao)(yao)的(de)(de)(de),这里会(hui)涉(she)及到(dao)算(suan)法、算(suan)力及数据(ju)几个(ge)层(ceng)面的(de)(de)(de)优化,今天主要(yao)(yao)与大(da)家探(tan)讨在算(suan)法层(ceng)面,更确切的(de)(de)(de)是(shi)在网络设(she)计的(de)(de)(de)层(ceng)面如何解决?
从“特征驱动”到“数据驱动”的大型神经网络模型设计
首先(xian)回顾下大型(xing)的(de)(de)(de)(de)神(shen)经网络(luo)模型(xing)的(de)(de)(de)(de)发展脉络(luo),其实卷积神(shen)经网络(luo)很早就出(chu)现, LeNet-5很早在美国邮(you)政的(de)(de)(de)(de)数字识(shi)别上已经得(de)到很好(hao)的(de)(de)(de)(de)应用。但后(hou)来并(bing)没有得(de)到更多的(de)(de)(de)(de)推广,沉默了10年,10年内主流的(de)(de)(de)(de)一些视觉分析的(de)(de)(de)(de)方法还是手工特征。
对(dui)于(yu)手(shou)工特征,大家(jia)比较熟悉的(de)是SIFT特征,它是在x方向(xiang)(xiang)跟y方向(xiang)(xiang)去(qu)提(ti)取梯度(du)图,然后(hou)把每一(yi)(yi)(yi)个(ge)(ge)(ge)(ge)像素(su)的(de)梯度(du)图按照一(yi)(yi)(yi)定的(de)角度(du)区间各(ge)自去(qu)做梯度(du)方向(xiang)(xiang)的(de)投(tou)影,最终得到(dao)128位的(de)描述(shu)子。如果把这个(ge)(ge)(ge)(ge)问题换一(yi)(yi)(yi)个(ge)(ge)(ge)(ge)角度(du)来思考,可以发现 SIFT特征的(de)生(sheng)成过程,可以等效是一(yi)(yi)(yi)个(ge)(ge)(ge)(ge)卷积层和一(yi)(yi)(yi)个(ge)(ge)(ge)(ge)pooling层。

上图可以看到它的(de)8个方(fang)(fang)向(xiang)的(de)梯(ti)度,代表(biao)的(de)是输出Channel为8,kernel大小为1*1的(de)卷积,输入(ru)是x方(fang)(fang)向(xiang)跟y方(fang)(fang)向(xiang)的(de)梯(ti)度流。对(dui)于 x方(fang)(fang)向(xiang)跟y方(fang)(fang)向(xiang)的(de)图,等效成一(yi)个2*8*1*1的(de)卷积操作(zuo),后面再接了一(yi)个8*8*4*4的(de)Pooling层,最终(zhong)得到一(yi)个两层的(de)神经(jing)网络结(jie)构。
随(sui)着(zhe)特(te)征(zheng)(zheng)(zheng)描(miao)述(shu)的(de)(de)(de)发展(zhan),逐渐从底层的(de)(de)(de)特(te)征(zheng)(zheng)(zheng)设(she)计发展(zhan)到(dao)(dao)中(zhong)层特(te)征(zheng)(zheng)(zheng)设(she)计。中(zhong)层特(te)征(zheng)(zheng)(zheng)设(she)计比较典(dian)型的(de)(de)(de)是Fisher Vector,它在(zai)图像(xiang)搜(sou)索的(de)(de)(de)方(fang)面应用(yong)的(de)(de)(de)非常广泛。Fisher Vector特(te)征(zheng)(zheng)(zheng)首(shou)先对图像(xiang)做特(te)征(zheng)(zheng)(zheng)提取,然后基于GMM模型对特(te)征(zheng)(zheng)(zheng)做进(jin)一(yi)步的(de)(de)(de)编码(ma),编码(ma)得(de)到(dao)(dao)的(de)(de)(de)特(te)征(zheng)(zheng)(zheng),再通过(guo)空(kong)(kong)间卷积得(de)到(dao)(dao)在(zai)不同的(de)(de)(de)尺度(du)空(kong)(kong)间上的(de)(de)(de)特(te)征(zheng)(zheng)(zheng)描(miao)述(shu)。用(yong)现在(zai)的(de)(de)(de)神经网(wang)络(luo)结构的(de)(de)(de)方(fang)式去看,可以等效(xiao)为一(yi)个SIFT特(te)征(zheng)(zheng)(zheng)提取过(guo)程(cheng),加一(yi)个编码(ma)层和一(yi)个Pooling层,即为一(yi)个四层的(de)(de)(de)神经网(wang)络(luo)结构。4层的(de)(de)(de)网(wang)神经网(wang)络(luo)结构比两层的(de)(de)(de)神经网(wang)络(luo)精度(du)会更(geng)高,特(te)征(zheng)(zheng)(zheng)也更(geng)抽(chou)象,表达能力(li)更(geng)强。
到(dao)2010年(nian)时,李飞飞教授带领(ling)的(de)一帮学(xue)者整(zheng)理了(le)一个(ge)非常大型的(de)数(shu)据(ju)集(ji)-Imagenet,这个(ge)数(shu)据(ju)集(ji)有1000类,大概120万张(zhang)图片,这个(ge)数(shu)据(ju)集(ji)的(de)出(chu)现是神经网络得到(dao)飞速(su)发展(zhan)的(de)基石(shi),掀起了(le)整(zheng)个(ge)AI界的(de)军备(bei)竞赛。
时(shi)间(jian)到了2012年(nian),ImageNet比赛冠军提出来一(yi)个(ge)(ge)新(xin)的(de)(de)网(wang)络AlexNet。它由5个(ge)(ge)卷(juan)积层(ceng)(ceng),3个(ge)(ge)全连接层(ceng)(ceng)。另外由于(yu)当时(shi)GPU显(xian)存的(de)(de)限制,把网(wang)络的(de)(de)卷(juan)积分(fen)成(cheng)分(fen)组(zu)的(de)(de)形(xing)式,使得网(wang)络能够在(zai) GPU有(you)限的(de)(de)情况下运(yun)行起来,里(li)面还有(you)drop out的(de)(de)技巧等(deng)。AlexNet开创(chuang)了神经(jing)网(wang)络结构(gou)的(de)(de)一(yi)个(ge)(ge)新(xin)河,在(zai)此之后,工(gong)业(ye)界的(de)(de)人开始(shi)相信深(shen)度学习是有(you)效的(de)(de),可(ke)以产生一(yi)些有(you)价值的(de)(de)东西,而不仅是学术界的(de)(de)一(yi)个(ge)(ge)玩(wan)具。

2014年,出现(xian)(xian)了VGG和GoogleNet两(liang)种(zhong)不(bu)同(tong)的(de)网(wang)(wang)(wang)络(luo)结构,两(liang)个网(wang)(wang)(wang)络(luo)其(qi)实(shi)都是在(zai)不(bu)同(tong)层面对网(wang)(wang)(wang)络(luo)去建(jian)模。在(zai)早期(qi),AlexNet出现(xian)(xian)之后,在(zai)调(diao)网(wang)(wang)(wang)络(luo)的(de)时候(hou)发现(xian)(xian)一(yi)(yi)种(zhong)很奇怪的(de)现(xian)(xian)象,当(dang)把层数往上堆(dui)时,很容易出现(xian)(xian)梯度弥散的(de)效应。如何(he)把网(wang)(wang)(wang)络(luo)做深,在(zai)当(dang)时一(yi)(yi)直没(mei)有得(de)到(dao)很好的(de)解决。
VGG跟GoogleNet做的(de)(de)网络(luo)都接近20层左右,这是(shi)(shi)一(yi)个突破(po),这里(li)也是(shi)(shi)使(shi)(shi)用了一(yi)些技巧,比如 GoogleNet是(shi)(shi)在(zai)(zai)层中间插入 loss的(de)(de)监督(du), 然后(hou)在(zai)(zai)block的(de)(de)设计上引(yin)入了一(yi)些技巧,通过这种多(duo)(duo)尺(chi)度的(de)(de)卷积核,提取图像(xiang)上的(de)(de)多(duo)(duo)尺(chi)度的(de)(de)信息。其实尺(chi)度是(shi)(shi)一(yi)个非常重要的(de)(de)因素。另外逐层的(de)(de) finetuning,在(zai)(zai)VGG用的(de)(de)比较多(duo)(duo),还引(yin)入了连(lian)续两个3×3的(de)(de)卷积核去模拟(ni)5×5的(de)(de)感受野(ye),它使(shi)(shi)得(de)网络(luo)可以做得(de)更(geng)深,精(jing)度做得(de)更(geng)高。
2015年,微软(ruan)亚洲研究员何凯(kai)明设计(ji)的(de)残差网络,把神经(jing)网络从(cong)20层(ceng)提(ti)升到(dao)几百层(ceng)。可以看到(dao)网络层(ceng)数越(yue)来越(yue)深,而(er)且网络的(de)宽度也(ye)越(yue)来越(yue)宽,当然最终的(de)精度也(ye)是非(fei)常(chang)高。

上图(tu)(tu)为ImageNet分类Top5错误率图(tu)(tu),可以看到网络的精(jing)度随着层数(shu)逐渐(jian)增(zeng)加越来越高,网络结构也在(zai)不断创新。
从“精度优先”到“速度优先”的轻量级神经网络模型设计
自2015-2016年之后出现网络模型有往端(duan)上发展的(de)(de)趋(qu)势(shi),如何把神经网络模型在终端(duan)上跑得更快,是(shi)演(yan)变的(de)(de)一个趋(qu)势(shi),也(ye)就是(shi)模型的(de)(de)设(she)计从(cong)精度优先到后来的(de)(de)速(su)度优先。

我们可以简单(dan)分析下神(shen)经(jing)网络模(mo)型的(de)(de)计算(suan)量,可以看到一般(ban)的(de)(de)神(shen)经(jing)网络模(mo)型,大部分都是由(you)卷积层(ceng)(ceng)组(zu)成,卷积层(ceng)(ceng)在里面的(de)(de)计算(suan)量占到了80%以上(shang),卷积的(de)(de)计算(suan)示(shi)意图如上(shang)图所(suo)示(shi),计算(suan)复杂(za)度为N*M*H*W*K*K。
轻量(liang)级的(de)(de)神经网(wang)络(luo)模型(xing)所做(zuo)的(de)(de)工(gong)作,就(jiu)是(shi)围绕着计算复杂度,把里面(mian)的(de)(de)一些(xie)参(can)数(shu)尽量(liang)的(de)(de)减小,使得(de)计算量(liang)能够降低。计算量(liang)在嵌入式设备上体(ti)现最明显的(de)(de)是(shi)它的(de)(de)速度。如(ru)何在优化计算复杂度的(de)(de)同时保(bao)证模型(xing)的(de)(de)高精(jing)度,就(jiu)是(shi)下面(mian)一些(xie)主流的(de)(de)神经网(wang)络(luo)模型(xing)设计所做(zuo)的(de)(de)工(gong)作。
最(zui)开始比较(jiao)有代表性的(de)一个(ge)网络是(shi)SqueezeNet网络,它有两个(ge)特点,先用1×1的(de)卷积核做通(tong)道压缩,然后(hou)把1×1与3×3的(de)卷积核并(bing)排(pai),使得卷积核可以更小(xiao)。也就(jiu)是(shi)通(tong)过减小(xiao)通(tong)道数以及卷积核大小(xiao)降低(di)模型的(de)计(ji)算量(liang),使得模型可以推理的(de)更快。
第二个是(shi)MobileNet网络(luo)(luo)和ShuffleNet网络(luo)(luo),MobileNet网络(luo)(luo)用到一个比(bi)较重要的点是(shi)Depthwise卷(juan)(juan)(juan)积(ji),也是(shi)把(ba)(ba)原(yuan)来稠密(mi)的卷(juan)(juan)(juan)积(ji)N*M的计算(suan)量,直接优化为(wei)N的计算(suan)量。ShuffleNet网络(luo)(luo)借(jie)鉴了 MobileNet网络(luo)(luo)一些(xie)点,比(bi)如Depthwise卷(juan)(juan)(juan)积(ji),当应用Depthwise卷(juan)(juan)(juan)积(ji)后(hou),发现(xian)整个神经网络(luo)(luo)计算(suan)量更多(duo)(duo)是(shi)在1×1的卷(juan)(juan)(juan)积(ji)上(shang),这(zhei)时(shi)就可(ke)以把(ba)(ba)1×1卷(juan)(juan)(juan)积(ji)去做(zuo)一个通道(dao)Shuffle分组(zu),分组(zu)之后(hou)做(zuo)通道(dao)卷(juan)(juan)(juan)积(ji),使得(de)它能够(gou)在3×3上(shang)再进一步(bu)的融(rong)合(he),可(ke)以看(kan)到大(da)家更多(duo)(duo)的是(shi)把(ba)(ba)卷(juan)(juan)(juan)积(ji)由原(yuan)来的稠密(mi)卷(juan)(juan)(juan)积(ji)变(bian)成通道(dao)的卷(juan)(juan)(juan)积(ji)。
最近(jin)的(de)(de)神(shen)经网(wang)(wang)络(luo)是(shi)模型搜(sou)索NAS,这(zhei)方(fang)面(mian)有很多的(de)(de)轻量级的(de)(de)网(wang)(wang)络(luo)结构,但是(shi)没(mei)有把它(ta)应用到嵌入设备上(shang),为(wei)什么?因为(wei) NAS搜(sou)索出来的(de)(de)网(wang)(wang)络(luo)规律(lv)性比(bi)较(jiao)差,对嵌入式设备不是(shi)很友好。实际应用更多的(de)(de)还是(shi)停留在(zai)MobileNet网(wang)(wang)络(luo)这(zhei)种(zhong)比(bi)较(jiao)直线(xian)型的(de)(de)网(wang)(wang)络(luo)上(shang)去(qu)优化。
后来有一个(ge)(ge)EfficientNet网络(luo)结构(gou),它的想法比较综合(he),把网络(luo)计算量的几个(ge)(ge)因(yin)素同时去做(zuo)(zuo)一个(ge)(ge)联(lian)合(he)搜索优化,比如网络(luo)的层数,或者图像的feature map的长宽,以及(ji)计算复(fu)杂度中提到(dao)的N、M、K,去做(zuo)(zuo)一个(ge)(ge)统一的建模,通过增强学(xue)习去搜索最优解。另外,网络(luo)结构(gou)也做(zuo)(zuo)一些重复(fu)的堆叠,相对非(fei)常有规律,对整个(ge)(ge)嵌入(ru)式(shi)设备(bei)还是非(fei)常友(you)好的。
在嵌入式设备实现神经网络模型的高效部署与运行

首先(xian)看下整体的(de)(de)加速框架,这(zhei)里面大概包(bao)含(han)了(le)阅面所做(zuo)的(de)(de)一些工(gong)作,左边是训练(lian)端(duan),主要做(zuo)了(le)模(mo)型的(de)(de)通(tong)道剪枝、模(mo)型蒸馏和量化训练(lian)的(de)(de)工(gong)作,右边是在(zai)(zai)嵌入式设备上做(zuo)模(mo)型的(de)(de)转换(huan),以(yi)及卷积运算(suan)算(suan)子的(de)(de)优化,使得我们的(de)(de)模(mo)型可(ke)以(yi)在(zai)(zai)一些硬(ying)件层面快速的(de)(de)跑起来。
第一个(ge)是(shi)通(tong)道剪枝,剪枝包(bao)括稀疏化(hua)等,但对嵌入式设(she)备(bei)不是(shi)很友好,因(yin)为稀疏化(hua)剪枝得(de)到(dao)的(de)(de)模型没有规(gui)律,让内存的(de)(de)取值变得(de)随机(ji),使得(de)设(she)备(bei)速度跑不起来(lai)。后来(lai)通(tong)道剪枝可(ke)(ke)以(yi)得(de)到(dao)规(gui)则(ze)(ze)模型,使得(de)剪完(wan)之后的(de)(de)模型能够复(fu)用以(yi)前的(de)(de)计算引擎,这方(fang)面(mian)更多的(de)(de)是(shi)基于一些规(gui)则(ze)(ze),比(bi)如选取响应最(zui)大(da)卷(juan)(juan)积(ji)核(he)或选一些方(fang)差比(bi)较大(da)的(de)(de)卷(juan)(juan)积(ji)核(he),对卷(juan)(juan)积(ji)核(he)建模,通(tong)道压缩率(lv)也可(ke)(ke)以(yi)通(tong)过强化(hua)学习的(de)(de)方(fang)法去反复(fu)搜索(suo),最(zui)终得(de)到(dao)最(zui)优的(de)(de)结果(guo)。
通道剪枝主要针对MobileNetV2和 EfficientNet这类网络,可(ke)以(yi)看到当模型从(cong)原来的200-300M的计算规模,到后来100M以(yi)下,其精度下降在(zai)一个(ge)可(ke)以(yi)接受(shou)的范围内,这样的模型可(ke)以(yi)在(zai)检(jian)测(ce)或(huo)者是识(shi)别任务上得(de)到很(hen)好的使用。
第二是(shi)模(mo)(mo)型(xing)蒸馏,最早主要(yao)是(shi)体(ti)现在loss设计上,比(bi)如 Student模(mo)(mo)型(xing)去学(xue)习Teacher模(mo)(mo)型(xing)的(de)样本(ben)分布,最终来提高Student模(mo)(mo)型(xing)的(de)精(jing)(jing)度(du)(du)。以Margin为例,Margin在细粒度(du)(du)分类(lei)上用的(de)比(bi)较多。通过(guo)Student模(mo)(mo)型(xing)去学(xue)习Teacher模(mo)(mo)型(xing)的(de)Margin分布,使得Student模(mo)(mo)型(xing)的(de)精(jing)(jing)度(du)(du)得到(dao)非常大的(de)提升。

上图为训练(lian)人脸识别网络(luo),第(di)一行(xing)(xing)是 Teacher模型(xing)的(de)(de)精(jing)度(du),第(di)二(er)行(xing)(xing)是Student模型(xing)的(de)(de)一个baseline ,第(di)三(san)行(xing)(xing)是用模型(xing)蒸馏的(de)(de)方法产生的(de)(de)Student模型(xing)的(de)(de)记录,可以看到训练(lian)出的(de)(de) Student模型(xing)的(de)(de)精(jing)度(du),是介于Teacher模型(xing)跟Student模型(xing)之间,而且比较接近Teacher模型(xing)的(de)(de)精(jing)度(du),相对于baseline有(you)非常大(da)的(de)(de)提升。
第(di)三块是量(liang)化(hua)训练(lian),为(wei)什么要做(zuo)量(liang)化(hua)训练(lian)?模型(xing)(xing)量(liang)化(hua)会带来(lai)很多(duo)好处(chu),最常见的比(bi)如(ru)可(ke)以把模型(xing)(xing)的存储量(liang),从原来(lai)的FP32减到(dao)INT16或(huo)INT8,直(zhi)接减掉一(yi)半或(huo)1/4。另一(yi)点(dian)是做(zuo)量(liang)化(hua)之后,使得模型(xing)(xing)做(zuo)并行加速,比(bi)如(ru)同样(yang)一(yi)个(ge)指(zhi)令(ling)周期,原来(lai)可(ke)以操作(zuo)1个(ge)浮点(dian)数,现在(zai)可(ke)以同时操作(zuo)2个(ge)INT16或(huo)4个(ge)INT8,使得数据的吞吐量(liang)提升,这也是一(yi)种提速。
它的(de)(de)流程(cheng)如(ru)下:首先会收(shou)集前(qian)向的(de)(de)数据集,然后对(dui)网(wang)络做(zuo)(zuo)统(tong)计(ji),统(tong)计(ji)分为(wei)两部分,一个(ge)是(shi)模(mo)(mo)(mo)型(xing)的(de)(de) weight做(zuo)(zuo)最大最小或(huo)者 kr散度(du)分布上(shang)的(de)(de)统(tong)计(ji),另一个(ge)是(shi)对(dui)模(mo)(mo)(mo)型(xing)的(de)(de)输(shu)入(ru)输(shu)出做(zuo)(zuo)统(tong)计(ji),从(cong)而(er)可(ke)以选取到(dao)最优的(de)(de)一个(ge)标准去对(dui)模(mo)(mo)(mo)型(xing)做(zuo)(zuo)量化。如(ru)果只(zhi)做(zuo)(zuo)INT16的(de)(de)量化,模(mo)(mo)(mo)型(xing)的(de)(de)精(jing)(jing)度(du)是(shi)可(ke)以完全保(bao)持住(zhu)的(de)(de)。但当做(zuo)(zuo)更低精(jing)(jing)度(du),比如(ru)INT8或(huo)INT4,模(mo)(mo)(mo)型(xing)精(jing)(jing)度(du)会有一些(xie)损失,这时还需要做(zuo)(zuo)一些(xie)finetune,使得模(mo)(mo)(mo)型(xing)精(jing)(jing)度(du)可(ke)以回到(dao)跟(gen)原来浮点模(mo)(mo)(mo)型(xing)的(de)(de)精(jing)(jing)度(du)。

上(shang)图是在人脸识别模型上(shang)所做(zuo)的(de)(de)工作(zuo),比(bi)如FP32在1/10万(wan)是达到97.94%的(de)(de)识别率,直接量(liang)化INT8,精度为 85.17,通过(guo)finetune使得最终的(de)(de)模型可(ke)能只降低了1~2个点。量(liang)化是一个非常有(you)效(xiao)的(de)(de)降低模型计算(suan)量(liang),同时适合嵌入式设备,不管(guan)是功耗或存储的(de)(de)占用都非常友好。
第四点是(shi)当得到一个最优的(de)(de)模型结(jie)构之(zhi)后,最终(zhong)部署到嵌入式设备上,就涉及(ji)到推理引(yin)擎(qing)。推荐引(yin)擎(qing)主要的(de)(de)计算在卷(juan)积运算, 我们采用(yong)的(de)(de)是(shi)直接(jie)基于原始的(de)(de)卷(juan)积方式做优化(hua)。这(zhei)涉及(ji)到行主序的(de)(de)内(nei)存重排、矩阵分块、内(nei)存对齐(qi)、内(nei)存复用(yong)、缓(huan)存预读取、SIMD并行加速、循环展开、多线(xian)程(cheng)等(deng)。

我(wo)(wo)们在RK3288上做的(de)(de)优(you)化,对(dui)比的(de)(de)是腾讯开(kai)源的(de)(de)NCNN推理引擎(qing)。可(ke)以看到(dao)在同样的(de)(de)输入下(xia),我(wo)(wo)们的(de)(de)速(su)度提升大概有(you)40%~50%之间,这个(ge)引擎(qing)还在持续的(de)(de)优(you)化,算子的(de)(de)计算优(you)化也是非(fei)常重要的(de)(de)一环。

最(zui)后(hou)总结下(xia),在(zai)(zai)嵌入式(shi)模(mo)(mo)(mo)型部(bu)署所做(zuo)的(de)(de)工作,首先会得(de)到(dao)检测或(huo)识(shi)别的(de)(de)业务(wu)模(mo)(mo)(mo)型,根(gen)据(ju)具体(ti)客(ke)户的(de)(de)需求(qiu)训(xun)练浮点模(mo)(mo)(mo)型,之(zhi)(zhi)后(hou)做(zuo)模(mo)(mo)(mo)型蒸馏(liu)的(de)(de)loss训(xun)练,把(ba)计算(suan)(suan)量做(zuo)进(jin)一(yi)(yi)步(bu)(bu)的(de)(de)精(jing)简。精(jing)简完之(zhi)(zhi)后(hou),对(dui)一(yi)(yi)些稀疏的(de)(de)通道,做(zuo)进(jin)一(yi)(yi)步(bu)(bu)的(de)(de)剪枝(zhi),并且把(ba)模(mo)(mo)(mo)型finetune,得(de)到(dao)一(yi)(yi)个(ge)(ge)最(zui)紧凑(cou)的(de)(de)深度学习模(mo)(mo)(mo)型。之(zhi)(zhi)后(hou)根(gen)据(ju)前(qian)面的(de)(de)一(yi)(yi)些积累,我们更(geng)多是(shi)基于(yu)Caffe的(de)(de)框架(jia),在(zai)(zai)这个(ge)(ge)基础之(zhi)(zhi)上(shang)对(dui)模(mo)(mo)(mo)型做(zuo)进(jin)一(yi)(yi)步(bu)(bu)的(de)(de)量化(hua)(hua),量化(hua)(hua)可能会根(gen)据(ju)具体(ti)硬件不(bu)同会有所不(bu)同。最(zui)终(zhong)得(de)到(dao)一(yi)(yi)个(ge)(ge)最(zui)优化(hua)(hua)的(de)(de)量化(hua)(hua)模(mo)(mo)(mo)型之(zhi)(zhi)后(hou),把(ba)算(suan)(suan)子计算(suan)(suan)库(ku)打包一(yi)(yi)起,最(zui)终(zhong)形成一(yi)(yi)个(ge)(ge)运行程(cheng)序,部(bu)署到(dao)实(shi)际的(de)(de)设备上(shang)。上(shang)面就是(shi)完整的(de)(de)模(mo)(mo)(mo)型部(bu)署的(de)(de)流程(cheng)。
以(yi)上(shang)就是我今天的分享内容,谢(xie)谢(xie)大(da)家。