張立博,李昌偉,齊 偉,王 剛,戚魯鳳
(1.中國綠發投資集團有限公司,北京 100010;2.山東魯軟數字科技有限公司,濟南 250001)
隨著人工智能(AI)蓬勃發展,網絡模型的精準度不斷提升,應用場景愈發廣泛,但網絡模型存儲壓力不斷增加,模型運算量日益增大,資源受限的互聯網設備面臨新的挑戰[1]。AI技術需要利用低能耗的神經網絡處理器,但最近的大多數研究都集中在設計僅用于推理的加速器上[2]。然而,為了能夠真正利用AI服務于現實需求,還需實現自我監督和半監督學習,這就要求神經網絡處理器除了具有推理功能外,還要減少訓練過程。
大多數關于神經網絡加速器的研究都集中在確定輸入數據準確性的正向架構和電路結構上[3]。然而,為了盡可能地模擬人類或動物的神經網絡,有必要在反向傳播中設計一個通過精度反饋的神經網絡電路,從而能夠使用尺寸更小且功耗更低的運算_架構。文獻[4]指出神經網絡的學習可分為芯片外學習和芯片內學習。其中,芯片外學習通過借助互聯網設備分散大量運算,文獻[5]總結出使用邊緣設備收集、處理和分析神經網絡類數據更有效。文獻[6]驗證了與服務器重復交互的邊緣設備更能顯著減少電能消耗。文獻[7]開發了基于樹的算法用于預測資源受限的互聯網設備。芯片內學習則是通過設計優化的輕量級神經網絡模型在低功耗且小尺寸的芯片上實現訓練[8]。
為了實現低功耗,必須為所涉及的數學計算選擇適當的格式。文獻[9]研究表明整數運算足以設計低功耗推理加速器,然而,還需要大量的研究來訓練具有合理精度的神經網絡。文獻[10]的實證結果表明,訓練神經網絡需要至少16bit精度。文獻[11]中實現了使用整數運算的混合精度訓練,將兩個整數相乘并輸出存儲到整數累加器中。然而,整數運算符無法代表廣泛的數字,嚴重阻礙了訓練引擎中使用。
當用于訓練神經網絡時,浮點運算比定點運算具有更高的精度[12]。傳統的神經網絡電路設計研究集中在利用GPU 或定點計算硬件進行浮點運算。然而,大多數現有的基于浮點的神經網絡僅限于推理操作,只有少數包含針對高速服務器而非低功耗移動設備的訓練引擎[13]。將訓練與高精度目標結合起來需要使用浮點運算符。神經網絡中的高精度浮點運算結構往往會大量能耗。因此,需要設計出優化浮點運算的加速器。通過計算近似技術可以有效降低計算復雜性,最大限度地減少浮點算子的顯著能耗[14]。雖然計算近似技術在能耗和吞吐量優化方面表現出較好的性能,但現有研究熱點集中在反向傳播期間保持權重更新的精度。文獻[15]通過維護浮點權重的主副本來實現混合精度訓練,并且在向前和向后傳播期間使用浮點的另一副本。然后,權重梯度需要更新浮點運算主副本并在每次迭代中重復該過程。盡管減少了整體內存使用量,但保持權重的副本會將權重的內存需求增加兩倍[16],并且由于額外的內存訪問將不可避免地導致整體性能發生延遲。
為了能夠兼顧神經網絡訓練中浮點運算的訓練過程和高精度,本文設計了一種具有高性能卷積神經網絡(CNN)訓練處理器的浮點運算優化架構。在不犧牲精度的情況下找到最佳浮點格式。利用混合精度架構,將需要更高精度的層分配了更多的存儲,而需要更少精度的層分配了更少的存儲。通過評估不同的浮點格式及其組合來實現浮點運算符,從而以更少的能耗實現更高的精度結果。通過CNN 和浮點訓練設計一種混合精度加速器實現更高精度的卷積塊,并運用MNIST手寫數字數據集驗證了優化架構的有效性。
CNN 作為人工神經網絡(ANN)的分支,最常用于特征提取和分類[17]。使用CNN 訓練加速器訓練電路,從而高效準確地對輸入圖像進行分類。CNN 訓練加速器的體系結構可在正向傳播過程中使用經過訓練的權重從輸入值推導輸出,并在反向傳播過程中更新權重,進而提高正向傳播中下一幅圖像的總體精度[18]。CNN 的總體架構,如圖1所示。其中,Conv為卷積,ReLu為線性整流函數。Softmax為歸一化指數函數。

