齊豪 劉少禮 李威③?
(?中國科學(xué)技術(shù)大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院 合肥230026)
(??上海寒武紀(jì)信息科技有限公司 上海201306)
(???中國科學(xué)院計算技術(shù)研究所處理器芯片國家重點實驗室 北京100190)
近年來,深度學(xué)習(xí)技術(shù)在圖像分類[1]、語音識別[2]、自然語言處理[3]、視頻描述生成[4]等多個領(lǐng)域得到廣泛的應(yīng)用并取得巨大的成功,很多經(jīng)典的神經(jīng)網(wǎng)絡(luò)模型被提出,比如AlexNet[5]、VGGNet[6]、ResNet[7]和Inception V3[8]等。這些模型在提升算法精度的同時,其深度和規(guī)模都在不斷增加,其計算量和訪存量也在迅速增加。研究人員從算法優(yōu)化和硬件加速維度提出了多種優(yōu)化方法來解決上述問題,其中算法優(yōu)化包括模型剪枝[9]、參數(shù)量化[10]等,硬件加速結(jié)構(gòu)包括DianNao[11]、DaDianNao[12]等。
移動設(shè)備同時受到算力和功耗的限制,因此針對移動設(shè)備的研究致力于設(shè)計更輕量級的模型,這些模型由較少的層和計算操作組成,比如Xception[13]、MobileNetV1[14]、MobileNetV2[15]、Mobile-NetV3[16]和EfficientNet[17]等。在這些輕量級模型中,深度卷積(depthwise convolution)是一個比較常用的計算操作,比如在Xception 網(wǎng)絡(luò)的所有卷積操作中,深度卷積操作的數(shù)量占50%。因此,如何加速深度卷積的計算是一個值得研究的問題。
深度卷積和傳統(tǒng)卷積的不同之處在于它的輸入通道個數(shù)和輸出通道是相同的,并且是一一對應(yīng)的,輸入通道之間不累加。目前處理深度卷積的通常做法是將數(shù)據(jù)維度設(shè)置為NHWC,其中N表示特征圖的個數(shù),H和W分別表示特征圖的長度和寬度,C是通道數(shù),然后使用單指令多數(shù)據(jù)流(single instruction multiple data,SIMD)指令進(jìn)行處理[18]。這種處理方式存在一個問題,即如何設(shè)計相應(yīng)處理器的運算器長度? 如果運算器的長度太長,對于C較小的深度卷積,運算效率較低,比如MobileNetV3 的深度卷積最小C是16,如果用運算器長度為64 的SIMD處理器計算,運算效率只有25%;如果運算器長度設(shè)置為16,雖然計算效率可以達(dá)到100%,但此時處理器的計算峰值偏低。故一個固定運算器長度的SIMD 處理器不能夠高效地處理各種規(guī)模的深度卷積。
針對這一問題,本文提出了一種軟硬件結(jié)合的方式來優(yōu)化深度卷積的計算。本文關(guān)注于解決各種規(guī)模的深度卷積的優(yōu)化,通過設(shè)計特定的數(shù)據(jù)放置方式和多種數(shù)據(jù)傳輸模式,結(jié)合軟件模式選擇、數(shù)據(jù)拆分等優(yōu)化方式,在提高運算效率的同時減少了訪存量,提升了算法實現(xiàn)性能。本文主要貢獻(xiàn)如下。
(1) 提出一種新型的深度卷積加速器(depthwise convolution accelerator,DCA)結(jié)構(gòu),該加速器設(shè)計多種權(quán)值傳播模式以高效支持各種規(guī)模的深度卷積。
(2) 基于本文設(shè)計的深度卷積加速器,在軟件層面,選擇使用不同的權(quán)值傳輸模式和數(shù)據(jù)拆分方式,充分發(fā)揮出深度卷積加速器的性能。
(3) 實施了DCA 加速器和軟件優(yōu)化,并測試其在不同深度卷積規(guī)模上的實現(xiàn)性能。實驗結(jié)果表明,相比運算器長度為64 的單核SIMD 處理器最大可達(dá)29.3 倍的性能加速。
近年來,神經(jīng)網(wǎng)絡(luò)飛速發(fā)展,計算量和訪存量的迅速增加給計算機(jī)系統(tǒng)帶來了巨大的挑戰(zhàn)。中央處理器(central processing unit,CPU)和圖形處理器(graphics processing unit,GPU)為了保證其通用性,無法以較高的性能功耗比處理神經(jīng)網(wǎng)絡(luò)任務(wù)。因此,神經(jīng)網(wǎng)絡(luò)加速器應(yīng)運而生并得到了迅速的發(fā)展。Chen 等人[11]在2014 年提出了DianNao,DianNao 著重分析了單核深度學(xué)習(xí)處理器片上存儲層次以及訪存子系統(tǒng)的設(shè)計對性能和功耗的影響,專注于片上存儲層次和訪存子系統(tǒng)的優(yōu)化。DaDianNao[12]是一種用于高效處理大規(guī)模深度學(xué)習(xí)算法的多核架構(gòu),并且采用片上eDRAM 提高片上存儲密度,完全避免了片外訪存的開銷。ShiDianNao[19]是為以極低功耗開銷快速處理嵌入式系統(tǒng)中的圖像應(yīng)用而設(shè)計的架構(gòu),它通過將整個卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural networks,CNN)模型保存到片上存儲器內(nèi),并放置到圖像傳感器旁邊,直接接收圖像傳感器的輸入,可以完全消除系統(tǒng)對片外存儲器的訪問。文獻(xiàn)[20]設(shè)計了一款可以支持多種機(jī)器學(xué)習(xí)算法的運算單元,該運算單元實現(xiàn)了低面積、低功耗的需求。文獻(xiàn)[21]提出了一款新型的稀疏神經(jīng)網(wǎng)絡(luò)加速器架構(gòu)。該架構(gòu)能夠有效利用稀疏神經(jīng)網(wǎng)絡(luò)中的權(quán)值稀疏性和神經(jīng)元稀疏性,進(jìn)一步提升加速器處理神經(jīng)網(wǎng)絡(luò)模型時的運算速度。文獻(xiàn)[22]提出了一種軟硬件協(xié)同的方法,有效解決了稀疏神經(jīng)網(wǎng)絡(luò)的稀疏不規(guī)則性問題。MW-DLA[23]是一種支持動態(tài)可配置數(shù)據(jù)寬度的深度學(xué)習(xí)加速器,可支持多種數(shù)據(jù)格式。為了提高神經(jīng)網(wǎng)絡(luò)加速器的靈活性和通用性、提升代碼密度,Liu 等人[24]提出了神經(jīng)網(wǎng)絡(luò)指令集Cambricon。
隨著神經(jīng)網(wǎng)絡(luò)加速器的不斷發(fā)展,許多軟件層面的支持和優(yōu)化被提出來。DLPlib[25]是一個基于深度學(xué)習(xí)處理器的高性能庫,該庫支持主流神經(jīng)網(wǎng)絡(luò)算法的推理操作和一組基本的矩陣和向量操作。ZhuQue[26]定義了神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)的動態(tài)標(biāo)簽和靜態(tài)標(biāo)簽,提出了一種神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)分類方法NNData-Class,實現(xiàn)了基于標(biāo)記數(shù)據(jù)布局的神經(jīng)網(wǎng)絡(luò)開發(fā)套件LDL-NDK,最后抽象出了基于標(biāo)記的神經(jīng)網(wǎng)絡(luò)編程模型。文獻(xiàn)[27]提出了一系列針對神經(jīng)網(wǎng)絡(luò)加速器的編譯優(yōu)化技術(shù),包括圖優(yōu)化、循環(huán)展開和流水線優(yōu)化等。TVM[28]是一種深度學(xué)習(xí)編譯器框架,可以解析各種前端框架的計算圖。它使用Halide[29]中間表示(intermediate representation,IR)表示計算循環(huán)并提供多種級別的優(yōu)化。文獻(xiàn)[18]提出了一種基于ARM 處理器的深度卷積優(yōu)化方案。
上述工作都是針對傳統(tǒng)卷積、矩陣乘和其他機(jī)器學(xué)習(xí)算法等進(jìn)行硬件支持或軟件優(yōu)化的工作,沒有針對深度卷積進(jìn)行深入分析和探討。目前多數(shù)平臺通過使用固定運算長度的SIMD 處理器來實現(xiàn)深度卷積,但是這種方法具有局限性,即固定運算長度的SIMD 處理器對計算C方向很小的深度卷積的效率不高,從而可能會影響最終性能。本文提出的深度卷積加速器能夠有效計算各種規(guī)模的深度卷積算法,并且可根據(jù)硬件的設(shè)計進(jìn)行進(jìn)一步的軟件優(yōu)化。
本節(jié)主要介紹深度卷積的運算和訪存特征,以及在實際神經(jīng)網(wǎng)絡(luò)當(dāng)中的規(guī)模特征。
深度卷積中輸入特征圖的通道數(shù)和輸出特征圖的通道數(shù)是相同的,并且各個輸入特征圖的通道之間不會像傳統(tǒng)卷積算法那樣進(jìn)行累加操作,各個通道獨立運算。如圖1 所示,輸入input、權(quán)重weight及輸出output均為三維向量,其3 個維度分別對應(yīng)高度(h)、寬度(w)及通道(c)。其中,輸入input在3 個維度上的大小是hi×wi×ci;輸出output在3 個維度上的大小是ho × wo × co,其中co和ci是相同的;深度卷積的權(quán)值weight在3 個維度上的大小是ky × kx × ci,其中ky、kx分別表示卷積核在H、W方向的大小。假設(shè)深度卷積在H和W方向的步長stride分別為sy和sx,則深度卷積運算可以形式化地表示為式(1)。
圖1 深度卷積
陳云霽等人[[30]在《智能計算系統(tǒng)》一書中提到神經(jīng)網(wǎng)絡(luò)訪存有兩個重要的特性,分別是可解耦性和可重用性。在加速器的設(shè)計中需要考慮這兩個特性。
深度卷積的乘加運算器(multiply-accumulator,MAC)計算量和訪存量可由式(2)和式(3)得到。對于MobileNetV1、MobileNetV2、MobileNetV3 網(wǎng)絡(luò)中的所有深度卷積規(guī)模,計算量和訪存量的比例平均為3.8∶1。加速器的計算和訪存是可以并行的,因此在設(shè)計深度卷積加速器時要著重考慮算力和訪存帶寬之間的均衡,應(yīng)盡量讓計算時間和訪存時間相等。
MobileNet V1、MobileNet V2、MobileNet V3 中的深度卷積的輸入神經(jīng)元規(guī)模有一個特征,即在網(wǎng)絡(luò)的前幾層,C方向值較小,而HW方向值較大;在網(wǎng)絡(luò)的后幾層,C方向值較大,而HW方向值較小。
網(wǎng)絡(luò)中輸入神經(jīng)元的C方向的大小取值范圍是[16,1024]。C方向最小是16,如果使用一個運算器長度為64 的SIMD 處理器來計算,實際計算效率最多只有25%。如果使用一個運算器長度為16的SIMD 處理器來計算,計算效率雖然可以達(dá)到100%,但此時處理器算力相對較小。所以在設(shè)計加速器時,要選取合適的運算器規(guī)模。
基于上一節(jié)對深度卷積的分析,本節(jié)提出了一個新型的深度卷積加速器架構(gòu),稱之為DCA(depthwise convolution accelerator)。該架構(gòu)通過設(shè)計特定的數(shù)據(jù)放置方式和多種數(shù)據(jù)傳輸模式,高效完成各種規(guī)模的深度卷積運算。
加速器的整體架構(gòu)如圖2 所示,主要包括以下幾個部分:1 個矩陣運算單元(matrix functional unit,MFU)、1 個控制處理器(control processor,CP)、2 個片上緩存(input neuron buffer,NBin 和output neuron buffer,NBout)和直接存儲訪問模塊(direct memory access,DMA)。
圖2 深度卷積加速器總體架構(gòu)
加速器的2 個片上緩存分別命名為NBin 和NBout,其中NBin 存放輸入數(shù)據(jù),NBout 存放權(quán)值和輸出數(shù)據(jù)。加速器沒有為權(quán)值數(shù)據(jù)單獨分配一個緩存,而是和輸出數(shù)據(jù)共享一個緩存,主要有以下2 個原因:
(1) 權(quán)值數(shù)據(jù)規(guī)模相對于輸入和輸出數(shù)據(jù)規(guī)模較小,可以和輸入或輸出數(shù)據(jù)共享一個緩存,以減少單獨為權(quán)值分配緩存的硬件開銷。
(2) 權(quán)值數(shù)據(jù)將以不同的方式傳輸?shù)礁鱾€運算單元中(詳見3.4 節(jié)),并且與輸入數(shù)據(jù)進(jìn)行計算,故輸入數(shù)據(jù)和權(quán)值數(shù)據(jù)不能放在同一個緩存上。
矩陣運算單元由多個處理單元(processing element,PE)組成,PE 之間使用胖樹(FatTree)進(jìn)行連接,以避免線路擁塞,如圖3 所示。不同于NBout,NBin 被分成了多份,每個PE 包含了部分NBin。每個PE 內(nèi)部結(jié)構(gòu)如圖4 所示,包含以下幾個部分:1個運算器(computational unit,CU)、1 個數(shù)據(jù)控制器(data controller,DC)和2 個私有的片上緩存(private buffer,PB),其中1 個緩存用于存放神經(jīng)元(input private buffer,INPB),另外1 個緩存用于存放權(quán)值(weight private buffer,WPB)。
圖3 MFU 示意圖
圖4 PE 內(nèi)部結(jié)構(gòu)圖
CU 是一個向量MAC 單元,每個向量MAC 包含多個標(biāo)量MAC 運算器。MAC 接收16 位定點數(shù)進(jìn)行計算而不是常用的32 位單精度浮點數(shù),因為研究表明,使用16 位定點數(shù)即可保證深度學(xué)習(xí)算法的精度基本不受影響[11]。
數(shù)據(jù)通路的設(shè)計主要有以下3 個特點:(1) 駐留輸入、傳輸權(quán)值;(2) 多種權(quán)值傳輸模式;(3) 多播部分輸入數(shù)據(jù)。
駐留輸入、傳輸權(quán)值。對于實際的深度卷積,其權(quán)值相對于輸入較小。故本文在設(shè)計加速器時,與DaDianNao[12]的駐留權(quán)值、傳輸輸入的方式不同,本文的加速器將輸入駐留在與運算器相鄰的片上緩存上,傳輸權(quán)值。這樣做的目的是減少數(shù)據(jù)傳輸帶來的性能和功耗開銷。
多種權(quán)值傳輸模式。為了支持不同的深度卷積規(guī)模,加速器設(shè)計了3 種權(quán)值傳播模式,分別是權(quán)值廣播、權(quán)值多播、權(quán)值單播,如圖5 中(a)、(b)、(c)所示,不同的線型分別代表不同的權(quán)值。
圖5 權(quán)值傳輸模式示意圖
加速器在處理一次任務(wù)時,需要將當(dāng)前任務(wù)拆分到每一個PE 上。任務(wù)在PE 之間的拆分可以看作深度卷積的輸入數(shù)據(jù)在H、W、C3 個方向的拆分。
根據(jù)任務(wù)在PE 之間不同的拆分方式,PE 之間存在多種共享權(quán)值的方式,對應(yīng)了不同的權(quán)值傳輸模式。在神經(jīng)網(wǎng)絡(luò)前幾層,C方向值較小、HW方向值較大,此時PE在HW方向拆分輸入,每個PE 使用相同的權(quán)值,對應(yīng)的權(quán)值傳輸模式是權(quán)值廣播,如圖5(a)所示;在神經(jīng)網(wǎng)絡(luò)后幾層,C方向值較大、HW方向值較小,此時PE在C方向拆分輸入,對應(yīng)的權(quán)值傳輸模式是權(quán)值單播,每個PE 使用不同的權(quán)值,如圖5(c)所示;在網(wǎng)絡(luò)的中間幾層,C方向大小適中,此時PE在HWC3 個方向拆分輸入,對應(yīng)的權(quán)值傳輸模式是權(quán)值多播,如圖5(b)所示。權(quán)值多播又分為多種形式,將PE 分組,每一組內(nèi)使用相同權(quán)值,組之間使用不同的權(quán)值,可以有2 個PE 為一組、4 個PE 為一組、8 個PE 為一組等多種模式。
多播部分輸入數(shù)據(jù)。在權(quán)值廣播和權(quán)值多播模式中,輸入數(shù)據(jù)會在HW方向拆分到不同PE 的NBin 上。根據(jù)卷積的計算特征,對于卷積核大于stride的情況,HW方向相鄰的輸出數(shù)據(jù)點會使用相同的輸入數(shù)據(jù),所以會出現(xiàn)需要2 個PE 內(nèi)部的NBin 存放部分相同輸入數(shù)據(jù)的情況。圖6 給出了相同輸入數(shù)據(jù)在HW平面拆分到不同PE 的情況,圖中input數(shù)據(jù)中灰色的部分是2 個2 ×2 的輸出大小對應(yīng)的重疊的輸入數(shù)據(jù),其中卷積核和stride的大小分別是3 和1。在這種情況下,本文的加速器專門設(shè)計了一種部分?jǐn)?shù)據(jù)多播的通路,以加速加載輸入數(shù)據(jù)有冗余的情況。數(shù)據(jù)通路會檢查從DMA 傳輸?shù)絅Bin 的數(shù)據(jù),如果是冗余數(shù)據(jù),那么進(jìn)行多播。
圖6 PE 之間共享數(shù)據(jù)示意圖
本節(jié)介紹針對本文設(shè)計的DCA 加速器,軟件應(yīng)該如何實現(xiàn)并且如何優(yōu)化。本節(jié)的軟件實現(xiàn)是在DLPlib[25]的基礎(chǔ)上進(jìn)行擴(kuò)展,使其支持DCA 加速器。其中擴(kuò)展包括權(quán)值傳輸模式的選擇、數(shù)據(jù)拆分。
本文的加速器設(shè)計了多種權(quán)值傳輸模式,在使用時需根據(jù)具體的情況選擇不同的權(quán)值傳輸模式。在權(quán)值傳輸模式選擇時,考慮的因素有以下3 個方面。
(1) 運算效率。在計算時,運算效率由有效工作的PE 占所有PE 的比例和每個PE 中有效工作的運算器比例所決定。假設(shè)每個PE 做有效工作的運算器的比例都是相同的,則運算效率=有效工作的PE 比例×每個PE 中有效工作的運算器的比例。
(2) 訪存性能??紤]訪存局部性,盡量減少跳躍訪存(非連續(xù)內(nèi)存訪問),因為跳躍訪存可能會導(dǎo)致存儲器內(nèi)部行緩沖區(qū)命中率低,進(jìn)而降低訪存性能。
(3) 輸入數(shù)據(jù)冗余。輸入數(shù)據(jù)冗余分為2 種類型,即輸入數(shù)據(jù)在片外存儲器上拆分的冗余和輸入數(shù)據(jù)在PE 之間拆分的冗余。第1 種冗余是因為片上緩存大小限制,輸入數(shù)據(jù)在片外存儲器拆分,會引入額外的訪存或者片上數(shù)據(jù)傳輸開銷,從而可能影響整體性能。第2 種冗余不僅會占用更多片上緩存空間,而且冗余的數(shù)據(jù)寫入緩存會增加DCA 加速器的功耗。其中第2 種冗余數(shù)據(jù)的訪存行為可以通過本文3.4 節(jié)介紹的多播部分輸入數(shù)據(jù)的方式消除。但是第2 種冗余數(shù)據(jù)的增多會導(dǎo)致其占用片上緩存增多,使得輸入數(shù)據(jù)在片外存儲器的拆分粒度變小,拆分次數(shù)增加,最終導(dǎo)致第1 種數(shù)據(jù)冗余規(guī)模增加,整體性能下降。
為保證訪存的性能,本文在做數(shù)據(jù)拆分時,不會優(yōu)先拆分C方向,即盡量減少跳躍訪存。因此,后面的內(nèi)容主要考慮運算效率和數(shù)據(jù)冗余對模式選擇的影響。
本文的重點在于加速深度卷積的性能,即最小化深度卷積任務(wù)在加速器上的運行時間。因為DCA 加速器的計算和訪存可以并行,所以在理想情況下,最終運行時間T可根據(jù)計算時間Tcpt和訪存時間Tio確定,即:
假設(shè)任務(wù)的計算量、訪存量和輸入數(shù)據(jù)冗余量分別為CPT(MAC)、IO(B)和R(B),加速器的計算峰值和帶寬分別為CP(Giga operations per second,GOPS)和BW(GB/s),任務(wù)運行在加速器上的計算效率為CE(computing efficiency),則有:
從式(5)和式(6)可以看出,在任務(wù)規(guī)模以及加速器性能參數(shù)確定的情況下,軟件層面可以控制并且影響任務(wù)最終性能的2 個因素分別是計算效率CE和輸入數(shù)據(jù)冗余量R。
假設(shè)PE 個數(shù)M為16,向量MAC 的長度為16。因為每個PE 的向量MAC 是沿C方向進(jìn)行處理,所以計算效率主要受C方向大小的影響。圖7 給出了不同權(quán)值傳輸模式下,計算效率隨著C方向大小變化而變化的示意圖,其中在權(quán)值多播模式下,4 個PE 為一組(為簡便起見,后續(xù)權(quán)值多播模式都使用4 個PE 一組)。可以看出,權(quán)值廣播模式的計算效率在多數(shù)情況是很高的,并且隨著C的不斷增大趨于穩(wěn)定;權(quán)值單播模式在多數(shù)情況下計算效率不高,并且很不穩(wěn)定;權(quán)值多播模式的計算效率適中并且變化幅度較小,隨著C的增大逐漸增大并趨于穩(wěn)定。因此,若只從計算效率的角度考慮,應(yīng)該優(yōu)先選擇權(quán)值廣播模式,其次是權(quán)值多播模式,最后是權(quán)值單播模式。但是權(quán)值廣播和多播模式在PE 之間會有部分輸入數(shù)據(jù)的冗余,會影響最終性能。因此,在選擇權(quán)值傳輸模式時還需要進(jìn)一步考慮輸入數(shù)據(jù)冗余對性能的影響。
圖7 不同模式下的計算效率
圖8 給出了在不同傳輸模式下,數(shù)據(jù)冗余量隨著C方向的變化曲線,其中HW方向的輸出大小都是1024,卷積核和stride分別是3 和1。從圖8 可以看出,隨著C方向逐漸增大,3 種模式的數(shù)據(jù)冗余量都逐漸增多,其中權(quán)值廣播的變化幅度較大,權(quán)值單播模式的變化幅度較小,權(quán)值多播的變化幅度介于二者之間。權(quán)值廣播模式的曲線在C為896 之后消失,因為在C方向不拆分的情況下,此時每個PE 的片上緩存大小小于輸入數(shù)據(jù)在HW方向拆分最小粒度所需的緩存空間大小。
圖8 不同模式下的數(shù)據(jù)冗余量
假設(shè)運算單元的時鐘頻率為500 MHz,NBin 的大小為0.25 MB,內(nèi)存訪問帶寬為64 GB/s,此時加速器是計算量決定性能。圖9 給出了在不同權(quán)值傳輸模式下,任務(wù)運行時間T隨著C方向增大而變化的曲線。從圖9 可以看出,在多數(shù)情況下,因為權(quán)值廣播的計算效率較高,權(quán)值廣播模式的運行時間最小。此外還可以看出3 種模式的運行時間隨著C方向的增大呈現(xiàn)階梯形狀,并且權(quán)值單播模式下變化幅度最大,其次是權(quán)值多播和廣播模式。如果僅從任務(wù)運行時間來選擇模式,應(yīng)該優(yōu)先考慮權(quán)值廣播模式,因為在多數(shù)情況下,權(quán)值廣播運行時間最小。
圖9 任務(wù)在計算量決定性能時,不同模式下的運行時間
圖10 給出了任務(wù)在計算量決定性能時,不同模式下的最小運行時間,在運行時間相同的情況下,優(yōu)先考慮數(shù)據(jù)冗余量小的模式。從圖9 和圖10 可以看出,在權(quán)值廣播和多播的數(shù)據(jù)規(guī)模和計算效率相同的情況下,應(yīng)選擇使用權(quán)值多播模式,比如C大于48 且小于等于64 的情況,因為此時權(quán)值廣播的數(shù)據(jù)冗余量比權(quán)值多播模式大。
圖10 任務(wù)在計算量決定性能時,不同模式下的最小運行時間
PE 之間在C方向拆分不會引入冗余數(shù)據(jù),故冗余數(shù)據(jù)的大小只需要考慮HW2 個方向。假設(shè)一次計算的輸出數(shù)據(jù)在HW方向的大小分別是ho、wo,輸出的HW平面在權(quán)值廣播和權(quán)值多播模式下分別拆分成x和y份。因為權(quán)值多播在C方向拆分,所以在HW方向拆分的個數(shù)y小于x。為了PE 之間的計算負(fù)載均衡,每個PE 應(yīng)該處理相同規(guī)模的數(shù)據(jù),則權(quán)值廣播和權(quán)值多播在PE 拆分之后的輸出在HW方向大小的乘積分別為ho×wo/x,ho×wo/y。根據(jù)4.2 節(jié)數(shù)據(jù)拆分的結(jié)論,即每個PE 處理輸入的HW方向大小應(yīng)盡可能相等。因此,權(quán)值廣播和權(quán)值多播模式下的每個PE在HW方向的大小分別為
在卷積核和stride分別為3 和1 的情況下,權(quán)值廣播的HW平面的數(shù)據(jù)冗余量如式(7)最左端所示,權(quán)值多播的數(shù)據(jù)冗余量類似。因為輸出大小和卷積參數(shù)都是已知量,權(quán)值廣播模式的數(shù)據(jù)冗余量可以表示為,同理可得權(quán)值多播的數(shù)據(jù)冗余量為。因為x >y,顯然C3。所以在數(shù)據(jù)規(guī)模確定的情況下,權(quán)值廣播的數(shù)據(jù)冗余量比權(quán)值多播模式大。因此,在任務(wù)規(guī)模和計算效率相同的情況下,優(yōu)先考慮使用權(quán)值多播模式而不是權(quán)值廣播模式。
在權(quán)值單播模式下,PE 之間在C方向拆分,PE之間沒有冗余數(shù)據(jù)。因此,當(dāng)權(quán)值單播和權(quán)值多播、權(quán)值廣播的計算效率相同時,應(yīng)選擇權(quán)值單播模式,比如圖10中C大于240 且小于等于256 的情況。
結(jié)合式(4)~(6)以及對其的分析,本文以最小化任務(wù)在加速器上的運行時間為目標(biāo),然后評估任務(wù)在不同模式下的運行時間,最終選擇運行時間最小的模式。如果運行時間相同,應(yīng)盡可能減小Tcpt和Tio。如果Tcpt和Tio也相同,那么應(yīng)該減少片上數(shù)據(jù)傳輸量,即減少數(shù)據(jù)冗余量。
數(shù)據(jù)拆分主要分為2 類:因片上緩存大小限制而導(dǎo)致的拆分和輸入數(shù)據(jù)在PE 之間的拆分。第1類是因為片上緩存NBin 和NBout 的大小是有限的,當(dāng)深度卷積的規(guī)模較大,即數(shù)據(jù)大小大于緩存大小,需要對數(shù)據(jù)進(jìn)行拆分。其中包括權(quán)值拆分、輸入和輸出拆分。權(quán)值拆分的情況比較少,這里不做討論。第2 類是輸入數(shù)據(jù)在PE 之間的拆分,因為在權(quán)值廣播和多播模式下,PE 之間的輸入數(shù)據(jù)會有冗余。軟件在做拆分時,應(yīng)盡可能地減少冗余數(shù)據(jù)。在確定一次計算的大小時,需要同時考慮以上2 類拆分。具體步驟如下。
輸入和輸出在緩存上的拆分。對于輸入和輸出的拆分,首先考慮輸出的拆分,然后根據(jù)輸出大小以及卷積參數(shù)推測出輸入的大小。考慮深度卷積的數(shù)據(jù)訪存局部性,拆分的次序分別是ho、wo、co,應(yīng)盡量保證C方向不拆分。
輸入數(shù)據(jù)在PE 之間的拆分。針對不同的權(quán)值傳輸模式,輸入數(shù)據(jù)在PE 之間的拆分將分為3 類,即HW方向拆分、HWC方向拆分和C方向拆分。相應(yīng)的硬件模式是權(quán)值廣播、權(quán)值多播、權(quán)值單播。
輸入數(shù)據(jù)在HW方向拆分時,PE 之間會有部分冗余輸入數(shù)據(jù),如圖6 所示。相同大小的輸入數(shù)據(jù)在PE 之間的拆分方式不同,冗余數(shù)據(jù)大小不同,輸入數(shù)據(jù)占用片上緩存空間大小也不同。因此,在輸入數(shù)據(jù)規(guī)模確定的情況下,如何在PE 之間拆分輸入數(shù)據(jù)以最小化片上緩存空間是個值得研究的問題。
為了PE 之間的計算負(fù)載均衡,每個PE 的計算量應(yīng)盡可能相同。假設(shè)輸出數(shù)據(jù)在HW方向的大小分別是ho和wo,stride在HW方向都為1,拆分后每個PE 的輸出數(shù)據(jù)在HW方向的大小是hp和wp,PE數(shù)量是M,則hp×wp和ho×wo/M相等。每個PE的輸入數(shù)據(jù)大小可以根據(jù)輸出大小和深度卷積參數(shù)推測出,如式(8)所示。
在式(8)中,C4=hp × wp +(ky -1)×(kx -1),因為hp×wp和ho×wo/M相等,在輸出數(shù)據(jù)大小確定的情況下,hp×wp是已知量;因為ky、kx都是已知量,所以(ky-1) ×(kx-1)也是已知量,故C4是已知量。在網(wǎng)絡(luò)中,ky和kx的大小通常相等,因此C5=ky -1=kx -1 是已知量。因為C4和C5都是已知量,所以輸入數(shù)據(jù)占用片上緩存空間大小由hp+wp確定。根據(jù)基本不等式當(dāng)且僅當(dāng)a和b相等時,a+b的結(jié)果取最小,所以當(dāng)且僅當(dāng)hp和wp相等時,hp+wp的值取最小。因為hp×wp和ho×wo/M相等,所以相同的輸入數(shù)據(jù)規(guī)模在PE 之間拆分時,占用總片上緩存空間大小有最小值M ×(2× C4×)。
故結(jié)論是,當(dāng)輸入數(shù)據(jù)在HW方向拆分時,應(yīng)盡量保證每個PE 處理的H方向的大小和W方向的大小相同。PE 的個數(shù)為M,所以當(dāng)ho/wo接近M時,只在H方向拆分M份;當(dāng)ho/wo接近1 時,在H方向拆分份,在W方向拆分份;當(dāng)ho/wo接近1/M時,只在W方向拆分M份。
本節(jié)將詳細(xì)介紹本文實驗所使用的Benchmark和實驗平臺,并將本文設(shè)計的DCA 加速器與其他硬件平臺進(jìn)行性能對比。
本文的Benchmark 選取了應(yīng)用廣泛的MobileNet V1、MobileNet V2、MobileNet V3 網(wǎng)絡(luò)中具有代表性的深度卷積規(guī)模作為實驗測試用例,涵蓋了神經(jīng)網(wǎng)絡(luò)中的各種深度卷積規(guī)模,如表1 所示。
表1 深度卷積測試用例
本文在3 種不同的平臺上做了實驗,分別是CPU 平臺、SIMD 平臺和DCA 加速器平臺。
CPU 平臺。通用多核處理器,Intel Core i7-8850H,基本頻率是2.60 GHz,最大睿頻頻率可達(dá)4.30 GHz,9 MB L3 Cache,6 核,12 線程。算法的實現(xiàn)使用公開實現(xiàn)的高性能函數(shù)庫,比如Intel oneDNN[31]。
SIMD 平臺。單核SIMD 處理器。該平臺的架構(gòu)類似于DCA 加速器平臺,使用0.75 MB 的SPM,用于存放輸入神經(jīng)元、輸出神經(jīng)元和權(quán)值,時鐘頻率是1 GHz,有運算器長度為64 的乘法器和加法器。在SIMD 平臺,使用高性能庫DLPlib[25],數(shù)據(jù)擺放的格式是NHWC。
DCA 加速器平臺。本文提出的單核深度卷積加速器。0.25 MB 的NBout,0.5 MB 的NBin,時鐘頻率為1 GHz。PE 個數(shù)設(shè)置為16,向量MAC 的長度為16,因為根據(jù)本文2.2 節(jié)的介紹,在實際應(yīng)用的神經(jīng)網(wǎng)絡(luò)中C方向的最小值是16。DCA 加速器使用的高性能庫是在DLPlib[25]上實施本文第4 節(jié)介紹的軟件優(yōu)化的版本。為了獲得DCA 加速器的性能,首先通過DLPlib 生成指令,然后使用C ++構(gòu)建了一個性能模擬器來獲取最終性能。為了與單核SIMD 平臺公平對比,DCA 加速器的訪存帶寬和單核SIMD 處理器保持一致。
軟件優(yōu)化。本文分析了軟件優(yōu)化對DCA 加速器整體性能的影響。圖11 顯示了使用軟件優(yōu)化的加速比,只使用權(quán)值單播模式,使用在此模式下最優(yōu)的數(shù)據(jù)拆分方式。從圖11 中可以看出,在使用軟件優(yōu)化的情況下,所有的測試用例都有性能提升,平均提升了1.65 倍。其中dwconv1 的性能提升最明顯,這主要是由于dwconv1的C方向比較小,使用DCA加速器的權(quán)值廣播模式可以充分利用DCA 的運算單元。
圖11 DCA 加速器使用軟件優(yōu)化的加速比
圖12 顯示了表1 的測試用例在不同的模式下的性能,其中每種模式都使用在當(dāng)前模式下最優(yōu)的拆分方式。從圖12 中可以看出,dwconv1 和dwconv2 在權(quán)值單播模式下性能相對較差;dwconv3 和dwconv4 在3 種模式下性能相同;dwconv5、dwconv6和dwconv7 在權(quán)值單播模式下性能比較差。
圖12 測試用例在DCA 加速器的不同模式下的運行時間對比
在神經(jīng)網(wǎng)絡(luò)的前幾層,C方向通常比較小,如果使用權(quán)值單播模式,計算效率會非常低,最終導(dǎo)致計算成為整體性能的瓶頸。dwconv1 在權(quán)值廣播模式下,訪存時間大于計算時間。但是在使用權(quán)值單播模式下,它的計算效率只有1/16,這導(dǎo)致了計算時間大于訪存時間。在神經(jīng)網(wǎng)絡(luò)的中間幾層,比如dwconv3 和dwconv4,由于其訪存時間大于計算時間,雖然在使用權(quán)值廣播和權(quán)值單播的模式時的計算效率降低,但是仍然是訪存時間大于計算時間,所以在3 種模式下性能一樣。在神經(jīng)網(wǎng)絡(luò)的后幾層,C方向通常比較大,比如dwconv5、dwconv6 和dwconv7。如果選擇使用權(quán)值廣播模式,運算效率只有1/16,只有一個PE 在做有效工作,所以在權(quán)值廣播模式下,這幾層的計算是整體性能的瓶頸??偠灾?實驗結(jié)果符合本文之前的理論分析。
不同平臺對比。本文將DCA 加速器的性能和通用CPU、單核SIMD 處理器進(jìn)行對比。使用表1的深度卷積規(guī)模作為測試用例,測試結(jié)果如圖13 所示,其中橫軸表示不同的深度卷積的規(guī)模,縱軸表示DCA 加速器相對于其他平臺的加速比。從圖13 可以看出,DCA 加速器與通用CPU 處理器對比,平均加速了7.9 倍,最大可加速9.3 倍;DCA 加速器與單核SIMD 處理器對比,平均加速了8.3 倍,最大可加速29.3 倍。
圖13 DCA 加速器相對于SIMD、CPU 平臺的加速比
DCA 處理器比通用CPU 速度快的主要原因是DCA 加速器的軟件實現(xiàn)有數(shù)據(jù)預(yù)取操作,結(jié)合DCA加速器較大的算力,可以將計算時間完全隱藏在訪存時間里。從圖13 可以看出,在dwconv3 這個深度卷積規(guī)模下,DCA 加速器相對于CPU 的加速比比其他規(guī)模的加速比小,因為dwconv3的stride大小是2,即此時計算密度相對較小,這使得解決訪存量決定性能的DCA 加速器的優(yōu)勢降低。
DCA 加速器相對于SIMD 的加速比最高是在C方向值較小的深度卷積規(guī)模。因為固定向量運算器長度的單核SIMD 處理器在這種情況下計算效率比較低,從而導(dǎo)致計算成為瓶頸,比如對于dwconv1 的深度卷積規(guī)模,運算器長度為64 的單核SIMD 處理器的計算效率只有25%。而DCA 加速器在設(shè)計時考慮了包括較小C的各種深度卷積規(guī)模。DCA 加速器通過軟硬件協(xié)同優(yōu)化,能夠使得計算效率達(dá)到100%,從而獲得更好的整體性能。
許多加速器主要針對傳統(tǒng)卷積算法進(jìn)行優(yōu)化,沒有針對深度卷積進(jìn)行深入分析和探討。本文提出了一種軟硬件結(jié)合的方法優(yōu)化深度卷積,通過設(shè)計不同的權(quán)值數(shù)據(jù)傳輸模式,結(jié)合軟件模式選擇、數(shù)據(jù)拆分等優(yōu)化方式,有效解決深度卷積中不同規(guī)模下的計算性能問題。實驗結(jié)果表明,在實現(xiàn)MobileNet系列網(wǎng)絡(luò)中的深度卷積時,與運算器長度為64 的單核SIMD 處理器相比,本文所描述的工作最高提升性能可達(dá)29.3 倍。
未來將考慮對本文的DCA 加速器做進(jìn)一步擴(kuò)展,以支持更多類型的卷積。DCA 加速器的多PE、多種權(quán)值傳輸模式具有良好的擴(kuò)展性,如果將每個PE 的向量MAC 運算器的結(jié)果分組累加或者全部累加,可以高效地計算權(quán)值規(guī)模相對較小的傳統(tǒng)卷積,比如神經(jīng)網(wǎng)絡(luò)前幾層的卷積。當(dāng)權(quán)值很大時,可以將權(quán)值駐留在NBin 上,傳輸輸入,比如神經(jīng)網(wǎng)絡(luò)中后幾層的卷積規(guī)模。