曹渠成,陳慶奎
(上海理工大學 光電信息與計算機工程學院,上海 200093)
自從AlexNet[2]在2012年的ImageNet上奪冠后,在計算機圖像識別領域,構建卷積神經網絡模型來解決相關問題已經變得越來越普遍.人們在追求精度的同時使得神經網絡變得越來越龐大,甚者已經達到了上百處理層和上千輸出通道的規模[4],因此計算量也上升到了近上百億次的浮點運算,導致在對計算設備性能愈加嚴苛的同時加重了其計算負載.
目前深度神經網絡模型的運行方式有兩種:一種是采用C/S架構也就是前端設備采集到圖片后將其傳送給服務器交給服務器來處理,在面對大規模設備和高頻率上傳圖像的情況下會給服務端造成很大的負載壓力;另一種方式得益于近年來出現的輕量化模型,這些模型的主要思路是減輕CNN在卷積層的運算量[17],比如將普通卷積拆分為逐通道卷積和逐點卷積的Xception網絡[5],使用逐點卷積和分組卷積的ResNetXt網絡[3],以及在這兩者基礎上引入通道重排的ShuffleNet[6],然而雖然這些網絡使得嵌入式設備在本地運行深度學習模型成為可能,但是對于有實時性需求的操作模型運行完的時間不可控,而低廉的嵌入式設備即使使用了這些方法仍然面臨能否完成任務的考驗,其次在不改變結構的情況下想要完全移植已經存在的深度神經網絡到嵌入式設備的可行性又很低.
本文考慮在類似大規模公交車中實時車廂的人流判斷調度,以及大面積公園危險情況預警的場景中都需要運用到大規模廉價嵌入式設備進行監控和圖像采集.如果采用方式一,會造成服務端的大量負擔;如果采用方式二,因為在這些場景中的采集設備大都廉價可能會面臨無法運行完整個過程而宕機或者因為計算過程太長超出了下次采集時間,失去了重要信息.為了能夠減輕服務端的負載,同時在兩次采樣中的空閑時間中發揮前端嵌入式移動設備的計算能力.本文通過Roofline模型[1]根據硬件平臺本身的性能進行深度神經網絡運算時間的粗粒度估計判斷該平臺是否能完成整個模型的計算工作以及計算在可達范圍內運行到每層的大致時間.接著通過本文提出的縮小式窗口計算進行細粒度驗證,得到每一層的實際運算時間,使用這些信息引入計算過程分離思想,根據所期望的時間將一部分的工作量交給前端嵌入式設備使其在空閑時間中完成,將另一部分工作量交給服務端完成可有效減少其負載.
Roofline模型是由伯克利大學的并行計算實驗室提出一種計算模型所要花費的運行時間的估算模型[1],它指出一個計算模型主要受到計算平臺硬件性能兩方面的制約:
1)計算平臺的峰值計算能力π(單位:FLOP/s),它表示該計算平臺在單位時間內能完成的浮點數峰值計算次數;
2)計算平臺的峰值內存帶寬β(單位:Byte/s),它表示計算平臺的內存在單位時間內能完成的峰值數據傳輸容量[7].
在運用Roofline模型前還需要對使用的計算模型進行定量分析,得到幾個關鍵量:
1)計算模型的總體計算量F(單位:FLOPS),表示對于一次輸入計算模型需要的浮點算術的總次數,可以認為是模型的時間復雜度.
2)計算模型所用的訪存量M(單位:Bytes):對于一次輸入計算模型在內存中訪問的內存大小,可以認為是模型的空間復雜度.
3)計算模型的計算強度I(單位:FLOP/Byte):計算量與訪存量之比[7].


圖1 Roofline 模型圖Fig.1 Roofline model diagram
圖1中的縱坐標P(FLOP/s)代表著計算模型的峰值性能,即計算平臺所能達到的每秒浮點運算的極限次數.
根據圖1得到Roofline模型的數學表達式如公式(1)所示.
P=min(π,β×I)
(1)
Roofline模型可以告訴我們在理想條件下計算模型所能達到的最好性能.但是計算模型還會受到源代碼復雜度,使用的編譯器類型以及運行代碼的體系結構和微體系結構的復雜交互的影響.這些因素也導致計算模型不能達到最好的性能[7].所以本文在對深度神經網絡做分離時先使用Roofline模型進行粗粒度的估計找到在空閑時間下能完成的計算層數進行第一次分層,接著在此基礎上引入縮小式窗口計算通過實際運行方式得到每一層運行的精確時間,再在此基礎上進行第二次的細粒度分層,達到預期目標.
Protocol Buffer是由google公司提出的一種開源跨語言跨平臺的高效結構化數據編碼框架[9],采用二進制編碼格式,即使在不同平臺上也能進行互相通信交互.并且由于采用了特殊設計的編解碼格式,對數據的序列化和反序列化操作效率較高,同時得益于其所采用的獨特的編碼機制,它能夠實現數據的壓縮和傳輸[12].
本文主要以卷積神經網絡為例,所以著重分析CNN模型的計算量和訪存量給出相應的歸納公式.
本文所使用的嵌入式設備的結構如圖2所示.