圖1 CNN 的總體架構
Softmax函數作為激活函數,根據概率分布將網絡的輸出標準化為輸出類。Softmax函數將N個實數組成的向量xi作為輸入,由N個概率組成的概率分布建立標準化,且概率與輸入值的指數成正比。因此,對每個輸入向量應用標準指數函數,每個輸入向量指數值除以所有累加指數對每個輸入向量進行標準化。則SoftMax函數可以表示為:
從公式(1)可以看出,計算SoftMax值需要1個除法器模塊和1個加法器模塊。
CNN 訓練模型利用反向傳播算法將輸出層的誤差向后傳播,并使用基于梯度下降的優化算法逐層更新變量[19]。本文利用加速變量更新收斂方式平滑梯度下降學習過程中遇到的波動,CNN 模塊中的權重更新為:
其中:θτ為時刻τ的權重,η為學習率,Δντ為梯度。從公式(2)可以看出,梯度下降權重更新需要1個乘法器和1個減法器模塊。
根據IEEE 754標準,由3個元素定義浮點格式:1)符號(正/負);2)精度(實數的有效位數,尾數);3)位數(索引范圍)。浮點數可以表示:
其中:Sign為符號指數,E為指數的二進制值,eb為指數范圍的中值,M為尾數,即小數點后的數字部分。浮點運算的流程圖,如圖2所示。其中,MUX 為多路復用器,浮點數的每個部分單獨計算。

圖2 浮點運算的流程圖
浮點運算的步驟為:
步驟1:在執行實際計算之前,原始的浮點數A和B劃分為{符號A,指數A,尾數A}和 {符號B,指數B,尾數B}。
步驟2:對于每個分離的元素分別進行運算:
1)符號:在加法/減法運算中,通過比較兩個輸入的尾數和指數來確定輸出符號,在輸入B 的符號處放置1個非門和1個MUX,使用反向符號在相同模塊進行減法運算。在乘法/除法運算,通過異或(XOR)運算得到兩個輸入符號。
2)指數:如果指數值不同,則在兩個輸入中選擇較大的指數值。對于指數值較小的輸入,有效數位右移一位使得兩個數字與同一個小數點對齊。兩個輸入的指數大小之差決定了要執行右移的次數。
3)尾數:通過無符號運算計算尾數的值。尾數位的加法/減法運算結果可能比兩個輸入的尾數位大1bit。因此,為了獲得精確的結果,本文將兩個輸入的尾數位大小增加了兩次,然后根據尾數的計算結果,無論最高有效位(MSB)為0或1,對尾數進行加法或減法運算。如果MSB為0,則不需要標準化。如果MSB為1,則標準化器移動先前計算的指數位和尾數位來得到最終合并結果。
步驟3:每個計算出的元素合并成一個浮點前置模塊,從而生成結果以浮點形式輸出。
本文利用4種不同的浮點格式優化CNN。每種浮點格式的詳細信息,如表1所示。

表1 4種不同的浮點格式
表1中的有效位表示位,包括符號位和尾數位。本文中使用的每種浮點格式,如圖3所示。
16bits自定義浮點格式用于與現有的16bits腦浮點格式進行比較,24bits自定義浮點格式用于與其他浮點格式進行比較。本文還在16bits卷積塊中使用24bit自定義浮點格式進行累加,從而提高網絡的精度。
本文使用牛頓迭代法[20]作為除法運算的算法,只需要減法和乘法即可計算出一個數的倒數。在數值分析中,實值函數f(y)近似為一條切線,其方程由f(y)的值及其在初始近似處的一階導數求得。如果yn是真實值的當前估計值,則下一個估計值yn+1可以表示為:
其中:f′(yn)為f(yn)對yn的一階導數。
在倒數生成器中有3個整數乘法器,其中兩個乘法器負責在多次迭代后生成倒數。為了在倒數生成器中執行快速計算,本文使用Dadda乘法器[21],其中部分乘積在半加法器和全加法器階段求和,然后使用常規加法器將最終結果相加?;诘箶档母↑c除法器的結構,如圖4所示。

