潘坤榕,夏福源,李瑞民,劉子嫣,唐 珂,孫科學,3*
(1.南京郵電大學 電子與光學工程學院、微電子學院,江蘇 南京 210023; 2.南京郵電大學 貝爾英才學院,江蘇 南京 210023; 3.射頻集成與微組裝技術國家地方聯合工程實驗室,江蘇 南京 210023)
人工智能(Artificial Intelligence,AI)作為計算機科學技術領域的一項重要分支,得益于近年來高速發展的計算硬件,越來越受到關注并逐漸發展為最重要的研究領域之一,其發展成果滲透到了各個領域,對現代世界的方方面面產生了深遠的影響。作為人工智能的一個重要研究領域,圖像識別技術在探查資源、公安刑偵、生物醫學等領域有著廣泛的應用[1]。舉例來說,圖像識別技術能夠提取遙感圖像的信息以探查森林、水利、海洋、農業等資源;能夠完成指紋、手印、人像等類型數據的辨別以向公安機關提供有效的線索;能夠處理病患的各類圖像數據而為醫生提供各種輔助診斷的信息。受限于硬件和算法,圖像識別技術的發展一度停滯。90年代,支持向量機和人工神經網絡的結合促進了圖像識別技術的發展[2-3]。人工神經網絡需要人為參與預處理,這導致了圖像識別準確率的下降。為擺脫人工神經網絡的限制,人們提出了循環神經網絡(Recurrent Neural Network,RNN)[4]、深度信念網絡(Deep Belief Network,DBN)[5-6]、卷積神經網絡(Convolutional Neural Network,CNN)等深層次網絡結構[7]。
其中,卷積神經網絡以其良好的特征提取能力和泛化能力,在圖像處理、目標跟蹤與檢測、自然語言處理、場景分類、人臉識別等諸多領域獲得了巨大的成功[8]。[5][6]卷積神經網絡模型性能優異,但計算量異常龐大[9],因此對計算機硬件設備的計算能力有著比較嚴苛的要求?,F行的主流硬件平臺包括CPU、GPU、FPGA、ASIC等,其中,CPU因自身架構的局限而難以支持并行運算,處理效率不高;GPU因價格昂貴,功耗太高無法應用于嵌入式移動終端;專用集成電路(Application-Specific Integrated Circuit,ASIC)計算強、功耗低,但其通用性差、成本高昂且可遷移性低?,F場可編程邏輯門陣列(Field Programmable Gate Array,FPGA)器件在1985年由Xilinx公司發明,它的出現在很大程度上彌補了復雜可編程邏輯器件(Complex Programmable Logic Device,CPLD)和ASIC之間的空白,這種半定制化的解決方案既克服了ASIC開發成本巨大的弊端,又有著通用可編程邏輯器件無法比擬的運算效率。此外,FPGA配置了眾多邏輯單元可用于深度學習算法的并行計算,其計算力強、功耗低,并行化的結構特點正適用于卷積神經網絡模型的部署[10-11]。
于是卷積神經網絡模型的研究者和工程師們將目光轉向了FPGA平臺。FPGA加速深度學習算法,往往面臨如下挑戰:有限的FPGA資源難以滿足龐大的計算和數據需求;開發周期長,學習成本高,設計復用性差[12]。深度學習算法經過長足的發展,其算法復雜度不斷提高,其數據量也大幅增長。近年來,FPGA片上資源越來越豐富,但尚未能滿足不斷增長的算法配置需求。設計者必須關注如何使得資源得到高效的利用,否則其精心設計的算法將因資源的局限而無法配置成功。特別地,對于具有商業意義的設計而言,設計者更需要合理地降低產品生產成本及人工成本。大規模的FPGA芯片,往往價格高昂,資源與成本兩者間存在矛盾;相較于程序設計人員,FPGA開發者需要豐富的硬件知識及硬件開發經驗;FPGA系統的開發流程,也比軟件設計更繁瑣、冗長。此外,FPGA加速深度學習算法的設計往往只針對特定的應用場景,成本高昂的設計不能得到很好的重用,這造成了資源的浪費。
為解決以上難題,該文以MNIST數據集為例,在TensorFlow上搭建及訓練卷積神經網絡模型,探討了基于FPGA平臺的卷積神經網絡設計與優化方法,通過傳輸模型參數的方法實現了卷積層模塊的可重用,最后,完成驅動及系統上位機的程序設計,并對系統進行功能和性能測試。
卷積神經網絡是一種“端到端”的學習方法,它將圖像像素信息作為輸入,通過卷積操作進行圖像像素特征的提取,對原始圖像進行高度抽象,既能夠在最大程度上確保輸入圖像信息的完整性,又使得模型的輸出直接是圖像識別的結果,因此在圖像處理領域獲得了優異的性能表現,并得到了廣泛的實際應用。一個完整的卷積神經網絡模型的組成結構為:若干個卷積層(Convolutional Layer)、池化層(Pooling Layer)和全連接層(Fully Connected),處理單元包括:卷積核、池化、激活函數、分類器等[13],其中卷積層和全連接層的功能主要是完成原始圖像特征提取,而池化層的主要目的是防止過擬合現象的出現。當待處理的數據輸入卷積神經網絡模型后,通過卷積層進行數據的特征提取,池化層分為最大池化層、均值池化層等類型,完成數據的采樣,全連接層處理輸入數據和輸出數據的線性映射。如圖1所示,該模型為一個手寫數字識別的卷積神經網絡算法結構。