圖2 嵌入式設備計算結構Fig.2 Embedded device computing structure
該系統采用Cortext-A53架構CPU,該CPU實現了ARMv8-A 64位指令集,內核信息也在圖中給出.該架構的主要優勢在于基于順序執行的簡單8級流水線與復雜流水線的微架構相比,一條指令穿越一個簡單的流水線需要更少的寄存器,取指、譯碼、發射、執行和寫回結果需要翻轉的邏輯更少.因此,簡單的流水線消耗更小的面積和更少的功耗.同時具有高可擴展性,可針對移動SoC和可擴展企業系統進行配置和物理優化實現.其低功耗,可定制,廉價這些特性非常適合本文的監控設備場景.
其他的主要外圍設備有圖片采集的CAMERA,存儲模型的FLASH,用來加載模型提高速度的LPDDR2 1G內存,以及傳輸結果的LAN9514網卡和BLT天線.
因為CNN的計算量主要集中在卷積層,所以本文以單個卷積層為例進行分析[16],其他例如池化激活分析方法也類似不做贅述,如圖3所示.

圖3 單個卷積層分析圖Fig.3 Single convolutional layer analysis
其中Dini是輸入核的邊長,Mini是輸入核的深度;圖中第二部分為卷積核它與輸入核進行浮點運算,Dki是卷積核的邊長,Cini是輸入通道,有Mini=Cini,Couti是卷積核的輸出通道個數;最后得到第三部分的輸出,同樣的Douti為輸出核的邊長,Mouti是輸出核的深度,有Couti=Mouti.根據卷積運算易得公式(2):
單層卷積的計算量(公式(2),TCi為i層操作的計算量)
(2)
訪存量主要與參數有關根據圖3易得公式(3):
單層卷積的訪存量(公式(3),SCi為i層的訪存量)
(3)
模型整體的計算量TCtotal和訪存量SCtotal如公式(4)和公式(5)所示:
(4)
(5)
使用分析方法和Roofline模型結合我們就可以預估出計算模型到達某一層所花費的理論最短時間.
但是正如前面所提到的Roofline得到的時間是理論上運行的最短時間,實際上很多情況下都不能到達這一時間,這樣會導致與我們預期效果有很大的差距.要知道每一層運算時間的最好的辦法仍然是讓模型全部跑一遍記錄下每層運行時間再做分配,但是如果模型很大有上百層的操作,廉價低性能的嵌入式設備很可能無法走完整個程序而宕機,同時最后得到的時間也不可預計.所以本文提出了一種縮小式窗口計算的后續過程,本文在保留Roofline模型同時加入縮小式窗口計算,使用Roofline模型進行一個粗粒度的估計找到一個接近期望時間T的層數i.我們要“悲觀”地認為這一層不是我們要找的,因為它實際花費的時間要比計算出來的多,但通過理論計算后的它是在一個可控過程中,要找到期望時間T還需要在i層之前去找,而i層之前每層所用的時間我們就可以用實際運行時間記錄下來,根據實際計算結果進行第二次分層,就像一個窗口不斷地縮小即縮小式窗口計算.具體執行流程如圖5所示.

