雷 晨,何樂生,王威廉
(云南大學(xué) 信息學(xué)院,云南 昆明 650500)
云南是先天性心臟病(congenital heart disease,CHD)的高發(fā)區(qū)[1,2],大規(guī)模的心臟聽診篩查是先心病初診的重要手段[2]。已有研究人員在探索借助心音采集設(shè)備采集心音并上傳至云端,利用深度學(xué)習(xí)的算法進(jìn)行分類識別。但此方案最大的瓶頸在于采集后數(shù)據(jù)的上傳和分析結(jié)果的返回受限于網(wǎng)絡(luò)狀況。在便攜式設(shè)備部署輕量級分類網(wǎng)絡(luò)進(jìn)行先心病的分類處理成了項目組的研究方向[4,5]。為此,本文提出了一種基于APSoC(all programmable system on chip)的先心病初診輔助診斷系統(tǒng)的硬件設(shè)計方案。首先,對5122例心音信號進(jìn)行MFSC特征提取、維度變換等預(yù)處理。然后,訓(xùn)練CNN網(wǎng)絡(luò)模型用于心音分類。最后,利用軟硬件協(xié)同設(shè)計的思路,充分分析CNN算法前向傳播和并行計算的可行性,設(shè)計了兩個通用的電路,分別負(fù)責(zé)卷積-全連接和池化運算。采用高層次邏輯綜合(high-level synthesis,HLS)方法對電路進(jìn)行優(yōu)化,有效提高了電路的計算并行度,降低了電路運行所需時間。通過綜合和布局布線,得到一個完整的CNN算法模型電路。最終將該電路部署至硬件平臺,實現(xiàn)硬件并行CNN(convolutional neural network,CNN)加速算法。本文提出的硬件加速方案,滿足高性能、低資源利用率、低功耗、低成本等要求,實現(xiàn)了離線條件下分類效率高、分類精度高的要求,有望用于先心病篩查。
卷積神經(jīng)網(wǎng)絡(luò)近年來憑借其強(qiáng)大的學(xué)習(xí)能力在多個領(lǐng)域廣泛應(yīng)用,在分類、檢測以及分割等領(lǐng)域均有突破性的研究進(jìn)展。卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展依靠算法的不斷優(yōu)化和硬件平臺的算力支撐。由于在許多邊緣設(shè)備應(yīng)用的場景下,CPU(central processing unit)的串行運算方式無法滿足實時性需求,GPU高能耗的特點也不適用于移動設(shè)備。FPGA(field programmable gate array)既具備集成電路的性能優(yōu)勢,又有可重新配置的靈活性。通過充分發(fā)揮FPGA的并行特性,加快邏輯性強(qiáng)的操作速度,大大提高CNN的計算速度。因此,考慮到實時性處理和要求和便攜式設(shè)備的運算速度慢的特點,在便攜式設(shè)備上通過FPGA實現(xiàn)CNN的硬件加速具有重大意義。
傳統(tǒng)的FPGA計算能力強(qiáng),資源豐富,但是不易于搭建系統(tǒng)操作平臺,且開發(fā)成本高。目前,全可編程片上系統(tǒng)APSoC異軍突起,含高性能FPGA(可編程邏輯加速器programmable logic,PL部分)作為外設(shè),以及雙核ARM Cotex-A9(可編程系統(tǒng)programming system,PS部分)處理器,為異構(gòu)計算提供了極大地便利。其充分結(jié)合了兩者的優(yōu)勢??赏ㄟ^高層次邏輯綜合[6]將C/C++語言轉(zhuǎn)化為Verilog/VHDL(very-high-speed intergrated circuit hardware description language,VHDL)等低層次的RTL(re-gister transfer level)語言,并通過Vivado部署至板卡,開發(fā)流程[7]簡單,廣泛應(yīng)用于神經(jīng)網(wǎng)絡(luò)的硬件加速方案之中。
已有不少學(xué)者在APSoC架構(gòu)上實現(xiàn)了對深度神經(jīng)網(wǎng)絡(luò)的算法的加速。綜述[8]對卷積神經(jīng)網(wǎng)絡(luò)的研究表示卷積層的前向傳播是整個CNN前向傳播重要部分,計算量和所花費時間的占比均偏高。文獻(xiàn)[9]通過塊循環(huán)矩陣來實現(xiàn)精度和壓縮率之間的細(xì)粒度權(quán)衡,降低了運算復(fù)雜度。文獻(xiàn)[10]將卷積層轉(zhuǎn)換為與全連接層相似的矩陣乘法。文獻(xiàn)[11]同樣改變了卷積計算方式,大大提高了卷積層運算速度,但該算法需對不同卷積層進(jìn)行單獨計算和推導(dǎo),且實現(xiàn)難度大,不易擴(kuò)展,通用性差。文獻(xiàn)[12]在Zynq-7020平臺上為腦電信號分類進(jìn)行加速,在100 MHz的頻率下速度提升了19倍。通過對腦電信號的維度轉(zhuǎn)換的處理后,對CNN的每層網(wǎng)絡(luò)設(shè)計IP核,并分別配置實現(xiàn)硬件加速,資源利用率高。但該設(shè)計部分卷積層對整個加速器的延遲很大,不利于算法的擴(kuò)展。
綜上,本文提出了一種基于APSoC的先心病初診輔助診斷系統(tǒng)的設(shè)計方案。首先,對原始心音信號進(jìn)行預(yù)處理后訓(xùn)練CNN網(wǎng)絡(luò)。然后,對CNN進(jìn)行軟硬件劃分,將CNN的網(wǎng)絡(luò)結(jié)構(gòu)拆分為卷積-全連接和池化兩個通用IP(intellectual property,IP)。利用HLS實現(xiàn)并優(yōu)化電路,采用分塊化、并行計算和流水線技術(shù)。通過Vivado軟件對CNN電路的綜合和布局布線,得到可下載的比特流文件。最后,將硬件部署到Zynq SOC平臺,通過網(wǎng)線連接到PC端的Jupyter Notebook界面,即可在PS端的PYNQ(Python on Zynq,PYNQ)框架下進(jìn)行FPGA電路的燒寫、數(shù)據(jù)的讀取和操作。實現(xiàn)了心音輔助診斷算法的有效加速,且利于算法結(jié)構(gòu)的擴(kuò)展和遷移。
本文所用的數(shù)據(jù)源于從云南省阜外心血管病醫(yī)院、昆明醫(yī)科大學(xué)第一附屬醫(yī)院臨床已確診的先心病病例,以及課題組隨醫(yī)療隊下鄉(xiāng)篩查先心病采集的心音所建數(shù)據(jù)庫,含確診病例和健康志愿者心音樣本。采集對象為0.5到16周歲的兒童和青少年。采集設(shè)備由項目組自行研發(fā),采用美國(THE ONE,ThinkLabs)公司生成的心音傳感器,采集時長20 s,采樣率為5000 Hz。
對原始心音信號的預(yù)處理,通常包括降噪、分幀等。文獻(xiàn)[14]中分析對比了不同的小波去噪方法。本文選用db6小波基、4層小波、軟閾值10%的小波對心音進(jìn)行去噪處理。對降噪后的心音進(jìn)行分幀,本文自動截取每4 s作為一個樣本幀,約含5個心動周期,有足夠的信息供分析用。
心音特征參數(shù)選取的好壞直接影響系統(tǒng)的性能。梅爾頻譜系數(shù)MFSC(log Mel-frequency spectral coefficients,MFSC)[15],相對于梅爾倒譜系數(shù)(Mel frequency cepstral coefficents,MFCC)少了計算離散余弦變換(discrete cosine transformation,DCT)環(huán)節(jié),常用于語音信號分析。進(jìn)行MFSC特征提取,對信號先預(yù)加重、分幀、加窗操作,之后進(jìn)行快速傅里葉變換得到頻譜,接下來利用梅爾刻度變換得到頻帶內(nèi)信號的能量譜。心音信號經(jīng)過梅爾變換后,從1維時域信號變換成為2維的M×N梅爾頻率能量譜MFSC“特征圖”,其中M為時間上的幀數(shù),N為Mel頻率濾波器的個數(shù)。對MFSC取一階差分ΔMFSC和二階差分Δ2MFSC。由靜態(tài)的MFSC、ΔMFSC、Δ2MFSC這3幅M×N特征圖組成三通道的心音特征圖。相較于MFCC,MFSC方法主要改進(jìn)在于將靜態(tài)特征和反映聲音動態(tài)特性的差分譜結(jié)合起來,既滿足了CNN輸入特征的映射方式,又能兼顧心音信號的時頻域特征。MFSC模擬了彩色圖片,RGB通道分別對應(yīng)每個特征圖的MFSC的靜態(tài)數(shù)據(jù)、一階差分和二階差分的系數(shù)特征矩陣。心音數(shù)據(jù)的處理和MFSC組織方式過程如圖1所示。
圖1 心音數(shù)據(jù)的處理和MFSC組織方式
本文選用的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)分別由3個卷積層Conv_1、Conv_2、Conv_3,3個池化層Pool_1、Pool_2、Pool_3,2個全連接層Fc_1、Fc_2組成,如圖2所示。其中,卷積層之后的激活函數(shù)為ReLu,池化層選擇最大值池化。同時,在池化層之后采用dropout丟棄部分參數(shù),避免過擬合的同時減少了片上資源的占用。
目前,基于CNN的卷積神經(jīng)網(wǎng)絡(luò)的硬件加速基于其層次結(jié)構(gòu)主要有兩種不同的實現(xiàn)模式:一種是流架構(gòu),另一種是單結(jié)構(gòu)核心。前者,如圖3(a)所示,將相應(yīng)的硬件資源分配給各網(wǎng)絡(luò)層,其優(yōu)點是可實現(xiàn)高度可配置的并行,靈活性強(qiáng)。缺點是對片上資源消耗較大。后者注重資源重用,如圖3(b)所示,將不同的網(wǎng)絡(luò)層通過資源重用共享同一個加速器,這種非高度定制的結(jié)構(gòu)的優(yōu)點是更靈活,更容易在平臺之間遷移,且資源占用率低。
圖2 CNN架構(gòu)圖及參數(shù)
圖3 硬件加速總體架構(gòu)
CNN的計算量主要集中在卷積層,因其計算過程中涉及到大量的卷積計算,會消耗大量的計算資源。卷積計算的本質(zhì)為乘累加計算,乘累加計算的并行特質(zhì)是卷積計算便是CNN可以進(jìn)行FPGA加速的原因。池化的目的是特征提取,在卷積計算過后所產(chǎn)生的大量數(shù)據(jù)中,篩選出最有價值的數(shù)據(jù)進(jìn)行保存,防止數(shù)據(jù)量過大導(dǎo)致的數(shù)據(jù)爆炸等現(xiàn)象發(fā)生。池化的實質(zhì)就是降采樣。根據(jù)對全連接的計算原理分析即可知,全連接層可以看作被拉扁的卷積層。故本文不再單獨設(shè)計全連接層加速器,只需在傳入?yún)?shù)時,將卷積核大小設(shè)置為1*1即可。通過設(shè)計一個Conv_fc_acc實現(xiàn)了卷積和全連接兩種運算,提高了IP核的重用率和資源利用率。
考慮到硬件平臺資源的有限性,本文選擇在單計算核心模式下設(shè)計了系統(tǒng)架構(gòu)。計算核心包括Conv_fc_acc和Pool_acc,其中,Conv_fc_acc是指卷積-全連接運算加速器,主要負(fù)責(zé)對卷積計算過程與全連接計算過程進(jìn)行加速;Pool_acc是指池化運算加速器,主要負(fù)責(zé)對池化計算過程進(jìn)行加速。
硬件加速總體架構(gòu)如圖4所示。系統(tǒng)結(jié)構(gòu)大致可由可編程系統(tǒng)(programming system,PS)、可編程邏輯加速器(programmable logic,PL)兩部分組成,還有外部存儲器DDR、片內(nèi)緩沖區(qū)以及片內(nèi)和片外總線互連。其中,輸入數(shù)據(jù)和權(quán)重被預(yù)先存儲在外部存儲器DDR中。PS和PL通過AXI總線互連。加速器通過AXI_Lite總線接收來自CPU的配置信號,例如卷積內(nèi)核大小、跨步、padding方式等。在PS中DDR控制器的作用下,從DDR讀取加速器所需的當(dāng)前層的權(quán)重和輸入數(shù)據(jù),并將其從AXI_memory映射格式轉(zhuǎn)換為AXI4_streaming格式,并在直接內(nèi)存訪問(direct memory access,DMA)的作用下將其轉(zhuǎn)換到加速器的片上緩沖區(qū)。通用卷積電路和通用池化電路放在PL端進(jìn)行并行加速,將特征圖輸入和分類顯示等放在PS端進(jìn)行。AXI4總線負(fù)責(zé)完成數(shù)據(jù)通信,AXI_Lite總線負(fù)責(zé)完成信號的傳輸。ARM_CPU將輸入特征圖加載到DDR內(nèi)存中,然后在FPGA端進(jìn)行高度并行化的運算,以達(dá)到硬件加速的目的。利用FPGA的AXI_DMA總線送入到CNN加速模塊,最后將計算結(jié)果再通過AXI_DMA將輸出的分類結(jié)果傳回ARM端。
圖4 系統(tǒng)總體架構(gòu)
本文利用高層次邏輯綜合(HLS)[5,6]進(jìn)行FPGA開發(fā)。HLS工具可以將C/C++語言轉(zhuǎn)化為Verilog語言,并通過添加約束命令的方式實現(xiàn)并行化操作。相比傳統(tǒng)的FPGA電路設(shè)計方法,利用HLS進(jìn)行開發(fā)將大大提高開發(fā)效率。卷積計算過程可由6層循環(huán)完成,但串行完成,資源利用率低。本文使用的HLS優(yōu)化方法主要包括對數(shù)組的分塊處理、對循環(huán)的展開和流水、定點化處理,可以提高FPGA的資源利用率來提高硬件系統(tǒng)運算的并行度。
CNN的核心部分是利用卷積運算,利用卷積核對輸入特征圖提取特征的過程,卷積計算就是乘和累加計算。通過FPGA將乘、累加運算改為并行計算,是實現(xiàn)CNN加速的途徑。卷積計算的過程是前一層的輸入特征圖與權(quán)重特征圖進(jìn)行卷積,得到一個輸出特征圖。同時,它又作為下一層的輸入特征圖?;瑒臃较蛉鐖D5(a)所示,依次是從左到右、從上到下。當(dāng)輸入的特征圖從DDR中取出時,將按照循環(huán)展開的方法,每個循環(huán)的過程中從輸入通道的方向分解為K個特征子塊。在一個時鐘周期里,同時對多個子塊進(jìn)行卷積操作。其中,特征子塊計算的順序如圖5(b)所示。因此,大小為 [CH_in][H][W] 的特征圖可以被分解為N個子塊 [CH_in/K][H][W][K]。 特征子塊個數(shù)N的計算公式如式(1)所示
N=[CH_in/K]×[H]×[W]×[K]
(1)
式中:CH_in為輸入通道的個數(shù),H、W分別為特征圖的高度和寬度,K為并行度, [CH_in/K] 為一個特征子塊的長度。其中,各個變量均有取整操作。
與特征圖參數(shù)的重新組織方式一樣,權(quán)重參數(shù)的重新加載也是在輸入方向上,即在輸入通道數(shù)CH_in的方向上分為M個權(quán)重子塊。權(quán)重子塊個數(shù)M的計算公式如式(2)所示
M=[CH_out][Ky][Kx][CH_in/K][K]
(2)
式中:CH_in、CH_out為輸入通道數(shù)和輸出通道數(shù)、Kx、Ky為卷積核的大小、K為并行度。
假設(shè)架構(gòu)被分割成多個相互依賴的階段,流水線就是一種可以使不同階段并行執(zhí)行的技術(shù)。流水線技術(shù)通過同時執(zhí)行多個階段達(dá)到減小延遲的目的。如圖6所示。當(dāng)一個循環(huán)被流水線化時,在該循環(huán)下面的任何層次結(jié)構(gòu)中的循環(huán)都必須展開。因此,在進(jìn)行流水化處理之后,通常會在吞吐量和延遲方面提供最佳性能。
圖5 卷積運算順序及分割方式
圖6 流水線操作
在Vivado HLS中,采用流水線技術(shù),通過添加預(yù)編譯指令#pragma HLS PIPEMINE II=1,將最內(nèi)層的K層循環(huán)展開。經(jīng)過循環(huán)展開之后,此時可實現(xiàn)延遲間隔為1的流水線操作,循環(huán)遍歷次數(shù)可降低K倍。循環(huán)遍歷次數(shù)L_conv的計算公式如式(3)所示
L_conv=[H][W][CH_out][Ky][Kx][CH_in/K]
(3)
經(jīng)過PIPELINE約束后的運算時間由原來的L_conv×T個周期提升至L_conv+T-1個周期。速度提升倍數(shù)如式(4)所示
(4)
式中:I_conv指的是電路計算一個Latency所耗費的時間。
此外,在不影響識別精度的情況下,可采用定點化后的整數(shù)計算替代浮點計算,以實現(xiàn)高效率的算術(shù)操作。本文采用的是16位的定點量化。
本實驗硬件平臺采用Zynq-7020的PYNQ開發(fā)板,其中ARMcotex-A9處理器主頻為667 MHz,內(nèi)存為1 GB DDR3,F(xiàn)PGA的主頻為100 MHz,開發(fā)環(huán)境采用的是Xilinx Vivado HLS 2018、Vivado2018.1和SDK 2018.1,編程語言使用VHDL、C和Python;數(shù)據(jù)預(yù)處理由MATLAB 2018a。CPU平臺為Inteli7-8700的臺式機(jī),主頻為3.2 GHz,分類器的訓(xùn)練是在TensorFlow 1.15環(huán)境下。實驗使用的樣本數(shù)據(jù)大小是32×32×3,從心音數(shù)據(jù)庫中隨機(jī)選取5122個樣本,含1816個異常(病理)樣本和3306個正常樣本。異常數(shù)據(jù)作為負(fù)樣本,正常數(shù)據(jù)作為正樣本。在其中隨機(jī)抽取85%作為訓(xùn)練樣本集,剩下的15%作為測試樣本集。
本文采用損失函數(shù)對算法模型的性能進(jìn)行評估,在圖7(a)中可以看出,訓(xùn)練數(shù)據(jù)在經(jīng)過20次迭代后,訓(xùn)練精度仍有上升空間。但當(dāng)?shù)鷧?shù)大于50時,識別率和損失函數(shù)不再有提升。如圖7(b)所示。實驗結(jié)果表明,經(jīng)過38次迭代,達(dá)到了90.08%的識別率且此時的損失值不再有提升。
圖7 模型迭代次數(shù)為20次和40次的損失值和準(zhǔn)確率
利用FPGA對卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行加速的一大之后重要因素就是相比GPU、CPU,F(xiàn)PGA平臺具有更低的功耗,也就是說,F(xiàn)PGA平臺具有更高的能耗效率。FPGA更適合在移動端使用。上述設(shè)計的硬件加速器模塊通過Vivado綜合實現(xiàn)之后,可以得到FPGA的功耗大致為1.507 W。
表1中列出來FPGA工作在100 MHz下的資源使用情況。乘法部分運算邏輯全部使用DSP資源,資源占用在41.36%。也就是說,本文所設(shè)計的系統(tǒng)主要硬件消耗就在卷積單元的乘法運算中。BRAM使用率并不高,只有11.43%。LUT和FF資源分別占用了34.41%和21.88%??梢缘贸鼋Y(jié)論:本文算法所占用各項硬件資源并不高,能夠滿足所需的資源要求。
為對比先心病心音輔助診斷算法在FPGA、ARMCPU和通用CPU的計算性能,本文采用同樣的測試數(shù)據(jù)集,在
表1 FPGA資源占用情況
3種平臺上分別進(jìn)行運算時長的記錄。如表2所示,可以看出,本文算法在硬件資源有限的XC7Z010的板卡上,F(xiàn)PGA的前向傳播的運算速度為 0.095 s,幀率為41.68 frame/s。與此同時,在相同條件下,ARMCPU的運算時長為1152.49 s。另外,相同條件下,通用CPU的測試時長為3.342 s。相比之下,F(xiàn)PGA的加速效果約為通用CPU的35倍。為了測試本文加速系統(tǒng)的性能,本文將286個負(fù)樣本和586個正樣本進(jìn)行測試,計算其平均處理時間,可以達(dá)到40幀/s。
表2 FPGA與通用CPU運行CNN算法對比
本文算法的運算速度約為通用CPU的35倍,平均幀率可以達(dá)到40幀/s。實驗結(jié)果表明,F(xiàn)PGA加速模塊在幾乎不損失準(zhǔn)確度的情況下,F(xiàn)PGA加速性能好可以滿足實時檢測的要求。板上測試的精度值最后穩(wěn)定在90.08%,相對于采用CPU損失了1%左右。實驗結(jié)果表明,在經(jīng)過FPGA的板級測試之后,本文的算法精度仍具有相當(dāng)?shù)目尚哦取?/p>
本文與文獻(xiàn)[12]的計算模型性能對比見表3。
表3 本文與其它研究的計算模型性能對比
與文獻(xiàn)[12]對比,可以發(fā)現(xiàn)在相同的板卡和工作頻率條件下,本文所用的加速方案的加速倍數(shù)更高,資源占用更低。
綜合以上,可以得出FPGA相比通用CPU有明顯的加速效果,且經(jīng)過板卡級的驗證。且本文考慮到課題組CNN相關(guān)算法的不斷升級,設(shè)計了適用于多個常見卷積神經(jīng)網(wǎng)絡(luò)加速模塊的目標(biāo),提出一種高并行度與高效率的卷積神經(jīng)網(wǎng)絡(luò)加速模塊設(shè)計方案。
針對邊遠(yuǎn)山區(qū)網(wǎng)絡(luò)傳輸效果差、普通移動設(shè)備對神經(jīng)網(wǎng)絡(luò)的處理速度慢的局限性,本文提出一種基于異構(gòu)平臺的心音輔助診斷算法的硬件加速方法。利用FPGA的并行性,對CNN在結(jié)構(gòu)上進(jìn)行并行設(shè)計,并在數(shù)據(jù)復(fù)用上做了一定優(yōu)化,提高了本設(shè)計的效率;利用ARM的易操作性,完成模型的重建和數(shù)據(jù)的讀取的工作,提高了本設(shè)計的靈活性。實驗結(jié)果可以發(fā)現(xiàn),本文提出的方法所占用的硬件資源不到一半,且在滿足分類能力不下降的前提下,運算時間得到了大幅度的縮減,能夠滿足先心病初診輔助診斷的離線使用的需求。