劉之禹,李 述,王英鶴
(1.哈爾濱理工大學 計算機科學與技術學院,哈爾濱 150080;2.哈爾濱理工大學 電氣與電子工程學院, 哈爾濱 150080)
當今時代人工智能技術發展迅速,深度學習也是其中的重點領域之一,尤其是卷積神經網絡用途最廣泛,圖像分類,目標檢測等圖像處理技術都需要它[1]。隨著算法的不斷優化,其網絡性能也在不斷提升,但其參數量也在大幅度增長,如VGG系列,殘差網絡系列,有的甚至可以達到幾億參數,面對如此龐大的數據量就需要提升神經網絡的推理速度[2]。深度神經網絡的硬件部署情況各有優劣,其在CPU上運行速度過慢,在GPU上運行雖然速度很快,但其功耗過高,并且價格昂貴,不適合部署在移動端設備上。而FPGA由于其高度并行性,可重構性,功耗低,并且相對于專用集成電路成本低,因此可以較好地實現卷積神經網絡的加速[2]。但目前大部分研究人員設計的傳統的硬件加速器,一般只能針對某種特定的神經網絡模型進行加速。目前各種神經網絡算法迭代速度快,硬件設計卷積神經網絡架構較難,周期長,容易跟不上算法的快速發展,并且當將不同的神經網絡部署在不同的硬件設備上時,要進行適配,性能優化,寫算子代碼等大量重復性工作,及其耗費時間人力,因此通用深度學習加速器應運而生。例如中科院和寒武紀研究的Diannao系列芯片[4],谷歌的TPU,英偉達的NVDLA,都是性能不錯的通用型硬件加速芯片,可對多種神經網絡進行部署加速。但在這些芯片在設計出來之后,還要解決如何讓不同的深度學習框架訓練出來的網絡都能與該芯片兼容的難題,這就需要深度學習編譯器來解決,它可以作為神經網絡模型與硬件之間的橋梁,當今應用較多的深度學習編譯器框架有TVM,GLOW等[5]。
本設計針對NVDLA的官方深度學習編譯器進行了優化,采用了Tengine這一開源的AI推理框架來代替官方的編譯器,并且在軟硬協同的ZYNQ平臺上設計了一套完整的深度學習加速器平臺。
NVDLA是英偉達官方于2017年發布的一款開源深度學習加速器[6],它可用于卷積神經網絡的推理操作。它是一款高度可配置的CNN加速器框架,包含full,large,small版本,small版本規模最小,僅支持int8類型的運算,適合部署在嵌入式移動端設備上,并且可以在它上面部署不同的神經網絡模型。總體框架包含了軟件與硬件設計兩個部分,small的系統結構如圖所示。CPU與CSB接口相連,負責配置NVDLA的內部寄存器數據來完成所要運行的操作,IRQ接口為外部中斷接口,NVDLA會向CPU發送一些中斷信號。DBBIF接口與外部DRAM相連,負責從NVDLA中存入和取出輸入輸出數據,CPU也與DRAM相連獲取操作指令數據,NVDLA系統框架如圖1所示。

圖1 small版本NVDLA系統框圖
NVDLA內部包含寄存器配置模塊,與CSB接口相連,卷積運算模塊,卷積緩沖運算模塊,數據點操作激活函數模塊(SDP),本地響應規范化模塊(CDP),池化模塊(PDP),以及small版本不支持的重塑reshape模塊和橋接DMA模塊。其中每個模塊均與內存接口模塊相連,每個模塊都有一個寄存器配置接口和一個數據傳送接口,圖2為NVDLA內部數據流向模塊圖。數據從卷積模塊處開始輸入,一路送至CDP模塊,最后通過內存接口輸出數據。

