雷 晨,何樂生,王威廉
(云南大學 信息學院,云南 昆明 650500)
云南是先天性心臟病(congenital heart disease,CHD)的高發區[1,2],大規模的心臟聽診篩查是先心病初診的重要手段[2]。已有研究人員在探索借助心音采集設備采集心音并上傳至云端,利用深度學習的算法進行分類識別。但此方案最大的瓶頸在于采集后數據的上傳和分析結果的返回受限于網絡狀況。在便攜式設備部署輕量級分類網絡進行先心病的分類處理成了項目組的研究方向[4,5]。為此,本文提出了一種基于APSoC(all programmable system on chip)的先心病初診輔助診斷系統的硬件設計方案。首先,對5122例心音信號進行MFSC特征提取、維度變換等預處理。然后,訓練CNN網絡模型用于心音分類。最后,利用軟硬件協同設計的思路,充分分析CNN算法前向傳播和并行計算的可行性,設計了兩個通用的電路,分別負責卷積-全連接和池化運算。采用高層次邏輯綜合(high-level synthesis,HLS)方法對電路進行優化,有效提高了電路的計算并行度,降低了電路運行所需時間。通過綜合和布局布線,得到一個完整的CNN算法模型電路。最終將該電路部署至硬件平臺,實現硬件并行CNN(convolutional neural network,CNN)加速算法。本文提出的硬件加速方案,滿足高性能、低資源利用率、低功耗、低成本等要求,實現了離線條件下分類效率高、分類精度高的要求,有望用于先心病篩查。
卷積神經網絡近年來憑借其強大的學習能力在多個領域廣泛應用,在分類、檢測以及分割等領域均有突破性的研究進展。卷積神經網絡的發展依靠算法的不斷優化和硬件平臺的算力支撐。由于在許多邊緣設備應用的場景下,CPU(central processing unit)的串行運算方式無法滿足實時性需求,GPU高能耗的特點也不適用于移動設備。FPGA(field programmable gate array)既具備集成電路的性能優勢,又有可重新配置的靈活性。通過充分發揮FPGA的并行特性,加快邏輯性強的操作速度,大大提高CNN的計算速度。因此,考慮到實時性處理和要求和便攜式設備的運算速度慢的特點,在便攜式設備上通過FPGA實現CNN的硬件加速具有重大意義。
傳統的FPGA計算能力強,資源豐富,但是不易于搭建系統操作平臺,且開發成本高。目前,全可編程片上系統APSoC異軍突起,含高性能FPGA(可編程邏輯加速器programmable logic,PL部分)作為外設,以及雙核ARM Cotex-A9(可編程系統programming system,PS部分)處理器,為異構計算提供了極大地便利。其充分結合了兩者的優勢。可通過高層次邏輯綜合[6]將C/C++語言轉化為Verilog/VHDL(very-high-speed intergrated circuit hardware description language,VHDL)等低層次的RTL(re-gister transfer level)語言,并通過Vivado部署至板卡,開發流程[7]簡單,廣泛應用于神經網絡的硬件加速方案之中。
已有不少學者在APSoC架構上實現了對深度神經網絡的算法的加速。綜述[8]對卷積神經網絡的研究表示卷積層的前向傳播是整個CNN前向傳播重要部分,計算量和所花費時間的占比均偏高。文獻[9]通過塊循環矩陣來實現精度和壓縮率之間的細粒度權衡,降低了運算復雜度。文獻[10]將卷積層轉換為與全連接層相似的矩陣乘法。文獻[11]同樣改變了卷積計算方式,大大提高了卷積層運算速度,但該算法需對不同卷積層進行單獨計算和推導,且實現難度大,不易擴展,通用性差。文獻[12]在Zynq-7020平臺上為腦電信號分類進行加速,在100 MHz的頻率下速度提升了19倍。通過對腦電信號的維度轉換的處理后,對CNN的每層網絡設計IP核,并分別配置實現硬件加速,資源利用率高。但該設計部分卷積層對整個加速器的延遲很大,不利于算法的擴展。
綜上,本文提出了一種基于APSoC的先心病初診輔助診斷系統的設計方案。首先,對原始心音信號進行預處理后訓練CNN網絡。然后,對CNN進行軟硬件劃分,將CNN的網絡結構拆分為卷積-全連接和池化兩個通用IP(intellectual property,IP)。利用HLS實現并優化電路,采用分塊化、并行計算和流水線技術。通過Vivado軟件對CNN電路的綜合和布局布線,得到可下載的比特流文件。最后,將硬件部署到Zynq SOC平臺,通過網線連接到PC端的Jupyter Notebook界面,即可在PS端的PYNQ(Python on Zynq,PYNQ)框架下進行FPGA電路的燒寫、數據的讀取和操作。實現了心音輔助診斷算法的有效加速,且利于算法結構的擴展和遷移。
本文所用的數據源于從云南省阜外心血管病醫院、昆明醫科大學第一附屬醫院臨床已確診的先心病病例,以及課題組隨醫療隊下鄉篩查先心病采集的心音所建數據庫,含確診病例和健康志愿者心音樣本。采集對象為0.5到16周歲的兒童和青少年。采集設備由項目組自行研發,采用美國(THE ONE,ThinkLabs)公司生成的心音傳感器,采集時長20 s,采樣率為5000 Hz。
對原始心音信號的預處理,通常包括降噪、分幀等。文獻[14]中分析對比了不同的小波去噪方法。本文選用db6小波基、4層小波、軟閾值10%的小波對心音進行去噪處理。對降噪后的心音進行分幀,本文自動截取每4 s作為一個樣本幀,約含5個心動周期,有足夠的信息供分析用。
心音特征參數選取的好壞直接影響系統的性能。梅爾頻譜系數MFSC(log Mel-frequency spectral coefficients,MFSC)[15],相對于梅爾倒譜系數(Mel frequency cepstral coefficents,MFCC)少了計算離散余弦變換(discrete cosine transformation,DCT)環節,常用于語音信號分析。進行MFSC特征提取,對信號先預加重、分幀、加窗操作,之后進行快速傅里葉變換得到頻譜,接下來利用梅爾刻度變換得到頻帶內信號的能量譜。心音信號經過梅爾變換后,從1維時域信號變換成為2維的M×N梅爾頻率能量譜MFSC“特征圖”,其中M為時間上的幀數,N為Mel頻率濾波器的個數。對MFSC取一階差分ΔMFSC和二階差分Δ2MFSC。由靜態的MFSC、ΔMFSC、Δ2MFSC這3幅M×N特征圖組成三通道的心音特征圖。相較于MFCC,MFSC方法主要改進在于將靜態特征和反映聲音動態特性的差分譜結合起來,既滿足了CNN輸入特征的映射方式,又能兼顧心音信號的時頻域特征。MFSC模擬了彩色圖片,RGB通道分別對應每個特征圖的MFSC的靜態數據、一階差分和二階差分的系數特征矩陣。心音數據的處理和MFSC組織方式過程如圖1所示。