圖1 手寫識別模型結構
卷積層利用多個不同的卷積核過濾提取不同的特征信息,多個不同的卷積核可以視作不同的濾波器。圖像的基本特征在淺層卷積層中處理,圖像的抽象特征在深層卷積層中處理。在算法模型中,卷積層的運算量是最大的,并且可以視為是全并行的計算,故卷積層是優化加速的關鍵。卷積層的計算公式如公式(1)所示:
(1)
式中,l為卷積層數,k為卷積核,ai為輸入特征譜的一個選擇,b為偏執參數。
池化層主要用于合并各層中相似的特征信息。常用的池化結構分為平均池化層和最大池化層兩種,在神經網絡結構中,池化層取最大池化,即計算一個特征映射中部分區域的最大值,最大池化可使得失真的概率降低,最大池化如圖2所示。

圖2 最大池化層計算模型
使用激活函數可以讓神經網絡具有非線性識別功能,極大提升了神經網絡的表達能力。在激活函數的選擇上,sigmoid激活函數在梯度下降中容易出現過飽和、造成終止梯度傳遞,且沒有0中心化。為了解決這個問題,在神經網絡中使用另外一個激活函數:ReLU。
ReLU函數的全稱為Rectified Linear Units。表達式如下:
f(x)=max(0,x)
(2)
因為沒有時間開銷巨大的冪運算,運用ReLU函數作為激活函數的神經網絡具有收斂速度快、求梯度簡單的優點。
針對MNIST數據集的卷積神經網絡搭建是在TensorFlow中進行[14]。
MNIST數據集是一手寫字體數字數據集,包括了訓練樣本、訓練樣本標簽、測試樣本、測試樣本標簽四部分數據。MNIST數據集常用于各種模型的訓練及測試,該文的卷積神經網絡模型正是基于MNIST數據集。
TensorFlow是一種流行的深度學習框架,主要包括了TensorFlow核心庫以及配置、部署等軟件。TensorFlow方案方便快捷易用性強,被廣泛地應用于機器學習領域。TensorFlow提供了數據整合、數據處理、搭建及訓練機器模型、模型存儲其參數量化等服務。該文的卷積神經網絡搭建,基于TensorFlow并遵循如下設計。
卷積層選擇使用步長為1,邊距為0的模板,輸入經處理得到的輸出保證大小一致,池化層選擇步長為2的2×2大小的最大池化模板。
搭建的第一層卷積層由一個卷積接一個最大池化層完成。卷積在每個3×3的patch中計算得到16個特征,權重張量為[3,3,1,16],對每一個輸出通道都有一個對應的片質量,將偏執量設定為32。接著處理圖片,重塑為28×28的格式,將卷積和與重塑后的圖片進行卷積處理,經過ReLU激活函數處理后進入最大池化層。
第二層相比第一層將得到32個特征,權重張量為[3,3,16,32]。在前述步驟中,圖片的格式為28×28,池化層為2×2的參數設定,因此經過兩次池化層后的圖片尺寸變為7×7像素?,F在經一個參數為128神經元的全連接層處理,生成一個向量,將向量reshape為一維數組,與權重W_fc1相乘后與偏執b_fc1相加,通過ReLU激活函數處理。為了盡量減小過擬合問題造成的不良影響,在輸出層后添加Dropout[15]。
最后使用全連接層,通過Softmax Regression得到識別結果。
在訓練模型前需要定義損失函數(Loss Function),選擇交叉熵函數(Cross-Entropy),交叉熵函數如公式(3)所示。