圖4 基于倒數的浮點除法器的結構
由于基于倒數的除法器需要許多迭代和乘法器,因此,不可避免地受到處理延遲和過多硬件能耗的影響。本文使用符號數組來計算二進制數的除法[22],與使用倒數的除法計算相比,符號數組除法沒有重復的乘法運算。為了對分割進行優化,使用專門設計的處理單元,通過減法運算和執行反饋來選擇除法的商值。符號數組除法處理單元(PU)的結構,如圖5所示。

圖5 符號數組除法處理單元的結構
基于符號數組的浮點除法運算符整體結構,如圖6所示。其中,LSB為最低有效位。首先計算符號數組模塊中的尾數,使用減法器/補償器計算指數,使用XOR 獨立計算結果的符號位。符號數組模塊中的每行都計算部分除法(從先前的部分除法中減去),然后將其傳遞到下一行。每行右移一位,使每個部分除法對應于被除數的下一位位置。數組除法器的每行決定了除法的商值的下一個最高位,將3個元素進行合并得到最終的除法器結果。

圖6 基于符號數組的浮點除法運算符整體結構
本文設計的加速器結構將能耗和硬件尺寸降至足以滿足互聯網應用需求的程度。為了比較硬件尺寸、處理延遲和總能耗,使用設計編譯器合成工具和臺積電(TSMC)55nm標準單元實現倒數和符號數組這兩個除法器。倒數和符號數組進行除法計算的比較,如表2所示。對于50MHz和100MHz的運算時鐘,本文所提出的符號數組除法器比基于倒數的除法器分別降低了6.1倍和4.5倍。對于這兩個時鐘,符號數組除法器的處理延遲分別縮短了3.3倍和6倍。此外,與基于倒數的除法器相比,顯著降低了17.5~22.5倍的能耗。因此,在實現CNN 訓練加速器的Softmax函數時選擇所提出的符號數組除法器。

表2 倒數和符號數組進行除法計算的比較
與浮點加法器/減法器不同,浮點乘法器計算尾數和指數時不依賴于符號位。符號位通過兩個輸入XOR 門計算。加法器和補償器塊通過將兩個輸入數字的指數相加并從結果中減去偏移量“127”來計算得到的指數。如果計算的指數結果不在0和255之間,則視為上溢/下溢,并飽和到界限。即任何小于0的值(下溢)飽和為0,而大于255的值(上溢)飽和為255。通過兩個輸入尾數的整數乘法計算得到尾數輸出,使用指數值重新排列尾數位,然后合并生成最終的浮點格式。浮點乘法器的體系結構,如圖7所示。

圖7 浮點乘法器的體系結構
為了評估所提出的浮點運算符的性能,本文設計了可支持兩種運算模式的CNN 加速器,即推理和訓練。加速器配備了用于發送圖像、濾波器、權重和控制信號的芯片外接口。CNN 加速器的總體架構,如圖8所示。其中,FC為全連接網絡,dout為梯度,dW 為權重導數。

圖8 CNN 加速器的總體架構
在發送大小為28×28 的MNIST 手寫數字圖像之前,通過芯片外接口將大小為3×3的4個濾波器、大小為196×10的FC1和大小為10×10的FC2的初始權重寫入芯片內存儲器。接收到啟動信號后,將訓練圖像和濾波器權重傳遞給卷積模塊,并根據矩陣的點積計算卷積。最大池模塊通過在輸出特征數據的每個2×2子陣選擇最大值,對卷積模塊的輸出進行下采樣。對FC1和FC2兩個全連通層進行SoftMax運算,將預測輸入圖像的分類作為推理結果。
在訓練模式下,反向傳播按照CNN 層的倒序計算矩陣點積的梯度下降。Softmax層和反向傳播層也用于進一步訓練部分權重。從圖8可以看出,全連接層分為dout模塊和dW 模塊,其中,dout模塊用于計算梯度[23],dW 模塊用于計算權重導數[24]。由于反向卷積為最后一層,因此沒有dout模塊。通過反復計算dout和dW 來訓練每個層的權重值,直至權重值達到所需的精度。經過訓練的權重存儲在各自的存儲器中,并用于訓練過程的下一次迭代的推理。
為了找到最佳浮點格式來優化CNN 體系結構,本文計算了不同精度格式的準確率和動態功率,從而找到具有合理精度的浮點,如表3所示。