圖1 心音數據的處理和MFSC組織方式
本文選用的卷積神經網絡架構分別由3個卷積層Conv_1、Conv_2、Conv_3,3個池化層Pool_1、Pool_2、Pool_3,2個全連接層Fc_1、Fc_2組成,如圖2所示。其中,卷積層之后的激活函數為ReLu,池化層選擇最大值池化。同時,在池化層之后采用dropout丟棄部分參數,避免過擬合的同時減少了片上資源的占用。
目前,基于CNN的卷積神經網絡的硬件加速基于其層次結構主要有兩種不同的實現模式:一種是流架構,另一種是單結構核心。前者,如圖3(a)所示,將相應的硬件資源分配給各網絡層,其優點是可實現高度可配置的并行,靈活性強。缺點是對片上資源消耗較大。后者注重資源重用,如圖3(b)所示,將不同的網絡層通過資源重用共享同一個加速器,這種非高度定制的結構的優點是更靈活,更容易在平臺之間遷移,且資源占用率低。

圖2 CNN架構圖及參數

圖3 硬件加速總體架構
CNN的計算量主要集中在卷積層,因其計算過程中涉及到大量的卷積計算,會消耗大量的計算資源。卷積計算的本質為乘累加計算,乘累加計算的并行特質是卷積計算便是CNN可以進行FPGA加速的原因。池化的目的是特征提取,在卷積計算過后所產生的大量數據中,篩選出最有價值的數據進行保存,防止數據量過大導致的數據爆炸等現象發生。池化的實質就是降采樣。根據對全連接的計算原理分析即可知,全連接層可以看作被拉扁的卷積層。故本文不再單獨設計全連接層加速器,只需在傳入參數時,將卷積核大小設置為1*1即可。通過設計一個Conv_fc_acc實現了卷積和全連接兩種運算,提高了IP核的重用率和資源利用率。
考慮到硬件平臺資源的有限性,本文選擇在單計算核心模式下設計了系統架構。計算核心包括Conv_fc_acc和Pool_acc,其中,Conv_fc_acc是指卷積-全連接運算加速器,主要負責對卷積計算過程與全連接計算過程進行加速;Pool_acc是指池化運算加速器,主要負責對池化計算過程進行加速。
硬件加速總體架構如圖4所示。系統結構大致可由可編程系統(programming system,PS)、可編程邏輯加速器(programmable logic,PL)兩部分組成,還有外部存儲器DDR、片內緩沖區以及片內和片外總線互連。其中,輸入數據和權重被預先存儲在外部存儲器DDR中。PS和PL通過AXI總線互連。加速器通過AXI_Lite總線接收來自CPU的配置信號,例如卷積內核大小、跨步、padding方式等。在PS中DDR控制器的作用下,從DDR讀取加速器所需的當前層的權重和輸入數據,并將其從AXI_memory映射格式轉換為AXI4_streaming格式,并在直接內存訪問(direct memory access,DMA)的作用下將其轉換到加速器的片上緩沖區。通用卷積電路和通用池化電路放在PL端進行并行加速,將特征圖輸入和分類顯示等放在PS端進行。AXI4總線負責完成數據通信,AXI_Lite總線負責完成信號的傳輸。ARM_CPU將輸入特征圖加載到DDR內存中,然后在FPGA端進行高度并行化的運算,以達到硬件加速的目的。利用FPGA的AXI_DMA總線送入到CNN加速模塊,最后將計算結果再通過AXI_DMA將輸出的分類結果傳回ARM端。