(3)
計算交叉熵后,就可以使用梯度下降來優化參數。由于已部署好網絡結構,TensorFlow可以使用反向傳播算法計算梯度,自動地優化參數,直到交叉熵最小。TensorFlow提供了多種優化器,該文選擇Adam優化器來做梯度最速下降,學習率0.000 1。每次訓練隨機選擇50個樣本,加快訓練速度,每輪訓練結束后,計算預測準確度。實驗得出,預測正確率可以達到98%以上。
由于需要在PYNQ開發板上部署模型,故需要記錄卷積層、池化層、全連接層等詳細參數,其中數據的先后讀取順序必須保持順序相同,針對不同維度的數據,由維度從高到低存儲,以便在硬件層運行正常。
卷積神經網絡性能優異,但計算量龐大。圖像識別技術往往對數據處理的實時性有嚴格的要求。FPGA屬于專用集成電路中的一種半定制電路,是可編程的邏輯序列。其并行化的結構特點十分適合應用于圖像處理,極強的靈活性方便系統的維護、移植、升級及擴展,較低的功耗滿足于移動設備的耗能限制。但對于不了解硬件設計的工程師來說,傳統的FPGA設計需要熟練掌握VerilogHDL硬件編程語言。因此,賽靈思公司推出了Vivado軟件的對應套件Vivado HLS開發工具,HLS是高層次綜合(High-Level-Synthesis)的縮寫,HLS的主要功能是將C語言、C++等C規范語言轉換為可以由Xilinx旗下FPGA實現。HLS的出現大大降低了非專業硬件工程師的設計難度和開發周期,也減少了工程師進行FPGA開發的學習成本,并提高了軟件設計人員所設計系統的性能表現。
軟件開發人員可以在FPGA上加速他們算法中計算密集的部分。與傳統設計模式相比,利用Vivado HLS開發套件可以更快速地驗證硬件描述語言設計的功能正確性。與VerilogHDL和VHDL這樣的硬件描述語言相比,C/C++這樣的高級編程語言擁有更好的可讀性和使用基數。HLS套件可以根據默認的行為、約束條件以及開發人員自定義的優化設置來對高級語言所編寫的程序進行硬件層面的綜合??梢栽诔绦蛳嗤那闆r下綜合生成不同的硬件實現方案,通過優化指令自定義修改控制電路內部邏輯和I/O端口。為了確定HLS套件綜合生成的設計是否滿足性能要求和資源限制,HLS會在綜合結束后自動生成性能資源報告,可查看綜合得到的RTL級別模塊的響應性能及占用資源量。
如果采用傳統的軟件開發思路來設計HLS程序,會造成大量冗余,HLS套件會針對每一個函數都生成一份電路,在層數較多的網絡中就會造成大量電路出現。與此同時,如果后期進行刪減添加網絡層或者實現其他功能,都需要重新生成綜合電路,不僅低效而且不具備通用性,這與現在的開發模式是背道而馳的。
通過對MNIST的代碼實現分析可知,在MNIST網絡中,存在卷積運算、ReLU運算、池化運算和全連接運算。Softmax可以視為全連接運算的一種特殊形式,其中ReLU函數原理較為簡單,而全連接層也可以看作是卷積層的一種特殊形式,它的核大小正好等于輸入的空間尺寸。因此,實現一個具備靈活性的通用卷積電路只需要實現兩種通路,即兩種分別是通用卷積運算的電路和通用池化運算的電路。PYNQ的PS端(ARM端)所搭載的CPU作為主控來調度電路,卷積與ReLU運算和池化運算為兩條數據通路,通過CPU可以配置通路參數。
常見的CNN中,各個網絡函數的數據均為三維數據,即多個矩陣疊加,為了實現各層間共享加速模塊的設計要求,需要將各層的輸入輸出數據以及kernel的步長以變量形式進行傳遞。卷積層處理過程如圖3所示。

