潘坤榕,夏福源,李瑞民,劉子嫣,唐 珂,孫科學,3*
(1.南京郵電大學 電子與光學工程學院、微電子學院,江蘇 南京 210023; 2.南京郵電大學 貝爾英才學院,江蘇 南京 210023; 3.射頻集成與微組裝技術國家地方聯(lián)合工程實驗室,江蘇 南京 210023)
人工智能(Artificial Intelligence,AI)作為計算機科學技術領域的一項重要分支,得益于近年來高速發(fā)展的計算硬件,越來越受到關注并逐漸發(fā)展為最重要的研究領域之一,其發(fā)展成果滲透到了各個領域,對現(xiàn)代世界的方方面面產(chǎn)生了深遠的影響。作為人工智能的一個重要研究領域,圖像識別技術在探查資源、公安刑偵、生物醫(yī)學等領域有著廣泛的應用[1]。舉例來說,圖像識別技術能夠提取遙感圖像的信息以探查森林、水利、海洋、農(nóng)業(yè)等資源;能夠完成指紋、手印、人像等類型數(shù)據(jù)的辨別以向公安機關提供有效的線索;能夠處理病患的各類圖像數(shù)據(jù)而為醫(yī)生提供各種輔助診斷的信息。受限于硬件和算法,圖像識別技術的發(fā)展一度停滯。90年代,支持向量機和人工神經(jīng)網(wǎng)絡的結合促進了圖像識別技術的發(fā)展[2-3]。人工神經(jīng)網(wǎng)絡需要人為參與預處理,這導致了圖像識別準確率的下降。為擺脫人工神經(jīng)網(wǎng)絡的限制,人們提出了循環(huán)神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)[4]、深度信念網(wǎng)絡(Deep Belief Network,DBN)[5-6]、卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)等深層次網(wǎng)絡結構[7]。
其中,卷積神經(jīng)網(wǎng)絡以其良好的特征提取能力和泛化能力,在圖像處理、目標跟蹤與檢測、自然語言處理、場景分類、人臉識別等諸多領域獲得了巨大的成功[8]。[5][6]卷積神經(jīng)網(wǎng)絡模型性能優(yōu)異,但計算量異常龐大[9],因此對計算機硬件設備的計算能力有著比較嚴苛的要求?,F(xiàn)行的主流硬件平臺包括CPU、GPU、FPGA、ASIC等,其中,CPU因自身架構的局限而難以支持并行運算,處理效率不高;GPU因價格昂貴,功耗太高無法應用于嵌入式移動終端;專用集成電路(Application-Specific Integrated Circuit,ASIC)計算強、功耗低,但其通用性差、成本高昂且可遷移性低?,F(xiàn)場可編程邏輯門陣列(Field Programmable Gate Array,F(xiàn)PGA)器件在1985年由Xilinx公司發(fā)明,它的出現(xiàn)在很大程度上彌補了復雜可編程邏輯器件(Complex Programmable Logic Device,CPLD)和ASIC之間的空白,這種半定制化的解決方案既克服了ASIC開發(fā)成本巨大的弊端,又有著通用可編程邏輯器件無法比擬的運算效率。此外,F(xiàn)PGA配置了眾多邏輯單元可用于深度學習算法的并行計算,其計算力強、功耗低,并行化的結構特點正適用于卷積神經(jīng)網(wǎng)絡模型的部署[10-11]。
于是卷積神經(jīng)網(wǎng)絡模型的研究者和工程師們將目光轉向了FPGA平臺。FPGA加速深度學習算法,往往面臨如下挑戰(zhàn):有限的FPGA資源難以滿足龐大的計算和數(shù)據(jù)需求;開發(fā)周期長,學習成本高,設計復用性差[12]。深度學習算法經(jīng)過長足的發(fā)展,其算法復雜度不斷提高,其數(shù)據(jù)量也大幅增長。近年來,F(xiàn)PGA片上資源越來越豐富,但尚未能滿足不斷增長的算法配置需求。設計者必須關注如何使得資源得到高效的利用,否則其精心設計的算法將因資源的局限而無法配置成功。特別地,對于具有商業(yè)意義的設計而言,設計者更需要合理地降低產(chǎn)品生產(chǎn)成本及人工成本。大規(guī)模的FPGA芯片,往往價格高昂,資源與成本兩者間存在矛盾;相較于程序設計人員,F(xiàn)PGA開發(fā)者需要豐富的硬件知識及硬件開發(fā)經(jīng)驗;FPGA系統(tǒng)的開發(fā)流程,也比軟件設計更繁瑣、冗長。此外,F(xiàn)PGA加速深度學習算法的設計往往只針對特定的應用場景,成本高昂的設計不能得到很好的重用,這造成了資源的浪費。
為解決以上難題,該文以MNIST數(shù)據(jù)集為例,在TensorFlow上搭建及訓練卷積神經(jīng)網(wǎng)絡模型,探討了基于FPGA平臺的卷積神經(jīng)網(wǎng)絡設計與優(yōu)化方法,通過傳輸模型參數(shù)的方法實現(xiàn)了卷積層模塊的可重用,最后,完成驅動及系統(tǒng)上位機的程序設計,并對系統(tǒng)進行功能和性能測試。
卷積神經(jīng)網(wǎng)絡是一種“端到端”的學習方法,它將圖像像素信息作為輸入,通過卷積操作進行圖像像素特征的提取,對原始圖像進行高度抽象,既能夠在最大程度上確保輸入圖像信息的完整性,又使得模型的輸出直接是圖像識別的結果,因此在圖像處理領域獲得了優(yōu)異的性能表現(xiàn),并得到了廣泛的實際應用。一個完整的卷積神經(jīng)網(wǎng)絡模型的組成結構為:若干個卷積層(Convolutional Layer)、池化層(Pooling Layer)和全連接層(Fully Connected),處理單元包括:卷積核、池化、激活函數(shù)、分類器等[13],其中卷積層和全連接層的功能主要是完成原始圖像特征提取,而池化層的主要目的是防止過擬合現(xiàn)象的出現(xiàn)。當待處理的數(shù)據(jù)輸入卷積神經(jīng)網(wǎng)絡模型后,通過卷積層進行數(shù)據(jù)的特征提取,池化層分為最大池化層、均值池化層等類型,完成數(shù)據(jù)的采樣,全連接層處理輸入數(shù)據(jù)和輸出數(shù)據(jù)的線性映射。如圖1所示,該模型為一個手寫數(shù)字識別的卷積神經(jīng)網(wǎng)絡算法結構。
圖1 手寫識別模型結構
卷積層利用多個不同的卷積核過濾提取不同的特征信息,多個不同的卷積核可以視作不同的濾波器。圖像的基本特征在淺層卷積層中處理,圖像的抽象特征在深層卷積層中處理。在算法模型中,卷積層的運算量是最大的,并且可以視為是全并行的計算,故卷積層是優(yōu)化加速的關鍵。卷積層的計算公式如公式(1)所示:
(1)
式中,l為卷積層數(shù),k為卷積核,ai為輸入特征譜的一個選擇,b為偏執(zhí)參數(shù)。
池化層主要用于合并各層中相似的特征信息。常用的池化結構分為平均池化層和最大池化層兩種,在神經(jīng)網(wǎng)絡結構中,池化層取最大池化,即計算一個特征映射中部分區(qū)域的最大值,最大池化可使得失真的概率降低,最大池化如圖2所示。
圖2 最大池化層計算模型
使用激活函數(shù)可以讓神經(jīng)網(wǎng)絡具有非線性識別功能,極大提升了神經(jīng)網(wǎng)絡的表達能力。在激活函數(shù)的選擇上,sigmoid激活函數(shù)在梯度下降中容易出現(xiàn)過飽和、造成終止梯度傳遞,且沒有0中心化。為了解決這個問題,在神經(jīng)網(wǎng)絡中使用另外一個激活函數(shù):ReLU。
ReLU函數(shù)的全稱為Rectified Linear Units。表達式如下:
f(x)=max(0,x)
(2)
因為沒有時間開銷巨大的冪運算,運用ReLU函數(shù)作為激活函數(shù)的神經(jīng)網(wǎng)絡具有收斂速度快、求梯度簡單的優(yōu)點。
針對MNIST數(shù)據(jù)集的卷積神經(jīng)網(wǎng)絡搭建是在TensorFlow中進行[14]。
MNIST數(shù)據(jù)集是一手寫字體數(shù)字數(shù)據(jù)集,包括了訓練樣本、訓練樣本標簽、測試樣本、測試樣本標簽四部分數(shù)據(jù)。MNIST數(shù)據(jù)集常用于各種模型的訓練及測試,該文的卷積神經(jīng)網(wǎng)絡模型正是基于MNIST數(shù)據(jù)集。
TensorFlow是一種流行的深度學習框架,主要包括了TensorFlow核心庫以及配置、部署等軟件。TensorFlow方案方便快捷易用性強,被廣泛地應用于機器學習領域。TensorFlow提供了數(shù)據(jù)整合、數(shù)據(jù)處理、搭建及訓練機器模型、模型存儲其參數(shù)量化等服務。該文的卷積神經(jīng)網(wǎng)絡搭建,基于TensorFlow并遵循如下設計。
卷積層選擇使用步長為1,邊距為0的模板,輸入經(jīng)處理得到的輸出保證大小一致,池化層選擇步長為2的2×2大小的最大池化模板。
搭建的第一層卷積層由一個卷積接一個最大池化層完成。卷積在每個3×3的patch中計算得到16個特征,權重張量為[3,3,1,16],對每一個輸出通道都有一個對應的片質量,將偏執(zhí)量設定為32。接著處理圖片,重塑為28×28的格式,將卷積和與重塑后的圖片進行卷積處理,經(jīng)過ReLU激活函數(shù)處理后進入最大池化層。
第二層相比第一層將得到32個特征,權重張量為[3,3,16,32]。在前述步驟中,圖片的格式為28×28,池化層為2×2的參數(shù)設定,因此經(jīng)過兩次池化層后的圖片尺寸變?yōu)?×7像素?,F(xiàn)在經(jīng)一個參數(shù)為128神經(jīng)元的全連接層處理,生成一個向量,將向量reshape為一維數(shù)組,與權重W_fc1相乘后與偏執(zhí)b_fc1相加,通過ReLU激活函數(shù)處理。為了盡量減小過擬合問題造成的不良影響,在輸出層后添加Dropout[15]。
最后使用全連接層,通過Softmax Regression得到識別結果。
在訓練模型前需要定義損失函數(shù)(Loss Function),選擇交叉熵函數(shù)(Cross-Entropy),交叉熵函數(shù)如公式(3)所示。
(3)
計算交叉熵后,就可以使用梯度下降來優(yōu)化參數(shù)。由于已部署好網(wǎng)絡結構,TensorFlow可以使用反向傳播算法計算梯度,自動地優(yōu)化參數(shù),直到交叉熵最小。TensorFlow提供了多種優(yōu)化器,該文選擇Adam優(yōu)化器來做梯度最速下降,學習率0.000 1。每次訓練隨機選擇50個樣本,加快訓練速度,每輪訓練結束后,計算預測準確度。實驗得出,預測正確率可以達到98%以上。
由于需要在PYNQ開發(fā)板上部署模型,故需要記錄卷積層、池化層、全連接層等詳細參數(shù),其中數(shù)據(jù)的先后讀取順序必須保持順序相同,針對不同維度的數(shù)據(jù),由維度從高到低存儲,以便在硬件層運行正常。
卷積神經(jīng)網(wǎng)絡性能優(yōu)異,但計算量龐大。圖像識別技術往往對數(shù)據(jù)處理的實時性有嚴格的要求。FPGA屬于專用集成電路中的一種半定制電路,是可編程的邏輯序列。其并行化的結構特點十分適合應用于圖像處理,極強的靈活性方便系統(tǒng)的維護、移植、升級及擴展,較低的功耗滿足于移動設備的耗能限制。但對于不了解硬件設計的工程師來說,傳統(tǒng)的FPGA設計需要熟練掌握VerilogHDL硬件編程語言。因此,賽靈思公司推出了Vivado軟件的對應套件Vivado HLS開發(fā)工具,HLS是高層次綜合(High-Level-Synthesis)的縮寫,HLS的主要功能是將C語言、C++等C規(guī)范語言轉換為可以由Xilinx旗下FPGA實現(xiàn)。HLS的出現(xiàn)大大降低了非專業(yè)硬件工程師的設計難度和開發(fā)周期,也減少了工程師進行FPGA開發(fā)的學習成本,并提高了軟件設計人員所設計系統(tǒng)的性能表現(xiàn)。
軟件開發(fā)人員可以在FPGA上加速他們算法中計算密集的部分。與傳統(tǒng)設計模式相比,利用Vivado HLS開發(fā)套件可以更快速地驗證硬件描述語言設計的功能正確性。與VerilogHDL和VHDL這樣的硬件描述語言相比,C/C++這樣的高級編程語言擁有更好的可讀性和使用基數(shù)。HLS套件可以根據(jù)默認的行為、約束條件以及開發(fā)人員自定義的優(yōu)化設置來對高級語言所編寫的程序進行硬件層面的綜合。可以在程序相同的情況下綜合生成不同的硬件實現(xiàn)方案,通過優(yōu)化指令自定義修改控制電路內部邏輯和I/O端口。為了確定HLS套件綜合生成的設計是否滿足性能要求和資源限制,HLS會在綜合結束后自動生成性能資源報告,可查看綜合得到的RTL級別模塊的響應性能及占用資源量。
如果采用傳統(tǒng)的軟件開發(fā)思路來設計HLS程序,會造成大量冗余,HLS套件會針對每一個函數(shù)都生成一份電路,在層數(shù)較多的網(wǎng)絡中就會造成大量電路出現(xiàn)。與此同時,如果后期進行刪減添加網(wǎng)絡層或者實現(xiàn)其他功能,都需要重新生成綜合電路,不僅低效而且不具備通用性,這與現(xiàn)在的開發(fā)模式是背道而馳的。
通過對MNIST的代碼實現(xiàn)分析可知,在MNIST網(wǎng)絡中,存在卷積運算、ReLU運算、池化運算和全連接運算。Softmax可以視為全連接運算的一種特殊形式,其中ReLU函數(shù)原理較為簡單,而全連接層也可以看作是卷積層的一種特殊形式,它的核大小正好等于輸入的空間尺寸。因此,實現(xiàn)一個具備靈活性的通用卷積電路只需要實現(xiàn)兩種通路,即兩種分別是通用卷積運算的電路和通用池化運算的電路。PYNQ的PS端(ARM端)所搭載的CPU作為主控來調度電路,卷積與ReLU運算和池化運算為兩條數(shù)據(jù)通路,通過CPU可以配置通路參數(shù)。
常見的CNN中,各個網(wǎng)絡函數(shù)的數(shù)據(jù)均為三維數(shù)據(jù),即多個矩陣疊加,為了實現(xiàn)各層間共享加速模塊的設計要求,需要將各層的輸入輸出數(shù)據(jù)以及kernel的步長以變量形式進行傳遞。卷積層處理過程如圖3所示。
圖3 卷積層偽代碼
經(jīng)過HLS綜合后得出的性能參數(shù)如圖4所示。
圖4 性能報告
由圖4可知,上述設計仿真得到的時鐘周期高達2 378 400,對于HLS設計來說,需要有針對性地進行優(yōu)化加速設計。
軟件層面的設計若未經(jīng)優(yōu)化則直接綜合生成串行電路,即同一時間只能進行單路運算,無法發(fā)揮并行計算的優(yōu)勢。未經(jīng)優(yōu)化的HLS設計等效于串行結構,對于實例的卷積層電路來說,需要六次輪巡計算,理論上優(yōu)化后可以最高提升六倍的性能。但HLS的UNROLL優(yōu)化方法對循環(huán)的展開能力是有限的,且性能提升受工作頻率及數(shù)據(jù)耦合的限制,故難以達到理論值。
進行優(yōu)化設計,可在Directive中添加指引,通過UNROLL將循環(huán)運算展開為并行運算,進行綜合后的參數(shù)得到了提升。進一步地,為了提高數(shù)據(jù)輸入時的讀取速度,再對輸入數(shù)據(jù)進行優(yōu)化,將輸入數(shù)據(jù)多維度展開,綜合生成的電路性能參數(shù)如圖5所示。
圖5 性能參數(shù)
HLS的默認形式是不進行流水化處理的,默認綜合生成的電路為最節(jié)省資源的配置,使用pragma PIPELINE約束將卷積層進行流水化處理,PIPLINE將自動將循環(huán)內部的所有子循環(huán)展開,因此可以取代上述UNROLL的設置。經(jīng)過流水優(yōu)化后的性能報告如圖6所示。由圖6可知,經(jīng)過上述步驟進行優(yōu)化后,卷積層的時鐘周期從2 378 400縮短至7 088,即加速了335.55倍。
圖6 性能參數(shù)
上述的卷積層HLS是在卷積模型結構參數(shù)固定的情況下設計的,所使用的優(yōu)化加速方法,如循環(huán)展開、多維展開、流水化處理等操作都需要在模型參數(shù)確定的條件下才可以使用。當在PYNQ上部署的是針對某種特定邊緣計算場景的系統(tǒng)時,確實可以設計參數(shù)固定的卷積模型,但實際應用中,只能實現(xiàn)某一種單一功能的終端設備是很少見的,其設計成本高且不具備通用性。
為了設計一個通用性的卷積層IP,需要將原先設計中的各個權重參數(shù)作為變量來進行編程。VIVADO HLS對C語言以及C++都做了相應的擴展,允許工程師在設計中自定義任意精度的浮點數(shù)據(jù)類型和定點數(shù)據(jù)類型,在卷積層的設計中使用ap_uint定義位數(shù)精度即可。在適用不同場景時,通過參數(shù)調整便可實現(xiàn)卷積層IP的復用。
為了實現(xiàn)泛用性,實現(xiàn)在PYNQ的liunx系統(tǒng)直接傳參,可以進行端口類型約束指引,通過INTERFACE控制電路的啟停,選擇s_axilite總線方式,生成AXI總線接口。在此基礎上,可以將數(shù)據(jù)的輸入和讀取同樣采用AXI總線傳輸方式處理,同時添加INTERFACE指引,選擇m_axi方式實現(xiàn)數(shù)據(jù)的自動讀取。
針對主流深度學習算法CNN中計算量最大的卷積層,提出了在賽靈思高層次綜合開發(fā)工具環(huán)境下的設計思路及優(yōu)化方法,利用HLS的特點及優(yōu)勢設計了參數(shù)固定的卷積模塊以及具備通用性的卷積模塊,討論了 FPGA實現(xiàn)深度學習算法部署的設計思路和加速方法。經(jīng)驗證,部署于FPGA的卷積神經(jīng)網(wǎng)絡模型性能良好,能通過參數(shù)傳輸?shù)姆绞綄崿F(xiàn)針對不同數(shù)據(jù)的通用。該方法為圖像識別技術提供了一種卷積神經(jīng)網(wǎng)絡系統(tǒng)的設計思路,實現(xiàn)了卷積層模塊的通用性設計。