蘇梓培,楊 鑫,陳弟虎,粟 濤
(中山大學(xué)電子與信息工程學(xué)院,廣東 廣州 510275)
隨著科技的日益發(fā)展,人們開(kāi)始著重于對(duì)人工智能的研究。在計(jì)算機(jī)視覺(jué)領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)CNN運(yùn)用十分廣泛,且在各種各樣的應(yīng)用中遍地開(kāi)花。CNN模型的數(shù)據(jù)量不斷增大,精確度不斷提高,同時(shí)帶來(lái)的是模型的復(fù)雜化,計(jì)算量的劇增。而在一些特別的移動(dòng)端的應(yīng)用需求(如無(wú)人駕駛)中,對(duì)于數(shù)據(jù)量巨大的CNN網(wǎng)絡(luò),需要十分快速的前饋計(jì)算來(lái)滿足需求,因此研究CNN加速器顯得十分必要。
現(xiàn)在有許多研究CNN加速器的工作,而隨著CNN的發(fā)展,層數(shù)越來(lái)越多,數(shù)據(jù)量越來(lái)越大,卷積操作越來(lái)越復(fù)雜,使得神經(jīng)網(wǎng)絡(luò)的計(jì)算無(wú)法簡(jiǎn)單地映射到直接對(duì)應(yīng)的硬件上,要考慮到各種硬件部件的復(fù)用。運(yùn)算的基本單位為一個(gè) PE(Processing Element),而不同的 PE 也對(duì)應(yīng)著不同的架構(gòu):有的PE是一個(gè)乘加器,如文獻(xiàn)[1,2],通過(guò) PE 間數(shù)據(jù)傳輸進(jìn)行數(shù)據(jù)復(fù)用;有的 PE 是多個(gè)乘加器與加法樹(shù)的組合,如文獻(xiàn)[3,4];也有的 PE 除了乘加器,還包括數(shù)據(jù)傳輸與 FIFO,如文獻(xiàn)[5,6]。
但是,不同的應(yīng)用場(chǎng)景對(duì)加速器的具體需求不一樣。應(yīng)用的場(chǎng)景不同,硬件資源約束不同,使用網(wǎng)絡(luò)也不同,因此需要能夠快速尋找并快速設(shè)計(jì)性能較優(yōu)的CNN加速器。且現(xiàn)有移動(dòng)端所使用的網(wǎng)絡(luò)層數(shù)偏中。而MobileNet中提出的深度可分離卷積的運(yùn)用也越來(lái)越多,因此需要適配DW(Depthwise)/PW(Pointwise)/CONV(Convolution)的加速器架構(gòu)。文獻(xiàn)[7,8]設(shè)計(jì)了專(zhuān)門(mén)用于深度可分離卷積的神經(jīng)網(wǎng)絡(luò),但這些神經(jīng)網(wǎng)絡(luò)不能兼容經(jīng)典的卷積。
針對(duì)上述問(wèn)題,本文提出了一個(gè)基于3D可擴(kuò)展PE陣列的CNN加速器,能夠很好地根據(jù)不同的網(wǎng)絡(luò)和硬件資源進(jìn)行適配,并根據(jù)約束找到最優(yōu)的3D-PE每一維的PE數(shù)量。該加速器支持CONV、DW CONV(Depthwise Convolution)和PW CONV(Pointwise Convolution)功能,支持目前常見(jiàn)的移動(dòng)端網(wǎng)絡(luò),如yolo-tiny、mobile-net等。最后使用該加速器構(gòu)建了一個(gè)實(shí)時(shí)的目標(biāo)檢測(cè)系統(tǒng)。
在CNN神經(jīng)網(wǎng)絡(luò)中卷積運(yùn)算的運(yùn)算量巨大,因此需要進(jìn)行并行運(yùn)算?,F(xiàn)有的嵌入式移動(dòng)端的CNN加速主要采用2D的PE陣列進(jìn)行并行加速,即沒(méi)有并行運(yùn)算通道的運(yùn)算,只對(duì)其中一個(gè)通道的寬與高的像素運(yùn)算進(jìn)行并行化。
2D的PE陣列對(duì)大的特征圖能夠很好地進(jìn)行并行加速,并且能得到很好的性能。但是,2D的加速存在上限,如果網(wǎng)絡(luò)的特征圖的尺寸(寬/高)比較小,但是通道數(shù)比較多,在2D上會(huì)存在PE的浪費(fèi),而不能很好地利用這些PE對(duì)其他通道進(jìn)行并行運(yùn)算。
本文提出3D可擴(kuò)展PE陣列,如圖1所示,PE 陣列分為3個(gè)維度,分別是PE的寬X、PE的高Y和PE的通道數(shù)C,分別對(duì)應(yīng)特征圖的寬、高和輸入通道數(shù)??蓴U(kuò)展的意思是可以根據(jù)現(xiàn)場(chǎng)應(yīng)用的約束,定義其3個(gè)維度上的PE數(shù)量參數(shù)。
Figure 1 3D-PE array
本文設(shè)計(jì)的3D-PE陣列中,每個(gè)PE對(duì)應(yīng)一個(gè)通道的一個(gè)像素點(diǎn)的輸出,在3×3 CONV與3×3 DW CONV中,每個(gè)PE負(fù)責(zé)執(zhí)行9次乘加運(yùn)算;在1×1 PW CONV 與全連接層中,每個(gè)PE負(fù)責(zé)執(zhí)行1次乘加運(yùn)算。
在1×1 PW CONV模式與全連接層的模式下,PE陣列的運(yùn)算方式如圖2所示。例子中使用了2×2×2的PE陣列,灰色部分代表已經(jīng)運(yùn)算完成的特征圖部分,3D-PE先向右滑動(dòng)窗口,當(dāng)過(guò)了右邊界之后,就切換到下一行進(jìn)行運(yùn)算。
Figure 2 Sample diagram of 3D-PE array running 1×1 convolution
在CONV(3×3)模式與DW CONV模式下,3D-PE陣列的運(yùn)作方式如圖3所示,每個(gè)PE表示一個(gè)輸出神經(jīng)元,3×3卷積過(guò)程中,需要9個(gè)周期輸入9個(gè)數(shù)據(jù),9個(gè)周期之后則同時(shí)得到個(gè)數(shù)與PE數(shù)量相同的輸出值。圖3中灰色部分為輸入緩存,只加載新數(shù)值,用過(guò)的2列數(shù)值可以復(fù)用。
Figure 3 Sample diagram of 3D-PE array running 3×3 convolution
PE的數(shù)量根據(jù)應(yīng)用場(chǎng)景的不同而有不同的約束,包括芯片面積約束和芯片功耗約束。很顯然,PE的數(shù)量越多,必定得到的并行度越高,得到的性能也越高,但是與此同時(shí)也會(huì)帶來(lái)面積功耗的增加,因此PE數(shù)量的選擇是根據(jù)應(yīng)用場(chǎng)景進(jìn)行折衷考慮得到的。因此,PE利用率則成為了其中一個(gè)關(guān)鍵的因素。越高的PE利用率,則可以在同樣的PE數(shù)量下得到更優(yōu)的性能,在同樣的性能下使用更少的硬件。本文提出3D可擴(kuò)展PE陣列,意在在約束PE數(shù)量的情況下,比起2D的陣列,能夠提高利用率,獲得更好的性能;同時(shí)能夠應(yīng)對(duì)不同應(yīng)用場(chǎng)景的約束,得到不同約束下的3個(gè)最優(yōu)參數(shù)。
在加速器的運(yùn)算過(guò)程中,PE數(shù)量有限,并行程度有限。本文加速器采用的是3D的PE陣列,在3個(gè)維度進(jìn)行并行。為了評(píng)判其具體性能,建立了相關(guān)數(shù)學(xué)模型,針對(duì)不同的運(yùn)算層,有不同的計(jì)算量與并行方式。
不同的運(yùn)算層,每次使用PE陣列需要的周期數(shù)不一樣,3×3卷積需要9個(gè)周期進(jìn)行乘加運(yùn)算,而1×1的PW CONV和全連接層則只需要1個(gè)周期便可得到結(jié)果,而深度可分離卷積輸入通道與輸出通道一一對(duì)應(yīng)。把需要使用PE陣列的次數(shù)與每次使用所需要的周期數(shù)相乘,得到每一層需要的周期數(shù)。把整個(gè)網(wǎng)絡(luò)需要的周期數(shù)累加起來(lái),就可以得到該網(wǎng)絡(luò)運(yùn)行需要的周期數(shù),其計(jì)算方式如式(1)~式(5)所示:
(1)
(2)
(3)
(4)
(5)
其中,XPE表示PE陣列的寬,YPE表示PE陣列的高,CPE表示PE陣列的通道數(shù),w表示特征圖的寬,h表示特征圖的高,Cin表示特征圖的通道數(shù),Cyclei表示第i層運(yùn)算的周期數(shù)。
通過(guò)以上運(yùn)算得到網(wǎng)絡(luò)運(yùn)行所需要的周期數(shù),就可以從側(cè)面了解網(wǎng)絡(luò)運(yùn)行的性能,因此就可以據(jù)此評(píng)判參數(shù)的優(yōu)劣。當(dāng)CPE為1時(shí),就等同于使用的是2D-PE陣列。
本節(jié)首先分析PE數(shù)量不斷增加時(shí)2D-PE陣列的CNN加速器的性能提高情況。當(dāng)PE數(shù)量增加時(shí),選取2D的最優(yōu)參數(shù)XPE與YPE進(jìn)行計(jì)算,采用mobile-net-v1網(wǎng)絡(luò),分別對(duì)上限為256與1 024個(gè)PE數(shù)量進(jìn)行測(cè)量,計(jì)算結(jié)果如圖4所示。GOPS與PE數(shù)量的關(guān)系如圖4a所示。隨著PE數(shù)量的增加,的確可以帶來(lái)性能的提高,但是存在邊際效益遞減的情況:當(dāng)PE數(shù)量增加到一定值后,繼續(xù)增加PE帶來(lái)的性能提升幅度下降。圖4b表示的是GOPS/PE與PE數(shù)量的關(guān)系。從圖4b中可以看出,前面增加PE令GOPS/PE呈現(xiàn)波動(dòng)性的特征,表示增加PE的數(shù)量仍能保持提高性能的優(yōu)勢(shì),但是后面繼續(xù)增加PE的數(shù)量只會(huì)讓GOPS/PE逐漸下降。圖4中2D的PE陣列加速,在PE數(shù)量增加到一定程度后,將會(huì)出現(xiàn)更多的PE浪費(fèi)。就mobile-net-v1而言,PE數(shù)量到達(dá)60左右后就出現(xiàn)了明顯的增長(zhǎng)停滯。
Figure 4 Statistical graph of the marginal effect of total PE number on 2D-PE array
因此,本文設(shè)計(jì)引入了3D-PE陣列,使PE陣列的并行度能夠更加靈活,且不會(huì)像2D-PE陣列一樣快速到達(dá)瓶頸。與上述2D-PE進(jìn)行同樣的操作,對(duì)mobile-net-v1進(jìn)行測(cè)量,計(jì)算結(jié)果如圖5所示。從圖5a可以看出,增加PE數(shù)量,GOPS的提升幾乎是線性的,即使PE數(shù)量到了1 024個(gè)依然可以線性增長(zhǎng),這說(shuō)明3D-PE陣列可以跨越2D-PE陣列的瓶頸,進(jìn)行卷積操作的加速運(yùn)算時(shí)性能能夠更優(yōu)。圖5b中可以看出,GOPS/PE在震蕩,原因是存在一些更優(yōu)的3D參數(shù)組合,存在一定的震蕩范圍。
Figure 5 Statistical graph of the marginal effect of total PE number on 3D-PE array
然而即使是PE數(shù)量相同,3個(gè)維度不同的參數(shù)也會(huì)有很明顯的性能差別。當(dāng)PE數(shù)量相同,XPE、YPE、CPE3個(gè)并行參數(shù)不同時(shí),性能差距也會(huì)很大,如圖6所示高谷與低谷相差甚遠(yuǎn)。因此,通過(guò)模型可以計(jì)算出在同樣的PE數(shù)量條件下,可以得到更優(yōu)性能的3D的并行參數(shù)。
Figure 6 Performance difference caused by three different parameters of 3D-PE
如上所述,使用3D-PE陣列可以更好地利用PE,可以更加靈活地配置PE陣列在3個(gè)維度上的并行度。因此,相比2D陣列,本文設(shè)計(jì)引入的3D-PE陣列存在其優(yōu)勢(shì)。
本文CNN加速器的整體架構(gòu)如圖7所示。其核心思路是,整個(gè)加速器由一個(gè)中央控制器Controller進(jìn)行控制,通過(guò)中央控制器控制每個(gè)子模塊的工作模式和狀態(tài)。加速器設(shè)置有2個(gè)數(shù)據(jù)Buffer,在一層運(yùn)算中分別作為Input Buffer和Output Buffer,而他們的功能是復(fù)用的,即在一層運(yùn)算中,若數(shù)據(jù)可以完全被存放進(jìn)Buffer中,那么進(jìn)入下一層運(yùn)算前,就不需要重新把數(shù)據(jù)輸出到內(nèi)存,也不再需要從內(nèi)存中導(dǎo)入數(shù)據(jù),這樣就可以減少CNN加速器訪存時(shí)間。
Figure 7 Schematic diagram of the overall architecture of the CNN accelerator
同時(shí)設(shè)置了一個(gè)權(quán)值Buffer,因?yàn)闄?quán)值文件是比較大的,也不能完全存放在芯片上,因此會(huì)在每層運(yùn)算期間對(duì)內(nèi)存中的權(quán)值進(jìn)行訪問(wèn),而暫時(shí)緩存的Buffer就是權(quán)值Buffer。由于本設(shè)置采用了權(quán)值全復(fù)用的策略,權(quán)值被送入計(jì)算單元陣列之后就可以被完全復(fù)用,因此可以在權(quán)值Buffer中釋放掉其空間,設(shè)計(jì)為FIFO的形式。采用權(quán)值Buffer可以把訪問(wèn)權(quán)值的時(shí)間隱藏在計(jì)算時(shí)間當(dāng)中。
由于計(jì)算模塊中采用了3D-PE陣列的形式,數(shù)據(jù)是并行進(jìn)入陣列的,而且不同的卷積操作中,數(shù)據(jù)進(jìn)入時(shí)序與方式會(huì)有些許差別,因此在Buffer和計(jì)算模塊中間插入了負(fù)責(zé)協(xié)調(diào)和重排序以及緩存數(shù)據(jù)的模塊,作為Buffer和計(jì)算模塊之間的一個(gè)緩沖。
Figure 8 CNN accelerator pipeline design
在該系統(tǒng)框架中,若一層的數(shù)據(jù)可以被一個(gè)Buffer緩存起來(lái),那么在2層之間就完全不需要進(jìn)行數(shù)據(jù)的load和store操作,只需要從內(nèi)存中載入該層所需的權(quán)值,這樣就能減少訪存時(shí)間,只需要訪存必要的輸入特征圖和輸出的最終結(jié)果,大大減少了整個(gè)CNN的運(yùn)行時(shí)間。
接下來(lái)具體介紹加速器的數(shù)據(jù)通路和流水線設(shè)計(jì)。本文的CNN加速器采用了類(lèi)似中央處理器的組織架構(gòu),把控制器類(lèi)比為指令發(fā)射模塊,將控制信號(hào)與數(shù)據(jù)一起在流水線上進(jìn)行流水,可以保證每個(gè)模塊的控制信號(hào)的正確運(yùn)行。流水線設(shè)置為從數(shù)據(jù)Input Buffer中取數(shù)值,到最后運(yùn)算結(jié)束存回Output Buffer這一數(shù)據(jù)通路。整體的流水線設(shè)計(jì)如圖8所示。
整條流水線可以分為以下幾個(gè)步驟:取數(shù)據(jù)、重排序、計(jì)算、重排序和存數(shù)據(jù)。
(1)取數(shù)據(jù):流水線執(zhí)行的最開(kāi)端,是Controller發(fā)出“指令”,向Data Buffer申請(qǐng)?jiān)L問(wèn),根據(jù)當(dāng)前運(yùn)行層,BufferA、BufferB中的一個(gè)為Input Buffer,另一個(gè)為Output Buffer。從Input Buffer的每個(gè)bank中取出一個(gè)數(shù)據(jù),發(fā)送到重排序模塊。
(2)重排序:此時(shí)Controller發(fā)出的指令也沿著流水線到達(dá)了重排序(Gather)模塊,該模塊對(duì)送入計(jì)算陣列之前的數(shù)據(jù)進(jìn)行重排序。除了從Buffer讀到的數(shù)據(jù)以外,還有數(shù)據(jù)復(fù)用的不需要重新從Buffer訪問(wèn)的數(shù)據(jù)。因此,需要對(duì)從Buffer讀取的數(shù)據(jù)和在同一模塊中復(fù)用的之前的數(shù)據(jù)進(jìn)行統(tǒng)一規(guī)整,得到重排序后的數(shù)據(jù)。之后再把排序好的數(shù)據(jù)發(fā)送到計(jì)算陣列模塊進(jìn)行后續(xù)運(yùn)算。
(3)計(jì)算:計(jì)算所需要的數(shù)據(jù)已經(jīng)經(jīng)過(guò)了Gather模塊排序,只需要對(duì)數(shù)據(jù)進(jìn)行運(yùn)算即可。而計(jì)算陣列在計(jì)算過(guò)程中,不同的卷積運(yùn)算層會(huì)有不同的計(jì)算模式,根據(jù)不同的計(jì)算模式,對(duì)數(shù)據(jù)通路進(jìn)行控制,這個(gè)會(huì)在后續(xù)章節(jié)進(jìn)行詳細(xì)描述。計(jì)算模塊包括卷積、全連接、池化和激活等操作。某些運(yùn)算模式中(比如3×3 CONV),計(jì)算的過(guò)程還需要加部分和,這個(gè)部分和產(chǎn)生于之前計(jì)算模塊的輸出,部分和存儲(chǔ)在Output Buffer,當(dāng)計(jì)算模塊需要部分和時(shí)會(huì)讀取Output Buffer中的數(shù)據(jù)。
(4)重排序與存儲(chǔ)數(shù)據(jù):最后,從計(jì)算模塊中計(jì)算出來(lái)的數(shù)值,看需要是否進(jìn)行池化和激活操作,之后再經(jīng)過(guò)一次重排序,得到與Output Buffer的多個(gè)bank相對(duì)應(yīng)的數(shù)據(jù)排序,然后將重排序后的數(shù)據(jù)進(jìn)行存儲(chǔ),作為部分和或者該層的輸出。
首先描述PE的基本結(jié)構(gòu),如圖9所示。PE陣列存在3個(gè)數(shù)據(jù)級(jí),分別是Input REG輸入寄存器級(jí)、MAC PE計(jì)算陣列級(jí)和Output REG輸出寄存器級(jí)。
Figure 9 Schematic diagram of PE structure
Input REG輸入寄存器級(jí)為計(jì)算前的數(shù)據(jù)緩存,存放著即將要計(jì)算的數(shù)據(jù)。Input REG的個(gè)數(shù)比PE的個(gè)數(shù)要多,在計(jì)算3×3卷積的時(shí)候,需要多出2行2列的數(shù)據(jù)來(lái)進(jìn)行緩存。于是這些數(shù)據(jù)在Input REG級(jí)里進(jìn)行流動(dòng),且進(jìn)行復(fù)用。
考慮數(shù)據(jù)復(fù)用的情況,整個(gè)PE陣列之間具有很強(qiáng)的數(shù)據(jù)復(fù)用性,因此在輸入數(shù)據(jù)的寄存器前面,有對(duì)數(shù)據(jù)復(fù)用進(jìn)行選擇的多路選擇器。正如本文前面所提到的,PE的數(shù)據(jù)復(fù)用分為PE陣列內(nèi)的復(fù)用與PE陣列運(yùn)算間的復(fù)用。PE陣列內(nèi)的復(fù)用,數(shù)據(jù)來(lái)源可以是其右面PE的寄存器,也可以是其左下PE的寄存器。而PE陣列運(yùn)算間的復(fù)用,數(shù)據(jù)來(lái)源可以是line_buffer,上一次運(yùn)算中沒(méi)完全利用的最右端緩存的數(shù)據(jù)。當(dāng)然,數(shù)據(jù)來(lái)源還可以是無(wú)法進(jìn)行復(fù)用時(shí),從Input Buffer中讀取的數(shù)據(jù)。
因此,PE的輸入數(shù)據(jù)來(lái)源共有5個(gè),同時(shí)PE的輸入數(shù)據(jù)寄存器同時(shí)要對(duì)其值進(jìn)行輸出,以供其他PE進(jìn)行數(shù)據(jù)復(fù)用。PE所處在PE陣列的位置不同,其具體的部分結(jié)構(gòu)也不一樣,體現(xiàn)為輸入的多選器不同。不是所有的PE都需要5個(gè)輸入來(lái)源。每個(gè)PE都需要的輸入來(lái)源為:Input Buffer、右邊PE的數(shù)據(jù)復(fù)用、左下面PE的數(shù)據(jù)復(fù)用。最上面2行PE還需要增加line-buffer作為輸入來(lái)源。最左2列PE需要增加上一次的最右兩側(cè)的PE數(shù)據(jù)作為數(shù)據(jù)來(lái)源。
MAC PE計(jì)算陣列級(jí),主體為一個(gè)乘加器,在乘法器前面均有寄存器對(duì)輸入數(shù)據(jù)與輸入權(quán)值進(jìn)行寄存。乘法的輸入一個(gè)是輸入的數(shù)據(jù),另一個(gè)是輸入的權(quán)值,加法器的輸入分別是乘法器的輸出,以及偏置與部分和的2選1。經(jīng)過(guò)乘加器運(yùn)算后的輸出保存到輸出寄存器中。
Output REG輸出寄存器級(jí),存放經(jīng)過(guò)MAC計(jì)算得出的數(shù)值。由于全連接層、3×3卷積、1×1卷積都需要把通道間的數(shù)值進(jìn)行累加,且輸出只有一個(gè)通道,但是,3×3深度可分離卷積同時(shí)得到多個(gè)輸出通道的數(shù)據(jù),因此本文加速器設(shè)置了多通道輸出寄存器。但是,當(dāng)運(yùn)算的不是深度可分離卷積時(shí),數(shù)值會(huì)采用第1個(gè)通道的輸出寄存器作為緩存。第1個(gè)通道的輸出寄存器前有一個(gè)選擇器,選擇經(jīng)過(guò)通道間加法樹(shù)或者第1通道的PE輸出。而其他的輸出寄存器則對(duì)應(yīng)每個(gè)MAC通道的輸出,作為深度可分離卷積時(shí)的輸出寄存。
接下來(lái)說(shuō)明PE陣列運(yùn)算間的數(shù)據(jù)復(fù)用,如圖10所示,PE陣列計(jì)算完一個(gè)單元后,往后滑窗時(shí)也同時(shí)有數(shù)據(jù)的復(fù)用,以及一排運(yùn)算完成后,切換到下一排時(shí),也需要對(duì)行進(jìn)行數(shù)據(jù)復(fù)用。正如圖10所示,輸入寄存器緩存的最右2列可以復(fù)用給下一次的最左2列,同時(shí),最下面2行的數(shù)據(jù)要保存到line-buffer中。在運(yùn)算到下一排時(shí),前2行的數(shù)據(jù)則從line-buffer中讀取。這樣可以防止同一個(gè)數(shù)據(jù)需要在大的Input Buffer中讀取,降低了片上Buffer結(jié)構(gòu)的復(fù)雜性,訪問(wèn)Input Buffer的地址也變得連續(xù),而且減少了反復(fù)訪問(wèn)Input Buffer的功耗。
Figure 10 CNN accelerator pipeline design
對(duì)本文加速器進(jìn)行mobile-net-v1、yolo-v2網(wǎng)絡(luò)仿真,并測(cè)試其運(yùn)算性能。該加速器的時(shí)鐘運(yùn)行頻率為100 MHz。性能效率的計(jì)算公式如式(6)所示,表示的是真實(shí)性能/理論峰值性能。
(6)
其中,GOPSreal表示真實(shí)測(cè)得的GOPS,PEnumber表示PE的數(shù)量,f表示加速器的工作頻率。
本文加速器PE與DSP數(shù)量對(duì)等,一個(gè)DSP運(yùn)算一個(gè)乘加運(yùn)算,因此OP為2。得到實(shí)驗(yàn)結(jié)果如表1所示。
從表1中得知,這2個(gè)網(wǎng)絡(luò)都有一個(gè)共同的特性,當(dāng)PE數(shù)量增加時(shí),GOPS可以得到明顯的提升,但是GOPS/PE與性能效率在下降。原因是PE數(shù)量增多了,有時(shí)候?qū)е碌目沼郟E會(huì)更多,也就是PE的利用率會(huì)下降,導(dǎo)致該性能參數(shù)下降。
而在性能上,不同的網(wǎng)絡(luò)也出現(xiàn)了不同的小趨勢(shì)。在PE數(shù)量偏少時(shí),mobile-net-v1的性能比yolo-v2-tiny的要好,而PE數(shù)量偏多時(shí),則是反過(guò)來(lái),yolo-v2-tiny的性能比mobile-net-v1的更好。
而數(shù)據(jù)有一個(gè)不尋常的點(diǎn),在PE數(shù)量為1 024時(shí),yolo-v2-tiny的性能效率不但沒(méi)有下降,反而上升了。原因是3D-PE并行有3個(gè)維度的參數(shù),PE數(shù)量是3個(gè)維度的總乘積,因此存在某些更優(yōu)組合,而1 024個(gè)PE恰恰為更優(yōu)的組合。
總體而言,隨著PE數(shù)量的增加,性能能夠得到提高,而PE的利用率會(huì)下降,這也是很直觀的結(jié)果。因此,本文加速器的優(yōu)勢(shì)就體現(xiàn)出來(lái)了,能夠根據(jù)現(xiàn)實(shí)的需求進(jìn)行PE數(shù)量的選擇,從而可以得到更優(yōu)性能的加速器。
本文CNN加速器與文獻(xiàn)[1,7-11]中的研究進(jìn)行性能對(duì)比,具體結(jié)果如表2所示。在與相關(guān)文獻(xiàn)進(jìn)行比較的過(guò)程中,性能效率的計(jì)算方法是假設(shè)一個(gè)DSP一周期貢獻(xiàn)2個(gè)操作(本文加速器),使用同樣的方法對(duì)比,可以得到針對(duì)DSP資源消耗所產(chǎn)生的性能效率,因此對(duì)于相關(guān)文獻(xiàn)也假設(shè)一個(gè)DSP產(chǎn)生2個(gè)操作,因此該參數(shù)可以作為對(duì)DSP占用效率評(píng)估的重要參數(shù)。
在幾乎相同的DSP使用情況下,本文加速器的GOPS達(dá)到了中等水平,但是性能效率更高,且靈活性更強(qiáng)。靈活性從2個(gè)角度進(jìn)行體現(xiàn):(1)可以自由選擇不同的PE數(shù)量,選擇3個(gè)不同維度上的并行;(2)既可以運(yùn)行普通的卷積,也可以運(yùn)行深度可分離卷積用于移動(dòng)端設(shè)備。
Table 1 Performance changes of mobile-net-v1 and yolo-v2-tiny with the growth of PE number
Table 2 Performance comparison between ours and others classical eonvolution accelerator
綜上所述,本文CNN加速器在GOPS性能下降的情況下,可以達(dá)到更高的性能效率和更大的靈活性。
文獻(xiàn)[12]提出了一個(gè)CNN加速器的便捷設(shè)計(jì)工具,可以優(yōu)化各方面參數(shù),其參數(shù)的優(yōu)化與本文相似,但其硬件模板使用的是高級(jí)語(yǔ)言進(jìn)行高層次綜合得到的RTL電路,而本文直接對(duì)RTL級(jí)硬件電路進(jìn)行設(shè)計(jì)。且該文獻(xiàn)并沒(méi)有考慮現(xiàn)有移動(dòng)端上熱門(mén)的深度可分離卷積。
最后對(duì)該CNN加速器采用XILINX的ZC706 FPGA開(kāi)發(fā)板進(jìn)行驗(yàn)證。運(yùn)行yolo-lite實(shí)時(shí)目標(biāo)檢測(cè)的效果如圖11所示,卷積神經(jīng)網(wǎng)絡(luò)運(yùn)行性能達(dá)到53.65 fps。
Figure 11 Target detection effect
本文分析了現(xiàn)有CNN加速器的一些缺陷,并以此為切入點(diǎn),提出了3D可擴(kuò)展PE陣列的概念,本文CNN加速器可以針對(duì)不同的網(wǎng)絡(luò)和不同的硬件資源約束對(duì)3D可擴(kuò)展PE陣列進(jìn)行配置。CNN加速器在512個(gè)PE下運(yùn)行yolo-v2-tiny達(dá)到76.52 GOPS、74.72%的性能效率,在512個(gè)PE下運(yùn)行mobile-net-v1達(dá)到78.05 GOPS、76.22%的性能效率。該性能處于CNN加速器的中上水平,其優(yōu)勢(shì)體現(xiàn)在具有一定的靈活性和兼容性,最后將其運(yùn)用在了實(shí)際的實(shí)時(shí)目標(biāo)檢測(cè)系統(tǒng)當(dāng)中。
本文加速器提出了3D可擴(kuò)展PE陣列,對(duì)于不同的硬件約束、不同的現(xiàn)實(shí)網(wǎng)絡(luò)運(yùn)用需求,都可以很好地適配上。對(duì)于移動(dòng)端嵌入式系統(tǒng),CNN加速器不能太大,運(yùn)行的網(wǎng)絡(luò)也比較輕量級(jí),選擇使用本文CNN加速器十分適合。本文CNN加速器提出的3D可擴(kuò)展PE陣列,對(duì)以后能夠發(fā)展出更多的CNN加速器架構(gòu),提供了一定的開(kāi)拓性和創(chuàng)新性。