優化基於FPGA的深度卷積神經網絡的加速器設計

英文論文鏈接:http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf

翻譯:卜居

轉載請註明出處:http://blog.csdn.net/kkk584520/article/details/47450159


【0. 摘要】

CNN已經廣泛用於圖像識別,因爲它能模仿生物視覺神經的行爲獲得很高識別準確率。最近,基於深度學習算法的現代應用高速增長進一步改善了研究和實現。特別地,多種基於FPGA平臺的深度CNN加速器被提出,具有高性能、可重配置、快速開發週期等優勢。

儘管目前FPGA加速器已經展示了相比通用處理器更好的性能,加速器設計空間並沒有很好發掘。一個嚴重的問題是,一個FPGA平臺的計算吞吐並未很好匹配內存帶寬。因此,已有的方案要麼未充分利用邏輯資源,要麼未充分利用內存帶寬,都不能獲得最佳性能。同時,深度學習應用不斷增加的複雜度和可擴展性讓這個問題更加嚴重。

爲了克服這個問題,我們利用roofline模型提出一種設計分析方法。對於任意CNN設計方案,我們量化分析它使用不同優化技術(循環分塊、變換)的計算吞吐和所需內存帶寬。在roofline模型幫助下,我們可以發現最好性能和最低FPGA資源需求的解決方案。

作爲案例研究,我們在VC707 FPGA板卡上實現了一個CNN加速器,並將它與之前的方案對比。我們的實現在100MHz工作頻率下可獲得61.62GFLOPS的峯值處理能力,大大優於之前的方案。


【1. 簡介】

CNN是著名的深度學習架構,從人工神經網絡擴展而來,它已經大量用於不同應用,包括視頻監控,移動機器人視覺,數據中心的圖像搜索引擎等【6】【7】【8】【10】【14】

受生物視覺神經行爲的啓發,CNN用多層神經元相連處理數據,在圖像識別中可獲得很高準確率。最近,基於深度學習算法的現代應用快速增長進一步改善了DCNN的研究。


由於CNN的特殊計算模式,通用處理器實現CNN並不高效,所以很難滿足性能需求。於是,最近基於FPGA,GPU甚至ASIC的不同加速器被相繼提出【3】【4】【9】以提升CNN設計性能。在這些方案中,基於FPGA的加速器由於其更好的性能,高能效,快速開發週期以及可重配置能力吸引了越來越多研究者的注意【1】【2】【3】【6】【12】【14】。

對於任意CNN算法實現,存在很多潛在解決方案,導致巨大的設計空間。在我們的實驗中,我們發現使用同樣FPGA邏輯資源的不同方案性能有最大90%差距。尋找最優解不無價值,尤其當考慮FPGA平臺計算資源和內存帶寬限制時。實際上,如果一個加速器結構並未仔細設計,它的計算吞吐與內存帶寬不匹配。未充分利用邏輯資源或內存帶寬都意味着性能下降。


不幸的是,FPGA技術進步和深度學習算法同時將該問題複雜化了。一方面,當前FPGA平臺不斷提升的邏輯資源和內存帶寬擴大了設計空間,採取不同FPGA優化技術(如循環分塊、變換)會進一步擴大設計空間。另一方面,爲了滿足現代應用需求,深度學習可擴展性和複雜性在持續增長。因此,在巨大的設計空間中尋找最優解就更加困難,亟需一種高效檢索基於FPGA的CNN設計空間的方法。


爲了高效檢索設計空間,本文提出了分析設計的方法。我們的工作優於以前的方法,原因有二:

首先,【1,2,3,6,14】主要關注計算引擎優化,要麼忽視了外部存儲器操作,要麼直接將他們的加速器接入外部存儲器。我們的工作則考慮了緩衝區管理和帶寬優化。

其次,【12】通過數據重用減少了外部數據獲取從而獲得加速。但是這種方法不必導致最優全局性能。另外他們的方法需要對每層重新配置,不太方便。我們的加速器無需重編程FPGA就能執行不同層的計算。


本文主要貢獻如下:

* 量化分析可能解決方案的計算吞吐和所需內存帶寬;

