陳 立 軍, 張 屹, 陳 孝 如
( 廣州軟件學(xué)院 軟件工程系, 廣東 廣州 510990 )
在快速增長(zhǎng)的物聯(lián)網(wǎng)(IoT)世界中,數(shù)據(jù)分析期望從眾多原始數(shù)據(jù)中提取最有價(jià)值的信息。人工智能(AI)能夠從大量物聯(lián)網(wǎng)數(shù)據(jù)中,獲取知識(shí)并能快速作出決策,因此AI是擴(kuò)展物聯(lián)網(wǎng)價(jià)值的重要分析手段,在物聯(lián)網(wǎng)人工智能(AIoT)中,人工智能通過(guò)機(jī)器學(xué)習(xí),為物聯(lián)網(wǎng)增加價(jià)值并改善決策制定,而物聯(lián)網(wǎng)通過(guò)連通性、信令和數(shù)據(jù)交換為人工智能增加價(jià)值。根據(jù)IDC數(shù)據(jù),中國(guó)IoT支出規(guī)模在從2020年已經(jīng)超過(guò)1 500億美元,并預(yù)計(jì)在2025年達(dá)到3 069.8億美元。另外,IDC預(yù)計(jì)在2024年,制造業(yè)在物聯(lián)網(wǎng)行業(yè)支出占比規(guī)模最大,達(dá)到29%,政府支出與消費(fèi)者支出次之,分別約為13%。隨著人工智能技術(shù)的成熟,在AI的加持下,IoT有望進(jìn)入更廣闊的市場(chǎng)應(yīng)用[1]。
近年來(lái),深度神經(jīng)網(wǎng)絡(luò)(deep neural network,DNN)已被證明是一種很有前途的AI技術(shù),具有強(qiáng)大的功能,可以基于復(fù)雜且嘈雜的輸入進(jìn)行準(zhǔn)確的推理,盡管已經(jīng)設(shè)計(jì)了許多專用的DNN加速器,例如TPU[2],但大多數(shù)IoT設(shè)備,例如智能水表電表,工作人員不用上門(mén)抄表,也能通過(guò)手機(jī)APP獲取水電表的讀數(shù)。但這些水電表仍在使用低成本、低功耗和資源受限的微控制器單元(MCU),工作內(nèi)存小(64~2 048 kB),不能像傳統(tǒng)CPU一樣,有一級(jí)高速緩存和二級(jí)高速緩存,并且也不能像計(jì)算機(jī)一樣,在主板上根據(jù)需要插入相應(yīng)大小的內(nèi)存。物聯(lián)網(wǎng)終端設(shè)備MCU工作內(nèi)存詳細(xì)情況見(jiàn)表1(數(shù)據(jù)更新為2021年6月)。
表1 主流物聯(lián)網(wǎng)終端設(shè)備MCU的工作內(nèi)存狀況Tab.1 The working memory status of MCU of themain current IoT terminal device
因此,要實(shí)現(xiàn)AIoT的愿景,必須通過(guò)在MCU上部署DNN來(lái)將智能功能部署到嵌入式設(shè)備中,但是,典型的MCU受資源限制,其存儲(chǔ)(例如ROM和閃存)容量有限,并且大部分設(shè)備在低頻(幾兆赫茲或幾十兆赫茲)下運(yùn)行,而典型的DNN通常具有數(shù)千萬(wàn)的權(quán)重和用途,數(shù)十億次操作來(lái)完成一個(gè)推斷,即使是輕量級(jí)的DNN(例如MobileNetV2[6])也具有超過(guò)一百萬(wàn)的權(quán)重和數(shù)百萬(wàn)的操作。DNN的模型大小與MCU的存儲(chǔ)容量之間的差距使得DNN在MCU上的部署不可行,因此,諸如GENESIS[7]之類(lèi)的一些工作已經(jīng)采用了神經(jīng)網(wǎng)絡(luò)壓縮技術(shù),以在資源受限的MCU上部署DNN。但是,即使DNN可以通過(guò)壓縮裝入有限的存儲(chǔ)中,如果中間數(shù)據(jù)(即特征圖)超過(guò)了有限的RAM(例如64~2 048 kB),DNN仍然無(wú)法成功運(yùn)行,盡管在某些情況下可以不斷地將中間數(shù)據(jù)溢出到快速非易失性存儲(chǔ)器中,例如FRAM,但對(duì)于大多數(shù)現(xiàn)成的商用物聯(lián)網(wǎng)MCU而言,對(duì)于閃存或ROM而言,不是太昂貴,就是不可行,而本研究的輕量級(jí)運(yùn)行時(shí)工作內(nèi)存壓縮方法能很好地解決這個(gè)問(wèn)題。
設(shè)DNN中間結(jié)果所需的空間稱為工作內(nèi)存(Ω),本研究用Ωl來(lái)表示特定DNN的l層的內(nèi)存需求。
Ωl=|xl|+|yl|
(1)
式中:|xl|為l層輸入特征映射激活值的個(gè)數(shù);|yl|為l層輸出特征映射激活值的個(gè)數(shù);|Ωl|相當(dāng)于|xl+1|。
當(dāng)特定DNN的工作內(nèi)存超過(guò)目標(biāo)MCU的RAM大小時(shí),工作內(nèi)存過(guò)大,根據(jù)式(1)可以得出,Ωl與l層的濾波器形狀和數(shù)量有關(guān),現(xiàn)有的神經(jīng)網(wǎng)絡(luò)壓縮技術(shù)(如文獻(xiàn)[8]中的細(xì)粒度非結(jié)構(gòu)化修剪)著重于修剪濾波器的無(wú)關(guān)緊要的權(quán)重,可是DNN不會(huì)更改濾波器的形狀或數(shù)量,因此無(wú)法減少DNN的工作內(nèi)存。結(jié)構(gòu)化修剪[9]會(huì)在每層中刪除一定數(shù)量的濾波器,如圖1(a)所示,這可能會(huì)導(dǎo)致工作內(nèi)存減少,但是此方法對(duì)于不同的輸入而言也是靜態(tài)不變的,例如在圖1(a)中,永久刪除了灰色的濾波器,減少了工作內(nèi)存,修剪操作可能不會(huì)影響某些輸入(例如輸入0)的推論,但是,刪除的濾波器對(duì)于某些輸入(例如輸入1)的推論可能非常重要,刪除此濾波器可能會(huì)降低推論的準(zhǔn)確性。因此,靜態(tài)結(jié)構(gòu)化修剪會(huì)削弱原始DNN的表示能力,尤其是那些已經(jīng)為MCU設(shè)計(jì)的已經(jīng)很小的DNN,從而大大降低準(zhǔn)確性。盡管Lin等[10]提出了動(dòng)態(tài)結(jié)構(gòu)化修剪來(lái)減輕這種粗粒度修剪導(dǎo)致的準(zhǔn)確性損失,但由于它需要額外的DNN來(lái)確定運(yùn)行時(shí)的修剪策略,因此不適合用于MCU。量化是另一種壓縮技術(shù),可以通過(guò)使用較少的位,來(lái)表示輸出特征圖的激活值,從而減少工作內(nèi)存。但是,許多DNN的工作內(nèi)存器即使將其激活值量化為1 B也無(wú)法滿足RAM的約束;Wang等[11]提出將激活值量化為小于1 B,但是,這種量化對(duì)硬件不友好,并且在沒(méi)有額外硬件支持的情況下訪問(wèn)MCU的內(nèi)存時(shí)可能會(huì)引起內(nèi)存不夠的問(wèn)題,此外,量化也是靜態(tài)的,因此對(duì)運(yùn)行時(shí)的輸入不敏感,與本研究的運(yùn)行時(shí)動(dòng)態(tài)修剪中間特征映射值相比,本研究的方法既能降低工作內(nèi)存和減少運(yùn)行時(shí)延,又能保證推論的準(zhǔn)確性。
(a) 靜態(tài)修剪
(b) 動(dòng)態(tài)修剪
由于DNN的復(fù)雜性與MCU的有限資源,DNN曾經(jīng)被認(rèn)為不適合在物聯(lián)網(wǎng)MCU資源上部署,但是近年來(lái),在資源受限的物聯(lián)網(wǎng)MCU上運(yùn)行DNN引起更多關(guān)注。
Chen等[12]為了減少內(nèi)存需求,提出了一種高效的并行內(nèi)存壓縮框架,該框架能夠同時(shí)減少內(nèi)存占用和編碼/解碼對(duì)DNN訓(xùn)練的影響。與本算法相比,需要對(duì)中間特征映射值進(jìn)行編碼,再解碼,既浪費(fèi)解碼時(shí)間,又會(huì)增加運(yùn)行延遲;Fosca等[13]建議使用抽象的、類(lèi)似于語(yǔ)言的代碼對(duì)每個(gè)序列進(jìn)行內(nèi)部壓縮,以捕獲其數(shù)值和幾何規(guī)則;Wang等[14]提出了一種基于自編碼器和長(zhǎng)短期存儲(chǔ)器(LSTM)的有損數(shù)據(jù)壓縮算法,首先利用自編碼器對(duì)測(cè)量數(shù)據(jù)進(jìn)行特征提取,然后對(duì)特征向量進(jìn)行保存,達(dá)到數(shù)據(jù)壓縮的效果,當(dāng)需要對(duì)測(cè)量數(shù)據(jù)進(jìn)行解壓縮時(shí),將壓縮后的數(shù)據(jù)輸入解碼器實(shí)現(xiàn)解壓縮;Lazartigues等[15]提出工作內(nèi)存壓縮,來(lái)減少內(nèi)存不夠的問(wèn)題。雖然做了許多工作,但同樣,減少工作內(nèi)存,都不約而同采取編碼壓縮的方法,與本研究的方法相比,都因還需要解碼或解壓縮增加了運(yùn)行延遲。
Jia等[16]設(shè)計(jì)和部署MCU上的DNN比傳統(tǒng)算法實(shí)現(xiàn)了更好的性能,然而,DNN的簡(jiǎn)單架構(gòu)阻礙了它應(yīng)用于更復(fù)雜的任務(wù),例如圖像分類(lèi);Gobieski等[4]第一個(gè)把DNN成功部署在物聯(lián)網(wǎng)MCU上,使用FRAM作為存儲(chǔ)組件頻繁地寫(xiě)操作,通過(guò)從SRAM到FRAM的中間數(shù)據(jù)來(lái)克服超大工作內(nèi)存的問(wèn)題,對(duì)于帶閃存或ROM的MCU來(lái)說(shuō),這種方法過(guò)于昂貴。因此,需要更好的方法,來(lái)解決物聯(lián)網(wǎng)MCU上DNN的超大工作內(nèi)存的問(wèn)題,同時(shí)盡可能地保持精度。DNN壓縮是一種減少特定DNN尺寸的技術(shù),使得它可以適合移動(dòng)或嵌入式設(shè)備的存儲(chǔ)器,其精讀損失可忽略不計(jì)。修剪是一種常見(jiàn)的壓縮技術(shù)之一,可以分為結(jié)構(gòu)化修剪[9]和非結(jié)構(gòu)化修剪,但是直接將非結(jié)構(gòu)化修剪施加到MCU上的DNN,無(wú)法解決過(guò)大尺寸的工作內(nèi)存的問(wèn)題。
硬件感知神經(jīng)結(jié)構(gòu)搜索(NAS)是一種新興技術(shù),可以在滿足目標(biāo)平臺(tái)硬件限制的情況下,以最佳精度自動(dòng)生成特定應(yīng)用的DNN架構(gòu)[17],但是現(xiàn)有的研究大多集中在移動(dòng)設(shè)備上,很少關(guān)注在資源受限的MCU上設(shè)計(jì)DNN。Fedorov等[17]提出了一種為MCU定制的硬件感知神經(jīng)結(jié)構(gòu)搜索NAS,在搜索過(guò)程中考慮了DNN的模型大小和工作內(nèi)存,但工作內(nèi)存過(guò)大時(shí)DNN不能在MCU上運(yùn)行,然而,采用本研究的運(yùn)行時(shí)動(dòng)態(tài)修剪(也稱為壓縮算法),DNN可以成功地在目標(biāo)MCU上運(yùn)行,與工作內(nèi)存較小的DNN相比,可能具有更好的準(zhǔn)確性,因?yàn)檩^大的工作內(nèi)存通常與更復(fù)雜的體系結(jié)構(gòu)有關(guān),具有更強(qiáng)的表示能力。由于本研究的壓縮算法的簡(jiǎn)單性,可以方便地將其合并到參考文獻(xiàn)[9]的NAS框架中,從而擴(kuò)展其搜索空間。
為了部署一個(gè)DNN,能夠滿足資源受限的MCU,開(kāi)發(fā)了一種輕量級(jí)的運(yùn)行時(shí)工作內(nèi)存壓縮算法,可以動(dòng)態(tài)刪減中間輸出特征映射,以適合容量有限的RAM,而不會(huì)顯著降低某些輸入的精度。主要思路如圖1所示,該算法可以動(dòng)態(tài)地刪除運(yùn)行時(shí)輸出特征映射中的不重要的激活值(圖1(b)),而不是靜態(tài)地刪除某些濾波器(圖1(a)),由于要修剪的值是根據(jù)當(dāng)前輸入動(dòng)態(tài)決定的,因此該算法對(duì)輸入很敏感,最大限度地降低了對(duì)每個(gè)輸入進(jìn)行修剪所導(dǎo)致的精度降低。
靜態(tài)修剪是在運(yùn)行時(shí),刪除神經(jīng)網(wǎng)絡(luò)每層中一定數(shù)量的濾波器,來(lái)達(dá)到深度神經(jīng)網(wǎng)絡(luò)工作所需的工作內(nèi)存,但會(huì)削弱原始深度神經(jīng)網(wǎng)絡(luò)的表示能力,大大降低了推論的準(zhǔn)確性。動(dòng)態(tài)修剪是在運(yùn)行時(shí),動(dòng)態(tài)地刪除運(yùn)行時(shí)輸出特征映射中的不重要的激活值,既減少了深度神經(jīng)網(wǎng)絡(luò)工作所需的工作內(nèi)存和運(yùn)行時(shí)延,又保證了推論的準(zhǔn)確性。這種輕量級(jí)的運(yùn)行時(shí)工作內(nèi)存壓縮算法主要優(yōu)點(diǎn)是有效性、簡(jiǎn)單性和輕量級(jí),這是第一次在不改變已部署DNN架構(gòu)的情況下,保證具有超大工作內(nèi)存的特定DNN,能夠適應(yīng)資源受限的物聯(lián)網(wǎng)MCU的工作,由于保留了完整的網(wǎng)絡(luò)結(jié)構(gòu),與修改原有網(wǎng)絡(luò)結(jié)構(gòu)的靜態(tài)網(wǎng)絡(luò)修剪相比,修剪導(dǎo)致的精度損失減少,表明了算法的有效性;該算法可以很容易地在現(xiàn)成的商用物聯(lián)網(wǎng)MCU上實(shí)現(xiàn),而不需要任何額外的硬件支持,即為簡(jiǎn)單性;該算法還是輕量級(jí)的,因?yàn)閮?nèi)存開(kāi)銷(xiāo)可以忽略不計(jì),運(yùn)行時(shí)延遲的開(kāi)銷(xiāo)適中。此外,使用該壓縮算法運(yùn)行的DNN,也是對(duì)最近為MCUs[9]指定的神經(jīng)結(jié)構(gòu)搜索(NAS)的很好的補(bǔ)充。實(shí)驗(yàn)結(jié)果表明,該算法能夠保證工作內(nèi)存較大的DNN能夠適應(yīng)有限的物聯(lián)網(wǎng)MCU的RAM,同時(shí)在內(nèi)存開(kāi)銷(xiāo)和運(yùn)行時(shí)延相對(duì)較低的情況下保持滿意的準(zhǔn)確性。
DNN是深度學(xué)習(xí)的基礎(chǔ),它的工作原理與感知機(jī)的模型一樣,深度神經(jīng)網(wǎng)絡(luò)可以理解為有很多隱藏層的神經(jīng)網(wǎng)絡(luò)。多層神經(jīng)網(wǎng)絡(luò)其實(shí)就是深度神經(jīng)網(wǎng)絡(luò),DNN有時(shí)也叫作多層感知機(jī)(multi-layer perceptron,MLP)。感知機(jī)的模型是一個(gè)有若干輸入和一個(gè)輸出的模型,如圖2所示。
圖2 感知機(jī)模型Fig.2 Perceptron model
輸出和輸入之間學(xué)習(xí)到一個(gè)線性關(guān)系,得到中間輸出結(jié)果:
(2)
接著是一個(gè)神經(jīng)元激活函數(shù):
(3)
從而得到想要的結(jié)果1或者-1。這個(gè)模型只能用于二元分類(lèi),且無(wú)法學(xué)習(xí)比較復(fù)雜的非線性模型,因此在工業(yè)界無(wú)法使用。而深度神經(jīng)網(wǎng)絡(luò)則在感知機(jī)的模型上做了擴(kuò)展,主要有3點(diǎn):(1)加入隱藏層,隱藏層可以有多層,增強(qiáng)了模型的表達(dá)能力,增加隱藏層的同時(shí)也增加了模型的復(fù)雜度。(2)輸出層的神經(jīng)元可以有多個(gè)輸出,這樣模型可以靈活的應(yīng)用于分類(lèi)回歸,以及其他的機(jī)器學(xué)習(xí)領(lǐng)域比如降維和聚類(lèi)等。多個(gè)神經(jīng)元輸出的輸出層對(duì)應(yīng)的一個(gè)3個(gè)隱藏層的實(shí)例如圖3所示。(3)對(duì)激活函數(shù)做擴(kuò)展。感知機(jī)的激活函數(shù)是sign(z),雖然簡(jiǎn)單但是處理能力有限,因此神經(jīng)網(wǎng)絡(luò)中一般使用其他的激活函數(shù),比如在邏輯回歸中使用Sigmoid函數(shù)如式(4)所示。
(4)
圖3 深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)Fig.3 Structure of deep neural network
總之,DNN的工作原理與感知機(jī)模型基本一樣,只是增加了一定數(shù)量的隱藏層和可以有多個(gè)輸出。它是目前使用最廣,效果最好的機(jī)器學(xué)習(xí)模型。目前手寫(xiě)體、語(yǔ)音、圖像識(shí)別,圖片、聲音、文本生成方面比較成功的案例都是使用的深度神經(jīng)網(wǎng)絡(luò)。
傳統(tǒng)的靜態(tài)結(jié)構(gòu)修剪的目的是通過(guò)在選定的DNN層上刪除一定數(shù)量的濾波器,來(lái)降低計(jì)算成本,同時(shí)降低相應(yīng)層的內(nèi)存需求。但是,由于通常應(yīng)用于移動(dòng)平臺(tái)或云平臺(tái)上的DNN,存儲(chǔ)中間數(shù)據(jù)的內(nèi)存足夠,因此減少工作內(nèi)存只是該方法的一個(gè)副作用,并沒(méi)有對(duì)工作內(nèi)存的保存進(jìn)行優(yōu)化,在原有的結(jié)構(gòu)化修剪設(shè)置中,如果某些內(nèi)存需求較大的層次對(duì)修剪很敏感,算法可以選擇在這些層次上少修剪,甚至不修剪濾波器,以保持準(zhǔn)確性。然而,物聯(lián)網(wǎng)MCU中有限的RAM大小對(duì)部署的DNN的工作內(nèi)存器構(gòu)成了嚴(yán)格的限制,即使某些層對(duì)修剪很敏感,但如果它們的內(nèi)存需求遠(yuǎn)遠(yuǎn)超過(guò)RAM大小,就必須進(jìn)行大量修剪,因此,提出一種運(yùn)行時(shí)工作內(nèi)存(WM)壓縮,用于在資源受限的MCU上部署DNN。如果部署的DNN的權(quán)值能夠放入存儲(chǔ)中,則保留其完整的體系結(jié)構(gòu),并在運(yùn)行時(shí)動(dòng)態(tài)修剪中間輸出特征映射的不重要激活值,以滿足RAM大小的硬件約束。本研究的方法可以充分利用原始DNN的表示能力,從而盡可能降低對(duì)其敏感的一些層的修剪造成的精度損失。
運(yùn)行時(shí)WM壓縮主要由離線和在線兩部分組成。離線部分將在部署前決定DNN每一層中需要修剪的激活值的數(shù)量,如果內(nèi)存需求不超過(guò)特定層的RAM大小,則不需要裁剪激活值,因此WM壓縮在運(yùn)行時(shí)不會(huì)在該層中觸發(fā),從而減少在線開(kāi)銷(xiāo);在線部分的系統(tǒng)概述如圖4所示,將根據(jù)特定層的輸出特性映射,在運(yùn)行時(shí)決定哪些激活值需要進(jìn)行動(dòng)態(tài)修剪,對(duì)于不同的輸入數(shù)據(jù),選擇是不同的,當(dāng)為l層觸發(fā)在線部分時(shí),這意味著RAM不能保存來(lái)自l層的完整輸出特征映射。因此,在RAM中保留一個(gè)很小的緩沖區(qū),占用很小的空間,以逐步處理輸出特征映射,在推斷操作之后,計(jì)算出的Y′l中的激活值將首先發(fā)送到小緩沖區(qū),當(dāng)小緩沖區(qū)滿時(shí),將通知MCU以執(zhí)行運(yùn)行時(shí)間內(nèi)壓縮的在線部分代碼,該程序?qū)Q定k為緩沖區(qū)中的特定數(shù)據(jù)進(jìn)行修剪的最小激活值數(shù),本研究介紹一個(gè)具有閾值的機(jī)制和一個(gè)名為top_k 緩存的小空間,以在運(yùn)行時(shí)調(diào)整k,以跟蹤緩沖區(qū)中的數(shù)據(jù)之間的最小k激活值,然后,至少將這些k值修剪,并且僅在輸出特征映射的空間中保存激活值的剩余部分。此外,還有一個(gè)與修剪輸出功能映射Yl相關(guān)的位圖,它使用1位來(lái)指示相應(yīng)的激活值是否在Yl中修剪。當(dāng)MCU訪問(wèn)下一層l+1的輸入特征映射時(shí),它將首先查詢位圖,并使用Zero表示其位被設(shè)置為一個(gè)用于以下推理操作的激活值,否則,它將采用在Yl中保存的原始值,通過(guò)引入微小的緩沖區(qū)并考慮本研究算法的離線部分中的所有發(fā)生的內(nèi)存開(kāi)銷(xiāo)。運(yùn)行時(shí)WM壓縮,可以保證具有超大工作內(nèi)存器的DNN,可以適合RAM并在目標(biāo)MCU上成功運(yùn)行。
圖4 運(yùn)行時(shí)WM壓縮的系統(tǒng)概述Fig.4 Overview of run-time WM compression system
運(yùn)行時(shí)WM壓縮離線部分的目的是以一個(gè)在線修剪陣列Dp作為輸出,決定DNN中每一層對(duì)應(yīng)的輸出特征映射中需要修剪的激活值大小,由于這個(gè)過(guò)程是在DNN部署到MCU之前完成的,因此它是離線的,從而減少了在線開(kāi)銷(xiāo)。在WM壓縮中,只需要考慮用于壓縮的卷積層,對(duì)于池化層,它用于對(duì)卷積層的輸出Y進(jìn)行下行采樣,如果Y可以裝入RAM中,那么下行采樣的特征圖也必須能夠裝入RAM中,對(duì)于全連通(FC)層,其輸出的尺寸要比卷積層小得多,因此,F(xiàn)C層的內(nèi)存需求幾乎不可能超過(guò)RAM大小。
算法1離線部分壓縮的計(jì)算過(guò)程:
輸入:原始DNN,M與N卷積層,輸出閾值α,RAM大小Sr,微小緩沖區(qū)大小Sb,位寬bw的一個(gè)激活值;
輸出:在線修剪陣列Dp
1.S′in←GetInSize(M);
2.Sout←GetOutSize (M);
3.S′out←Sout;
4. forl=1,…,Ndo
5.Sbm←(Sout[l])/bw;
6.S′out[l]←S′out[l]+Sbm;
7.Swm←S′in[l]+S′out[l],
8.dem←1-2*(Sb/Sout[l]);
9.p←False;
10. IfS′out>α*Srthen
11.p←True;
12. ifS′in[l ]+Sb≥(1-α)*Srthen
13.num←S′in[L]+S′out[l]+Sb-Sr;
14. Else
15.num←S′out[l]-α*Sr;
16. End
17. Else ifSwm>Srthen
18.p←True;
19.num←S′in[l]+S′out[l]+Sb-Sr;
20. Else
21.num← 0;
22. End
24. Ifpthen
25.S′out[l]←S′out[l]-Dp[l];
26. if there is a pooling layer after layerlthen
27.Spool←GetPoolSize (M,l);
28.S′in[l+1]←min{S′out[l],Spool};
29. else
30.S′in[l+1]←S′out[l];
31. End
32. End
33. End
輸入,將RAM大小Sr和微小緩沖區(qū)大小Sb都轉(zhuǎn)換為它們可以容納的激活值的數(shù)量。輸出在線修剪陣列Dp。在算法1的語(yǔ)句中,函數(shù)GetInSize(M)返回一個(gè)包含DNN每個(gè)卷積層輸入特征映射中激活值個(gè)數(shù)的數(shù)組,函數(shù)GetOutSize(M)返回一個(gè)包含每個(gè)卷積層輸出特征映射中激活值個(gè)數(shù)的數(shù)組,Dp的決策過(guò)程通過(guò)N卷積層迭代,對(duì)于特定的層l,輸出特性映射有兩個(gè)約束,在不同的情況下只有一個(gè)約束會(huì)成為瓶頸,第一個(gè)約束是RAM大小的硬約束Sr,當(dāng)l層的內(nèi)存需求超過(guò)Sr時(shí),根據(jù)圖4所示的內(nèi)存布局,硬約束可以表述為
(5)
(6)
(7)
式中:Spool是卷積層l之后的池化層輸出的大小,由函數(shù)GetPoolSize(M,l)返回,經(jīng)過(guò)N迭代,得到的Dp是算法1的輸出,將作為運(yùn)行時(shí)WM壓縮在線部分的輸入之一。
算法2詳細(xì)介紹了針對(duì)特定輸入數(shù)據(jù)Xl的運(yùn)行時(shí)WM在線壓縮部分的步驟,這一部分的目的是根據(jù)特定層l的輸出特性映射來(lái)決定動(dòng)態(tài)修剪哪些激活值。
算法2運(yùn)行時(shí)WM壓縮的在線部分
輸入:輸入數(shù)據(jù)Xl,在線修剪數(shù)組Dp,修剪閾值τ,微小緩沖區(qū)大小Sb,位圖BM初始化為0;
輸出:預(yù)測(cè)Y
1.Pcur← 0;
2.Sout←GetOutSize (M);
3. Forl=1…Ndo
4. IfDp[l]>0 then
5.T←[Sout[l]/Sb];
6.Pb←[Dp[l]/T];
7.B←Sb;
8. Fori=1,…,Tdo
9.Pb←Dp[l]-Pcur;
10.B←Sout[l] modSb;
11. End
12.s,e←(i-1)*Sb,min {i*Sb,Sout[l]};
13.Yb←Conv(Xl,M,l,s,e);
14.Kid,K←Sort(Yb[0,Pb]);
15.C0←0;
16. forj=1,…,Bdo
17. TopKAdd (Kid,K,Yb[j],j);
18. ifYb[j]<τthen
19. SetBitmap(BM,i*(Sb-1)+j);
20.Yb[j]←0;
21.C0←C0+1;
22. End
23. End
24. ifC0>Pbthen
25.Pcur←Pcur+C0;
26.Pb←[(Dp[l]-Pcur)/(T-i)]
27. Else
28. fork∈Kiddo
29. SetBitmap (BM,i*(Sb-1)+k);
30.Yb[i]←0;
31. End
32.Pcur←Pcur+Pb;
33. End
34.Yl[s:e]←Yb;
35. End
36. Else
37.Yl←Conv(Xl,M,l,0,Sout[l]);
38. End
39. if there is a pooling layer after layerlthen
40.Yl←Pool(Yl,M,l);
41. End
42.Xl+1←Yl;
43. End
44.Y←FC(XN+1,M);
通過(guò)上述步驟,如果激活閾值修剪的比預(yù)設(shè)多,則可以減少Pb下行批次。因此,可以在以下批次中保留更重要的特征,從而減少準(zhǔn)確性的損失。否則,程序?qū)h除頂部K緩存中記錄的所有激活值,并將位圖BM中的對(duì)應(yīng)位設(shè)置為1,然后,批處理中修剪后的值Yb將被移動(dòng)到壓縮輸出特征映射Yl的空間中相應(yīng)的位置,當(dāng)所有的批處理完成后,運(yùn)行時(shí)WM壓縮卷積層l就完成了。如果有一個(gè)接一個(gè)的池化層l,Yl將通過(guò)函數(shù)池Pool(Yl,M,l)進(jìn)行下行采樣,下一層(l+1)的輸入為X(l+1)。
最后,使用本研究的壓縮方法對(duì)N卷積層進(jìn)行處理,生成的特性XN+1將是部署的DNN中剩余的完全連接層的輸入,通過(guò)函數(shù)FC(XN+1,M)計(jì)算最終的預(yù)測(cè)Y。
在CIFAR-10[9]上提出的運(yùn)行時(shí)工作內(nèi)存壓縮的實(shí)驗(yàn)結(jié)果表明,本算法可以有效地減少給定DNN的工作內(nèi)存,其精度高于原始DNN,且精度損失可以接受,此外,該方法壓縮后的DNN的精度也比靜態(tài)結(jié)構(gòu)修剪壓縮后的DNN有較大的提高,且對(duì)算法中的2個(gè)超參數(shù),即微小緩沖區(qū)大小Sb和τ進(jìn)行了敏感性分析,探討它們對(duì)算法性能的影響。
使用CIFAR-10數(shù)據(jù)集,其包含10個(gè)類(lèi)別的60 000張圖像。實(shí)驗(yàn)中,訓(xùn)練集為45 000,驗(yàn)證集為5 000,測(cè)試集為10 000,對(duì)圖像進(jìn)行預(yù)處理的方法是均值減法和標(biāo)準(zhǔn)差除法,實(shí)驗(yàn)評(píng)估的DNN分別為L(zhǎng)eNet-A、SpArSe-Net-A和SonicNet-A三種適用于資源受限MCU的輕量級(jí)DNN的適配版本,分別為L(zhǎng)eNet[18]、SpArSeNet[12]和SonicNet[4],這些DNN的詳細(xì)信息見(jiàn)表2。
表2 評(píng)估DNN的配置Tab.2 Evaluation of the DNN configuration
評(píng)估DNN的所有卷積層都使用步距等于1的有效填充,池位置是池化層位置的列表,即卷積層的索引緊隨池化層,全連通(FC)配置提供每個(gè)完全連接層的輸出功能的大小,該大小在一系列卷積層和池化層之后。例如:LeNet-A具有兩個(gè)卷積層,都有5×5個(gè)內(nèi)核,第一層有6個(gè)濾波器,而第二層有32個(gè)濾波器,緊隨其后的是池化層。要注意的是,只有LeNet-A的第二個(gè)合并層是全局平均合并,評(píng)估的DNN的其他池化層默認(rèn)為最大池化,LeNet-A在所有卷積和池化層之后具有3個(gè)完全連接的層,其輸出特征為120、84、10,而且,這3個(gè)DNN的權(quán)重和激活值都被量化為1個(gè)字節(jié)。
靜態(tài)結(jié)構(gòu)化修剪和量化還可以有效減少資源受限的MCU上DNN的工作內(nèi)存,由于已經(jīng)在實(shí)驗(yàn)中將DNN量化為1 B,因此只有靜態(tài)結(jié)構(gòu)化修剪才能進(jìn)一步減少工作內(nèi)存。以文獻(xiàn)[6]的方法作為基線,修剪的層是手動(dòng)確定的,因?yàn)樗鼈兊墓ぷ髂繕?biāo)是減少計(jì)算成本,并且在它們的工作中沒(méi)有內(nèi)存約束。但是在本研究的實(shí)現(xiàn)中,當(dāng)內(nèi)存需求超過(guò)RAM大小時(shí),將觸發(fā)修剪,輸出閾值α。α是運(yùn)行時(shí)工作內(nèi)存壓縮中的預(yù)定義參數(shù)。實(shí)驗(yàn)中,對(duì)于LeNet-A,SpArSeNet-A和SonicNet-A,分別將α設(shè)置為0.8、0.5和0.8。
表3顯示了對(duì)使用本研究建議的運(yùn)行時(shí)工作內(nèi)存壓縮(RTWMC,屬動(dòng)態(tài)修剪)的3個(gè)DNN評(píng)估實(shí)驗(yàn)結(jié)果,并將其與基線(即靜態(tài)結(jié)構(gòu)化修剪(SSP))進(jìn)行了比較,顯示目標(biāo)MCU的基本內(nèi)存配置以及存儲(chǔ)大小和RAM大小,量化之后,所有3個(gè)DNN都可以放入目標(biāo)MCU的存儲(chǔ)中,而它們的工作內(nèi)存仍超過(guò)相應(yīng)的RAM大小。
表3 3個(gè)DNN的運(yùn)行時(shí)工作內(nèi)存壓縮評(píng)估Tab.3 Evaluation of the run-time working memory compression of three DNN
因此,要在目標(biāo)物聯(lián)網(wǎng)MCU上運(yùn)行,必須修剪中間功能圖,表3中,原始精度表示未經(jīng)修剪的DNN的準(zhǔn)確性,而修剪后的精度表示修剪后的準(zhǔn)確性,根據(jù)表3,對(duì)于LeNet-A和SonicNet-A,使用本研究提出的方法(即RTWMC)進(jìn)行修剪后的精度分別比原始精度高0.62%和2.30%,這可能是由于本研究的修剪方法提供了正則化功能,可以提高原始DNN的泛化能力。此外,在LeNet-A和SonicNet-A上的方法的準(zhǔn)確性分別比基線(即SSP)的準(zhǔn)確性高18.58%和14.87%;對(duì)于SpArSeNet-A,該修剪方法會(huì)導(dǎo)致3.61%的精度損失,而基線的精度損失為7.59%。其原因是SpArSeNet-A采取的是粗粒度靜態(tài)結(jié)構(gòu)化修剪(在應(yīng)用時(shí),盡量避免使用此種方法),LeNet-A和SonicNet-A采取的是細(xì)粒度靜態(tài)結(jié)構(gòu)化修剪,但損失的精度很少,本研究方法的準(zhǔn)確性還是比基準(zhǔn)高出3.98%,表明該方法可以盡可能減少修剪造成的精度損失。RTWMC的主要開(kāi)銷(xiāo)是內(nèi)存開(kāi)銷(xiāo)和運(yùn)行時(shí)延遲,對(duì)于SSP,RAM的所有空間都用于存儲(chǔ)中間功能,而對(duì)于RTWMC,其中的一些空間則保留給微小的緩沖區(qū)和TopK高速緩存,如圖2所示,但是總的內(nèi)存開(kāi)銷(xiāo)是相對(duì)的較小,分別為0.02、0.09和0.07 kB,與相應(yīng)的RAM大小相比,可以忽略不計(jì)。此外,如表3所示,具有這些內(nèi)存開(kāi)銷(xiāo)的RTWMC的準(zhǔn)確性仍遠(yuǎn)高于SSP的準(zhǔn)確性。本研究還估計(jì)了RTWMC的運(yùn)行時(shí)延遲,以RTWMC延遲的比率的形式表示與不修剪而運(yùn)行DNN的情況相同,該比率分別為1.08倍、1.26倍和1.17倍,對(duì)于在MCU上運(yùn)行DNN而言適中。因此,可以說(shuō)本研究的RTWMC是輕量級(jí)的,可以在資源受限的MCU上部署DNN。
3.3.1 修剪閾值敏感性分析
當(dāng)緩沖區(qū)大小Sb固定時(shí),修剪閾值對(duì)RTWMC修剪的DNN top1準(zhǔn)確率的影響如圖5所示。top1的含義:在數(shù)據(jù)集中,有幾百或幾千種類(lèi)別,top1是第一種類(lèi)別的精度或錯(cuò)誤率。LeNet-A、SpArSeNet-A和SonicNet-A緩沖區(qū)大小分別為70、30和90 bit,當(dāng)修剪閾值為0時(shí),每個(gè)輸出特征映射被同等修剪,這意味著每個(gè)特征映射被修剪的激活值是相同的,而且已經(jīng)達(dá)到了相對(duì)較高的精度。LeNet-A和SonicNet-A分別比基線高18.32%和14.59%,SpArSeNet-A只比基線低0.78%。這一結(jié)果顯示了細(xì)粒度動(dòng)態(tài)非結(jié)構(gòu)化修剪相對(duì)于粗粒度靜態(tài)結(jié)構(gòu)化修剪的優(yōu)勢(shì),適當(dāng)?shù)男藜糸撝悼梢赃M(jìn)一步提高準(zhǔn)確率。LeNet-A、SpArSeNet-A和SonicNet-A的top1精度分別為60.00%、71.46%和71.00%,表現(xiàn)都遠(yuǎn)遠(yuǎn)超過(guò)了基線。此外,當(dāng)閾值較大時(shí)(實(shí)驗(yàn)閾值為10),評(píng)估的DNN的準(zhǔn)確率顯著下降,3個(gè)DNN的準(zhǔn)確率都小于25%,LeNet-A、SpArSeNet-A和SonicNet-A的對(duì)應(yīng)精度分別為20.28%、11.22%和17.31%。在這種情況下,前幾個(gè)輸出特征映射幾乎被完全刪除,從而大大降低了推理的準(zhǔn)確性。這種情況非常類(lèi)似于在運(yùn)行時(shí)應(yīng)用結(jié)構(gòu)化修剪,沒(méi)有機(jī)會(huì)重新訓(xùn)練權(quán)重的情況,因此,這個(gè)結(jié)果可能暗示了細(xì)粒度動(dòng)態(tài)非結(jié)構(gòu)化修剪相對(duì)于樸素的粗粒度動(dòng)態(tài)結(jié)構(gòu)化修剪的優(yōu)勢(shì)。
圖5 基于不同修剪閾值的運(yùn)行時(shí)工作內(nèi)存壓縮在3個(gè)評(píng)估DNN上的top1精度
3.3.2 緩沖區(qū)大小Sb的敏感性分析
當(dāng)修剪閾值固定時(shí),緩沖區(qū)大小Sb對(duì)RTWMC修剪的DNN top1準(zhǔn)確率的影響,如圖6所示。LeNet-A、SpArSeNet-A和SonicNet-A修剪閾值分別為0.3、0.3和0.1,由于無(wú)法將完整的輸出特征映射放入RAM中,因此無(wú)法根據(jù)特征映射的全局信息執(zhí)行修剪。在RTWMC中,修剪是以緩沖區(qū)大小為單位進(jìn)行的,如果緩沖區(qū)太小,則只根據(jù)少量激活值的信息來(lái)決定是否進(jìn)行修剪,這可能會(huì)導(dǎo)致次優(yōu)的解決方案。更大的緩沖區(qū)大小有助于做出更明智的修剪決策,但是,如果緩沖區(qū)太大,內(nèi)存開(kāi)銷(xiāo)和運(yùn)行時(shí)延將會(huì)增加,這會(huì)導(dǎo)致需要修剪的激活值總數(shù)更大,運(yùn)行時(shí)延遲更長(zhǎng)。因此,需要選擇一個(gè)合適的緩沖區(qū)大小,以獲得最佳性能,top1精度是60.04%、72.01%和71.11%。LeNet-A、 SpArSeNet-A和SonicNet-A達(dá)到的緩沖區(qū)大小分別為10、40和30 B,當(dāng)精度達(dá)到最佳時(shí),圖6中3條曲線的趨勢(shì)趨于穩(wěn)定,精度變化不大,這意味著較大的緩沖區(qū)大小所帶來(lái)的正面和負(fù)面影響達(dá)到了微妙的平衡。因此,增加緩沖區(qū)大小并不是提高準(zhǔn)確性的必要條件,本研究可以得出結(jié)論,對(duì)于RTWMC,可以在相對(duì)較小的緩沖區(qū)大小下獲得最佳性能,這證明了本研究中提到的較小的內(nèi)存開(kāi)銷(xiāo)和適度的運(yùn)行時(shí)開(kāi)銷(xiāo)是合理的。
圖6 在3個(gè)評(píng)估的DNN上使用不同Sb運(yùn)行時(shí)工作內(nèi)存壓縮的top1精度
為了使深度壓縮神經(jīng)網(wǎng)絡(luò)(DNN)能夠部署在物聯(lián)網(wǎng)資源受限的微處理器(MCU)上,當(dāng)它們的工作內(nèi)存超過(guò)RAM大小時(shí),提出了一個(gè)輕量級(jí)的運(yùn)行時(shí)工作內(nèi)存壓縮來(lái)動(dòng)態(tài)修剪中間輸出特性映射上的激活值,這樣工作內(nèi)存的大小就會(huì)減少到比RAM小的大小。實(shí)驗(yàn)結(jié)果表明,壓縮后的DNN在不增加內(nèi)存開(kāi)銷(xiāo)和運(yùn)行時(shí)延遲的情況下,可以保持原有精度,但運(yùn)行時(shí)精度損失不大。