圖3 卷積層偽代碼
經過HLS綜合后得出的性能參數如圖4所示。

圖4 性能報告
由圖4可知,上述設計仿真得到的時鐘周期高達2 378 400,對于HLS設計來說,需要有針對性地進行優化加速設計。
軟件層面的設計若未經優化則直接綜合生成串行電路,即同一時間只能進行單路運算,無法發揮并行計算的優勢。未經優化的HLS設計等效于串行結構,對于實例的卷積層電路來說,需要六次輪巡計算,理論上優化后可以最高提升六倍的性能。但HLS的UNROLL優化方法對循環的展開能力是有限的,且性能提升受工作頻率及數據耦合的限制,故難以達到理論值。
進行優化設計,可在Directive中添加指引,通過UNROLL將循環運算展開為并行運算,進行綜合后的參數得到了提升。進一步地,為了提高數據輸入時的讀取速度,再對輸入數據進行優化,將輸入數據多維度展開,綜合生成的電路性能參數如圖5所示。

圖5 性能參數
HLS的默認形式是不進行流水化處理的,默認綜合生成的電路為最節省資源的配置,使用pragma PIPELINE約束將卷積層進行流水化處理,PIPLINE將自動將循環內部的所有子循環展開,因此可以取代上述UNROLL的設置。經過流水優化后的性能報告如圖6所示。由圖6可知,經過上述步驟進行優化后,卷積層的時鐘周期從2 378 400縮短至7 088,即加速了335.55倍。

圖6 性能參數
上述的卷積層HLS是在卷積模型結構參數固定的情況下設計的,所使用的優化加速方法,如循環展開、多維展開、流水化處理等操作都需要在模型參數確定的條件下才可以使用。當在PYNQ上部署的是針對某種特定邊緣計算場景的系統時,確實可以設計參數固定的卷積模型,但實際應用中,只能實現某一種單一功能的終端設備是很少見的,其設計成本高且不具備通用性。
為了設計一個通用性的卷積層IP,需要將原先設計中的各個權重參數作為變量來進行編程。VIVADO HLS對C語言以及C++都做了相應的擴展,允許工程師在設計中自定義任意精度的浮點數據類型和定點數據類型,在卷積層的設計中使用ap_uint定義位數精度即可。在適用不同場景時,通過參數調整便可實現卷積層IP的復用。
為了實現泛用性,實現在PYNQ的liunx系統直接傳參,可以進行端口類型約束指引,通過INTERFACE控制電路的啟停,選擇s_axilite總線方式,生成AXI總線接口。在此基礎上,可以將數據的輸入和讀取同樣采用AXI總線傳輸方式處理,同時添加INTERFACE指引,選擇m_axi方式實現數據的自動讀取。
針對主流深度學習算法CNN中計算量最大的卷積層,提出了在賽靈思高層次綜合開發工具環境下的設計思路及優化方法,利用HLS的特點及優勢設計了參數固定的卷積模塊以及具備通用性的卷積模塊,討論了 FPGA實現深度學習算法部署的設計思路和加速方法。經驗證,部署于FPGA的卷積神經網絡模型性能良好,能通過參數傳輸的方式實現針對不同數據的通用。該方法為圖像識別技術提供了一種卷積神經網絡系統的設計思路,實現了卷積層模塊的通用性設計。