* 在計算資源和內存帶寬限制下,我們用roofline模型識別所有可能的解決方案,討論了不同層如何尋找最優解;

* 我們提出一種CNN加速器設計,對每層使用統一的循環展開因子;

* 實現了CNN加速器,獲得61.62GFLOPS處理性能,是目前最優的;


【2. 背景】

2.1 CNN基礎

CNN受神經科學研究的啓發,經過長達20多年的演變,CNN在計算機視覺、AI(【11】【9】)領域越來越突出。作爲一種經典有監督學習算法,CNN使用前饋處理用於識別,反饋用於訓練。在工業實踐中,很多應用設計者離線訓練CNN,然後用訓練好的CNN實現實時任務。因此,前饋計算速度是比較重要的。本文關注用基於FPGA的加速器設計前饋計算加速。


一個典型CNN由兩部分組成:特徵提取器 + 分類器。

特徵提取器用於過濾輸入圖像,產生表示圖像不同特徵的特徵圖。這些特徵可能包括拐角,線,圓弧等,對位置和形變不敏感。特徵提取器的輸出是包含這些特徵的低維向量。

該向量送入分類器(通常基於傳統的人工神經網絡)分類器的目的是決定輸入屬於某個類別的可能性。


一個典型CNN包括多個計算層,例如,特徵提取器可能包括幾個卷積層和可選的下采樣層。圖1展示了卷積層的計算。


卷積層收到N個特徵圖作爲輸入,每個輸入特徵圖被一個K * K的核卷積,產生一個輸出特徵圖的一個像素。滑動窗的間隔爲S,一般小於K。總共產生M個輸出特徵圖用於下一卷積層。卷積層的僞代碼如下:

for(row = 0; row < R; row ++)
{
  for(col = 0; col < C; col ++)
  {
     for(to = 0; to < M; to ++)
     {
        for(ti = 0; ti < N; ti ++)
        {
           for(i = 0; i < K; i++)
           {
              for(j = 0; j < K; j++)
              {
                  output_fm[to][row][col] += weights[to][ti][i][j] * input_fm[ti][S * row + i][S * col + j];
               }
            }
          }
       }
    }
}

在前饋計算角度,之前的論文【5】證明卷及操作會佔據超過90%的總計算時間,所以本文我們關注加速卷積層。後面會考慮集成其他可選層,如下采樣層、最大池化層。


一個真實的CNN


圖2展示了一個真實CNN應用,摘自【9】。該CNN包括8層,前5層爲卷積層,第6~8層爲全連接人工神經網絡。該算法接收3通道224x224輸入圖像(從原始256x256三通道RGB圖像變換而來),輸出1000維向量表示1000個類別的可能性。

第一層輸入爲3個224x224分辨率的特徵圖,輸出96個55x55分辨率的特徵圖,輸出分爲兩個集,每個48組特徵圖。表1記錄了該CNN的配置。




2.2 Roofline模型


計算和通信是系統吞吐優化的兩個基本限制。一個實現可能是計算受限的或訪存受限的。【15】開發了roofline性能模型來將系統性能同片外存儲帶寬、峯值計算性能相關聯。

公式(1)表示了特定硬件平臺的可達吞吐率,用GFLOPS作爲評估指標。


一個應用實際GFLOPS不會高於這兩項中的最小值:第一項爲所有可用計算資源提供的峯值計算能力(計算上限),第二項爲給定計算-通信比時系統訪存帶寬可支持的最大浮點性能(IO帶寬上限)。計算-通信比,又稱每DRAM傳輸運算量,表示特定系統實現所需的DRAM訪問量。


圖3將roofline模型可視化,分別展示了計算上限和IO帶寬上限。算法2相比算法1有更高計算-通信比,或更好的數據重用.從圖中看到算法2充分利用所有硬件計算資源,性能優於算法1。


【3. 加速器設計探索】


本節首先提供了我們的加速器結構概覽,介紹了FPGA平臺上的幾個設計挑戰。爲了克服這些挑戰,我們提出了相應的優化技術。

 

3.1 設計概覽


