(國防科技大學計算機學院 長沙 410073)
在航線監(jiān)控、機場管理、敵軍飛行器目標甄別等場景中遙感圖像飛行器關(guān)鍵點檢測起著重要的作用。近年來在關(guān)鍵點檢測領(lǐng)域,人們從利用傳統(tǒng)方法提取特描述并訓(xùn)練關(guān)鍵點檢測流程[1~2],到利用深度學習、神經(jīng)網(wǎng)絡(luò)方法提取更加抽象的特征,該領(lǐng)域經(jīng)歷了短暫又迅猛的發(fā)展階段,比較現(xiàn)有幾個深度神經(jīng)網(wǎng)絡(luò)的性能,最終選擇了VGG-19[3]作為關(guān)鍵點預(yù)測的深度學習框架。
FPGA以其高性能、高能效、高靈活性等優(yōu)點,成為CNN加速平臺研究的熱點。近年來基于FPGA的CNN加速器被提出用來加速推理過程。本文中我們著重加速飛行器目標檢測過程,并做出以下貢獻:
1)提出了一種可擴展的飛行器關(guān)鍵點檢測專用加速器框架,能夠同時適應(yīng)多種網(wǎng)絡(luò)結(jié)構(gòu),例如VGG-S,AlexNet等。
2)開發(fā)了配套的軟件工具鏈,支持參數(shù)提取,硬件性能預(yù)測評估、統(tǒng)計最優(yōu)定點(16bit)格式、定位錯誤的層等,幫助快速完成上板工作。
3)在Xilinx Virtex-7 VC709上實現(xiàn)加速器,平均吞吐率達796.8GOP/s,性能功耗比為50.43GOP/s/W,吞吐率是CPU的2.95倍,性能功耗比是CPU的17.75倍。
本節(jié)簡要回顧下飛行器關(guān)鍵點檢測的推理過程、神經(jīng)網(wǎng)絡(luò)加速器設(shè)計以及對加速器進行16位定點化的相關(guān)背景。
飛行器關(guān)鍵點預(yù)測的主體是一個VGG-19網(wǎng)絡(luò),首先將不同大小的飛行器圖像縮放至224*224像素,輸入網(wǎng)絡(luò)進行特征提取,全連接層fc8的輸出維度為10,得到飛行器的五個關(guān)鍵點檢測主要包含四個主要操作:圖像縮放(resize),卷積(conv),最大池化(max-pooling),全連接(fc)。Resize有五種插值算法,分別是:最近鄰、雙線性、雙三次、基于像素區(qū)域關(guān)系、蘭索斯插值。我們選擇雙線性作為縮放算法,因其在速度和上下采樣兩者間做了適合我們應(yīng)用的折衷。卷積操作一共有五大層,卷積核的大小全部為3×3。最大池化和全連接操作此不贅述。VGG-19網(wǎng)絡(luò)的每層輸入特征和輸出特征的規(guī)模如圖1所示。
圖1 VGG-19網(wǎng)絡(luò)每層計算量規(guī)模
目前對網(wǎng)絡(luò)算法進行優(yōu)化的常用方法包括三種:1)采用傅里葉變換的方法,將時域運算轉(zhuǎn)換為頻域的乘法運算進行加速,由于基于傅里葉變換的卷積內(nèi)存帶寬需求很大,當卷積核尺寸較大例如7*7,9*9等才有速度優(yōu)勢。Jong等在文獻[22]中使用了FFT算法實現(xiàn)了卷積運算用于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,由于反向傳播計算梯度時卷積核尺寸比較大,因此對于訓(xùn)練過程的加速非常明顯。還可以在此基礎(chǔ)上添加OaA方法進行進一步優(yōu)化,降低算法復(fù)雜度[17]。2)Winograd算法。Lu等在文獻[23]中采用了基于快速Winograd算法的CNN加速器設(shè)計,利用線性緩沖結(jié)構(gòu)實現(xiàn)對特征圖像的復(fù)用,通用的逐元素相乘的PE,并設(shè)計多個PE增加并行性。Winograd算法特別適用于卷積核尺寸特別小的情形,其原理是通過矩陣變換減少乘法操作的次數(shù)。3)矩陣乘法。將卷積運算轉(zhuǎn)為矩陣乘法則是一種非常通用的實現(xiàn)方式,TensorFlow等深度學習框架在GPU和CPU平臺上實現(xiàn)卷積運算也是采用這種方式。文獻[24]將卷積計算轉(zhuǎn)化為矩陣乘法操作進行加速,文獻[25]采用乘法脈動陣列對矩陣乘法進行加速。卷積轉(zhuǎn)化為矩陣乘法時,會引起額外訪存壓力,所以要注意對于存儲的優(yōu)化。
考慮到神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程需要高精度的浮點運算,但在前向推理過程可以允許較低的計算精度而不會影響最終的關(guān)鍵點預(yù)測或分類性能?;谶@一特點,采用半精度運算部件、定點運算部件甚至位運算部件的加速器被紛紛提出。將高精度的浮點數(shù)類型量化為低精度的定點數(shù)類型,好處主要有兩個方面:一是通過有效減少了數(shù)據(jù)位寬降低了對于數(shù)據(jù)存儲空間和帶寬的需求;二是簡化了計算部件,在相同的資源限制下可以部署更多的計算部件增加并行性。二值化和三值化網(wǎng)絡(luò)推理實現(xiàn)的研究成果頗多,例如文獻[9~14],利用0和1表示權(quán)值和神經(jīng)元的值來平衡準確性和訪存效率。文獻[15]中以AlexNet和VGG為例分析了采用定點運算對于網(wǎng)絡(luò)分類性能的影響,在其實現(xiàn)的加速器中,所有層的網(wǎng)絡(luò)權(quán)重參數(shù)被表示為統(tǒng)一規(guī)格的8位位寬的定點數(shù),計算過程采用定點運算,相較于浮點實現(xiàn)的版本,網(wǎng)絡(luò)分類正確率損失不到1%。文獻[16]中采用了動態(tài)定點數(shù)的表示方法,允許不同層的網(wǎng)絡(luò)采用不同的量化范圍,從而在不增加位寬的情況保證了更高的數(shù)據(jù)精度。我們通過HLS工具鏈統(tǒng)計出精度最優(yōu)的一種16位的定點格式,將之運用在加速器中。
這一部分我們首先描述系統(tǒng)的總體設(shè)計,在此基礎(chǔ)上描述了加速器的工作方式。
飛行器關(guān)鍵點預(yù)測的系統(tǒng)總體架構(gòu)如圖2所示。主要包括四部分:主機端(Host),關(guān)鍵點預(yù)測專用加速器模塊(Accelerator),控制模塊(Control)和片外存儲模塊(DDR)??刂颇K和主機端以及加速器模塊連接,從主機端接收加速器執(zhí)行所需的參數(shù),然后傳遞至加速器實施控制。DDR和主機端以及加速器連接,接收從主機端傳入的圖像和權(quán)值等數(shù)據(jù),將其提供給加速器進行處理,同時接收加速器的運行結(jié)果,重新傳至主機端。加速器主要實現(xiàn)了卷積網(wǎng)絡(luò)的部分,圖像的預(yù)處理resize放在主機端實現(xiàn)。
圖2 系統(tǒng)總體架構(gòu)
加速器一共包含四部分:片上數(shù)據(jù)緩沖(buffer)、FIFO、計算單元(PE)陣列和偏置加法(BiasA-dd)陣列。片上數(shù)據(jù)緩沖接收DDR傳入的數(shù)據(jù),送至FIFO,F(xiàn)IFO將數(shù)據(jù)傳送給計算單元陣列和偏置加法陣列處理,計算結(jié)果輸出至片上緩沖,然后送至DDR。加速器整體架構(gòu)如圖3所示。
圖3 加速器架構(gòu)
3.2.1 計算單元陣列與偏置加法陣列
神經(jīng)網(wǎng)絡(luò)的運算有卷積、最大池化和全連接三種。卷積運算為矩陣乘法,全連接運算為向量乘法,最大池化是求矩陣最大值,所以將PE設(shè)置為實現(xiàn)乘累加的運算單元,一個端口srca接收輸入特征數(shù)據(jù),另一個端口srcb接收權(quán)值數(shù)據(jù),供給卷積和全連接層使用,并且將求最大值運算額外添加到PE中,此時srcb端口不接收數(shù)據(jù),這樣VGG-19的所有運算操作均可以在PE中完成。分析圖1中VGG-19每層網(wǎng)絡(luò)的運算規(guī)模,輸入特征行/列分別是:224,112,56,28,14,權(quán)值矩陣的輸出通道分別是3,64,128,256,512,我們將PE陣列的列取輸入特征的行/列的約數(shù),PE陣列的行取權(quán)值矩陣輸出通道的約數(shù),并且盡可能利用完板上的DSP資源,所以將PE陣列設(shè)置為64×56大小,每周期讀取64個權(quán)值參數(shù),56個特征矩陣像素。然后判斷當前層網(wǎng)絡(luò)是否為池化,如果是則跳過偏置加法輸出結(jié)果,否則當計算單元陣列完成計算,64×56個元素在64個周期內(nèi)被傳輸至偏置加法,完成計算后將結(jié)果輸出。
3.2.2 片上數(shù)據(jù)緩沖與FIFO
片上緩沖分為三部分:輸入緩沖,權(quán)值緩沖和輸出緩沖。權(quán)值緩沖用于存儲權(quán)值矩陣、輸入緩沖用于存儲部分輸入特征圖像、輸出緩沖用于存儲部分輸出特征圖像。每組數(shù)據(jù)緩沖中都設(shè)有多個獨立的存儲單元,可提供多個數(shù)據(jù)訪存接口,存儲單元的數(shù)量取決于PE的陣列規(guī)模。鑒于計算單元陣列在每個時鐘周期都需要讀取64個權(quán)值參數(shù),56個輸入特征像素,所以在權(quán)值緩沖中部署了64個存儲單元,在輸入緩沖中部署了56+2×pad個存儲單元,額外的2×pad個存儲單元對應(yīng)于卷積窗口滑動到輸入特征圖像左右邊界的情況。計算單元陣列并行計算64×56個輸出特征圖像的元素,在輸出緩沖中部署了56個存儲單元,若當前層完成的是池化運算,當計算單元陣列完成計算,64×56個元素在64個周期內(nèi)被寫入到輸出緩沖中;若當前層完成的是卷積或全連接運算,則每個周期接收從偏置加法傳入的56個輸出特征像素結(jié)果。
基于第三節(jié)的加速器體系結(jié)構(gòu),我們采用高級綜合技術(shù)HLS實現(xiàn)加速器配套的工具鏈,本節(jié)將介紹HLS工具鏈的設(shè)計及如何利用HLS優(yōu)化加速器性能的具體工作。
圖4 工具鏈結(jié)構(gòu)
工具鏈一共由五部分組成:解析Caffe[8]網(wǎng)絡(luò)描述文件(ParseCaffe),生成硬件執(zhí)行網(wǎng)絡(luò)需要的參數(shù)(GenParam),包括指令(GenInstruction)以及數(shù)據(jù)存放內(nèi)存的地址(GenAddrParam),生成硬件執(zhí)行所需的數(shù)據(jù)(GenSimData),加速器原型系統(tǒng)(ProcessLayer),在執(zhí)行網(wǎng)絡(luò)的過程中統(tǒng)計了每層的數(shù)據(jù)范圍(GenRange)方便后期做定點化,網(wǎng)絡(luò)層結(jié)果對比(CompareLayer),圖4給出了工具鏈的結(jié)構(gòu)。
代碼的軟件版本是基于Tensorflow框架[4],但是基于Tensorflow的python代碼不易解析,故我們將Caffe框架的下的VGG-19網(wǎng)絡(luò)描述文件prototxt作為程序的輸入,將解析得到的網(wǎng)絡(luò)數(shù)據(jù)存放到一個描述網(wǎng)絡(luò)的向量vec_layer中,向量的每個元素代表一層,記錄了該層的名字,輸入特征大小,權(quán)值矩陣大小,輸出特征大小,步長等所有相關(guān)信息。后面所有的操作都是在vec_layer的基礎(chǔ)上進行操作。
硬件執(zhí)行網(wǎng)絡(luò)所需的參數(shù)有兩部分,一是指令序列,要配置出當前層執(zhí)行需要的參數(shù),有的可以直接從vec_layer向量中獲取,例如步長,卷積核的大小,輸入特征的大小等,另一些參數(shù)需要結(jié)合硬件架構(gòu)計算得到參數(shù)。二是生成內(nèi)存地址供上板使用,vec_addr是網(wǎng)絡(luò)地址參數(shù)向量,每個元素記錄一層網(wǎng)絡(luò)中的輸入特征地址,權(quán)值地址,輸出特征地址,他們由vec_layer向量中的值計算得到。
將每層的輸入特征按照Ix,Ic,Iy的順序、每行56個數(shù)據(jù)、以十六進制形式存儲到文件中(Ix是輸入特征的行,Ic是輸入特征的通道數(shù),Iy是輸入特征的列)。將每層的權(quán)值矩陣按照Oc,Ic,kx,ky的順序、每行64個數(shù)據(jù)、以十六進制形式存儲到文件中(Oc是輸出特征的通道數(shù),Ic同上,kx是權(quán)值矩陣的行,ky是權(quán)值矩陣的列)。
神經(jīng)網(wǎng)絡(luò)加速器的主要操作分為三類:卷積操作,池化操作,全連接操作,我們分別實現(xiàn)這三類操作,然后依次讀取vec_layer的層類型以及層參數(shù),將之傳遞至函數(shù)進行運算,并保存每層的計算結(jié)果。
神經(jīng)網(wǎng)絡(luò)在前向推理過程可以允許較低的計算精度而不會影響最終的關(guān)鍵點預(yù)測或分類性能,基于這一特點,我們嘗試使用16位的定點代替32位浮點數(shù)進行推理。好處主要有兩個方面:一是通過有效減少了數(shù)據(jù)位寬降低了對于數(shù)據(jù)存儲空間和帶寬的需求;二是簡化了計算部件,在相同的資源限制下可以部署更多的計算部件增加并行性。
在實現(xiàn)加速器原型系統(tǒng)的基礎(chǔ)上,對卷積層計算和全連接層計算模塊添加了統(tǒng)計輸入特征,輸出特征,權(quán)值矩陣的模塊,分析結(jié)果發(fā)現(xiàn),所有層的權(quán)值矩陣范圍都介于-1和1之間,我們將16位的權(quán)值格式類型設(shè)置為1-3-12(分別對應(yīng):符號為-整數(shù)位-小數(shù)位),而對于VGG-19網(wǎng)絡(luò)的每層輸入和輸出特征的范圍來講,從conv1到fc8層,先逐層增加,帶conv4達到最大,然后逐層減小,并且經(jīng)過實驗發(fā)現(xiàn),對于不同類別的飛行器以及相同類別不同角度的飛行器,范圍也會不同,我們統(tǒng)計了數(shù)據(jù)集中所有種類所有角度的飛行器conv4卷積層輸入輸出特征,發(fā)現(xiàn)其范圍在2799~8684之間,取范圍的上限,下限及中間的一個隨機值6447,取這三張圖像做實驗。
表1 不同格式下不同圖像的歐式距離結(jié)果
表2 根據(jù)范圍取定的格式
如表1所示,首先測試了所有層都使用統(tǒng)一的定點格式時這三張圖片的結(jié)果誤差,表中的結(jié)果為歐式距離。橫軸表示這三個conv4層輸入輸出特征最大值的三張圖像,縱軸表示格式,前8行是所有層都使用統(tǒng)一的格式得到的結(jié)果,可以看到這三張不同圖像結(jié)果最優(yōu)的格式并不一致(我們并沒有展示出來當max=6447和max=8684在表中前幾行格式的結(jié)果準確度,因其歐式距離誤差過大不具備可比性)。第9行采用表2中前三列所示的統(tǒng)一的變格式得到的結(jié)果,這三個結(jié)果表示了所能達到的最好結(jié)果。但是實際的硬件實現(xiàn)不可能采取每類飛機用不同的方法,所以這只是表示最理想的一種情況。綜合前兩個實驗的結(jié)果,選取了折衷的一種格式,即表2的第5列,進行實驗得到表1最后一行的結(jié)果,滿足項目工程的需求。
首先取軟件版本的代碼每層運行結(jié)果,將之作為基準,然后運行半精度或定點格式情況下的每層網(wǎng)絡(luò)得到結(jié)果,設(shè)置一個β因子作于臨界值,例如β=0.1或β=0.01,這樣可以統(tǒng)計每層結(jié)果中兩個值的絕對值差大于β的數(shù)有多少個,比例是多少,能夠更加直觀地看到從哪一層精度開始掉下了。另外,取硬件代碼執(zhí)行的結(jié)果與基準進行對比,也可以定位錯誤的層,易于排錯。
我們分別在CPU和FPGA開發(fā)板上實現(xiàn)了飛行器關(guān)鍵點預(yù)測VGG-19網(wǎng)絡(luò)加速器。實驗選擇的CPU平臺是Intel Core i7-8700k,運行頻率為@3.7GHz;軟件版本是在深度學習框架Tensorflow上實現(xiàn)的,執(zhí)行推理任務(wù)時采用的batch數(shù)為1,測試了數(shù)據(jù)集中的所有飛行器圖像,共26種類別4560張飛行器圖像,數(shù)據(jù)集是我們在Google地圖上搜尋帶有飛行器的區(qū)域,并將飛行器剪裁下來組成飛行器數(shù)據(jù)集。實驗選擇的加速器平臺為Xilinx VC709開發(fā)板,開發(fā)板上有2個DDR3存儲器,峰值帶寬均為14.9GB/s;開發(fā)板上的芯片型號為Xilinx Virtex7 VX690T,芯片上集成了3600個DSP計算單元和6.5MB片上存儲空間。加速器的實現(xiàn)基于高級綜合技術(shù),借助Vivado HLS工具首先完成加速器的功能驗證,然后利用Vivado工具進行代碼編寫,對封裝好的IP進行綜合、布線和實現(xiàn)。
表3展示了在CPU和FPGA上平均運行一張圖像時VGG-19網(wǎng)絡(luò)每層所用時間及總時間,由表計算得:CPU執(zhí)行推理任務(wù)的平均吞吐率為270.048 GOP/s,加速器的平均吞吐率為796.8GOP/s。加速器的資源使用情況如表4所示,從表中可以發(fā)現(xiàn),加速器充分使用了片上的計算資源,使用了較少的存儲資源。
表3 CPU和FPGA執(zhí)行推理任務(wù)花費時間
圖5展示了VGG-19網(wǎng)絡(luò)模型在加速器及CPU上執(zhí)行推理任務(wù)時每層的吞吐率性能,首先對于加速器,在150MHz的時鐘頻率下,對卷積層來說,conv1_1和conv5的吞吐率較低,這是由于conv1_1的輸入通道數(shù)較小,PE陣列的列利用不充分,conv5各層的輸入特征較小,PE陣列的行利用不充分。fc層吞吐率最低,首先是PE陣列只使用了一列,但是瓶頸并不在于PE利用率低,而是受訪存受限影響。而對于CPU的執(zhí)行,每層的吞吐率幾乎都是加速器吞吐率的1/2。
圖5 VGG-19神經(jīng)網(wǎng)絡(luò)各層的吞吐率性能
表4 加速器片上資源使用情況
表5 加速器與CPU平臺實驗結(jié)果對比
表6 與以前的加速器實現(xiàn)進行比較
表5列出了運行VGG-19網(wǎng)絡(luò)加速器與CPU平臺上的實驗結(jié)果對比。加速器的吞吐率性能是CPU平臺的1.98倍。另外,CPU的熱設(shè)計功耗(TDP)為95W,根據(jù)Vivado工具給出的功耗報告,加速器的熱設(shè)計功耗為15.8W。從表中看出,我們的加速器性能功耗比是CPU的17.75倍。
表6選擇了幾個在FPGA上實現(xiàn)的VGG網(wǎng)絡(luò)加速器作為對比。由于FPGA平臺不同,我們列出了性能密度以便進行比較,性能密度定義為一個DSP在一個周期內(nèi)執(zhí)行的算術(shù)操作數(shù),消除了時鐘頻率的影響。我們的PE被計算為兩個操作。如表6所示,就性能密度而言,我們的加速器優(yōu)于文獻[15,21],比文獻[20]低5%,從吞吐率角度看,我們的加速器吞吐率是文獻[21]的1.24倍,是文獻[15]的6.75倍,而文獻[20]加速器使用了比其他加速器高得多的時鐘頻率獲得最佳的吞吐率性能。
本篇論文針對飛行器關(guān)鍵點檢測過程進行加速,更進一步地,重點提出了關(guān)于VGG-19神經(jīng)網(wǎng)絡(luò)的加速器體系結(jié)構(gòu)設(shè)計。首先分析了VGG-19深度神經(jīng)網(wǎng)絡(luò)卷積層、池化層、全連接層的計算特點,提出了通用矩陣乘法的加速器體系結(jié)構(gòu),采用乘累加單元陣列高效地執(zhí)行矩陣乘法計算;接下來基于高級綜合技術(shù)實現(xiàn)了加速器,并利用HLS指導(dǎo)語句優(yōu)化了加速器的吞吐率性能;最后對加速器進行了驗證實現(xiàn)。