圖2 small版本NVDLA內部模塊
NVDLA框架整體包含軟件與硬件兩個層次,硬件即NVDLA的電路邏輯單元結構,是進行CNN推理運算的主要部分,主要通過硬件部分的高度并行性來加速神經網絡的大量數據運算,其中包含了卷積運算,激活函數,池化,歸一化4種算子。軟件部分包括在CPU上運行的compiler與runtime兩部分,compiler即深度學習編譯器部分,負責接收由caffe訓練的caffemodel模型,將其轉化為一種中間表示(IR)形式,一種計算圖表示結構,然后compiler再對該圖進行一些網絡結構的圖優化,再轉化為硬件層面上的抽象語法樹結構,最后生成硬件可以識別的文件格式,便于不同神經網絡在硬件上部署。runtime部分又分為UMD和KMD兩個部分,UMD為用戶模式驅動程序,通過接受compiler生成的loadable文件并解析。然后發送給KMD,即內核模式驅動程序,它接收到要進行推理的指定神經網絡后,將硬件配置信息發送給硬件部分的配置寄存器,從存儲器中取數據,執行所配置的寄存器操作,開始運行卷積網絡并輸出結果,NVDLA軟件棧工作流程如圖3所示。

圖3 軟件棧流程
NVDLA硬件與軟件部分代碼完全開源,內容規范完整,尤其是它的硬件架構和軟件編譯器部分十分重要,為深度學習加速器的研究提供了極大的參考價值。
隨著深度學習算法的不斷優化,以及各種為了便攜式嵌入式設備而研究的輕量型深度神經網絡的出現,因此相應的深度學習加速器也成為了研究人員展開研究的熱點。卷積神經網絡更是深度神經網絡中的主流方向,在深度學習加速器中,卷積相關的運算一般都占了一半以上的運行時間,絕大部分數據也都要進行卷積運算的過程,但卷積運算是十分規則的矩陣乘累加運算[7],并且其中涵蓋著大量的數據重用[1],可以針對CNN的卷積運算的一致性而專門針對卷積運算設計相應的硬件電路結構[8],因此可以用FPGA或ASIC這種并行度高的硬件電路來設計卷積運算框架,來加速卷積運算[7]。卷積運算分為直接卷積運算與快速卷積運算,本設計只針對直接卷積運算,即將一個卷積核在輸入圖像上按指定步長滑動,卷積核的參數與相應位置的圖像進行乘累加運算得到輸出特征圖的一個像素點的值。快速卷積計算包括FFT和Winograd變換等方法[10],通過優化卷積運算來減少耗費資源和功耗的乘法次數來提升卷積操作性能。卷積運算之后還會緊跟池化層也叫下采樣層可用于降維并將特征信息進行壓縮減小運算量,分為最大池化,最小池化,平均池化三重計算。然后有非線性層,它對卷積層或全連接層的輸出施加激活函數來為網絡引入非線性特征,來增強網絡的學習能力,如Relu,sigmoid函數等。一般最后有全連接層,每一層的神經元都與下一層的每個神經元相連,全連接層的參數量一般占了網絡中的大部分參數,全連接層的輸出結果連接softmax函數,其結果為分類結果,卷積神經網絡結構[10]如圖4所示。