如圖4所示,一個CNN加速器設計包括:處理單元(PE),片上緩存,外部存儲器以及片內外互聯。PE是卷積的基本計算單元。用於處理的所有數據放在外部存儲器。由於片上資源限制,數據首先緩存到片上buffer,之後送入PE。這裏使用雙緩衝將傳輸時間掩蓋於計算時間。片上互聯用於PE和片上緩衝的通信。

在FPGA平臺上有這樣幾個設計挑戰阻礙了高效的CNN加速器設計:首先,片上數據只有很小一部分,故循環分塊(loop tiling)是必要的,不合適的循環分塊可能降低數據重用和數據並行處理效率。

其次,PE和緩衝區組織及其互聯應仔細考慮,這樣能高效處理片上數據。第三,PE的數據處理吞吐應該匹配FPGA平臺的片外訪存帶寬。

 

本節我們從Code1開始優化,提供了連續步驟獲得最優處理效率。

使用了循環分塊的代碼如下:


注意到循環變量i和j並未分塊,因爲CNN中卷積層kernel尺寸K太小(3~11)。

第二,我們討論了計算引擎優化並將計算性能與分塊係數建立聯繫。

第三,我們使用數據重用技術減少外存訪問,建立了計算-訪存比和分塊係數的聯繫;

第四,利用上述兩個變量,我們定義了設計空間,在FPGA平臺上找最優解;

第五,我們討論了怎樣爲多層CNN應用選擇最好的加速器。

 

3.2 計算優化

本節使用標準基於多面體的數據相關性分析【13】來通過循環調度和循環分塊尺寸窮舉法衍生出一系列等效CNN設計實現。

計算優化目標是使用有效的循環展開、流水線,將計算資源完全利用。本節假設所有需要的數據都在片上。片外存儲帶寬限制將在3.3節討論。


循環展開:用於增加海量計算資源利用率。在不同循環層次展開會產生不同實現。展開的執行單元是否共享數據以及共享到什麼程度會影響生成硬件的複雜性,最終影響展開的複製品數量和硬件運行頻率。某個循環維度中對一個數組的共享關係可以分爲三種類型:

* 無關,如果循環變量i不出現在數組A的任何訪問函數,則稱相應循環維度對數組A是無關的;

* 獨立,如果數組A沿着某個循環維度i是完全可分的,稱i對數組A獨立;

* 相關,如果數組A沿某個循環維度i不可分,稱i對數組A依賴;


圖6顯示了不同數據共享關係時產生的硬件實現。


獨立數據共享關係:buffer和計算引擎直接連接;

無關:生成廣播式連接;

相關:產生帶多路開關的互聯;


對圖5中代碼分析相關性,結論如下表:


最終,選擇too和tii兩個循環維度做循環展開,從而避免生成複雜硬件拓撲。我們需要將循環嵌套次序做修改,讓too和tii到最內層循環,簡化HLS代碼生成。生成的硬件實現如圖7所示。



循環流水線: 是HLS裏一項重要優化技術,通過將不同循環層次操作執行交疊,可提高系統吞吐。可獲得的吞吐受資源和數據相關性限制。loop-carried相關性會導致循環不能完全流水線。

經過循環展開和流水線優化的代碼如圖所示。



分塊尺寸選擇:將循環結構固定後,不同循環分塊尺寸變化會有巨大性能變化。代碼3中有效的循環分塊尺寸由公式(2)確定:


(卜居注:後面4個條件是顯然的,第一個是由於循環展開、流水線的要求而必須加以限制,爲了獲得高計算能力,必須付出增加硬件面積的代價)

給定特定分塊尺寸組合(Tm, Tn, Tr, Tc),計算性能(或roofline模型中的計算上限)可以由公式(3)計算得到。從公式中看到,計算上限是Tm和Tn的函數。


(卜居注:計算上限的單位是GFLOPS,也就是計算量除以耗時。公式分子爲完成代碼(1)的總乘、加計算量,分母爲完成計算所需的時鐘週期,由於使用了循環分塊,所以括號內的時鐘週期數目爲流水線從開始到結束的總週期,括號外爲分塊外循環次數。)



3.3 訪存優化

