趙 彤,喬廬峰,陳慶華
(陸軍工程大學 通信工程學院,江蘇 南京 210007)
隨著硬件GPU的快速發展和大數據時代的來臨,深度學習迅猛發展,已席卷人工智能各個領域,包括語音識別、圖像識別、視頻跟蹤、自然語音處理等在內的圖、文、視頻領域。深度學習技術突破了傳統技術方法,大大提高了各領域的識別性能。應用深度學習技術到智能化移動嵌入式軍事設備,將成為新一代深度學習的發展浪潮。
伴隨著深度網絡模型的性能增加,模型的深度越來越深,深度網絡模型的高計算量和高存儲弊端,嚴重制約著資源有限的應用環境,特別是智能化移動嵌入式設備。例如,8層的AlexNet[1]裝有600 000個網絡節點,6.1×107個網絡參數,需要花費240 MB的內存存儲、7.29×108次浮點型運算 次 數(The Number of Floating-point Operation,FLOP)來分類一副分辨率為224×224的彩色圖像。隨著模型深度的加深,存儲和計算開銷增加。同樣分類一副分辨率為224×224的彩色圖像,16層的VGGNet[2]裝有1 500 000個網絡節點,1.44×108個網絡參數,需要花費528 MB的內存存儲、1.5×1010次FLOP。
目前,對深度神經網絡的實現多是基于通用計算機,不僅計算機體積大,還會因計算機的輸入輸出接口速度限制了整體速度,更限制了應用的廣度與深度。另外,深度神經網絡的設計者或使用者必須要對網絡的工作軟硬件環境有相當了解,才能將其應用在實際系統上,更限制了深度神經網絡的發展。因此,若能適當采用現場可編程邏輯門陣列(Field Programmable Gate Array,FPGA)芯片的形式實現控制器,不僅可以大大縮小硬件體積,而且具有執行速度快、靈活度高的優點。目前,雖然已有一些研究[3-6]將神經網絡控制器實現在FPGA芯片上,但將深度神經網絡的方法實現在FPGA芯片上的研究越來越受到重視,并展現出很有希望的前景。已有研究發現,使用FPGA實現后硬件在執行速度上可將原本限制于普通計算機I/O的毫秒等級速度提高到微秒等級的快速輸出,高處理速度將可使深度神經網絡應用在更多需要快速反應的應用上。深度神經網絡會因FPGA硬件體積較小和功耗較低提高使用者的興趣,尤其在學習精準度上沒有因為硬件化而有太大差異。此外,由于FPGA的可重復編程性,可以方便地實現算法更新和目標重定義。
由于目前神經網絡的規模越來越大,層數也越來越深,而受限于FPGA上的存儲資源,必須借助外部存儲芯片,才能完成整個網絡的運行。因此,本設計采用將外部DDR存儲芯片與運算FPGA相結合的方式,架構如圖1所示。由圖1可以看出,整個硬件平臺的架構由運算FPGA芯片和存儲芯片DDR組成,FPGA內部由總控和運算單元(PE)組成。

圖1 CNN加速器的基本架構
總控主要負責對輸入的特征圖、網絡的權重以及產生的中間結果進行管理,并負責各PE與外部DDR之間的通信和數據轉換,結構如圖2所示。
總控模塊包含DDR控制器、數據接口、數據解析/打包模塊以及存儲中間結果的FIFO。
DDR控制器用與FPGA與外部DDR之間的通信,包含運行DDR接口協議的IP核。在滿足一個突發的條件后,它將FPGA內部的數據傳輸到DDR或者將DDR里的數據傳輸到FPGA。其余部分按數據流向可以分成兩部分。
第一部分,數據流從DDR到FPGA。在FPGA模塊開始運行后,先將一部分特征值與網絡權重值預先存儲在FPGA內部。待整個系統運行起來后,在需要數據參與運算時,通過DDR控制器發送讀取命令給DDR(包括讀取的bank號,讀取的行列號以及突發的長度)。DDR接收到命令后,將相應的數據以突發方式傳輸到FPGA中。由于DDR傳輸來的數據含有標記信息(包括該數據的特征圖編號、行列號等),所以FPGA在接收到數據后,要先通過數據解析模塊解析數據,再存儲到相應的FIFO中,以便PE讀取。

