
出品 | 智東西公開課
講師 | 童志軍 閱面科技合伙人&CTO
提醒 | 點擊上方藍字關注我們,并回復關鍵詞 嵌入式04,即可獲取課件。
導讀:
4月(yue)17日,閱面(mian)(mian)科技合伙人&CTO童志軍(jun)在智東西(xi)公開課進行了嵌入式AI合輯第四講的直播講解,主(zhu)題為《面(mian)(mian)向(xiang)嵌入式設(she)(she)備(bei)的輕量(liang)級神經網絡(luo)模型設(she)(she)計(ji)》。
在本(ben)次講(jiang)解中,童志軍(jun)老(lao)師從神(shen)經(jing)網絡(luo)模(mo)型(xing)在嵌(qian)入式(shi)設備運(yun)行的(de)挑(tiao)戰、神(shen)經(jing)網絡(luo)模(mo)型(xing)從“特(te)征驅動(dong)”、“數據驅動(dong)”、“精(jing)度優先”到“速度優先”等不(bu)同階段的(de)發(fa)展歷(li)程,并通過實(shi)際案例解讀如(ru)何(he)在嵌(qian)入式(shi)設備上實(shi)現神(shen)經(jing)網絡(luo)模(mo)型(xing)的(de)高效部署和運(yun)行。
本(ben)文為此次課(ke)程主(zhu)講環(huan)節的圖文整理(li):
正文:
大家好,我(wo)是閱(yue)面科(ke)技合伙人&CTO童志軍,很高興能在(zai)智東西公開(kai)課和大家一起分(fen)享今天的(de)課題(ti)。我(wo)今天分(fen)享的(de)主(zhu)題(ti)為《面向嵌入式設(she)備的(de)輕(qing)量級(ji)神經網絡模型設(she)計》,主(zhu)要分(fen)為以下4個(ge)部(bu)分(fen):
1、神經網絡模型在嵌入式設備運行的挑戰
2、從“特征驅動”到“數據驅動”的大型神經網絡模型設計
3、從“精度優先”到“速度優先”的輕量級神經網絡模型設計
4、在嵌入式設備實現神經網絡(luo)模型的高效部(bu)署與(yu)運(yun)行
神經網絡模型在嵌入式設備運行的挑戰
目前,在所(suo)看見的(de)嵌入式設(she)備(bei)上,很(hen)大(da)一部分會(hui)有AI的(de)算法的(de)身(shen)影。在我(wo)們身(shen)邊也有很(hen)多應用(yong),比如刷(shua)臉解鎖手機、刷(shua)臉支付、家(jia)用(yong)的(de)攝像頭(tou),或馬路上隨處可見的(de)公共安(an)防攝像頭(tou)等。
嵌(qian)入式設備在我們身邊(bian)無孔不入,這些設備分為(wei)兩種(zhong),一種(zhong)是只(zhi)做(zuo)(zuo)視(shi)頻(pin)的抓取沒有(you)計(ji)算,只(zhi)是把(ba)視(shi)頻(pin)傳到后(hou)(hou)臺服務(wu)(wu)器,然(ran)后(hou)(hou)做(zuo)(zuo)分析;另(ling)一種(zhong)是設備上會帶有(you)AI計(ji)算能力,一些算法會在前端(duan)設備上去(qu)計(ji)算,然(ran)后(hou)(hou)把(ba)計(ji)算得到的結構化數(shu)據再傳到后(hou)(hou)端(duan)服務(wu)(wu)器去(qu)做(zuo)(zuo)進一步(bu)分析。
上(shang)(shang)(shang)圖(tu)左邊(bian)列舉了一些(xie)主流(liu)的神(shen)經(jing)網(wang)絡模(mo)(mo)型(xing),包括計算量(liang)(liang)及參數量(liang)(liang),相應在Imagenet公開(kai)數據集上(shang)(shang)(shang)Top-1的精(jing)度。上(shang)(shang)(shang)圖(tu)橫坐(zuo)標(biao)代表的是(shi)計算的浮點計算量(liang)(liang),然后縱(zong)坐(zuo)標(biao)是(shi)精(jing)度。可以看到神(shen)經(jing)網(wang)絡模(mo)(mo)型(xing)的精(jing)度與模(mo)(mo)型(xing)的計算量(liang)(liang)成正比(bi),隨著模(mo)(mo)型(xing)計算量(liang)(liang)越來越大(da),精(jing)度也越來越高。
但也可以(yi)看到(dao)(dao),網(wang)(wang)絡模(mo)(mo)型(xing)的(de)(de)精度(du)與模(mo)(mo)型(xing)的(de)(de)參數(shu)量(liang)是沒有(you)完(wan)全(quan)呈正比(bi)。比(bi)如(ru)VGG網(wang)(wang)絡,它的(de)(de)參數(shu)量(liang)很(hen)大,但是精度(du)不是特別高。在嵌式(shi)設(she)備(bei)上運(yun)行(xing)神經(jing)網(wang)(wang)絡,首先要求(qiu)模(mo)(mo)型(xing)的(de)(de)精度(du)要非常高,只有(you)模(mo)(mo)型(xing)的(de)(de)精度(du)達到(dao)(dao)一定的(de)(de)準確率才(cai)能滿足(zu)人(ren)們(men)實(shi)際使用的(de)(de)需求(qiu)。由于嵌入式(shi)設(she)備(bei)的(de)(de)功耗、存(cun)儲及(ji)計(ji)算(suan)(suan)(suan)資源(yuan)都(dou)非常有(you)限,如(ru)何在有(you)限的(de)(de)計(ji)算(suan)(suan)(suan)資源(yuan)下把高精度(du)的(de)(de)模(mo)(mo)型(xing)運(yun)行(xing)為實(shi)時動態的(de)(de)效果是非常重要的(de)(de),這(zhe)里(li)會涉及(ji)到(dao)(dao)算(suan)(suan)(suan)法、算(suan)(suan)(suan)力及(ji)數(shu)據幾個層(ceng)面(mian)的(de)(de)優化(hua),今天主要與大家探討在算(suan)(suan)(suan)法層(ceng)面(mian),更確切的(de)(de)是在網(wang)(wang)絡設(she)計(ji)的(de)(de)層(ceng)面(mian)如(ru)何解決?
從“特征驅動”到“數據驅動”的大型神經網絡模型設計
首(shou)先回顧下大型(xing)的神(shen)經(jing)網絡模型(xing)的發展(zhan)脈絡,其實卷(juan)積神(shen)經(jing)網絡很(hen)早就出(chu)現, LeNet-5很(hen)早在美國郵政的數字識別上(shang)已(yi)經(jing)得(de)到很(hen)好(hao)的應用。但后來并(bing)沒有得(de)到更多的推廣,沉默(mo)了10年,10年內主流的一些(xie)視覺(jue)分析(xi)的方法還是手工特征。
對于手工特征(zheng),大(da)家比較熟悉的(de)是SIFT特征(zheng),它是在(zai)x方(fang)(fang)向(xiang)跟y方(fang)(fang)向(xiang)去提取梯(ti)度圖,然后(hou)把(ba)每一個(ge)像素的(de)梯(ti)度圖按照一定(ding)的(de)角度區間各自去做(zuo)梯(ti)度方(fang)(fang)向(xiang)的(de)投(tou)影,最終得(de)到128位的(de)描述子。如果把(ba)這個(ge)問題換一個(ge)角度來思考,可以(yi)發現 SIFT特征(zheng)的(de)生成過(guo)程,可以(yi)等效是一個(ge)卷(juan)積層和一個(ge)pooling層。
上圖(tu)(tu)可以看(kan)到(dao)它(ta)的(de)8個(ge)方(fang)(fang)向的(de)梯(ti)度,代表的(de)是輸出(chu)Channel為(wei)8,kernel大小為(wei)1*1的(de)卷積(ji),輸入是x方(fang)(fang)向跟(gen)y方(fang)(fang)向的(de)梯(ti)度流。對于 x方(fang)(fang)向跟(gen)y方(fang)(fang)向的(de)圖(tu)(tu),等效成一(yi)個(ge)2*8*1*1的(de)卷積(ji)操作,后面再接了一(yi)個(ge)8*8*4*4的(de)Pooling層,最終得(de)到(dao)一(yi)個(ge)兩(liang)層的(de)神經網絡(luo)結構。
隨著(zhu)特征(zheng)(zheng)描述的(de)(de)(de)(de)發展,逐漸(jian)從(cong)底層(ceng)(ceng)的(de)(de)(de)(de)特征(zheng)(zheng)設計(ji)發展到(dao)中層(ceng)(ceng)特征(zheng)(zheng)設計(ji)。中層(ceng)(ceng)特征(zheng)(zheng)設計(ji)比較(jiao)典型的(de)(de)(de)(de)是Fisher Vector,它在(zai)圖(tu)像搜索的(de)(de)(de)(de)方面應(ying)用的(de)(de)(de)(de)非常廣泛。Fisher Vector特征(zheng)(zheng)首先對(dui)圖(tu)像做(zuo)特征(zheng)(zheng)提取,然后基(ji)于GMM模型對(dui)特征(zheng)(zheng)做(zuo)進一(yi)步(bu)的(de)(de)(de)(de)編碼(ma),編碼(ma)得到(dao)的(de)(de)(de)(de)特征(zheng)(zheng),再通過空間卷積得到(dao)在(zai)不同的(de)(de)(de)(de)尺度空間上的(de)(de)(de)(de)特征(zheng)(zheng)描述。用現在(zai)的(de)(de)(de)(de)神經網(wang)絡結(jie)構的(de)(de)(de)(de)方式(shi)去看,可以等效為(wei)一(yi)個(ge)(ge)SIFT特征(zheng)(zheng)提取過程,加一(yi)個(ge)(ge)編碼(ma)層(ceng)(ceng)和一(yi)個(ge)(ge)Pooling層(ceng)(ceng),即為(wei)一(yi)個(ge)(ge)四層(ceng)(ceng)的(de)(de)(de)(de)神經網(wang)絡結(jie)構。4層(ceng)(ceng)的(de)(de)(de)(de)網(wang)神經網(wang)絡結(jie)構比兩層(ceng)(ceng)的(de)(de)(de)(de)神經網(wang)絡精度會更高(gao),特征(zheng)(zheng)也更抽象,表達(da)能力(li)更強。
到(dao)2010年時,李飛(fei)飛(fei)教(jiao)授(shou)帶領的一幫學者整理(li)了一個非常(chang)大型(xing)的數(shu)據集-Imagenet,這(zhe)個數(shu)據集有1000類,大概(gai)120萬張圖片,這(zhe)個數(shu)據集的出(chu)現是神經(jing)網絡(luo)得到(dao)飛(fei)速發(fa)展的基石(shi),掀(xian)起了整個AI界的軍(jun)備競(jing)賽。
時間到了(le)2012年,ImageNet比賽冠軍提(ti)出來一個(ge)新(xin)的(de)網(wang)絡(luo)AlexNet。它由(you)5個(ge)卷積(ji)層,3個(ge)全連接層。另(ling)外由(you)于當時GPU顯(xian)存的(de)限(xian)制,把網(wang)絡(luo)的(de)卷積(ji)分成(cheng)分組的(de)形式,使(shi)得網(wang)絡(luo)能夠(gou)在 GPU有限(xian)的(de)情(qing)況下運(yun)行起來,里面還有drop out的(de)技巧等(deng)。AlexNet開創了(le)神經網(wang)絡(luo)結構的(de)一個(ge)新(xin)河(he),在此之后,工業界(jie)的(de)人開始(shi)相信深(shen)度學習是有效的(de),可以產生一些有價(jia)值的(de)東西,而不(bu)僅是學術界(jie)的(de)一個(ge)玩(wan)具。
2014年,出(chu)現(xian)了VGG和(he)GoogleNet兩(liang)種(zhong)不同的(de)網(wang)絡(luo)(luo)結構,兩(liang)個網(wang)絡(luo)(luo)其實都(dou)是在(zai)不同層面對網(wang)絡(luo)(luo)去建模(mo)。在(zai)早(zao)期,AlexNet出(chu)現(xian)之后,在(zai)調網(wang)絡(luo)(luo)的(de)時候發現(xian)一種(zhong)很(hen)奇怪的(de)現(xian)象,當把層數往上堆(dui)時,很(hen)容易出(chu)現(xian)梯度彌散的(de)效應。如何把網(wang)絡(luo)(luo)做深,在(zai)當時一直沒有(you)得(de)到(dao)很(hen)好的(de)解決。
VGG跟GoogleNet做的(de)網(wang)絡都接近20層左右,這(zhe)是(shi)一個(ge)突(tu)破,這(zhe)里也是(shi)使用了(le)一些(xie)技(ji)巧(qiao),比如 GoogleNet是(shi)在(zai)層中間插入 loss的(de)監督, 然后在(zai)block的(de)設計上引入了(le)一些(xie)技(ji)巧(qiao),通(tong)過這(zhe)種多尺度的(de)卷積(ji)核,提取圖像(xiang)上的(de)多尺度的(de)信(xin)息。其(qi)實(shi)尺度是(shi)一個(ge)非常重(zhong)要的(de)因素。另外(wai)逐層的(de) finetuning,在(zai)VGG用的(de)比較多,還(huan)引入了(le)連續兩(liang)個(ge)3×3的(de)卷積(ji)核去模擬5×5的(de)感受野,它使得網(wang)絡可以做得更深,精度做得更高。
2015年(nian),微軟亞洲(zhou)研究(jiu)員何(he)凱明設計的殘(can)差網絡(luo),把神(shen)經(jing)網絡(luo)從20層(ceng)提升到(dao)幾百層(ceng)。可以看(kan)到(dao)網絡(luo)層(ceng)數(shu)越(yue)來越(yue)深,而(er)且網絡(luo)的寬度也越(yue)來越(yue)寬,當然(ran)最終的精度也是(shi)非常高(gao)。
上圖為ImageNet分類Top5錯(cuo)誤(wu)率圖,可(ke)以看(kan)到(dao)網絡(luo)的精度(du)隨著層數逐(zhu)漸增加越來越高,網絡(luo)結構也在不斷(duan)創新。
從“精度優先”到“速度優先”的輕量級神經網絡模型設計
自2015-2016年之(zhi)后(hou)出現網絡模(mo)型(xing)有往端上發展(zhan)的(de)趨(qu)勢(shi),如何把神經網絡模(mo)型(xing)在終端上跑得(de)更快,是(shi)演變(bian)的(de)一個趨(qu)勢(shi),也(ye)就是(shi)模(mo)型(xing)的(de)設計從精度優先到后(hou)來的(de)速度優先。
我們(men)可(ke)以簡單分析(xi)下神(shen)經(jing)網(wang)絡(luo)模型的(de)計(ji)算量,可(ke)以看到一般(ban)的(de)神(shen)經(jing)網(wang)絡(luo)模型,大部分都是由卷(juan)積(ji)層(ceng)(ceng)組成,卷(juan)積(ji)層(ceng)(ceng)在(zai)里面(mian)的(de)計(ji)算量占到了80%以上,卷(juan)積(ji)的(de)計(ji)算示(shi)意圖如(ru)上圖所示(shi),計(ji)算復雜度(du)為(wei)N*M*H*W*K*K。
輕量(liang)(liang)級的(de)(de)神(shen)經網(wang)絡模(mo)型所做(zuo)的(de)(de)工作,就是圍繞著計算復雜度(du),把里面(mian)的(de)(de)一(yi)(yi)些參數盡量(liang)(liang)的(de)(de)減小,使得(de)計算量(liang)(liang)能夠降低。計算量(liang)(liang)在(zai)嵌入式設(she)備(bei)上體現最明顯(xian)的(de)(de)是它的(de)(de)速度(du)。如何在(zai)優化計算復雜度(du)的(de)(de)同時(shi)保證模(mo)型的(de)(de)高精度(du),就是下面(mian)一(yi)(yi)些主流的(de)(de)神(shen)經網(wang)絡模(mo)型設(she)計所做(zuo)的(de)(de)工作。
最開(kai)始比(bi)較有(you)代表性的(de)一(yi)個(ge)網絡是SqueezeNet網絡,它(ta)有(you)兩個(ge)特點,先(xian)用1×1的(de)卷積核(he)(he)(he)做通(tong)道壓縮,然后把1×1與(yu)3×3的(de)卷積核(he)(he)(he)并排,使得卷積核(he)(he)(he)可(ke)(ke)以(yi)(yi)更小。也就是通(tong)過減(jian)小通(tong)道數以(yi)(yi)及卷積核(he)(he)(he)大小降低模型的(de)計算量(liang),使得模型可(ke)(ke)以(yi)(yi)推理的(de)更快。
第二個(ge)是(shi)MobileNet網(wang)(wang)絡(luo)和ShuffleNet網(wang)(wang)絡(luo),MobileNet網(wang)(wang)絡(luo)用(yong)(yong)到(dao)一個(ge)比(bi)較(jiao)重要(yao)的(de)點是(shi)Depthwise卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji),也是(shi)把原(yuan)來(lai)稠(chou)密的(de)卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)N*M的(de)計(ji)算量,直接優化為N的(de)計(ji)算量。ShuffleNet網(wang)(wang)絡(luo)借鑒了(le) MobileNet網(wang)(wang)絡(luo)一些點,比(bi)如Depthwise卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji),當應用(yong)(yong)Depthwise卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)后,發現整個(ge)神經網(wang)(wang)絡(luo)計(ji)算量更多是(shi)在(zai)1×1的(de)卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)上,這時就(jiu)可以(yi)把1×1卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)去做(zuo)一個(ge)通道Shuffle分(fen)組,分(fen)組之后做(zuo)通道卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji),使(shi)得它能夠在(zai)3×3上再進一步(bu)的(de)融合,可以(yi)看到(dao)大家更多的(de)是(shi)把卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)由(you)原(yuan)來(lai)的(de)稠(chou)密卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)變(bian)成通道的(de)卷(juan)(juan)(juan)積(ji)(ji)(ji)(ji)。
最近的神經網(wang)絡是(shi)模型搜索(suo)NAS,這(zhe)方面有很多(duo)的輕量(liang)級的網(wang)絡結構,但是(shi)沒有把它應(ying)用(yong)到嵌入(ru)設備(bei)上(shang),為什么?因為 NAS搜索(suo)出來的網(wang)絡規(gui)律性比(bi)較差,對嵌入(ru)式設備(bei)不是(shi)很友好(hao)。實際應(ying)用(yong)更多(duo)的還(huan)是(shi)停留在MobileNet網(wang)絡這(zhe)種比(bi)較直線型的網(wang)絡上(shang)去(qu)優化。
后來有一(yi)個EfficientNet網(wang)絡(luo)結構,它的(de)(de)(de)(de)想法(fa)比較綜合,把網(wang)絡(luo)計算量的(de)(de)(de)(de)幾個因素(su)同時去(qu)做一(yi)個聯(lian)合搜索(suo)優化,比如網(wang)絡(luo)的(de)(de)(de)(de)層數,或(huo)者(zhe)圖像的(de)(de)(de)(de)feature map的(de)(de)(de)(de)長寬,以及計算復(fu)雜度中提(ti)到的(de)(de)(de)(de)N、M、K,去(qu)做一(yi)個統一(yi)的(de)(de)(de)(de)建模,通過增強(qiang)學習去(qu)搜索(suo)最優解。另(ling)外,網(wang)絡(luo)結構也做一(yi)些(xie)重復(fu)的(de)(de)(de)(de)堆疊,相(xiang)對非常有規律(lv),對整(zheng)個嵌入式設(she)備還是(shi)非常友好(hao)的(de)(de)(de)(de)。
在嵌入式設備實現神經網絡模型的高效部署與運行
首(shou)先看下整體的(de)加速(su)(su)框架(jia),這里面(mian)大概包含了閱面(mian)所做的(de)一些工(gong)作,左邊是訓練端,主要做了模(mo)型的(de)通道剪枝、模(mo)型蒸餾和(he)量化訓練的(de)工(gong)作,右邊是在嵌(qian)入(ru)式設備上做模(mo)型的(de)轉換,以及卷積運算算子的(de)優(you)化,使得我們(men)的(de)模(mo)型可以在一些硬件(jian)層面(mian)快(kuai)速(su)(su)的(de)跑(pao)起(qi)來。
第一個是通(tong)道剪(jian)(jian)枝(zhi),剪(jian)(jian)枝(zhi)包(bao)括稀疏(shu)化等,但對嵌入式設備不(bu)是很友好,因為稀疏(shu)化剪(jian)(jian)枝(zhi)得(de)(de)到(dao)的(de)模型沒有規律(lv),讓內存(cun)的(de)取值變得(de)(de)隨機,使得(de)(de)設備速度跑不(bu)起來。后來通(tong)道剪(jian)(jian)枝(zhi)可以得(de)(de)到(dao)規則(ze)模型,使得(de)(de)剪(jian)(jian)完之(zhi)后的(de)模型能夠復用以前的(de)計(ji)算引(yin)擎,這方面更多的(de)是基于一些(xie)規則(ze),比(bi)如選取響應最大(da)卷(juan)積核(he)(he)或(huo)選一些(xie)方差(cha)比(bi)較(jiao)大(da)的(de)卷(juan)積核(he)(he),對卷(juan)積核(he)(he)建模,通(tong)道壓縮(suo)率(lv)也(ye)可以通(tong)過強化學習的(de)方法去反復搜索,最終得(de)(de)到(dao)最優(you)的(de)結果(guo)。
通道剪枝主要針對MobileNetV2和 EfficientNet這類網絡,可以(yi)(yi)看到(dao)(dao)當模(mo)(mo)型從原來的(de)(de)(de)200-300M的(de)(de)(de)計算規(gui)模(mo)(mo),到(dao)(dao)后(hou)來100M以(yi)(yi)下(xia),其精度下(xia)降在(zai)一個可以(yi)(yi)接受的(de)(de)(de)范圍(wei)內,這樣的(de)(de)(de)模(mo)(mo)型可以(yi)(yi)在(zai)檢測或者是識別任務(wu)上(shang)得到(dao)(dao)很(hen)好的(de)(de)(de)使用(yong)。
第二是模(mo)(mo)(mo)型(xing)蒸餾,最(zui)早主要是體(ti)現(xian)在loss設計上,比(bi)如 Student模(mo)(mo)(mo)型(xing)去學習Teacher模(mo)(mo)(mo)型(xing)的(de)(de)樣本(ben)分布,最(zui)終來提(ti)高Student模(mo)(mo)(mo)型(xing)的(de)(de)精(jing)度。以Margin為(wei)例,Margin在細(xi)粒(li)度分類(lei)上用的(de)(de)比(bi)較多。通過(guo)Student模(mo)(mo)(mo)型(xing)去學習Teacher模(mo)(mo)(mo)型(xing)的(de)(de)Margin分布,使得Student模(mo)(mo)(mo)型(xing)的(de)(de)精(jing)度得到(dao)非常大的(de)(de)提(ti)升。
上圖為訓練人(ren)臉(lian)識別網絡,第一(yi)行(xing)是(shi)(shi)(shi) Teacher模(mo)(mo)型(xing)的精度(du),第二行(xing)是(shi)(shi)(shi)Student模(mo)(mo)型(xing)的一(yi)個baseline ,第三(san)行(xing)是(shi)(shi)(shi)用模(mo)(mo)型(xing)蒸(zheng)餾的方(fang)法(fa)產生的Student模(mo)(mo)型(xing)的記錄,可以看到(dao)訓練出(chu)的 Student模(mo)(mo)型(xing)的精度(du),是(shi)(shi)(shi)介于Teacher模(mo)(mo)型(xing)跟Student模(mo)(mo)型(xing)之間,而且比較(jiao)接近Teacher模(mo)(mo)型(xing)的精度(du),相對于baseline有非常大的提升。
第三塊是(shi)量(liang)(liang)(liang)化(hua)(hua)訓練,為什么要做量(liang)(liang)(liang)化(hua)(hua)訓練?模(mo)型(xing)量(liang)(liang)(liang)化(hua)(hua)會帶(dai)來(lai)很(hen)多好處(chu),最常見的(de)比如可以把模(mo)型(xing)的(de)存儲量(liang)(liang)(liang),從原來(lai)的(de)FP32減(jian)到INT16或(huo)INT8,直接減(jian)掉(diao)一(yi)(yi)半或(huo)1/4。另(ling)一(yi)(yi)點是(shi)做量(liang)(liang)(liang)化(hua)(hua)之后,使(shi)得模(mo)型(xing)做并行加速,比如同(tong)樣一(yi)(yi)個指令周期,原來(lai)可以操作1個浮點數,現在(zai)可以同(tong)時操作2個INT16或(huo)4個INT8,使(shi)得數據的(de)吞吐量(liang)(liang)(liang)提升,這也是(shi)一(yi)(yi)種提速。
它的(de)(de)(de)流(liu)程如下:首(shou)先會收(shou)集前向(xiang)的(de)(de)(de)數據集,然后(hou)對(dui)網絡做(zuo)(zuo)(zuo)統計(ji),統計(ji)分為兩部分,一個是模型(xing)(xing)(xing)(xing)的(de)(de)(de) weight做(zuo)(zuo)(zuo)最(zui)(zui)大最(zui)(zui)小或(huo)者 kr散度分布上的(de)(de)(de)統計(ji),另一個是對(dui)模型(xing)(xing)(xing)(xing)的(de)(de)(de)輸入輸出做(zuo)(zuo)(zuo)統計(ji),從而可以選(xuan)取到(dao)最(zui)(zui)優(you)的(de)(de)(de)一個標準去對(dui)模型(xing)(xing)(xing)(xing)做(zuo)(zuo)(zuo)量化。如果(guo)只做(zuo)(zuo)(zuo)INT16的(de)(de)(de)量化,模型(xing)(xing)(xing)(xing)的(de)(de)(de)精(jing)(jing)(jing)度是可以完全(quan)保持住的(de)(de)(de)。但當做(zuo)(zuo)(zuo)更低精(jing)(jing)(jing)度,比(bi)如INT8或(huo)INT4,模型(xing)(xing)(xing)(xing)精(jing)(jing)(jing)度會有一些(xie)損失,這時(shi)還需要做(zuo)(zuo)(zuo)一些(xie)finetune,使得模型(xing)(xing)(xing)(xing)精(jing)(jing)(jing)度可以回到(dao)跟原來浮點模型(xing)(xing)(xing)(xing)的(de)(de)(de)精(jing)(jing)(jing)度。
上(shang)圖是(shi)(shi)在(zai)(zai)人臉識別(bie)模型上(shang)所(suo)做的(de)(de)(de)工作,比(bi)如FP32在(zai)(zai)1/10萬是(shi)(shi)達到97.94%的(de)(de)(de)識別(bie)率,直接量化(hua)(hua)INT8,精度為(wei) 85.17,通過finetune使得(de)最終的(de)(de)(de)模型可能只降低了1~2個點(dian)。量化(hua)(hua)是(shi)(shi)一(yi)個非(fei)常有效的(de)(de)(de)降低模型計算量,同時適(shi)合嵌入式(shi)設(she)備,不管是(shi)(shi)功耗或存(cun)儲的(de)(de)(de)占用都非(fei)常友好。
第四(si)點是(shi)當得(de)到一個(ge)最(zui)優(you)的(de)模(mo)型(xing)結構之后,最(zui)終部署到嵌(qian)入式(shi)設備(bei)上,就涉及(ji)到推理引擎。推薦引擎主要(yao)的(de)計算在卷積運算, 我們采用的(de)是(shi)直接基于(yu)原始的(de)卷積方式(shi)做優(you)化。這涉及(ji)到行(xing)主序(xu)的(de)內存重排、矩陣(zhen)分(fen)塊、內存對齊、內存復(fu)用、緩存預讀取、SIMD并行(xing)加(jia)速(su)、循環展開、多(duo)線程等。
我們在(zai)RK3288上做的(de)優化,對比的(de)是騰訊(xun)開源的(de)NCNN推理引擎(qing)。可以看(kan)到在(zai)同樣的(de)輸入下,我們的(de)速度提升大概有40%~50%之間,這個引擎(qing)還在(zai)持續的(de)優化,算(suan)子的(de)計算(suan)優化也是非(fei)常(chang)重要的(de)一環。
最后總(zong)結下(xia),在嵌(qian)入(ru)式(shi)模(mo)型(xing)(xing)(xing)(xing)(xing)部署所做(zuo)的(de)(de)(de)(de)(de)(de)工作,首先會(hui)得到檢測或(huo)識別的(de)(de)(de)(de)(de)(de)業務模(mo)型(xing)(xing)(xing)(xing)(xing),根(gen)據具體(ti)客戶的(de)(de)(de)(de)(de)(de)需求訓練(lian)浮點(dian)模(mo)型(xing)(xing)(xing)(xing)(xing),之(zhi)(zhi)后做(zuo)模(mo)型(xing)(xing)(xing)(xing)(xing)蒸(zheng)餾的(de)(de)(de)(de)(de)(de)loss訓練(lian),把計算量做(zuo)進一步(bu)的(de)(de)(de)(de)(de)(de)精簡(jian)。精簡(jian)完之(zhi)(zhi)后,對一些(xie)稀疏的(de)(de)(de)(de)(de)(de)通道,做(zuo)進一步(bu)的(de)(de)(de)(de)(de)(de)剪枝,并(bing)且(qie)把模(mo)型(xing)(xing)(xing)(xing)(xing)finetune,得到一個最緊湊的(de)(de)(de)(de)(de)(de)深度學習模(mo)型(xing)(xing)(xing)(xing)(xing)。之(zhi)(zhi)后根(gen)據前面(mian)的(de)(de)(de)(de)(de)(de)一些(xie)積累,我(wo)們更多是基(ji)于Caffe的(de)(de)(de)(de)(de)(de)框架,在這(zhe)個基(ji)礎之(zhi)(zhi)上(shang)(shang)對模(mo)型(xing)(xing)(xing)(xing)(xing)做(zuo)進一步(bu)的(de)(de)(de)(de)(de)(de)量化(hua)(hua),量化(hua)(hua)可能(neng)會(hui)根(gen)據具體(ti)硬件(jian)不同會(hui)有(you)所不同。最終(zhong)得到一個最優化(hua)(hua)的(de)(de)(de)(de)(de)(de)量化(hua)(hua)模(mo)型(xing)(xing)(xing)(xing)(xing)之(zhi)(zhi)后,把算子計算庫打包一起,最終(zhong)形成一個運行(xing)程序(xu),部署到實際的(de)(de)(de)(de)(de)(de)設備上(shang)(shang)。上(shang)(shang)面(mian)就是完整(zheng)的(de)(de)(de)(de)(de)(de)模(mo)型(xing)(xing)(xing)(xing)(xing)部署的(de)(de)(de)(de)(de)(de)流程。
以上就是我今天(tian)的分享內容,謝(xie)謝(xie)大家(jia)。