廖裕民
(福州瑞芯微電子有限公司,福州350003)
隨著深度學習的快速發展與應用[1-2],卷積神經網絡(Convolutional Neural Network,CNN)正在被越來越廣泛的使用,特別是在圖像識別和分類場景中獲得了巨大的突破性進展。CNN 由于擁有多層的神經網絡結構,其自身有很強的學習和并行處理特點[3],是一種擁有多層感知,局部連接和權值共享的網絡結構[4],所以最終可以達到較低的網絡模型復雜性和較少的網絡連接權值個數,因此近年來,越來越多的CNN 正在被圖像內容分析[5-6]、內容識別[7-8]等領域得到了廣泛的應用。但是隨著CNN 的逐步廣泛應用,其海量的運算能力需求與當前硬件運算能力的矛盾越來越突出。在現階段實現卷積神經網絡主要還是使用消費級的通用處理器CPU 或者GPU 來實現,其運算效率較低且能耗非常高,因此這還遠遠不能滿足卷積神經網絡運算對速度和低能耗的需求。
同時,由于便攜電子設備的普及,神經網絡運算對便攜化的需求也非常強烈,但是便攜設備對功耗和工作效率要求非常高[9-10],所以我們提出了這個通用低功耗高效率的CNN 加速電路結構,對可重構和工作效率和功耗都做了針對性的優化設計,以到達到便攜設備的要求。
本文提出的加速電路具備以下特點:
(1)通過可重構性設計方法,讓電路可以兼容多種神經網絡結構和算法,使得這套電路不僅可以完全實現前面提到的多種神經網絡圖像算法,還可以對將來的算法升級有良好的適應性。
(2)通過雙配置寄存器組設計,減少模塊的空閑時間,從而提高模塊的利用率。
(3)通過利用圖像卷積運算中數據稀疏性的特點做了針對性的低功耗設計,使得該加速電路可以運行在較低功耗水平,以適應移動手持設備的需求。
整體的電路結構由以下幾個部分構成:主存儲器、CPU、取數控制模塊、卷積運算模塊、激活運算模塊、池化運算模塊、寫數控制模塊,以及每個運算模塊都帶有一個直通單元和寄存器通路選擇單元。

圖1 電路總結構
神經網絡運算加速電路的連接結構和工作流程如下:
運算加速電路由于采用可重構性的設計結構,將神經網絡電路算法拆分為多個小的運算加速模塊單元,通過通路配置使其可以適配各種不同的網絡結構。因此該運算加速芯片可以完成各種深度學習神經網絡處理中所需的圖像邊沿分割和內容分類等多個算法加速運算。
神經網絡運算加速電路包括:主存儲器、CPU、取數控制模塊、卷積運算模塊、激活運算模塊、池化運算模塊、寫數控制模塊,以及每個運算模塊都帶有一個直通單元和寄存器通路選擇單元的設計。
其中,除了讀寫控制兩個模塊之外,中間的每個模塊都有一個直通單元,直通單元負責根據配置將數據流跳過對應模塊直接到達下一個運算模塊,以實現不同的網絡結構。
在電路的工作前需要先完成算法的神經網絡結構訓練以產生完整的網絡結構和所有的網絡參數,然后將網絡結構和網絡參數存入主存儲器中,以便運算加速芯片進行加速運算。當所有網絡結果和參數存入主存儲器后,整個電路可以開始正常工作。
主存儲器存儲了網絡結構和網絡參數,包括網絡層數量,每層網絡卷積核個數、寬度、高度、通道數、卷積步長、PADDING 大小、卷積核數值、激活函數類型、池化大小參數等。同時主存儲器還負責存儲網絡層間的中間運算結果。
CPU 在電路開始工作后,從主存儲器中讀取出網絡結構參數對各個模塊的配置寄存器進行配置控制,根據網絡結構選擇需要的模塊,將不需要的模塊通過配置該模塊的直通單元有效而使其被繞過。
在CPU 配置完成后,取數控制單元,根據配置寄存器信息對存儲器進行特征數據和卷積核數據的讀取操作,并把讀取數據送往卷積運算模塊。
卷積運算模塊:對特征數據和卷積核進行神經網絡的卷積運算和反卷積運算,該電路在設計時充分考慮了圖像卷積運算中數據稀疏性的特點做了針對性的低功耗設計,使得該加速電路可以運行在較低功耗水平。具體結構后面有詳述。
激活運算模塊:可以進行神經網絡的激活函數運算,支持ReLU、PReLU、sigmoid 激活函數。
反池化模塊:可以進行反卷積運算,將結果送往池化運算模塊。
池化運算模塊:可以完成神經網絡的池化運算,將池化運算結果送往寫數控制模塊。
為了提高整個神經網絡加速運算的工作效率,減少網絡層之間的運算時間間隔,我們設計了一種雙寄存器組結構,該結構為每個運算模塊都設計了AB 兩組配置寄存器和一個寄存器選通控制單元,分別可以存儲兩層網絡的配置。