在3.2節,我們討論瞭如何衍生設計變種使用不同計算上限,假設計算引擎所有數據訪問都是片上已經緩存的。但是,當考慮內存帶寬限制時,高計算上限的設計變種不一定能達到更高計算上限。本節我們將展示如何通過高效數據重用降低所需通信量。

圖9展示了一個CNN層的內存傳輸操作。輸入/輸出特徵圖和權值在計算引擎開始之前就已經載入,產生的輸出特徵圖寫回主存。


本地存儲提升:如果最內層循環的通信部分(圖9循環變量爲ti)與某個數組是無關的,那麼該循環會有冗餘內存操作。本地存儲提升【13】可以用於降低冗餘操作。

在圖9中,最內層循環ti與output_fm是無關的,所以訪問output_fm的操作可以提升到外層循環。注意到提升操作可以一直執行,直到與循環變量相關。

利用該技術,對output_fm的訪存需求從降低至


爲了數據重用而實行循環變換:爲了最大可能進行數據重用,我們使用基於多面體的優化框架來發現所有有效的循環變換。表3顯示了循環層次和數組之間的數據共享關係。本地存儲提升方法用到每個可能的循環調度中,儘可能減少總通信量。


計算-通信比:用來描述每次訪存的計算操作。數據重用優化會降低總的訪存次數,進而提升計算-通信比。

圖9代碼的計算-通信比可以由公式(4)計算:


裏面變量較多,分別表示如公式(5)~(11)


給定一個特定循環結構和分塊尺寸組(Tm, Tn, Tr, Tc),計算-通信比可以通過上述公式計算得到。


3.4 設計空間探索

綜上所述,給定(Tm, Tn, Tr, Tc),可以計算該設計的計算能力上限和計算-通信比。枚舉所有可能的循環次序和分塊尺寸可以產生一系列計算性能和計算-通信比對,圖8(a)顯示了例子CNN第5層在roofline模型中的所有有效解,X軸表示計算-通信比,或者每DRAM字節訪問的浮點處理性能。Y軸表示計算性能(GFLOPS)。任意點與原點(0, 0)的連線斜率表示該實現的最低訪存帶寬需求。

例如,設計P的最低訪存帶寬需求和P' 是相同的。


在圖8(b)中,帶寬上限線和計算上限是由特定平臺決定的。在帶寬上限線左側的點需要比平臺能提供的訪存帶寬更高,因此不可實現,即圖中雖然設計A取得了最高的計算性能,但平臺內存帶寬不能滿足該設計的需求,所以平臺上可以獲得的性能落到A' 位置。



平臺支持的設計定義爲:位於帶寬上限線右側的集合。位於帶寬上限線的是左側點的投影。

我們探索平臺支持最優方案的策略如下:最高性能,最高計算-通信比(這樣有最小的訪存需求)。該準則基於我們可以使用更少IO口,更少LUT和硬件連線,數據傳輸引擎有更低帶寬需求。因此,點C是CNN第5層的最終選擇,它的帶寬需求爲2.2GB/s。


3.5 多層CNN加速器設計

前幾節我們討論瞭如何爲每個卷積層尋找最優實現參數。在CNN應用中,這些參數可能在不同層之間變化。表4顯示了例子CNN中每層最優展開係數(Tm和Tn):


設計一個支持不同展開係數的多個卷積層的硬件加速器將會非常有挑戰性,因爲需要設計複雜的硬件架構來支持重配置計算引擎和互聯。

一種替代方案是所有層都用同一套展開係數。我們枚舉了所有可行的解來選擇最優的全局設計參數。使用統一展開係數易於設計實現,但對某些層是次優解。表4表明使用統一展開係數(64, 7),性能下降不超過5%。因此我們的實驗選擇了這個展開係數。

枚舉空間大約98,000,使用普通筆記本大約10分鐘就能完成。


【4. 實現細節】

本節描述我們解決方案的具體實現。

4.1. 系統概述

圖10 顯示了我們的實現概述。



全部系統都放在了單個FPGA芯片,使用DDR3 DRAM用於外部存儲。

MicroBlaze是一個RISC處理器軟核,用於幫助CNN加速器啓動,與主機CPU通信,以及計時。