表3 不同精度格式的準確率和動態功率
本文選擇93%的目標準確率,盡管自定義-24 格式滿足93%的準確率閾值,但其動態功率為30mW,比單精度-16浮點格式高58%。因此,在滿足目標準確率的同時,搜索各個層的最佳浮點格式來實現最小的能耗。本文中設置為單精度-16的初始浮點格式計算準確率,將指數逐漸增加1bit,直至準確率停止增加或開始降低。因此,在第k次迭代中,指數位增加,而隨著尾數位的減少,整體數據寬度(DW)保持不變。在確定指數位寬度后,算法使用新的浮點數據格式計算性能指標(準確率和能耗)。在本文實驗中,發現尾數優化之前的新浮點格式為(Sign,Exp,DW-Exp-1),DW=16bit,Exp=8,尾數=16-8-1=7bit。通過逐漸將尾數增加1bit對每層的精確度格式進行優化,直至當前DW 滿足目標準確率。當所有層在滿足目標準確率的同時以最小能耗進行優化時,將為所有層存儲最佳格式的組合。然后,將所有層的DW 增加1bit,重復上述過程來搜索其他最佳格式,直至DW 達到最大數據寬度(MAX DW),本文實驗中DW 設置為32bit。完成上述搜索過程后,將比較所有搜索結果的準確率和功率,在保持目標準確率的情況下,確定功率最小的格式構建最佳組合。
使用Synopsys軟件設計編譯器對不同格式的比較進行了評估,編譯器可以將HDL設計合成為SoC數字電路。使用臺積電(TSMC)55nm 工藝技術和100 MHz的固定頻率進行評估。不同位寬的浮點加法器和減法器的比較,如表4所示。

表4 不同位寬的浮點加法器和減法器的比較
由表4可見,浮點加法器/減法器運算的位數越少,硬件尺寸或能耗就越小。每個位寬的浮點格式由N(S,E,M)表示,其中N為總位數,S為符號位,E為指數,M為尾數。使用不同位寬的浮點乘法器的比較,如表5所示。

表5 不同位寬的浮點乘法器的比較
由表5可見,浮點乘法器運算的位數越少,硬件尺寸和能耗就越小。與加法器/減法器不同,乘法器能耗大幅增加。使用不同位寬的浮點除法器的比較,如表6所示。

表6 不同位寬的浮點除法器的比較
由表6可見,與其他運算符相比,浮點除法器運算延遲時間是恒定的,但浮點除法運算的位數越少,硬件尺寸和能耗就越小。
本文所提出的CNN 訓練加速器使用Verilog在寄存器傳輸級設計中實現,并使用Vivado Verilog模擬器進行驗證。確認結果后在現場可編程門陣列(FPGA)上實現了加速器,并針對50 K 圖像訓練了所有測試用例模型。訓練后,通過將MNIST 手寫數字數據集中的10K 測試圖像用于訓練模型來計算推理準確率。
表7給出了優化算法找到的幾個突出的格式組合搜索結果。在格式組合中,混合卷積-24選為準確率和功率方面最優的格式組合。這種格式組合在卷積層(正向和反向傳播)中使用24bit格式,同時為池、FC1、FC2和Soft-Max層(正向和反向傳播)分配16bit格式。

表7 不同精度格式下優化算法準確率和動態功率的比較
為了驗證本文提出的浮點運算優化架構比現有FGPA加速器大幅減少硬件資源,利用MNIST 手寫數字數據集,將本文的最優架構(混合卷積-24)與文獻[25]使用的傳統CNN、文獻[26]采用滑動濾波器進行CNN 和乘與積(MAC)的并行運算、文獻[27]提出的基于Spike網絡加速器的CNN 等方法進行比較,如表8所示。

表8 優化架構比較
由表8可見,在本文的最優架構(混合卷積-24)加速器中,每幅圖像的能耗僅為8.5μJ,每幅圖像的能耗分別比傳統CNN 方法、CNN+MAC 方法和Spike+CNN 方法低1 140、81和555倍。
本文評估了不同的浮點格式并優化了CNN 訓練中的浮點運算符,在高達100 MHz的頻率下增加了吞吐量。使用MNIST手寫數字數據集進行評估,使用混合精度體系結構實現了93%以上的準確率,并且每幅圖像的能耗僅為8.5 μJ,比其他方法顯著地降低了能耗。由于加速器僅需55nm芯片即可實現低能耗和高精度,因此,本文設計的加速器適用于現實AI應用。在未來的研究中,嘗試在CNN 加速器中添加8bit配置,使其更進一步降低能耗。