圖4 卷積神經網絡結構
式(1)為卷積神經網絡計算的公式,O為輸出特征圖,I代表輸入特征圖,W為卷積核,b為偏置,C為卷積通道數,F為卷積核的寬和高,S為指定的步長。
O[n][x][y]=Relu(b[n]+

(1)
由于CNN算法框架的增多,如yolo,bert系列等,它們的網絡結構不同,算子種類也不盡相同,算子組合方式多種多樣,并且應用場景也隨之被不斷發掘。隨著各種嵌入式移動設備廣泛應用,因此就需要將各種深度學習算法部署在各種硬件上[12],如CPU,GPU,FPGA,NPU(Neural Nework Unit)等。以前的方法是由人工針對各種網絡結構去做優化,寫出算子代碼,并且還要針對不同的硬件后端,還要去做優化測試和適配,而這會帶來極大的工作量[13]。因此就要想辦法高效的將不同的神經網絡可以用一種較為容易的方法去部署到不同的硬件上,讓它們之間形成一道通用的橋梁,因此深度學習編譯器就被提了出來[10]。
廣義的編譯器技術在計算機中應用廣泛,它是一種程序,將某種高級語言如Java,Go,Python等,轉換為一個中間表示,再把他翻譯成等價含義的另一種目標語言程序,一般為機器語言或低級語言。深度學習編譯器的過程與其類似,因為深度神經網絡結構本身抽象化之后就是一個有向圖結構,圖的每一個節點代表一個卷積計算過程,兩個節點之間包含著所對應的數據,因此深度學習編譯器主要是對計算圖相關的優化,包括前端,后端[5]。編譯器前端先實現一個解析的功能,先接受由深度學習訓練框架訓練好的網絡,再把它們轉換成一個中間的表示形式,構建了一個有向計算圖的表示形式。再對該有向圖進行硬件無關的優化,比如算子融合,層融合等優化方法,可以將計算圖的結構變的簡化一些,減少神經網絡的推理運行時間。然后將優化后的圖IR送給后端,后端與部署目標硬件關系十分緊密,負責基于特定硬件的優化,如對硬件在運行推理操作時的數據存取,內存管理,計算單元調度等操作做出一系列指定,生成針對目標硬件體系結構的優化代碼[11]。有時不同的硬件對應著不同的體系結構,如嵌入式設備一般采用ARM體系結構[14],主機采用X86架構,以及現如今發展最為火熱的RISC-V等[11],因此針對不同體系結構的硬件后端,設計編譯器時也要有所區分。
NVDLA的官方也發布了相應的編譯器,它只能接受caffe訓練的模型,tensorflow與caffe都是目前流行的深度學習框架,而caffe訓練框架已逐漸被其余訓練框架取代[15]。NVDLA官方的編譯器設計流程為,首先接受caffemodel后,通過解析器解析網絡模型結構,生成IR中間表示,然后構建一個抽象語法樹,也就是一個跟硬件架構無關的圖優化結構,然后又根據硬件特點轉化成一個跟硬件相關的的抽象語法樹,該語法樹包含了硬件的寄存器配置和內存分配信息,經過轉化生成了一個針對硬件的圖優化結構。與硬件無關的抽象語法樹就是整個卷積神經網絡各算子按順正常序連接的形式。
Tengine是一個靈活,輕型的邊緣AI計算框架,并且開源免費,它能夠快速將深度學習前端模型部署到各種CPU,GPU,NPU平臺,也具有深度學習編譯器功能,可以進行模型轉換,模型量化,多種端側部署功能,可以高效地發揮端側不同芯片的異構計算能力。它可以接收大部分訓練框架如caffe,tensorflow等,通過序列化操作[5],轉換成抽象計算圖形式,然后再對其進行圖優化操作,統一保存為一種tmfile格式的文件。如果有量化需求的話可以使用Tengine自帶量化工具進行int8的對稱和非對稱量化兩種量化形式,直接導入網絡模型和訓練集即可完成量化。在后端進行部署時,Tengine有著獨特的自動切圖機制,可將支持NPU的算子在NPU上運行,不支持NPU的算子切到CPU或其他設備上去運行,這充分發揮了設備的異構計算能力。對接后端時要注意,針對不同的后端設備,可以通過修改Tengine的接口函數文件,給硬件分配各節點和輸入數據的內存以及切圖模式,將已經轉換為Tengine的與硬件無關的計算圖變成與硬件相關的計算圖結構。在不同的硬件后端上部署神經網絡時,要添加該網絡對應的算子,Tengine官方針對不同訓練框架所對應的算子與硬件相關的就是根據硬件架構將每個算子映射到NVDLA的不同模塊上的各模塊連接方式。例如卷積模塊包含一個輸入與權重相乘的乘法模塊和其相乘結果與偏置相加的加法模塊,這樣一個卷積算子就映射到了兩個模塊上,接著生成針對NVDLA硬件的優化代碼,最后生成loadable數據流文件。然后是進行runtime階段,負責硬件方面的配置和調度,它接收loadable文件,然后開始配置NVDLA的寄存器配置,內存分配,處理終端等配置。官方的編譯器的缺點明顯,比如現如今tensorflow,pytorch等已成為主流訓練框架,而它只能接受caffe訓練的框架,其次量化方面必須要下載TensorRT,并且還要寫python代碼來進行操作,過程復雜。此外官方的支持的算子數量少,官方源碼難以修改去添加其他算子,而以上缺點采用Tengine推理框架可以得到較好的解決,官方編譯器的工作流程如圖5所示[5]。

圖5 NVDLA官方的compiler流程
大部分都已經添加,因此可以直接從源碼文檔中尋找對應算子自行添加。Tengine在執行時,通過將待分類的圖像輸入給Tengine編譯好的可執行分類程序,就可以輸出分類結果。Tengine系統框架如圖6所示。并且Tengine還提供了靈活的調試功能,它可以輸出每個節點的輸入輸出數據,以及每個算子中的參數和設備運行算子的執行時間,為調試后端硬件功能提供了極大便利。

圖6 Tengine系統框架圖
本設計采用Tengine編譯器代替官方的編譯工具,即在原來官方編譯流程中的通用抽象語法樹處插入Tengine的編譯器。在這之前仍然采用官方的編譯器去生成中間表示IR,然后在通用語法樹處接入Tengine編譯工具,這樣可以采用Tengine編譯器來對計算圖結構進行切圖,圖優化等操作,使NVDLA得到由Tengine優化的結構,將原來生成loadable文件的過程去掉,直接將tmfile文件交給runtime部分。與后端設備對接時要實現以下幾個功能,首先要初始化數據,為優化的計算圖結構開辟內存,然后要把數據送入NVDLA,以及取出NVDLA的輸出數據,最后,釋放空間內存,要寫出以上函數來實現對接。Tengine代替原來編譯器流程的結構如圖7所示[14]。

圖7 Tengine框架編譯流程
神經網絡的參數量化技術,目前也是壓縮神經網絡的主流方法之一。神經網絡訓練時都是32位浮點數,量化是指將參數量化成16位8位4位等低精度格式,目前主流量化方案是int8量化,這樣可以降低設備對于網絡模型的存儲壓力[16],大量減少了數據訪存次數和計算量同時降低了功耗[17]。并且也有研究表明,由于CNN對于噪聲不敏感,因此int8量化后的網絡與之前浮點32位的網絡精度相差無幾[18],并且硬件比較適合進行定點運算[19]。量化方案包含對稱量化與非對稱量化,對稱量化是將待量化數據絕對值的最大值映射到新數據范圍內的最大值,非對稱量化是指將待量化數據的最大值和最小值映射到新范圍內的最大值最小值,本設計針對對稱量化展開研究。
量化的過程為先計算數據的最大最小值,計算出縮放因子scale,然后得到它的數據分布,最后對其進行數據截斷。Tengine的量化原理與TensorRT類似,采用一種反量化方法,即將輸入數據和權重進行int8量化,即把它們與scale相乘,偏置值不量化,然后輸入數據與權重相乘,之后再轉換成浮點32位,最后再與偏置值相加得到結果[20]。Tengine的量化工具經過官方研究表明其效果好于大部分NPU自帶的量化工具。Tengine已經根據量化原理設計好量化工具,在工具庫里可以找到,直接輸入要量化的tmfile格式的文件模型執行量化程序來量化,量化時還需要加上訓練集中的一部分數據來進行量化時的校準,使得量化結果更為準確。
本實驗硬件平臺采用賽靈思的ZYNQ UltarSCALE+系列的ZCU104開發板搭載雙核ARM A53處理器,PC端使用vivado和petalinux開發軟件和pycharm軟件進行神經網絡訓練,采用tensorflow框架訓練網絡,PC端的中央處理器型號為i5-1035G1。
使用mnist手寫數字訓練集訓練lenet-5網絡和cifar-10訓練集訓練resnet-18網絡,將訓練好的模型分別采用NVDLA官方的深度學習編譯器和Tengine的編譯器去將該模型轉化為NVDLA硬件可以接受的形式,在開發板上對測試集進行推理,最后分析實驗結果。
官方發布的NVDLA是針對ASIC設計的,現要將其映射到FPGA上。首先要將NVDLA中的RAM結構替換為FPGA上的BRAM資源,因為官方的代碼描述的RAM是RTL行為級的,直接映射到FPGA上的話,會使的FPGA上的查找表資源來實現RAM,會浪費大量資源。然后還要關閉門控時鐘,因為FPGA上的時鐘資源與ASIC不同,如果采用ASIC的門控時鐘行為,會導致保持時間違例[13]。
圖8和圖9為NVDLA的寄存器配置部分仿真圖和數據傳輸接口部分仿真圖。NVDLA作為從機,與其進行數據交互的CPU作為主機。如圖8所示,當輸入信號valid與NVDLA的給出的輸出信號ready同時為高時,代表握手信號成功,write寫信號被拉高,寄存器地址和要寫入的數據發送給NVDLA。如圖9所示,當valid信號和ready信號同時為高時,數據寫入NVDLA的內部存儲單元內。

圖8 NVDLA寄存器配置接口仿真圖

圖9 NVDLA數據傳輸接口仿真圖
例化NVDLA模塊后還需要將它與CPU相連,ZCU104上的ARM處理器可當作CPU使用。NVDLA的CSB接口上加一個CSB轉APB協議的轉接器模塊,并且想要與ARM通信只能采用AXI協議,因此要設計一個APB轉AXI的橋接模塊將NVDLA與ARM相連。還要將csb_clk與core_clk兩個時鐘短接,它們負責寄存器的讀寫最后得出,時鐘頻率定為100 Mhz,時序符合要求,FPGA的資源占用情況見表1。還要生成xsa文件,用于在 petalinux中定制操作系統。

表1 資源使用情況
與NVDLA的加速任務,異步電路的存在使得vivado難以進行靜態時序分析,因此要把它轉換成同步時序電路。將各個模塊集成連線,設計成完整的SOC系統,進行邏輯綜合布局布線,得到時序符合要求的設計,圖10為NVDLA總體電路結構圖。

圖10 NVDLA總體電路結構圖
在pycharm軟件上采用tensorflow框架訓練lenet-5和resnet-18兩個網絡。mnist手寫數字數據集訓練集60 000張圖片,測試集10 000張圖片,cifar-10數據集訓練集有50 000張圖片,測試集有10 000張圖片,resnet-18網絡比lenet-5復雜。訓練模型的精確度如表2所示,均為32位浮點數形式,tensorflow訓練模型輸出為pb格式文件。

表2 PC端訓練模型精確度
為了在開發板上完整設計NVDLA平臺,還需要ZYNQ上移植一個ubuntu16.04的操作系統,存放在SD卡上,插到開發板卡槽上,打開開發板啟動開關即可運行Linux系統。同時還要將由vivado生成的xsa文件導入petalinux軟件中,定制操作系統鏡像文件,將NVDLA設計增加到了系統的設備樹中,這樣就可以在Linux系統中使用NVDLA外設。整個平臺的架構如圖11所示,通過鍵盤輸入Linux系統下的各種指令,在顯示屏上查看結果。

圖11 系統架構圖
采用NVDLA官方編譯器與Tengine編譯器分別優化轉換以上兩個網絡,進行int8量化,將測試集的圖片輸入,分析它們的運行時間后再將兩個網絡在CPU上運行,得到數據分析對時間和準確率,然后并將它們對比,結果如表3所示。

表3 不同方案數據對比
如表3對比可知,由于lenet-5網絡簡單,因此使用不同編譯器的網絡優化效果不明顯,對比使用CPU推理網絡有大約30%的加速效果。對于resnet-18網絡,由于該網絡較為復雜,因此可以明顯看出采用Tengine的編譯器優化結構效果要好于采用官方編譯器,速度增加了約2.5倍,對比CPU增加了約3.7倍,并且功耗也比CPU低約6.5倍。

表4 準確率對比 %
量化后的測試集準確率如表4所示,由于采用官方編譯器與Tengine編譯器的量化方案不同,因此準確率會有一些差別,與表2中原來的32位浮點數形式的準確率對比,誤差在合理范圍之內。
針對多種卷積神經網絡實現硬件加速時,在不同硬件后端部署時遇到的效率低的問題,提出了采用Tengine這一深度學習推理框架的方案來解決該問題,在ZYNQ平臺上部署了完整流程的深度學習加速器。又對深度學習編譯器和NVDLA特性結構進行研究,將Tengine這一框架應用于NVDLA上,使用Tengine的編譯器來將CNN模型與NVDLA硬件部分對接。通過實驗在ZCU104開發板上搭建了NVDLA這一加速器平臺,實現了lenet-5和resnet-18兩個網絡的圖像分類任務。實驗結果表明使用Tengine工具鏈的深度學習加速器可以支持接受多種深度學習訓練框架模型,并且其圖優化結果要好于官方的深度學習編譯器,使得卷積神經網絡推理速度更快,量化工具等其余功能使用起來也很方便,對于研究卷積神經網絡的落地應用有一定的研究意義。