AXI4lite總線用於傳輸命令,AXI4總線用於傳輸數據

CNN加速器作爲AXI總線上一個IP。它從MicroBlaze接收命令和配置參數,與定製的數據傳輸引擎通過FIFO接口通信,該數據傳輸引擎可以獲取通過AXI4總線外部存儲。

MicroBlaze和CNN加速器使用中斷機制來提供精確的計時。


4.2 計算引擎



圖11的計算引擎部分顯示了我們實現的模塊圖。它們是基於第三節分析結果而設計的。

二級循環展開(圖2中的Tm和Tn)實現爲並行執行計算引擎,使用了類似圖7的樹狀結構。對於最優的跨層設計(Tm, Tn)=(64,7),單個引擎接收來自輸入特徵圖的7個輸入,以及7個來自權值的輸入以及一個bias輸入。64個複製的結構用來展開Tm。

(卜居注:由於使用了64個相同的計算引擎,每個消耗35個dsp,有7個乘法器和7個加法器組成,每個加法器消耗2個dsp,每個乘法器消耗3個dsp)

4.3 存儲子系統

片上緩衝區是基於雙緩衝設計的,工作在乒乓模式來掩蓋數據傳輸時間到計算時間中。它們一共有4組,兩組用於輸入特徵圖、權值,兩組用於輸出特徵圖。我們先介紹每個緩衝區的組織,隨後介紹乒乓數據傳輸機制。

每個緩衝區包括幾個獨立的緩衝區bank,每個輸入緩衝區的bank數目等於Tn(input_fm的分塊尺寸)。輸出緩衝區的bank數目等於Tm(output_fm的分塊尺寸)。

雙緩衝用於實現乒乓操作。爲了簡化討論,我們使用圖9的具體例子來展示乒乓操作機制。見圖9中的代碼。“off-load”操作只有在[N/Tn]次“load”操作後纔會發生一次。但每個output_fm傳輸的數據量大於input_fm,比例大約爲Tm/Tn = 64/7 = 9.1,爲了提高帶寬利用率,我們實現了兩套獨立通道,一個用於load操作,另一個用於off-load操作。

圖12顯示了計算和數據傳輸階段的時序圖。


第一個階段時,計算引擎處理輸入緩衝區0同時拷貝下一階段數據到輸入緩衝區1,下一階段做相反的操作。這是輸入特徵圖、權值的乒乓操作。

當[N/Tn]個階段之後,輸出特徵圖寫入DRAM,"off-load"操作會將位於輸出緩衝區0的結果寫回DRAM,直到輸出緩衝區1產生新的結果。這是輸出特徵圖的乒乓操作。注意這兩個獨立存取通道機制適用於該框架下任何其他數據重用的場景。


4.4 外部數據傳輸引擎

使用外部數據傳輸引擎的目的有兩個:(1)可以提供加速器和外部DRAM之間的數據傳輸;(2)可以隔離加速器和平臺、工具相關帶寬特性。

圖13展示了一個實驗,在Vivado 2013.4中的AXI4總線帶寬。


兩幅圖中,我們設置兩個參數,AXI總線到DRAM控制器的位寬,和DRAM控制器的外部帶寬,在它們最高配置下單改變IP-AXI接口數目和每個IP的位寬。

在圖13(a)中,增加IP-AXI接口位寬不影響帶寬(400MB/s在100MHz頻率下)。

在圖13(b)中,更多IP接口加入AXI總線,它的帶寬幾乎線性增長,最高帶寬大約4.5GB/s。

在我們CNN加速器設計中,最小帶寬需要1.55GB/s。根據圖13,4個IP接口足夠用於這個設計。我們使用兩個AXI-IP接口用於數據傳輸引擎0,兩個用於數據傳輸引擎1,如圖10所示。


【5. 評估】

本節首先介紹我們實驗環境設置,然後提供了全面的實驗結果。


5.1 實驗設置

加速器設計用Vivado HLS(v2013.4)實現。該工具允許用C語言實現加速器,並導出RTL爲一個Vivado IP核。CNN設計C代碼通過增加HLS定義的編譯嚮導實現並行化,並行化版本通過時序分析工具進行了驗證。快速綜合前仿真使用該工具的C仿真和C/RTL聯合仿真完成。綜合前資源報告用於設計空間探索和性能估計。導出的RTL使用Vivado v2013.4進行綜合、實現。