圖2 總控模塊的結構
第二部分,當卷積運算完成后,產生的中間結果要從FPGA內部傳輸到DDR。這時數據流從PE中出來,先經過數據打包模塊為每個數據打上相應的標簽,包括該數據的層號、特征圖的編號以及行列號等信息,而后打包完的數據發送到輸出FIFO進行緩存,等到滿足一個突發條件后,該突發數據經由DDR控制器發送到外部DDR進行存儲。
對于目前最常見的網絡,最多是3×3和5×5卷積核。所以,對于PE架構,有以下兩種設計:圖3(a)是卷積核為3×3時的PE結構,圖3(b)是卷積核為5×5時的PE結構。PE中主要由存儲陣列控制器、RAM陣列和乘加操作運算矩陣構成。存儲陣列控制器負責對RAM陣列中的數據進行管理,控制行列號的轉換和RAM陣列讀寫操作的控制;RAM矩陣存儲相應的特征值和權重;乘加操作運算矩陣負責對輸出的特征值與權重進行計算,以得到最終結果。本設計針對卷積核的不同設計不同的PE,目的是針對不同網絡的結構特性調整整個設計中PE的分布,從而使性能達到最優。

圖3 數據處理單元(PE)的結構
在硬件中實現多計算資源來加速CNN的推斷過程,存儲帶寬的限制常常是處理CNN的瓶頸[7]。例如,對于卷積層來講,大量的乘加操作必然導致大量的存儲器讀寫。因為每個乘加操作需要至少2個 存儲器讀操作和1個存儲器寫操作,而FPGA內部存儲資源的限制,必須要把大部分網絡參數和中間結果存儲在外部DDR上,所以會嚴重影響吞吐率和能量消耗,甚至比乘加運算本身的能耗還要大。
針對存儲帶寬的限制問題,本設計提出一種能降低對外部存儲帶寬需求的方案。具體地,針對目前應用最廣泛的3×3卷積核,進行以下設計。對于一張224×224的特征圖,采用如圖4所示方式進行存儲。對于一個224×224的特征圖,在整個運算開始前,先將該特征圖的前3行值存儲到3×3的RAM陣列中。在RAM陣列中,每一行RAM只存儲特征圖的同一行值。這樣存儲便可在一拍就得到卷積結果,而不需要額外的操作。
對于CNN的參數,采用如圖5所示的格式進行存儲。可以看到,該層網絡共有32個3×3的卷積核。本設計將這些卷積核存儲到一個3×3的RAM陣列中,3×3卷積核中的每個權重值分別存儲到不同的RAM中。這樣權重值與特征值相對應,可以在一拍內得出計算結果。

圖4 特征值的存儲示意

圖5 權重的存儲示意

