杜煜章,潘家華,宗 容,粟 煒,王威廉
1.云南大學 信息學院,昆明 650504
2.云南省阜外心血管病醫(yī)院,昆明 650102
心臟雜音是識別先天性心臟?。–ongenital Heart Disease,CHD)最常見的體征,通過心臟聽診可以準確快速地進行新生兒先天性心臟病臨床篩查[1]。然而,依靠醫(yī)生人工進行先心病臨床篩查難度大、成本高,因此,有研究者提出基于深度學習的先心病機器輔助診斷系統(tǒng),輔助醫(yī)生進行聽診,提高篩查效率,提升準確率[2]。
卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,CNN)是一種重要的深度學習模型,廣泛應用于計算機視覺、自然語言處理等領域。因其善于從海量數(shù)據(jù)中挖掘抽象的特征,且擁有高度的泛化性與出色的識別能力,近年來CNN也被運用于心音的分類研究中[3-4]。為滿足傳統(tǒng)卷積神經(jīng)網(wǎng)絡在運算量、存儲空間方面的需求,目前CNN主要被部署在CPU或GPU上。但因CNN計算過程具有多種并行特征,可利用FPGA對CNN并行計算過程進行硬件加速[5-7]。
為充分利用FPGA的并行計算特性,許多研究團隊在CNN的FPGA硬件加速與實現(xiàn)方面做了大量的研究[8-10]。Han等人提出“深度量化”,通過剪枝、權值共享、權值量化、哈夫曼編碼等方法的共同協(xié)作,在不影響準確度的前提下,將卷積神經(jīng)網(wǎng)絡的存儲需求減少35~49倍[11]。Zhao等人提出一種流設計思想,對不同的卷積層采用不同的量化精度與算法,在FPGA上實現(xiàn)了一種高性能的多精度多算法網(wǎng)絡[12]。谷歌提出一種適用于嵌入式設備的輕量級神經(jīng)網(wǎng)絡MobileNet,該設計使用深度可分離卷積構建輕型深度神經(jīng)網(wǎng)絡,在準確度相近的情況下,相較于GoogleNet與VGG16參數(shù)與計算量減少了近90%[13]。
本文使用高層次綜合(High Level Synthesis,HLS)設計并實現(xiàn)了一種適用于FPGA硬件平臺的心音分類器,并對其進行硬件加速優(yōu)化。采用滑動窗、參數(shù)重排序等優(yōu)化方案實現(xiàn)卷積層多像素、多通道并行運算,加快了心音分類器在FPGA上的運行速率。通過16位定點量化縮小模型參數(shù),減少心音分類器參數(shù)在FPGA上的內存消耗。采用AXI-Stream數(shù)據(jù)流進行數(shù)據(jù)傳輸,提升數(shù)據(jù)傳輸速率。對硬件加速優(yōu)化后的心音分類器網(wǎng)絡,以實驗室心音數(shù)據(jù)庫心音特征圖為識別對象進行實驗,驗證心音分類器網(wǎng)絡分類準確率與加速效果。
MobileNet模型的核心思想是深度可分離卷積。深度可分離卷積將傳統(tǒng)卷積過程分為了深度卷積和逐點卷積兩步,如圖1(b)所示。深度卷積對不同的輸入通道使用不同的卷積核分別進行卷積,逐點卷積通過一個1×1的卷積核來結合深度卷積各個通道的輸出產生新的特征。深度可分離卷積將傳統(tǒng)卷積的濾波以及生成新特征這兩個過程分離,這個分離過程可顯著減少計算次數(shù)和模型大小。
圖1 傳統(tǒng)卷積過程與深度可分離卷積過程Fig.1 Traditional convolution process and depth separable convolution process
對于傳統(tǒng)卷積過程,假設輸入通道數(shù)目為M,輸入特征圖的寬和高均為GI,卷積核的寬和高均為FH,輸出通道數(shù)目為N,該傳統(tǒng)卷積層的計算次數(shù)CT為:
深度可分離卷積將傳統(tǒng)卷積分為深度卷積與逐點卷積。深度卷積的計算次數(shù)CD為:
整個深度可分離卷積層的計算次數(shù)C為:
深度可分離卷積與傳統(tǒng)卷積的計算次數(shù)之比P為:
當深度卷積使用的卷積核寬和高FH=3,輸出通道數(shù)目N=128時,在對精度造成的影響很小的情況下,深度可分離卷積的計算次數(shù)相較于傳統(tǒng)卷積減少了8.41倍。并且隨著輸出通道數(shù)目的增加,卷積核寬和高的增加,計算次數(shù)減少得將會更加明顯。
MobileNet模型利用深度可分離卷積,通過減少網(wǎng)絡的計算次數(shù),加速了網(wǎng)絡在嵌入式設備上的運行速度,降低了網(wǎng)絡運行的能耗。同時深度可分離卷積還減少了網(wǎng)絡的參數(shù)數(shù)目,壓縮了模型部署在嵌入式設備上所消耗的內存空間,降低了對于嵌入式設備硬件資源的消耗。
傳統(tǒng)卷積層結構在卷積運算結束后,加入批量歸一化層(Batch Normalization,BN)與ReLU激活函數(shù)層對卷積運算結果進行處理。深度可分離卷積在深度卷積層與逐點卷積層后,均接入了BN層與ReLU6層,相較于傳統(tǒng)卷積層結構加入的BN層與ReLU6層更多,其模型結構如圖2所示。向模型中加入更多的ReLU6層,增加了模型的非線性變化,增強了模型的泛化能力。ReLU6相較于傳統(tǒng)卷積層結構中的ReLU激活函數(shù),限制了激活函數(shù)的最大輸出值為6,這樣使得該激活函數(shù)在低精度的fix16/int8的嵌入式硬件設施上性能良好,模型的魯棒性更強。BN層的存在控制了梯度爆炸與梯度消失,并提高了神經(jīng)網(wǎng)絡的訓練與收斂速度。
圖2 傳統(tǒng)卷積與深度可分離卷積結構Fig.2 Traditional convolution and depth separable convolution structure
本文構建的心音分類器網(wǎng)絡模型運用Mobilenet輕量級網(wǎng)絡中的深度可分離思想,將三層傳統(tǒng)卷積神經(jīng)網(wǎng)絡,改進六層為深度可分離卷積網(wǎng)絡,使其模型參數(shù)更少,更適合于課題組所構建的先心病心音數(shù)據(jù)庫數(shù)據(jù),同時也使其能更加便捷地部署于FPGA硬件平臺。
卷積層在整個網(wǎng)絡的各個層中,占據(jù)了超過90%的運算次數(shù),消耗了大量運算時間。因此卷積運算單元的并行加速設計是整個硬件加速設計部分的核心。卷積運算過程具有多種并行特征,可以使用不同的并行優(yōu)化方法。本文中使用兩種并行優(yōu)化方法來對卷積運算單元進行硬件加速,一種是同通道上的并行加速,另一種是不同通道上的并行加速。
心音分類器模型中共包含兩種卷積運算:深度卷積運算與逐點卷積運算。針對深度卷積與逐點卷積的不同運算特性,深度卷積采用同通道上的并行加速,逐點卷積采用不同通道上的并行加速。
2.1.1 同通道并行加速
對一張32×16的輸入圖片的一個通道,用一個3×3的卷積核進行卷積運算。不進行任何優(yōu)化,每次運算都需要取、算、存三個時鐘周期,運算整張輸入圖片,共需要32×16×9×3個時鐘周期。
(1)對運算過程進行Pipeline(流水線)約束
Pipeline(流水線)約束,在第一個數(shù)據(jù)進行運算同時,對第二個數(shù)據(jù)進行讀取。在第二個數(shù)據(jù)進行運算同時,并行執(zhí)行第一個數(shù)據(jù)運算結果的寫入與第三個數(shù)據(jù)讀取。對整張輸入圖片進行卷積運算,僅需要32×16×9+2個時鐘周期。相較于不對算法進行任何優(yōu)化,運行時間減少大約3倍。
(2)3×3卷積核的9次乘法并行計算
傳統(tǒng)的卷積運算單元中,執(zhí)行3×3卷積乘法運算需要9個時鐘周期。本文在高層次綜合中對卷積窗口進行循環(huán)展開(UNROLL),實現(xiàn)卷積核9次乘法運算并行計算,其并行思想如圖3所示。高層次綜合中的循環(huán)展開將例化額外的硬件,消耗9個DSP(Digital Signal Processing)并行計算,通過犧牲硬件資源與面積,提升卷積運算速度。
圖3 同通道多像素并行運算Fig.3 Parallel computing with multiple pixels in the same channel
循環(huán)展開實現(xiàn)了卷積核9次乘法并行運算,但內存帶寬需求增高。傳統(tǒng)卷積運算單元每個時鐘周期進行1次內存存取操作。循環(huán)展開后,9次乘法并行計算,對內存帶寬的要求增加至每個時鐘周期9次內存存取操作。在高層次綜合中,外部內存存在多個端口,通過高層次綜合生成的模塊只能連接到其中一個端口上,且每個時鐘周期只能進行一次數(shù)據(jù)傳輸。因此,本文將內存帶寬需求從外部內存端口轉移至高層次綜合編譯器生成的本地內存。
高層次綜合生成的本地內存類似于CPU的高速緩存,在高層次綜合中被稱為行緩存。
緩存整張輸入圖片將消耗大量的硬件資源,并且對于卷積操作,并非所有的數(shù)據(jù)都將在短期內被重復調用,行緩存僅用于存儲正常執(zhí)行卷積操作所需要的最小數(shù)量的像素值。對于3×3的卷積乘法窗口操作,行緩存必須存儲2個完整的圖像行以及第3行的前3個像素,才能計算得到第一個輸出像素值,因此需要三行行緩存,每行行緩存可緩存輸入圖片列數(shù)個像素值。
通過使用FPGA中的BRAM硬件資源實現(xiàn)行緩存。分別將圖片的三行像素值存儲在三塊BRAM中,每塊BRAM在每個時鐘周期內都可存取1個像素。因此,可用于算法計算的內存帶寬將從原先每個時鐘周期1個像素提高3倍,達到每個時鐘周期3個像素。
行緩存中的數(shù)據(jù)移動如圖4所示。輸入圖片數(shù)據(jù)以數(shù)據(jù)流的形式輸入,數(shù)據(jù)從第三行緩存的第一個位置開始,依次填滿第三行緩存。當?shù)谌芯彺嫣畛錆M時,第三行緩存第一個位置的數(shù)據(jù)存儲至第二行緩存的第一個位置。當行緩存存滿2個完整圖像行與第三行前3個像素時,進行第一次計算。
圖4 行緩存中的數(shù)據(jù)移動Fig.4 Data movement in line buffer
行緩存可實現(xiàn)每個時鐘周期存取3個像素。為滿足每個時鐘周期存取計算9個像素,使用FPGA中的FF硬件資源實現(xiàn)滑動窗(圖4中方框部分)?;瑒哟懊總€寄存器均可供所有其他寄存器獨立訪問或同時訪問。對整張輸入圖片進行卷積運算,當流水線充滿時,需要的時鐘周期為32×16。與CPU串行運算相比,運行的時鐘周期數(shù)目減少大約9倍。
2.1.2 不同通道上并行加速
卷積運算在不同通道上也存在并行特性,可運用不同的卷積窗口對不同通道并行運算,如圖5所示。一張RGB三通道圖像,三通道并行運算消耗的運算時間將比單通道依次運算減少三倍。但不同通道上的并行運算同樣是以犧牲硬件資源為代價,用面積換取運算速度的提升。綜合考慮網(wǎng)絡每層的輸入通道數(shù)目與輸出通道數(shù)目均為四的整數(shù)倍,且DMA數(shù)據(jù)位寬為64 bit,經(jīng)定點量化后的數(shù)據(jù)為16 bit定點數(shù),DMA一次能傳輸四個數(shù)據(jù),因此選取四通道并行運算,對模型進行硬件加速。
圖5 多通道并行運算Fig.5 Multi-channel parallel computing
卷積運算的特征圖,需要先計算完成所有輸入通道,然后將每個輸入通道上的運算結果進行累加。以一張RGB的三通道圖像為例,圖像大小為32×16,在內存中的存儲方式如圖6(a)所示。在讀取輸入圖片時,首先32×16個“R”通道的像素點被傳輸,然后依次傳輸32×16個“G”通道像素點與32×16個“B”通道像素點。通過這種方式存儲與傳輸數(shù)據(jù),對于每一個輸出通道,需等待最后一個輸入通道運算完成才可以得到卷積結果。將耗費大量的緩存來存儲運算的中間結果。
圖6 參數(shù)重排序Fig.6 Parameter reordering
因此將輸入圖像像素在內存中的存儲進行重新排序。如圖6(b)所示,讀取輸入圖片時,首先傳輸輸入圖片“R”“G”“B”三通道的第一個像素點,然后依次傳輸三通道的第二個像素點以及第三個像素點,直至整張輸入圖片傳輸完成。通過這種方式傳輸圖片,因首先進行了不同輸入通道上的像素循環(huán),故可直接進行疊加得到輸出結果,不需要消耗緩存來存儲運算的中間結果。
使用Keras和TensorFlow訓練得到的網(wǎng)絡模型,數(shù)據(jù)精度為float32/float64。FPGA中并無專用的浮點運算單元,進行浮點運算需要消耗較多的DSP資源與LUT資源。由文獻[14]和實際實驗可知,HLS中的浮點32位乘法需要三個DSP資源,浮點32位加法需要兩個DSP資源。定點16位乘法需要一個DSP資源,而定點16位加法僅消耗LUT資源實現(xiàn)。對比可知,對權重數(shù)據(jù)與輸入圖像數(shù)據(jù)進行定點量化,可以減少硬件資源消耗。將32位數(shù)據(jù)替換為16位數(shù)據(jù),占用的內存減少一半,模型大小縮小,運算速度加快。
MobileNet模型包含傳統(tǒng)卷積層、深度卷積層、逐點卷積層、最大池化層、全連接層與Softmax層等六種類型的層。通過Mobilenet模型改進的心音分類器模型刪除了部分層。假設將每一層封裝成獨立的IP,在FPGA上利用單獨的硬件資源進行運算,由于對每一層進行了定制,可最大程度地提高運算效率以及吞吐量,但將消耗大量的FPGA硬件資源,使一些模型較大、層數(shù)較深的神經(jīng)網(wǎng)絡無法部署在FPGA上。
另一種設計方法將每一層的硬件設計分布在不同比特文件中,當每一層的計算結束后,通過比特文件重新配置FPGA,這種方法保證了每一層硬件設計性能最優(yōu),且不會因為層數(shù)較深導致硬件資源消耗過多。但每一次通過比特流重新配置FPGA都需要消耗數(shù)百毫秒的時間,盡管每層的延時都是最佳的,但整體性能將會受到明顯影響[15]。
由于FPGA上實現(xiàn)的僅為心音分類器模型的前向傳播算法。與CNN相似,心音分類器模型的前向傳播算法不同層之間的運算過程相互獨立,所以本文將深度卷積層、逐點卷積層與最大池化層封裝成可實現(xiàn)復用的IP,通過復用這些IP核實現(xiàn)完整的深層次神經(jīng)網(wǎng)絡。
將心音分類器模型中的深度卷積層,逐點卷積層與最大池化層通過FPGA實現(xiàn),并對其進行硬件加速。具體硬件系統(tǒng)設計如圖7所示。
圖7 心音分類器FPGA硬件系統(tǒng)設計Fig.7 FPGA hardware system design of heart sound classifier
DMA0將AXI4數(shù)據(jù)轉換為AXI-Stream數(shù)據(jù)。AXI-Stream數(shù)據(jù)相較于AXI4數(shù)據(jù)減少了地址線,可降低延時。DMA0分兩次向高層次綜合生成的深度卷積IP傳輸數(shù)據(jù),第一次傳輸深度卷積權重數(shù)據(jù),第二次傳輸圖像數(shù)據(jù),運算結果由深度卷積IP傳輸至逐點卷積IP。然后由DMA1向逐點卷積IP傳輸逐點卷積權重數(shù)據(jù),運算結果由逐點卷積IP傳輸至Xilinx官方定義的Switch IP。心音分類器模型僅在最后一次逐點卷積運算結束后接入最大池化層,可通過Switch IP進行選擇,當并未進行至最后一次逐點卷積,將逐點卷積運算結果直接經(jīng)過Switch IP傳輸至DMA1,由DMA1傳送回DDR。本文采用雙DMA分別傳輸深度卷積權重值與逐點卷積權重值,并將DMA的數(shù)據(jù)位寬設定為64位,適應于卷積四通道并行運算。
全連接層通過Zynq的ARM核進行軟件實現(xiàn)。Softmax層則由比較器進行替代。Softmax層的作用是將最終的運算結果映射為[0,1]之間的實數(shù),并且運算結果之和恰好為1。本文使用心音分類器進行二分類,分類結果為陰性與陽性。通過傳統(tǒng)Softmax層運算將進行大量指數(shù)運算,增加運行時間。本文使用比較器替換傳統(tǒng)Softmax層,僅需從運算結果找出較大的值,便可得到分類結果,取代了復雜的指數(shù)運算,加快了運行速度。
本文實驗采用Xilinx公司的ZYNQ-7000系列xc7z020clg400-2芯片作為硬件平臺,該芯片中包含兩大部分:PS(Processing System)部分,集成兩個ARM cortexa9處理器。PL(Programmable Logic)部分,即FPGA部分。其中FPGA部分BRAM_18K、DSP48E、FF、LUT資源分別為280、220、106 400及53 200。CPU軟件訓練平臺采用Intel?Core?i7-9750H,主頻為2.6 GHz。訓練所用的軟件為TensorFlow2.1.0及Keras2.3.1。
本文使用實驗室先天性心臟病心音數(shù)據(jù)庫數(shù)據(jù)構建數(shù)據(jù)集,該數(shù)據(jù)庫研究經(jīng)云南大學醫(yī)學院倫理委員會審查通過。數(shù)據(jù)集特征譜圖由先天性心臟病心音數(shù)據(jù)庫心音信號通過心音分割后,使用子帶包絡方法進行特征提取獲得。所有異常心音信號均由超聲心動圖確診。數(shù)據(jù)集訓練集由5 370例心音信號構成,其中正常心音信號2 345例,異常心音信號3 025例,經(jīng)心音分割與特征提取獲得特征譜圖96 729張(陰性42 210張,陽性54 519張),測試集由324例心音信號構成,其中正常心音信號160例,異常心音信號164例,經(jīng)心音分割與特征提取獲得特征譜圖5 837張(陰性2 878張,陽性2 959張),每張?zhí)卣髯V圖的維數(shù)均為32×16。
本文在軟件平臺CPU上實現(xiàn)與FPGA相同的神經(jīng)網(wǎng)絡,通過Keras進行訓練,將訓練后得到的權重參數(shù),通過16位定點量化下載至FPGA中。FPGA硬件平臺中不進行訓練,只進行前向分類過程。
4.2.1 資源消耗評估
本文采用多通道、多像素并行性,定點量化等加速方法,設計并實現(xiàn)了與文獻[16]網(wǎng)絡模型相同的傳統(tǒng)卷積網(wǎng)絡。然后將該傳統(tǒng)卷積網(wǎng)絡改進為深度可分離卷積網(wǎng)絡。其FPGA硬件資源消耗情況如表1所示。
表1 FPGA硬件資源消耗對比Table 1 FPGA hardware resource consumption comparison
硬件加速以消耗大量的硬件資源為代價,用資源換取速度。由表1可知,經(jīng)過硬件加速的傳統(tǒng)卷積網(wǎng)絡相較于文獻[16]網(wǎng)絡消耗了更多硬件資源,將傳統(tǒng)卷積網(wǎng)絡改進為深度可分離卷積網(wǎng)絡,減少了運算次數(shù)與參數(shù)數(shù)目,可在增加運算速率同時,降低硬件資源消耗。深度可分離卷積的BRAM_18K、DSP48E、FF等模塊的消耗相較于文獻[16]都有明顯降低。
BRAM_18K資源主要用于實現(xiàn)存儲量大的緩存。本文卷積運算單元硬件加速部分為保證高并行度運算,進行大量緩存操作,輸入行緩存,輸出行緩存,權重緩存,因此消耗BRAM_18K資源相對較多。
4.2.2 性能評估
本文使用深度可分離卷積思想構建心音分類器。比較了三層傳統(tǒng)卷積神經(jīng)網(wǎng)絡,以及由三層傳統(tǒng)卷積網(wǎng)絡改進來的六層深度可分離網(wǎng)絡對數(shù)據(jù)集中測試集心音特征譜圖進行分類的準確率,如表2所示,證明了深度可分離卷積在對分類準確率影響較小的前提下,縮小了模型的大小,減少了模型參數(shù)。
表2 不同神經(jīng)網(wǎng)絡心音分類準確率Table 2 Heart sound classification accuracy of different neural networks
表3是不同網(wǎng)絡在不同運算平臺下針對心音進行分類的前向過程運行速度對比。參考文獻[16]網(wǎng)絡在FPGA上處理一張圖片需耗時19.41 ms,使用本文的加速方法對參考文獻[16]網(wǎng)絡進行硬件加速,處理一張圖片需耗時7.12 ms,相較于文獻[16]中的方法,運行速度提升近3倍。本文的心音分類器模型在CPU平臺上處理一張圖片需耗時15.95 ms,在FPGA上進行硬件加速后,處理一張圖片需耗時1.138 ms,相較于CPU平臺上相同網(wǎng)絡,運行速度提升近14倍。
表3 不同平臺不同網(wǎng)絡運行速度對比Table 3 Comparison of different network computing speeds on different platforms
本文通過Xilinx官方提供的Vivado設計工具中的Implementation design估算FPGA運行功耗。傳統(tǒng)卷積網(wǎng)絡功耗為2.507 W,本文心音分類器功耗為1.819 W,本文心音分類器相較于傳統(tǒng)卷積網(wǎng)絡在FPGA平臺上的運行功耗更低。
本文設計了一種基于輕量級神經(jīng)網(wǎng)絡的心音分類器,針對心音信號進行分類,在FPGA上完成了網(wǎng)絡的前向傳播過程。并根據(jù)卷積運算不同并行特征對其進行多像素多通道并行加速。實驗結果表明,該方案在盡可能減少硬件資源消耗的基礎上,加快了心音分類器的運行速率。未來進一步的改進主要有兩個方面:(1)在FPGA硬件平臺上實現(xiàn)心音信號預處理部分;(2)提高逐點卷積并行度。