我們的實現基於VC707板卡,有一片Xilinx FPGA芯片Virtex 7 485t。它的工作頻率爲100MHz,軟件實現運行在Intel Xeon CPU E5-2430(@2.2GHz),15MB Cache。


5.2 實驗結果

本小節我們先彙報資源佔用,之後對比軟件實現(CPU上)和我們的加速器實現(FPGA上)。最後,給出了我們的實現和已有FPGA實現的對比情況。

佈局佈線由Vivado工具集提供。之後,工具會彙報資源佔用情況,如表6所示。可以看出我們的CNN加速器已經差不多完全利用了FPGA的硬件資源。



我們的加速器和基於軟件的實現性能對比如表7所示。


我們選擇本文提出的跨層加速器作爲對比。軟件在單線程和16線程使用gcc帶-O3優化選項實現。我們的FPGA實現相比單線程軟件實現獲得了17.42x加速比,同時相比16線程軟件實現獲得4.8x加速比。我們的加速器總性能達到61.62GFLOPS。

圖14顯示了我們板卡實現圖。


一個功率計用來測量運行時功率特性,大約18.6瓦特。CPU的熱設計功率爲95瓦特。因此,我們可以粗略估計軟件和FPGA的功率。

表8顯示了能耗相差至少24.6倍,FPGA實現消耗更少能量。

在表5中列出了已有的不同基於FPGA的CNN加速器同我們實現的對比情況。


之前的方法是用GMACS,而我們用GFLOPS作爲性能指標。我們首次將所有結果數字表示爲GOPS,實現同等對比。注意每個乘加操作包括兩個整數操作。表5的第9行顯示,我們的加速器具有61.62GOPS吞吐,相比其他實現至少有3.62倍加速。

由於不同工作使用了不同並行策略和不同FPGA平臺,很難有一個直接對比。爲了提供公平對比,我們進一步給出“性能密度”結果,定義爲單位面積(每slice)的GOPS,可表示一個設計的效率而無需考慮所用的FPGA平臺,最終結果如表5最後一行所示,我們的設計獲得最高性能密度,比第二名高1.8倍。另外,如果使用定點計算引擎,我們的方法可以獲得更好性能和性能密度,因爲定點處理單元使用更少的資源(如表9所示)。

(卜居注:定點評估有問題,加法器不需要DSP,乘法器所需資源不比浮點少)



【6. 相關工作】

本節,我們討論不同設計方法,參考其他之前的基於FPGA的CNN加速器設計工作。

首先,很多CNN應用加速器都聚焦在優化計算引擎上。實現【6】【14】【3】是三個代表。

最早的方法【6】主要用軟件搭起CNN應用,而是用一個硬件脈動結構加速器完成濾波卷積工作。這個設計省下大量硬件資源,用於自動駕駛機器人的嵌入式系統。

【14】【2】【3】在FPGA上實現了完整CNN應用,但採取了不同並行措施。【14】【2】主要利用了特徵圖內部卷積核的並行性。【3】使用了輸出內、輸出間的並行性。我們的並行方法類似,但他們並未使用片上緩衝區做數據重用,而是用很高帶寬和動態重配置來提高性能。我們的實現合理進行數據重用,平衡了帶寬限制和FPGA計算能力。

其次,【12】考慮了CNN的通信問題,選擇最大化數據重用,將帶寬需求降至最低。但他們的方法並未考慮最大化計算性能,另外當換到下一層計算時他們需要爲FPGA重編程(大約10秒),而我們的方案秩序消耗不到1us來配置幾個寄存器。


【7. 結論】

本文中,我們提出了基於roofline模型的CNN FPGA加速方法。首先優化CNN的計算和訪存,之後將所有可能涉及在roofline模型下建模,爲每層尋找最優解。我們通過枚舉發現了最好的跨層設計。最終,我們在Xilinx VC707板卡上實現,性能優於以往的實現。

【8. 致謝】

【9. 參考文獻】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章