圖2 正常NN 加速電路工作流程
圖2 是正常情況下的神經網絡加速運算流程,下一層的運算依賴于前一層運算的全部結束,可以看到每個模塊實際工作中都會存在大量的空閑。
為了解決這個問題,提升加速電路的工作效率,減少電路的空閑時間,我們為每個運算模塊都設計了AB兩組配置寄存器和一個寄存器選通控制單元,使得各個模塊工作時不再依賴于前一網絡層運算完畢,而是自己模塊完成當前層的運算后可以立即切換到下一層的運算,達到圖3 中的工作效果。
雙寄存器組的具體工作方式:
(1)在加速電路開始工作前,CPU 先將前兩層網絡的配置分別配置到每個模塊的配置寄存器A 和配置寄存器B。然后加速電路可以開始工作,工作開始后首先使用配置寄存器A 中的配置進行第一層網絡的工作。
(2)當第一個模塊完成當前層的工作后,將本層工作完成信號送往本模塊的寄存器選通控制單元和CPU,然后本模塊的寄存器選通控制單元立刻將該模塊的寄存器改為寄存器B 也就是下一個網絡層的配置,該模塊可以立刻進入下一層的工作處理。同時,CPU 在收到該模塊的本層工作完成信號后,對寄存器A 中的配置進行配置更新,更新為第三層網絡的配置。
(3)當模塊完成第二層網絡的運算工作后,同樣的將本層工作完成信號送往本模塊的寄存器選通控制單元和CPU,然后本模塊的寄存器選通控制單元立刻將該模塊的寄存器改為寄存器A 也就是第三層網絡的配置,該模塊可以立刻進入第三層的工作處理。同時,CPU 在收到該模塊的本層工作完成信號后,對寄存器B 中的配置進行配置更新,更新為第四層網絡的配置。
(4)每個模塊都遵照上面所述的順序進行工作,不依賴于整層網絡運算結束后整體切換到下一層進行工作,實現了完全流水作業,大幅減少了各模塊的空閑狀態時間,從而提升了的電路工作效率。

圖3 雙寄存器組電路工作流程
由于大量的神經網絡運算圖像具有稀疏性的特點。因此我們針對待運算圖像中出現的數據稀疏性矩陣運算特點,設計了針對性的功耗優化和運算電路。該電路可以有效地降低卷積神經網絡電路運算過程中的運算數量和運算過程中消耗的功耗。
卷積層是所有神經網絡運算中最重要也隨耗費硬件資源和功耗的部分,卷積運算的計算公式如下:
Fi=σ(Wc(i)*Fi-1+bi).
其中,Fi表示第i 卷積層的卷積結果,Fi-1表示第i-1 卷積層的卷積結果,Wc(i)表示第i 卷積層的權值,符號“*”表示卷積運算,bi表示第i 卷積層的偏置,σ表示激活函數運算。
針對圖像的稀疏性,本文提出的針對性優化的卷積運算電路結構如圖4。
在乘加陣列的設計上,將32 個乘加器劃分為4 個時鐘組,每個時鐘組包含相同數量的8 個乘加器單元。然后通過對待運算的特征數據和卷積核數據進行非零判斷,如果特征數據或者卷積核數據值任意一個為零則表示該次運算的結果必然為零,因此只對該次運算的位置進行標記而不做乘加運算,當完成整個待運算矩陣的非零判斷后,根據剩下的非零運算的數量來判斷需要打開多少個時鐘組的乘加單元,而不需要用到的時鐘組在此次運算中時鐘始終處于關閉狀態,最后在運算完成后,根據前面非零判斷時對零數據的位置進行恢復后完成后累加,從而實現了低功耗的卷積運算處理。
乘加陣列單元的具體工作過程:
(1)兩個非零判斷單元分別負責對特征數據和卷積核中的數據進行非零判斷,如果數據為零,則輸出高有效信號到邏輯“或”電路。
(2)邏輯“或”電路負責對兩個非零判斷單元的判斷結果進行邏輯“或”操作,將運算結果送往非零統計單元和通路開關和分配單元。因為零乘以任何數都為零,所以只要待相乘的兩個數中任何一個為零則運算結果必然為零,所以在此使用了或操作。
(3)非零統計單元負責對邏輯“或”電路輸出的特征數據和卷積核數據都非零的操作數進行統計,并將統計數據送往門控時鐘單元。
(4)通路開關負責根邏輯“或”電路輸出的判斷結果,在特征數據和卷積核數據都非零時將數據送往分配單元。在有零時,不將數據送往分配單元。
(5)分配單元根據通路開關送來的數據,依次送往每個乘加陣列組,例如先送組1 的8 個乘加器,然后再是組2 的8 個乘加器,直到送滿整個乘加陣列。同時并將該非零數據在特征數據流中的序號送往非零數據序號存儲單元。而從實現了將整個序列中的非零數據重新整齊排列到規整緩存單元中,并將這些非零數據的序號送往累加緩存單元以方便累加時還原矩陣位置。