圖4 系統總體架構
本文利用高層次邏輯綜合(HLS)[5,6]進行FPGA開發。HLS工具可以將C/C++語言轉化為Verilog語言,并通過添加約束命令的方式實現并行化操作。相比傳統的FPGA電路設計方法,利用HLS進行開發將大大提高開發效率。卷積計算過程可由6層循環完成,但串行完成,資源利用率低。本文使用的HLS優化方法主要包括對數組的分塊處理、對循環的展開和流水、定點化處理,可以提高FPGA的資源利用率來提高硬件系統運算的并行度。
CNN的核心部分是利用卷積運算,利用卷積核對輸入特征圖提取特征的過程,卷積計算就是乘和累加計算。通過FPGA將乘、累加運算改為并行計算,是實現CNN加速的途徑。卷積計算的過程是前一層的輸入特征圖與權重特征圖進行卷積,得到一個輸出特征圖。同時,它又作為下一層的輸入特征圖。滑動方向如圖5(a)所示,依次是從左到右、從上到下。當輸入的特征圖從DDR中取出時,將按照循環展開的方法,每個循環的過程中從輸入通道的方向分解為K個特征子塊。在一個時鐘周期里,同時對多個子塊進行卷積操作。其中,特征子塊計算的順序如圖5(b)所示。因此,大小為 [CH_in][H][W] 的特征圖可以被分解為N個子塊 [CH_in/K][H][W][K]。 特征子塊個數N的計算公式如式(1)所示
N=[CH_in/K]×[H]×[W]×[K]
(1)
式中:CH_in為輸入通道的個數,H、W分別為特征圖的高度和寬度,K為并行度, [CH_in/K] 為一個特征子塊的長度。其中,各個變量均有取整操作。
與特征圖參數的重新組織方式一樣,權重參數的重新加載也是在輸入方向上,即在輸入通道數CH_in的方向上分為M個權重子塊。權重子塊個數M的計算公式如式(2)所示
M=[CH_out][Ky][Kx][CH_in/K][K]
(2)
式中:CH_in、CH_out為輸入通道數和輸出通道數、Kx、Ky為卷積核的大小、K為并行度。
假設架構被分割成多個相互依賴的階段,流水線就是一種可以使不同階段并行執行的技術。流水線技術通過同時執行多個階段達到減小延遲的目的。如圖6所示。當一個循環被流水線化時,在該循環下面的任何層次結構中的循環都必須展開。因此,在進行流水化處理之后,通常會在吞吐量和延遲方面提供最佳性能。

圖5 卷積運算順序及分割方式