圖4 使用Roofline計算出到達某一層理論最短時間Fig.4 Use Roofline to calculate the shortest time to reach a certain layer theory
在第(i)步得到Layer.info記錄的深度神經網絡每層信息的配置文件并分析層數及計算量和訪存量.
在第(ii)步對于期望時間T1,使用Roofline找到大致層數,計算得到運行到第i層時所花費的時間為T.
在第(iii)步考慮到實際情況會比預想的悲觀,所以運行模型至第i層,得到運行到每層所花費實際時間.
第(iv)步發現在實際運行中t3>T,而t2 如果期望的時間發生變化為T′時,若T′ 當T′>T1時則跳轉第(vi)步直接讀取LayerTime.info并返回到Roofline分析步驟(ii)進行新一輪的分析. 上述的預測分配方法發生在發布前的生產環境中或是設備剛啟動時,因為通過配置文件保留結果.設備工作前只需要讀取配置文件就可以加載對應模型參數,如果時間需求發生變化調整,一般來說只要前期規劃好很少會有需求頻繁變化,在該情況下設備重啟需重新加載模型參數進行調整,所以在工作狀態時不需要考慮該預測方法帶來的時間影響. 我們給出分層過程的偽代碼: Separation算法: 1:IF LayerTime.info is not null THEN Read oldtimeTfrom LayerTime.info ELSE T=0 2:Input new excepted timeT′ 3:IFT′ Separate the layer using former info ELSE Read Each Layer info from Layer.info 4:Compute each Layer′sTCiandSCi 5:Apply the Roofline model to estimate each Layer′s minimum execution timeti 6.Find theticlose to the excepted timeT′ 7.Using reduced window calculation and write each layer′s Actual time to LayerTime.info 8.Separate the layer 我們可以很確切地知道經過分層的方法,能夠大幅度減少最后交給服務端的計算任務.假設最后嵌入式設備分得的層數為k,那么在服務端能減少的計算量開銷,訪存量開銷如公式(6)、公式(7)所示: (6) (7) (8) 圖5 完整的分層過程Fig.5 Complete layering process 無論從實際還是從數學公式上考慮,我們都可以看到,將一部分神經網絡的工作合理地分配到前端嵌入式設備上可以明顯減少傳統方式中服務端所要面臨的工作負載過大的問題. 采用Roofline和縮小式窗口計算對神經網絡分層后,整個預測過程如圖6所示. 圖6 經過分層策略后計算模型的運行圖Fig.6 Run the graph of the model after the stratification strategy 可以看到,我們系統中有一部分是傳輸流量的開銷,對于傳統的由攝像頭采集圖像發送到服務端進行預測,它發送的是圖片.而現在攝像頭的CPU也可以利用空閑時間做一些預處理的工作而預處理后發送的數據則是包含矩陣數據的文件. 通常情況下發送的數據我們會采用JSON[14]格式或者XML[13]格式定義下的字符流文件,但是在這一過程中我們仍然發現傳輸流量方面的開銷很大,雖然采用字符流的方式傳輸的是人能看懂的格式,但是服務端還要花費一部分時間去做解析,顯然不是最佳方案.本文從Protocol Buffer[8]中得到啟發,基于二進制傳輸文件,優勢在于體積更小,數據在傳輸過程中更快,同樣因為是二進制只要制定好了規則在服務端解析同樣很快.圖7、圖8,展示了基于字符流和二進制文件的內容差異. 圖7 經過二進制編碼的文件內容Fig.7 Binary encoded file content 圖8 字符流發送的文件內容Fig.8 File content sent by character stream 輸出的矩陣規模與二進制文件的大小關系如公式(9)所示,其中S為矩陣中一個值占用的大小,R為保存矩陣規則所占用的大小,兩者都為常量,在本文中S取值為4Bytes,R取值為128Bytes. (9) 如果圖片的原始大小為OriginSize,那么理論上采用發送二進制文件的方式可以減少的大小為: (10) 從上述論述中我們容易知道,只要確定了每層的輸出結構即輸出的矩陣大小,那么其發送的文件大小也是固定的.而OriginSize卻在很大程度上因為采集攝像頭的清晰度不一致,圖像包含的信息不同其大小也會略有變化.所以只有當OriginSize>BinarySizei時才會體現減少傳輸大小的作用,也就是說在面臨數據規模越大采集圖像信息越豐富和清晰的時候Savei的值才會越大采用此方法進行傳輸也就更有優勢,當面對規模小較小畫質內容較為模糊和稀少的情況下就需要在計算量和傳輸量方面進行取舍.本文也在后續實驗中進行了比較. 在前端大規模攝像頭設備采集到圖片完成所分到的計算任務后交由服務端處理的協同處理流程如圖9所示. 圖9 協同處理機制流程圖Fig.9 Collaborative processing mechanism flow chart 在采集組部分,考慮到在相同時間T的約束下,由于前端設備的異構性所能達到的計算層數也不同.本文采用傳感器分組的方式由計算層數分為不同組. 不同組的發送數據的目標端口也不同,這樣做的好處是接收數據時不需要解析包里面的內容,根據接收端口就可知設備所屬組如表1所示. 表1 前端攝像設備分組表Table 1 Device grouping table 在消息服務部分,使用是面向通道進行IO操作的NIO(New IO),即非阻塞,當一個通道無數據可讀,可切換通道處理其他IO.對于已經發送到緩沖區的數據包,可以開辟一個線程池根據訪問量動態增加或者減少線程數量.每個線程的工作就是將數據包轉移到消息隊列中等待模型的計算操作. 圖10 隊列發布機制Fig.10 Queue publishing mechanism 為了解決異構數據問題,同時提高利用率,本文將不同組的數據存放到不同的消息隊列中,同時設定容量閾值QN和時間閾值QT,如圖10所示.在計算服務和多個消息隊列之間有一個Selector選擇器充當訂閱者,當隊列包含的數據量Cap(Queue)=QN時,或者距離上次發布內容到Selector的時間Ot(Queue)>QT時將內容分發到Selector中. 如果此時的計算服務正在運行,則選擇器選擇等待.當計算服務完成當前任務后,從選擇器中選出最先到達的任務,沒有任務則進入空閑狀態.如果發布到選擇器時計算服務本身就處于空閑狀態,則由選擇器充當發布者將任務發布給計算服務.計算服務根據Selector中的標志位置命中要從哪一層開始計算作業. 本次實驗使用的硬件環境如下:服務端的CPU是Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz,內存大小為32G 2400MHZ,GPU是GTX1080,顯存大小為8G.前端嵌入式設備為樹莓派3B,它的CPU為ARM CortexA53架構,內存為LPDDR2 1G. 開發環境為:服務端使用的是TensorFlow 1.3.0,樹莓派使用的是樹莓派版的TensorFlow 1.7.0,IDE均為Sublime Text 3.0. 計算模型采用最典型的CNN網絡LeNet-5[10]使用MNIST數據集完成手寫數字識別,它的計算模型如圖11所示. 圖11 LeNet-5計算模型Fig.11 LeNet-5 computing model 它的計算分析如表2所示. 表2 LeNet-5計算量和訪存量分析Table 2 LeNet-5 calculation and memory analysis 分析分層后傳輸數據文件過程中所要花費的流量大小比較,一次處理的圖片量為10張.由圖12可知傳輸二進制文件的方案明顯優于字符文件的方案.同時由于在CNN網絡中每一層輸出的矩陣大小是固定的,所以傳輸流量大小也恒定,而傳輸文件的方式是否較之傳輸圖片的方式更加節省資源取決 圖12 傳輸流量比較Fig.12 Transmission traffic comparison 于攝像頭得到圖片的大小,對于清晰度較小的圖片(小于BinarySize)采用分層可能在前幾次的傳輸流量上比直接傳圖會稍大如實驗采取的極端情況10張圖片總大小僅為2k,而對于清晰度較高的圖片(大于BinarySize)這種分層方式則非常有效地減少了這方面的流量問題,本文采用常見攝像頭采集的10張總大小為3600K的圖像,發現對該模型來說只是采用二進制文件在第一層就可以減少達到72%的大小,隨著層數的深入,大小最多可以減少到98%,而傳輸時間也與流量大小表現出正相關性,由圖13可知其時間最大也提升了93%.可以說在絕大部分環境下也極大提升了傳輸效率. 圖13 傳輸時間比較Fig.13 Transmission time comparsion 輸入預期時間T,使用本文Roofline和縮小式窗口計算,對計算模型進行分層,得到具體層和嵌入式設備執行到該層的花費時間如表3所示.為了使效果更明顯使用了500張MNIST數據集圖片進行驗證. 表3 使用分層模型進行分層結果Table 3 Hierarchical results using a layered model 可以看到對于預期時間T我們總能找到滿足在該時間內完成的最大層數,證明該預測方式符合本文目標. 我們考察分層后的服務端響應時間(為了增加效果模擬了1000個節點發送來的15000張圖片數據),經過分層后服務端的響應時間也有了顯著的提升,分到最后層對于服務端來說響應速度比起第一層提升了96%.面對大規模多節點的情況下使用分層處理確實能有效加快服務器的處理速度,如圖14所示. 圖14 分層后服務端的響應時間Fig.14 Server response time after layering 定義LOAD=t×u,其中LOAD為GPU工作負載,t為分層后運行時間,u為分層后平均內存占有率.使用LOAD來粗略估計負載情況,顯而易見前端設備分到的層越多,服務端壓力壓力越小,最大可以減少99%,可以有更多的能力空閑完成其他任務,如圖15所示. 圖15 分層后服務端GPU負載情況Fig.15 Server-side GPU load situation after layering 本文實現了在嵌入式設備上運用神經網絡同時提出了一種將深度神經網絡分層的思想,有別于傳統方法中將預測工作全部交給服務端去完成或者都是由本地高性能嵌入式設備來做的方式,將一部分計算工作交由前端廉價嵌入式設備來做,可拓展性高,發揮了前端設備的計算能力并減少了服務端的計算負載.在系統初始化階段通過Roofline與縮小式窗口計算相結合的方式給出了一種較為精確的計算時間預估方法,雖然本文主要是使用了卷積神經網絡做例子,但是只要分析對了計算量和訪存量在面對任何情況下仍然可以使用該預測模型進行預測,具有實際意義. 后續工作上,仍然要完善預測的功能因為隨著環境的改變嵌入式設備出現降頻等情況還需要有實時調整的策略,同時應該從調度問題下再出發,配合出更好的通信機制和協議完善整個系統.

3.4 采用更輕的網絡傳輸方式



3.5 協同處理機制



4 實驗分析
4.1 實驗環境說明


4.2 網絡傳輸優劣比較


4.3 使用分層模型進行驗證

4.4 服務端響應與負載


5 結 語