圖4 卷積運算電路結構
(6)門控時時鐘判斷單元根據非零數據個數和乘加陣列的每個門控時鐘控制的乘加器組中乘加器的個數,來決定打開幾個乘加器組的時鐘。
(7)乘加器單元負責對特征數據和卷積核數據進行乘加運算操作,并將乘加結果送往累加緩存單元。
(8)累加緩存單元在乘加器單元完成乘加運算后,從非零數據序號存儲單元讀取本次乘加運算結果對應的矩陣位置點,完成后對乘加結果的累加操作。
(9)直到整個卷積核的全部channel 完成累加,此時的累加結果作為最終卷積結果輸出。
通過以上提出的神經網絡加速電路,可以快速完成各種神經網絡算法加速處理。
為了測試本文提出的電路結構,我們采用LeNet網絡結構進行實驗,如圖5 所示,網絡包含卷積、激活、池化等運算,對應于硬件的卷積運算模塊、激活運算模塊、池化運算模塊,同時可分為4 層運算。作為硬件運算結果的對比參考值,本文使用TensorFlow 對網絡進行網絡搭建和參數訓練,將權重等參數載入主存儲器,通過C 代碼控制CPU 配置神經網絡運算加速芯片,最終得到運算結果。
然后,根據本文提出的結構,使用硬件描述語言Verilog 完成了電路的設計實現,在VCS 仿真工具下進行功能仿真正確后,經過Quartus 綜合,將網表下載到FPGA 器件Stratix IV EP4SE820 中,具體實驗流程如下:
開始的準備工作:
首先,準備好待處理圖像數據,和電路實現的算法對應的TensorFlow 算法模型;
然后,將待處理圖像數據經過TensorFlow 算法模型的計算得到參考正確結果。此時,準備工作結束。
正式試驗流程:
首先,將待處理圖像數據和網絡參數初始化到RAM 中;
然后,打開神經網絡加速電路使其開始工作,加速電路讀取RAM 中的待處理圖像和網絡參數進行神經網絡層運算處理后將該層的數據結果寫回RAM 的另一段地址。然后開始讀入下一層的網絡參數和上一層的運算結果開始下一層的運算,如此循環直到所有網絡層完成運算和結果導出。
最后,將經過神經網絡加速電路處理后的RAM 中的結果數據導出,并且和之前準備的參考正確結果進行比對,則可以判斷電路是否可以正確工作。
實驗結果表明本文設計的神經網絡加速電路在FPGA 上對100 幅測試圖像進行測試,測試精度為95%,與算法運算結果完全一致。
本文提出了一套通用低功耗高效率的CNN 加速電路結構。該結構具有可重構、工作效率高、低功耗的特點,可以快速完成各種神經網絡算法的圖像處理,同時可以滿足便攜設備的功耗和性能需求。

圖5 LeNet網絡結構