CNN已經(jīng)廣泛用于圖像識別,因?yàn)樗苣7律镆曈X神經(jīng)的行為獲得很高識別準(zhǔn)確率。最近,基于深度學(xué)習(xí)算法的現(xiàn)代應(yīng)用高速增長進(jìn)一步改善了研究和實(shí)現(xiàn)。特別地,多種基于FPGA平臺的深度CNN加速器被提出,具有高性能、可重配置、快速開發(fā)周期等優(yōu)勢。
盡管目前FPGA加速器已經(jīng)展示了相比通用處理器更好的性能,加速器設(shè)計(jì)空間并沒有很好發(fā)掘。一個(gè)嚴(yán)重的問題是,一個(gè)FPGA平臺的計(jì)算吞吐并未很好匹配內(nèi)存帶寬。因此,已有的方案要么未充分利用邏輯資源,要么未充分利用內(nèi)存帶寬,都不能獲得最佳性能。同時(shí),深度學(xué)習(xí)應(yīng)用不斷增加的復(fù)雜度和可擴(kuò)展性讓這個(gè)問題更加嚴(yán)重。
為了克服這個(gè)問題,我們利用roofline模型提出一種設(shè)計(jì)分析方法。對于任意CNN設(shè)計(jì)方案,我們量化分析它使用不同優(yōu)化技術(shù)(循環(huán)分塊、變換)的計(jì)算吞吐和所需內(nèi)存帶寬。在roofline模型幫助下,我們可以發(fā)現(xiàn)最好性能和最低FPGA資源需求的解決方案。
作為案例研究,我們在VC707 FPGA板卡上實(shí)現(xiàn)了一個(gè)CNN加速器,并將它與之前的方案對比。我們的實(shí)現(xiàn)在100MHz工作頻率下可獲得61.62GFLOPS的峰值處理能力,大大優(yōu)于之前的方案。
【1. 簡介】
CNN是著名的深度學(xué)習(xí)架構(gòu),從人工神經(jīng)網(wǎng)絡(luò)擴(kuò)展而來,它已經(jīng)大量用于不同應(yīng)用,包括視頻監(jiān)控,移動(dòng)機(jī)器人視覺,數(shù)據(jù)中心的圖像搜索引擎等【6】【7】【8】【10】【14】
受生物視覺神經(jīng)行為的啟發(fā),CNN用多層神經(jīng)元相連處理數(shù)據(jù),在圖像識別中可獲得很高準(zhǔn)確率。最近,基于深度學(xué)習(xí)算法的現(xiàn)代應(yīng)用快速增長進(jìn)一步改善了DCNN的研究。
由于CNN的特殊計(jì)算模式,通用處理器實(shí)現(xiàn)CNN并不高效,所以很難滿足性能需求。于是,最近基于FPGA,GPU甚至ASIC的不同加速器被相繼提出【3】【4】【9】以提升CNN設(shè)計(jì)性能。在這些方案中,基于FPGA的加速器由于其更好的性能,高能效,快速開發(fā)周期以及可重配置能力吸引了越來越多研究者的注意【1】【2】【3】【6】【12】【14】。
對于任意CNN算法實(shí)現(xiàn),存在很多潛在解決方案,導(dǎo)致巨大的設(shè)計(jì)空間。在我們的實(shí)驗(yàn)中,我們發(fā)現(xiàn)使用同樣FPGA邏輯資源的不同方案性能有最大90%差距。尋找最優(yōu)解不無價(jià)值,尤其當(dāng)考慮FPGA平臺計(jì)算資源和內(nèi)存帶寬限制時(shí)。實(shí)際上,如果一個(gè)加速器結(jié)構(gòu)并未仔細(xì)設(shè)計(jì),它的計(jì)算吞吐與內(nèi)存帶寬不匹配。未充分利用邏輯資源或內(nèi)存帶寬都意味著性能下降。
不幸的是,F(xiàn)PGA技術(shù)進(jìn)步和深度學(xué)習(xí)算法同時(shí)將該問題復(fù)雜化了。一方面,當(dāng)前FPGA平臺不斷提升的邏輯資源和內(nèi)存帶寬擴(kuò)大了設(shè)計(jì)空間,采取不同F(xiàn)PGA優(yōu)化技術(shù)(如循環(huán)分塊、變換)會進(jìn)一步擴(kuò)大設(shè)計(jì)空間。另一方面,為了滿足現(xiàn)代應(yīng)用需求,深度學(xué)習(xí)可擴(kuò)展性和復(fù)雜性在持續(xù)增長。因此,在巨大的設(shè)計(jì)空間中尋找最優(yōu)解就更加困難,亟需一種高效檢索基于FPGA的CNN設(shè)計(jì)空間的方法。
為了高效檢索設(shè)計(jì)空間,本文提出了分析設(shè)計(jì)的方法。我們的工作優(yōu)于以前的方法,原因有二:
首先,【1,2,3,6,14】主要關(guān)注計(jì)算引擎優(yōu)化,要么忽視了外部存儲器操作,要么直接將他們的加速器接入外部存儲器。我們的工作則考慮了緩沖區(qū)管理和帶寬優(yōu)化。
其次,【12】通過數(shù)據(jù)重用減少了外部數(shù)據(jù)獲取從而獲得加速。但是這種方法不必導(dǎo)致最優(yōu)全局性能。另外他們的方法需要對每層重新配置,不太方便。我們的加速器無需重編程FPGA就能執(zhí)行不同層的計(jì)算。
本文主要貢獻(xiàn)如下:
* 量化分析可能解決方案的計(jì)算吞吐和所需內(nèi)存帶寬;
* 在計(jì)算資源和內(nèi)存帶寬限制下,我們用roofline模型識別所有可能的解決方案,討論了不同層如何尋找最優(yōu)解;
* 我們提出一種CNN加速器設(shè)計(jì),對每層使用統(tǒng)一的循環(huán)展開因子;
* 實(shí)現(xiàn)了CNN加速器,獲得61.62GFLOPS處理性能,是目前最優(yōu)的;
【2. 背景】
2.1 CNN基礎(chǔ)
CNN受神經(jīng)科學(xué)研究的啟發(fā),經(jīng)過長達(dá)20多年的演變,CNN在計(jì)算機(jī)視覺、AI(【11】【9】)領(lǐng)域越來越突出。作為一種經(jīng)典有監(jiān)督學(xué)習(xí)算法,CNN使用前饋處理用于識別,反饋用于訓(xùn)練。在工業(yè)實(shí)踐中,很多應(yīng)用設(shè)計(jì)者離線訓(xùn)練CNN,然后用訓(xùn)練好的CNN實(shí)現(xiàn)實(shí)時(shí)任務(wù)。因此,前饋計(jì)算速度是比較重要的。本文關(guān)注用基于FPGA的加速器設(shè)計(jì)前饋計(jì)算加速。
一個(gè)典型CNN由兩部分組成:特征提取器 + 分類器。
特征提取器用于過濾輸入圖像,產(chǎn)生表示圖像不同特征的特征圖。這些特征可能包括拐角,線,圓弧等,對位置和形變不敏感。特征提取器的輸出是包含這些特征的低維向量。
該向量送入分類器(通?;趥鹘y(tǒng)的人工神經(jīng)網(wǎng)絡(luò))分類器的目的是決定輸入屬于某個(gè)類別的可能性。
一個(gè)典型CNN包括多個(gè)計(jì)算層,例如,特征提取器可能包括幾個(gè)卷積層和可選的下采樣層。圖1展示了卷積層的計(jì)算。
?
卷積層收到N個(gè)特征圖作為輸入,每個(gè)輸入特征圖被一個(gè)K * K的核卷積,產(chǎn)生一個(gè)輸出特征圖的一個(gè)像素?;瑒?dòng)窗的間隔為S,一般小于K。總共產(chǎn)生M個(gè)輸出特征圖用于下一卷積層。卷積層的偽代碼如下:
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];
}
}
}
}
}
}
在前饋計(jì)算角度,之前的論文【5】證明卷及操作會占據(jù)超過90%的總計(jì)算時(shí)間,所以本文我們關(guān)注加速卷積層。后面會考慮集成其他可選層,如下采樣層、最大池化層。
一個(gè)真實(shí)的CNN
圖2展示了一個(gè)真實(shí)CNN應(yīng)用,摘自【9】。該CNN包括8層,前5層為卷積層,第6~8層為全連接人工神經(jīng)網(wǎng)絡(luò)。該算法接收3通道224x224輸入圖像(從原始256x256三通道RGB圖像變換而來),輸出1000維向量表示1000個(gè)類別的可能性。
第一層輸入為3個(gè)224x224分辨率的特征圖,輸出96個(gè)55x55分辨率的特征圖,輸出分為兩個(gè)集,每個(gè)48組特征圖。表1記錄了該CNN的配置。
?
2.2 Roofline模型
計(jì)算和通信是系統(tǒng)吞吐優(yōu)化的兩個(gè)基本限制。一個(gè)實(shí)現(xiàn)可能是計(jì)算受限的或訪存受限的?!?5】開發(fā)了roofline性能模型來將系統(tǒng)性能同片外存儲帶寬、峰值計(jì)算性能相關(guān)聯(lián)。
公式(1)表示了特定硬件平臺的可達(dá)吞吐率,用GFLOPS作為評估指標(biāo)。
一個(gè)應(yīng)用實(shí)際GFLOPS不會高于這兩項(xiàng)中的最小值:第一項(xiàng)為所有可用計(jì)算資源提供的峰值計(jì)算能力(計(jì)算上限),第二項(xiàng)為給定計(jì)算-通信比時(shí)系統(tǒng)訪存帶寬可支持的最大浮點(diǎn)性能(IO帶寬上限)。計(jì)算-通信比,又稱每DRAM傳輸運(yùn)算量,表示特定系統(tǒng)實(shí)現(xiàn)所需的DRAM訪問量。
圖3將roofline模型可視化,分別展示了計(jì)算上限和IO帶寬上限。算法2相比算法1有更高計(jì)算-通信比,或更好的數(shù)據(jù)重用.從圖中看到算法2充分利用所有硬件計(jì)算資源,性能優(yōu)于算法1。
【3. 加速器設(shè)計(jì)探索】
本節(jié)首先提供了我們的加速器結(jié)構(gòu)概覽,介紹了FPGA平臺上的幾個(gè)設(shè)計(jì)挑戰(zhàn)。為了克服這些挑戰(zhàn),我們提出了相應(yīng)的優(yōu)化技術(shù)。
3.1 設(shè)計(jì)概覽
如圖4所示,一個(gè)CNN加速器設(shè)計(jì)包括:處理單元(PE),片上緩存,外部存儲器以及片內(nèi)外互聯(lián)。PE是卷積的基本計(jì)算單元。用于處理的所有數(shù)據(jù)放在外部存儲器。由于片上資源限制,數(shù)據(jù)首先緩存到片上buffer,之后送入PE。這里使用雙緩沖將傳輸時(shí)間掩蓋于計(jì)算時(shí)間。片上互聯(lián)用于PE和片上緩沖的通信。
在FPGA平臺上有這樣幾個(gè)設(shè)計(jì)挑戰(zhàn)阻礙了高效的CNN加速器設(shè)計(jì):首先,片上數(shù)據(jù)只有很小一部分,故循環(huán)分塊(loop tiling)是必要的,不合適的循環(huán)分塊可能降低數(shù)據(jù)重用和數(shù)據(jù)并行處理效率。
其次,PE和緩沖區(qū)組織及其互聯(lián)應(yīng)仔細(xì)考慮,這樣能高效處理片上數(shù)據(jù)。第三,PE的數(shù)據(jù)處理吞吐應(yīng)該匹配FPGA平臺的片外訪存帶寬。
本節(jié)我們從Code1開始優(yōu)化,提供了連續(xù)步驟獲得最優(yōu)處理效率。
使用了循環(huán)分塊的代碼如下:
注意到循環(huán)變量i和j并未分塊,因?yàn)镃NN中卷積層kernel尺寸K太?。?~11)。
第二,我們討論了計(jì)算引擎優(yōu)化并將計(jì)算性能與分塊系數(shù)建立聯(lián)系。
第三,我們使用數(shù)據(jù)重用技術(shù)減少外存訪問,建立了計(jì)算-訪存比和分塊系數(shù)的聯(lián)系;
第四,利用上述兩個(gè)變量,我們定義了設(shè)計(jì)空間,在FPGA平臺上找最優(yōu)解;
第五,我們討論了怎樣為多層CNN應(yīng)用選擇最好的加速器。
3.2 計(jì)算優(yōu)化
本節(jié)使用標(biāo)準(zhǔn)基于多面體的數(shù)據(jù)相關(guān)性分析【13】來通過循環(huán)調(diào)度和循環(huán)分塊尺寸窮舉法衍生出一系列等效CNN設(shè)計(jì)實(shí)現(xiàn)。
計(jì)算優(yōu)化目標(biāo)是使用有效的循環(huán)展開、流水線,將計(jì)算資源完全利用。本節(jié)假設(shè)所有需要的數(shù)據(jù)都在片上。片外存儲帶寬限制將在3.3節(jié)討論。
循環(huán)展開:用于增加海量計(jì)算資源利用率。在不同循環(huán)層次展開會產(chǎn)生不同實(shí)現(xiàn)。展開的執(zhí)行單元是否共享數(shù)據(jù)以及共享到什么程度會影響生成硬件的復(fù)雜性,最終影響展開的復(fù)制品數(shù)量和硬件運(yùn)行頻率。某個(gè)循環(huán)維度中對一個(gè)數(shù)組的共享關(guān)系可以分為三種類型:
* 無關(guān),如果循環(huán)變量i不出現(xiàn)在數(shù)組A的任何訪問函數(shù),則稱相應(yīng)循環(huán)維度對數(shù)組A是無關(guān)的;
* 獨(dú)立,如果數(shù)組A沿著某個(gè)循環(huán)維度i是完全可分的,稱i對數(shù)組A獨(dú)立;
* 相關(guān),如果數(shù)組A沿某個(gè)循環(huán)維度i不可分,稱i對數(shù)組A依賴;
圖6顯示了不同數(shù)據(jù)共享關(guān)系時(shí)產(chǎn)生的硬件實(shí)現(xiàn)。
獨(dú)立數(shù)據(jù)共享關(guān)系:buffer和計(jì)算引擎直接連接;
無關(guān):生成廣播式連接;
相關(guān):產(chǎn)生帶多路開關(guān)的互聯(lián);
對圖5中代碼分析相關(guān)性,結(jié)論如下表:
最終,選擇too和tii兩個(gè)循環(huán)維度做循環(huán)展開,從而避免生成復(fù)雜硬件拓?fù)?。我們需要將循環(huán)嵌套次序做修改,讓too和tii到最內(nèi)層循環(huán),簡化HLS代碼生成。生成的硬件實(shí)現(xiàn)如圖7所示。
循環(huán)流水線: 是HLS里一項(xiàng)重要優(yōu)化技術(shù),通過將不同循環(huán)層次操作執(zhí)行交疊,可提高系統(tǒng)吞吐。可獲得的吞吐受資源和數(shù)據(jù)相關(guān)性限制。loop-carried相關(guān)性會導(dǎo)致循環(huán)不能完全流水線。
經(jīng)過循環(huán)展開和流水線優(yōu)化的代碼如圖所示。
分塊尺寸選擇:將循環(huán)結(jié)構(gòu)固定后,不同循環(huán)分塊尺寸變化會有巨大性能變化。代碼3中有效的循環(huán)分塊尺寸由公式(2)確定:
?
(卜居注:后面4個(gè)條件是顯然的,第一個(gè)是由于循環(huán)展開、流水線的要求而必須加以限制,為了獲得高計(jì)算能力,必須付出增加硬件面積的代價(jià))
給定特定分塊尺寸組合(Tm, Tn, Tr, Tc),計(jì)算性能(或roofline模型中的計(jì)算上限)可以由公式(3)計(jì)算得到。從公式中看到,計(jì)算上限是Tm和Tn的函數(shù)。
(卜居注:計(jì)算上限的單位是GFLOPS,也就是計(jì)算量除以耗時(shí)。公式分子為完成代碼(1)的總乘、加計(jì)算量,分母為完成計(jì)算所需的時(shí)鐘周期,由于使用了循環(huán)分塊,所以括號內(nèi)的時(shí)鐘周期數(shù)目為流水線從開始到結(jié)束的總周期,括號外為分塊外循環(huán)次數(shù)。)
3.3 訪存優(yōu)化
在3.2節(jié),我們討論了如何衍生設(shè)計(jì)變種使用不同計(jì)算上限,假設(shè)計(jì)算引擎所有數(shù)據(jù)訪問都是片上已經(jīng)緩存的。但是,當(dāng)考慮內(nèi)存帶寬限制時(shí),高計(jì)算上限的設(shè)計(jì)變種不一定能達(dá)到更高計(jì)算上限。本節(jié)我們將展示如何通過高效數(shù)據(jù)重用降低所需通信量。
圖9展示了一個(gè)CNN層的內(nèi)存?zhèn)鬏敳僮?。輸?輸出特征圖和權(quán)值在計(jì)算引擎開始之前就已經(jīng)載入,產(chǎn)生的輸出特征圖寫回主存。
本地存儲提升:如果最內(nèi)層循環(huán)的通信部分(圖9循環(huán)變量為ti)與某個(gè)數(shù)組是無關(guān)的,那么該循環(huán)會有冗余內(nèi)存操作。本地存儲提升【13】可以用于降低冗余操作。
在圖9中,最內(nèi)層循環(huán)ti與output_fm是無關(guān)的,所以訪問output_fm的操作可以提升到外層循環(huán)。注意到提升操作可以一直執(zhí)行,直到與循環(huán)變量相關(guān)。
利用該技術(shù),對output_fm的訪存需求從降低至。
為了數(shù)據(jù)重用而實(shí)行循環(huán)變換:為了最大可能進(jìn)行數(shù)據(jù)重用,我們使用基于多面體的優(yōu)化框架來發(fā)現(xiàn)所有有效的循環(huán)變換。表3顯示了循環(huán)層次和數(shù)組之間的數(shù)據(jù)共享關(guān)系。本地存儲提升方法用到每個(gè)可能的循環(huán)調(diào)度中,盡可能減少總通信量。
?
計(jì)算-通信比:用來描述每次訪存的計(jì)算操作。數(shù)據(jù)重用優(yōu)化會降低總的訪存次數(shù),進(jìn)而提升計(jì)算-通信比。
圖9代碼的計(jì)算-通信比可以由公式(4)計(jì)算:
?
里面變量較多,分別表示如公式(5)~(11)
?
給定一個(gè)特定循環(huán)結(jié)構(gòu)和分塊尺寸組(Tm, Tn, Tr, Tc),計(jì)算-通信比可以通過上述公式計(jì)算得到。
3.4 設(shè)計(jì)空間探索
綜上所述,給定(Tm, Tn, Tr, Tc),可以計(jì)算該設(shè)計(jì)的計(jì)算能力上限和計(jì)算-通信比。枚舉所有可能的循環(huán)次序和分塊尺寸可以產(chǎn)生一系列計(jì)算性能和計(jì)算-通信比對,圖8(a)顯示了例子CNN第5層在roofline模型中的所有有效解,X軸表示計(jì)算-通信比,或者每DRAM字節(jié)訪問的浮點(diǎn)處理性能。Y軸表示計(jì)算性能(GFLOPS)。任意點(diǎn)與原點(diǎn)(0, 0)的連線斜率表示該實(shí)現(xiàn)的最低訪存帶寬需求。
例如,設(shè)計(jì)P的最低訪存帶寬需求和P' 是相同的。
在圖8(b)中,帶寬上限線和計(jì)算上限是由特定平臺決定的。在帶寬上限線左側(cè)的點(diǎn)需要比平臺能提供的訪存帶寬更高,因此不可實(shí)現(xiàn),即圖中雖然設(shè)計(jì)A取得了最高的計(jì)算性能,但平臺內(nèi)存帶寬不能滿足該設(shè)計(jì)的需求,所以平臺上可以獲得的性能落到A' 位置。
平臺支持的設(shè)計(jì)定義為:位于帶寬上限線右側(cè)的集合。位于帶寬上限線的是左側(cè)點(diǎn)的投影。
我們探索平臺支持最優(yōu)方案的策略如下:最高性能,最高計(jì)算-通信比(這樣有最小的訪存需求)。該準(zhǔn)則基于我們可以使用更少IO口,更少LUT和硬件連線,數(shù)據(jù)傳輸引擎有更低帶寬需求。因此,點(diǎn)C是CNN第5層的最終選擇,它的帶寬需求為2.2GB/s。
3.5 多層CNN加速器設(shè)計(jì)
前幾節(jié)我們討論了如何為每個(gè)卷積層尋找最優(yōu)實(shí)現(xiàn)參數(shù)。在CNN應(yīng)用中,這些參數(shù)可能在不同層之間變化。表4顯示了例子CNN中每層最優(yōu)展開系數(shù)(Tm和Tn):
設(shè)計(jì)一個(gè)支持不同展開系數(shù)的多個(gè)卷積層的硬件加速器將會非常有挑戰(zhàn)性,因?yàn)樾枰O(shè)計(jì)復(fù)雜的硬件架構(gòu)來支持重配置計(jì)算引擎和互聯(lián)。
一種替代方案是所有層都用同一套展開系數(shù)。我們枚舉了所有可行的解來選擇最優(yōu)的全局設(shè)計(jì)參數(shù)。使用統(tǒng)一展開系數(shù)易于設(shè)計(jì)實(shí)現(xiàn),但對某些層是次優(yōu)解。表4表明使用統(tǒng)一展開系數(shù)(64, 7),性能下降不超過5%。因此我們的實(shí)驗(yàn)選擇了這個(gè)展開系數(shù)。
枚舉空間大約98,000,使用普通筆記本大約10分鐘就能完成。
【4. 實(shí)現(xiàn)細(xì)節(jié)】
本節(jié)描述我們解決方案的具體實(shí)現(xiàn)。
4.1. 系統(tǒng)概述
圖10 顯示了我們的實(shí)現(xiàn)概述。
全部系統(tǒng)都放在了單個(gè)FPGA芯片,使用DDR3 DRAM用于外部存儲。
MicroBlaze是一個(gè)RISC處理器軟核,用于幫助CNN加速器啟動(dòng),與主機(jī)CPU通信,以及計(jì)時(shí)。
AXI4lite總線用于傳輸命令,AXI4總線用于傳輸數(shù)據(jù)
CNN加速器作為AXI總線上一個(gè)IP。它從MicroBlaze接收命令和配置參數(shù),與定制的數(shù)據(jù)傳輸引擎通過FIFO接口通信,該數(shù)據(jù)傳輸引擎可以獲取通過AXI4總線外部存儲。
MicroBlaze和CNN加速器使用中斷機(jī)制來提供精確的計(jì)時(shí)。
4.2 計(jì)算引擎
圖11的計(jì)算引擎部分顯示了我們實(shí)現(xiàn)的模塊圖。它們是基于第三節(jié)分析結(jié)果而設(shè)計(jì)的。
二級循環(huán)展開(圖2中的Tm和Tn)實(shí)現(xiàn)為并行執(zhí)行計(jì)算引擎,使用了類似圖7的樹狀結(jié)構(gòu)。對于最優(yōu)的跨層設(shè)計(jì)(Tm, Tn)=(64,7),單個(gè)引擎接收來自輸入特征圖的7個(gè)輸入,以及7個(gè)來自權(quán)值的輸入以及一個(gè)bias輸入。64個(gè)復(fù)制的結(jié)構(gòu)用來展開Tm。
(卜居注:由于使用了64個(gè)相同的計(jì)算引擎,每個(gè)消耗35個(gè)dsp,有7個(gè)乘法器和7個(gè)加法器組成,每個(gè)加法器消耗2個(gè)dsp,每個(gè)乘法器消耗3個(gè)dsp)
4.3 存儲子系統(tǒng)
片上緩沖區(qū)是基于雙緩沖設(shè)計(jì)的,工作在乒乓模式來掩蓋數(shù)據(jù)傳輸時(shí)間到計(jì)算時(shí)間中。它們一共有4組,兩組用于輸入特征圖、權(quán)值,兩組用于輸出特征圖。我們先介紹每個(gè)緩沖區(qū)的組織,隨后介紹乒乓數(shù)據(jù)傳輸機(jī)制。
每個(gè)緩沖區(qū)包括幾個(gè)獨(dú)立的緩沖區(qū)bank,每個(gè)輸入緩沖區(qū)的bank數(shù)目等于Tn(input_fm的分塊尺寸)。輸出緩沖區(qū)的bank數(shù)目等于Tm(output_fm的分塊尺寸)。
雙緩沖用于實(shí)現(xiàn)乒乓操作。為了簡化討論,我們使用圖9的具體例子來展示乒乓操作機(jī)制。見圖9中的代碼?!皁ff-load”操作只有在[N/Tn]次“l(fā)oad”操作后才會發(fā)生一次。但每個(gè)output_fm傳輸?shù)臄?shù)據(jù)量大于input_fm,比例大約為Tm/Tn = 64/7 = 9.1,為了提高帶寬利用率,我們實(shí)現(xiàn)了兩套獨(dú)立通道,一個(gè)用于load操作,另一個(gè)用于off-load操作。
圖12顯示了計(jì)算和數(shù)據(jù)傳輸階段的時(shí)序圖。
第一個(gè)階段時(shí),計(jì)算引擎處理輸入緩沖區(qū)0同時(shí)拷貝下一階段數(shù)據(jù)到輸入緩沖區(qū)1,下一階段做相反的操作。這是輸入特征圖、權(quán)值的乒乓操作。
當(dāng)[N/Tn]個(gè)階段之后,輸出特征圖寫入DRAM,"off-load"操作會將位于輸出緩沖區(qū)0的結(jié)果寫回DRAM,直到輸出緩沖區(qū)1產(chǎn)生新的結(jié)果。這是輸出特征圖的乒乓操作。注意這兩個(gè)獨(dú)立存取通道機(jī)制適用于該框架下任何其他數(shù)據(jù)重用的場景。
4.4 外部數(shù)據(jù)傳輸引擎
使用外部數(shù)據(jù)傳輸引擎的目的有兩個(gè):(1)可以提供加速器和外部DRAM之間的數(shù)據(jù)傳輸;(2)可以隔離加速器和平臺、工具相關(guān)帶寬特性。
圖13展示了一個(gè)實(shí)驗(yàn),在Vivado 2013.4中的AXI4總線帶寬。
兩幅圖中,我們設(shè)置兩個(gè)參數(shù),AXI總線到DRAM控制器的位寬,和DRAM控制器的外部帶寬,在它們最高配置下單改變IP-AXI接口數(shù)目和每個(gè)IP的位寬。
在圖13(a)中,增加IP-AXI接口位寬不影響帶寬(400MB/s在100MHz頻率下)。
在圖13(b)中,更多IP接口加入AXI總線,它的帶寬幾乎線性增長,最高帶寬大約4.5GB/s。
在我們CNN加速器設(shè)計(jì)中,最小帶寬需要1.55GB/s。根據(jù)圖13,4個(gè)IP接口足夠用于這個(gè)設(shè)計(jì)。我們使用兩個(gè)AXI-IP接口用于數(shù)據(jù)傳輸引擎0,兩個(gè)用于數(shù)據(jù)傳輸引擎1,如圖10所示。
【5. 評估】
本節(jié)首先介紹我們實(shí)驗(yàn)環(huán)境設(shè)置,然后提供了全面的實(shí)驗(yàn)結(jié)果。
5.1 實(shí)驗(yàn)設(shè)置
加速器設(shè)計(jì)用Vivado HLS(v2013.4)實(shí)現(xiàn)。該工具允許用C語言實(shí)現(xiàn)加速器,并導(dǎo)出RTL為一個(gè)Vivado IP核。CNN設(shè)計(jì)C代碼通過增加HLS定義的編譯向?qū)?shí)現(xiàn)并行化,并行化版本通過時(shí)序分析工具進(jìn)行了驗(yàn)證。快速綜合前仿真使用該工具的C仿真和C/RTL聯(lián)合仿真完成。綜合前資源報(bào)告用于設(shè)計(jì)空間探索和性能估計(jì)。導(dǎo)出的RTL使用Vivado v2013.4進(jìn)行綜合、實(shí)現(xiàn)。
我們的實(shí)現(xiàn)基于VC707板卡,有一片Xilinx FPGA芯片Virtex 7 485t。它的工作頻率為100MHz,軟件實(shí)現(xiàn)運(yùn)行在Intel Xeon CPU E5-2430(@2.2GHz),15MB Cache。
5.2 實(shí)驗(yàn)結(jié)果
本小節(jié)我們先匯報(bào)資源占用,之后對比軟件實(shí)現(xiàn)(CPU上)和我們的加速器實(shí)現(xiàn)(FPGA上)。最后,給出了我們的實(shí)現(xiàn)和已有FPGA實(shí)現(xiàn)的對比情況。
布局布線由Vivado工具集提供。之后,工具會匯報(bào)資源占用情況,如表6所示??梢钥闯鑫覀兊腃NN加速器已經(jīng)差不多完全利用了FPGA的硬件資源。
我們的加速器和基于軟件的實(shí)現(xiàn)性能對比如表7所示。
我們選擇本文提出的跨層加速器作為對比。軟件在單線程和16線程使用gcc帶-O3優(yōu)化選項(xiàng)實(shí)現(xiàn)。我們的FPGA實(shí)現(xiàn)相比單線程軟件實(shí)現(xiàn)獲得了17.42x加速比,同時(shí)相比16線程軟件實(shí)現(xiàn)獲得4.8x加速比。我們的加速器總性能達(dá)到61.62GFLOPS。
圖14顯示了我們板卡實(shí)現(xiàn)圖。
一個(gè)功率計(jì)用來測量運(yùn)行時(shí)功率特性,大約18.6瓦特。CPU的熱設(shè)計(jì)功率為95瓦特。因此,我們可以粗略估計(jì)軟件和FPGA的功率。
表8顯示了能耗相差至少24.6倍,F(xiàn)PGA實(shí)現(xiàn)消耗更少能量。
在表5中列出了已有的不同基于FPGA的CNN加速器同我們實(shí)現(xiàn)的對比情況。
之前的方法是用GMACS,而我們用GFLOPS作為性能指標(biāo)。我們首次將所有結(jié)果數(shù)字表示為GOPS,實(shí)現(xiàn)同等對比。注意每個(gè)乘加操作包括兩個(gè)整數(shù)操作。表5的第9行顯示,我們的加速器具有61.62GOPS吞吐,相比其他實(shí)現(xiàn)至少有3.62倍加速。
由于不同工作使用了不同并行策略和不同F(xiàn)PGA平臺,很難有一個(gè)直接對比。為了提供公平對比,我們進(jìn)一步給出“性能密度”結(jié)果,定義為單位面積(每slice)的GOPS,可表示一個(gè)設(shè)計(jì)的效率而無需考慮所用的FPGA平臺,最終結(jié)果如表5最后一行所示,我們的設(shè)計(jì)獲得最高性能密度,比第二名高1.8倍。另外,如果使用定點(diǎn)計(jì)算引擎,我們的方法可以獲得更好性能和性能密度,因?yàn)槎c(diǎn)處理單元使用更少的資源(如表9所示)。
(卜居注:定點(diǎn)評估有問題,加法器不需要DSP,乘法器所需資源不比浮點(diǎn)少)
【6. 相關(guān)工作】
本節(jié),我們討論不同設(shè)計(jì)方法,參考其他之前的基于FPGA的CNN加速器設(shè)計(jì)工作。
首先,很多CNN應(yīng)用加速器都聚焦在優(yōu)化計(jì)算引擎上。實(shí)現(xiàn)【6】【14】【3】是三個(gè)代表。
最早的方法【6】主要用軟件搭起CNN應(yīng)用,而是用一個(gè)硬件脈動(dòng)結(jié)構(gòu)加速器完成濾波卷積工作。這個(gè)設(shè)計(jì)省下大量硬件資源,用于自動(dòng)駕駛機(jī)器人的嵌入式系統(tǒng)。
【14】【2】【3】在FPGA上實(shí)現(xiàn)了完整CNN應(yīng)用,但采取了不同并行措施?!?4】【2】主要利用了特征圖內(nèi)部卷積核的并行性。【3】使用了輸出內(nèi)、輸出間的并行性。我們的并行方法類似,但他們并未使用片上緩沖區(qū)做數(shù)據(jù)重用,而是用很高帶寬和動(dòng)態(tài)重配置來提高性能。我們的實(shí)現(xiàn)合理進(jìn)行數(shù)據(jù)重用,平衡了帶寬限制和FPGA計(jì)算能力。
其次,【12】考慮了CNN的通信問題,選擇最大化數(shù)據(jù)重用,將帶寬需求降至最低。但他們的方法并未考慮最大化計(jì)算性能,另外當(dāng)換到下一層計(jì)算時(shí)他們需要為FPGA重編程(大約10秒),而我們的方案秩序消耗不到1us來配置幾個(gè)寄存器。
【7. 結(jié)論】
本文中,我們提出了基于roofline模型的CNN FPGA加速方法。首先優(yōu)化CNN的計(jì)算和訪存,之后將所有可能涉及在roofline模型下建模,為每層尋找最優(yōu)解。我們通過枚舉發(fā)現(xiàn)了最好的跨層設(shè)計(jì)。最終,我們在Xilinx VC707板卡上實(shí)現(xiàn),性能優(yōu)于以往的實(shí)現(xiàn)。
評論