圖6 流水線操作
在Vivado HLS中,采用流水線技術,通過添加預編譯指令#pragma HLS PIPEMINE II=1,將最內層的K層循環展開。經過循環展開之后,此時可實現延遲間隔為1的流水線操作,循環遍歷次數可降低K倍。循環遍歷次數L_conv的計算公式如式(3)所示
L_conv=[H][W][CH_out][Ky][Kx][CH_in/K]
(3)
經過PIPELINE約束后的運算時間由原來的L_conv×T個周期提升至L_conv+T-1個周期。速度提升倍數如式(4)所示
(4)
式中:I_conv指的是電路計算一個Latency所耗費的時間。
此外,在不影響識別精度的情況下,可采用定點化后的整數計算替代浮點計算,以實現高效率的算術操作。本文采用的是16位的定點量化。
本實驗硬件平臺采用Zynq-7020的PYNQ開發板,其中ARMcotex-A9處理器主頻為667 MHz,內存為1 GB DDR3,FPGA的主頻為100 MHz,開發環境采用的是Xilinx Vivado HLS 2018、Vivado2018.1和SDK 2018.1,編程語言使用VHDL、C和Python;數據預處理由MATLAB 2018a。CPU平臺為Inteli7-8700的臺式機,主頻為3.2 GHz,分類器的訓練是在TensorFlow 1.15環境下。實驗使用的樣本數據大小是32×32×3,從心音數據庫中隨機選取5122個樣本,含1816個異常(病理)樣本和3306個正常樣本。異常數據作為負樣本,正常數據作為正樣本。在其中隨機抽取85%作為訓練樣本集,剩下的15%作為測試樣本集。
本文采用損失函數對算法模型的性能進行評估,在圖7(a)中可以看出,訓練數據在經過20次迭代后,訓練精度仍有上升空間。但當迭代參數大于50時,識別率和損失函數不再有提升。如圖7(b)所示。實驗結果表明,經過38次迭代,達到了90.08%的識別率且此時的損失值不再有提升。

圖7 模型迭代次數為20次和40次的損失值和準確率
利用FPGA對卷積神經網絡進行加速的一大之后重要因素就是相比GPU、CPU,FPGA平臺具有更低的功耗,也就是說,FPGA平臺具有更高的能耗效率。FPGA更適合在移動端使用。上述設計的硬件加速器模塊通過Vivado綜合實現之后,可以得到FPGA的功耗大致為1.507 W。
表1中列出來FPGA工作在100 MHz下的資源使用情況。乘法部分運算邏輯全部使用DSP資源,資源占用在41.36%。也就是說,本文所設計的系統主要硬件消耗就在卷積單元的乘法運算中。BRAM使用率并不高,只有11.43%。LUT和FF資源分別占用了34.41%和21.88%。可以得出結論:本文算法所占用各項硬件資源并不高,能夠滿足所需的資源要求。
為對比先心病心音輔助診斷算法在FPGA、ARMCPU和通用CPU的計算性能,本文采用同樣的測試數據集,在

表1 FPGA資源占用情況
3種平臺上分別進行運算時長的記錄。如表2所示,可以看出,本文算法在硬件資源有限的XC7Z010的板卡上,FPGA的前向傳播的運算速度為 0.095 s,幀率為41.68 frame/s。與此同時,在相同條件下,ARMCPU的運算時長為1152.49 s。另外,相同條件下,通用CPU的測試時長為3.342 s。相比之下,FPGA的加速效果約為通用CPU的35倍。為了測試本文加速系統的性能,本文將286個負樣本和586個正樣本進行測試,計算其平均處理時間,可以達到40幀/s。

表2 FPGA與通用CPU運行CNN算法對比
本文算法的運算速度約為通用CPU的35倍,平均幀率可以達到40幀/s。實驗結果表明,FPGA加速模塊在幾乎不損失準確度的情況下,FPGA加速性能好可以滿足實時檢測的要求。板上測試的精度值最后穩定在90.08%,相對于采用CPU損失了1%左右。實驗結果表明,在經過FPGA的板級測試之后,本文的算法精度仍具有相當的可信度。
本文與文獻[12]的計算模型性能對比見表3。

表3 本文與其它研究的計算模型性能對比
與文獻[12]對比,可以發現在相同的板卡和工作頻率條件下,本文所用的加速方案的加速倍數更高,資源占用更低。
綜合以上,可以得出FPGA相比通用CPU有明顯的加速效果,且經過板卡級的驗證。且本文考慮到課題組CNN相關算法的不斷升級,設計了適用于多個常見卷積神經網絡加速模塊的目標,提出一種高并行度與高效率的卷積神經網絡加速模塊設計方案。
針對邊遠山區網絡傳輸效果差、普通移動設備對神經網絡的處理速度慢的局限性,本文提出一種基于異構平臺的心音輔助診斷算法的硬件加速方法。利用FPGA的并行性,對CNN在結構上進行并行設計,并在數據復用上做了一定優化,提高了本設計的效率;利用ARM的易操作性,完成模型的重建和數據的讀取的工作,提高了本設計的靈活性。實驗結果可以發現,本文提出的方法所占用的硬件資源不到一半,且在滿足分類能力不下降的前提下,運算時間得到了大幅度的縮減,能夠滿足先心病初診輔助診斷的離線使用的需求。