對于當前存儲在RAM陣列中的特征圖和權重,計算完成后會得到分屬于32個不同特征圖的結果,這樣需要用FIFO進行緩存,而后經過一次DMA突發,將屬于同一個特征圖的特征值送到外部DDR,以最大限度的節省帶寬。
存儲管理模塊的設計流程如圖6所示。
由圖6可以看出,本設計運算開始后,先固定一個權重值,而后遍歷特征圖,以使得該部分的輸出屬于同一個特征圖,方便對其進行存儲。在當前存儲權重的RAM陣列運行到最后一個值時,更新存儲特征圖的RAM陣列,以保證流水的不中斷,也使設計的并行化達到最大。
對于每一組ram來講,每一行的3個ram存儲同一行的特征值,即需要預先將特征圖的3整行分別存儲到片內,而后從第四行進行更新。在對同一行進行卷積操作時,只有列號進行變化,而行號保持不變。只有在整列結束,所有的值都更新完畢后,再進行行號的變化。
當存儲在RAM陣列中的權重值運行到最后一個時,開始進行特征圖的更新,在此之前會將一整行特征圖以DMA突發的方式傳輸到片內FIFO中進行存儲,再從FIFO中一次取出一個特征值更新RAM陣列中的特征值,具體過程如圖7所示。
由圖7可以看出,在更新完特征值后,RAM陣列中的列號要進行變化,且更新過的RAM中的讀指針要加1,以方便對RAM陣列操作,即對于外部接口來講,每次只需要對列號為0、1、2的RAM進行操作,便可以讀取相應的操作數。
當一整行特征值更新完畢后,要進行行號的轉換,具體過程如圖8所示。
由圖8可以看出,一行特征值的最后一個更新完畢后,相應的RAM陣列的行號也發生變化,從而為下一次操作做準備。對于外部接口來講,每次只需要對行號為0、1、2的RAM進行操作,便可以讀取相應的操作數。
特征值的行列號與權重值的對應關系,如表1 所示。特征值與權重的對應關系是固定的,所以每次運算的操作數均嚴格按照卷積神經網絡的運算規則,不會出現位置的不匹配而導致錯誤的 結果。

圖6 存儲管理模塊的流程

圖7 RAM陣列更新時的列號變化

圖8 RAM陣列更新時的行號變化

表1 特征值的行列號與權重值的對應關系
對于stride=1的3×3卷積,采用Winograd算法[8]來加速整個計算。Winograd算法的基本原理即用加法運算代替乘法運算,以減少運算量。例如,本設計中采用F(2×2,3×3),共需4×4=16次乘法運算,而標準的算法則需2×2×3×3=36次乘法。
對于F(2×2,3×3),其輸出為:

其中,

式(2)中剩余的參數g為3×3的濾波器,d為4×4的特征值矩陣。每一個特征圖被分割成了4×4的子特征矩陣,相鄰的兩個子特征矩陣之間有2個特征值的重疊。
針對Winograd算法的特性,可以令U=GgGT,V=BTdB,則式(2)變成:

本設計在運算開始前,可以將卷積核與特征值提前進行轉換,而后直接在FPGA內部進行運算,以減少大量的重復性工作。
本設計是在Xilinx Virtex7 xc7vx690t平臺上執行的,采用流水結構,將每層單獨設計,而后統一控制,提升了速度。在流水線設計中,每一層的運算量要保持大體相等,否則會產生流水線的瓶頸,從而降低整個流水線效率。
本設計以Alexnet為例,對提出的相關算法進行實現,并與其他的FPGA實現方式進行對比,得到的結果如表2所示。可以看出,采用本方案提出的存儲管理和運行框架,可以達到較高的性能,且在表格所列舉的5個設計方案中,本設計的能耗性能比最高。
此外,將該FPGA平臺的實驗結果與GPU的實現結果進行對比,結果如表2所示。
本設計采用NVIDIA TitanX的GPU,在Caffe框架[13]下對Alexnet進行實現。在GPU的實現中,采用Winograd算法對設計進行加速,得到的結果如表3所示。可以看出,在實現相同的網絡時,雖然GPU的性能要高于本設計,但是本設計能耗性能比是GPU的2.7倍。

表2 不同平臺實現Alexnet的性能對比

表3 本設計與GPU的性能對比
本文對基于CNN的FPGA硬件平臺進行研究,設計了一種高效的硬件平臺架構,提出了一種能夠有效降低存儲帶寬的存儲管理方案。在此基礎上,采用Winograd算法降低運算量,并對卷積核為3×3和5×5的處理模塊分別進行設計,使得該硬件平臺能夠更加高效加速CNN。本設計在Virtex7 xc7vx690t上實現了Alexnet,性能為1.31 TFlop/s,平均性能功耗比為45.7 GOP/s/W,結果優于目前較流行的集中設計方案。