深度學習軟硬體加速器探索

工研院資通所   羅賢君、張國強、林洪榮、張宇君、楊凱鈞、孫際恬、許鈞瓏

 

深度學習之運算需求,帶動加速器軟硬體設計新商機

近年深度學習的發展突破了傳統電腦視覺的瓶頸,激盪出新一波人工智慧的浪潮,在整體深度學習的技術中,資料的存取與繁重的運算需求,帶來加速器軟硬體技術相關議題的熱烈探討與晶片市場新商機,引領多家新創公司紛紛問世;一般而言,深度學習可分為模型訓練與模型推論兩個階段,本文將著重於模型推論階段軟硬體加速設計最佳化之分析討論,同時探討產業指標性大廠NVIDIA的開發現況及整體深層神經網路 (Deep Neural Network, DNN)之效能評估,以提供讀者對深度學習軟硬體加速器技術開發一個整體的概觀論述。

 

1. 深度學習基本觀念

深度學習與傳統人工智慧的經驗法則不同,是利用統計回歸等演算法,根據大量的具有標示意義的資料,進行訓練後,得到的數學模型結論。由於需要找出這些資料中隱藏的資訊規則,神經網路的做法首先要設定這一大筆資料需要的特徵。但在實際應用中,我們剛開始其實不知道究竟應該用多少特徵能夠描述、分析或分類這一大筆資料,因此數學運算上,首先會假設需要非常多特徵、構成了非常高維度的向量陣列。通常這些特徵與特徵之間具有非常複雜的相互關係(correlation),所以為了找出這些關係,勢必需要多個層次的交互關係運算,經過統計回歸,找出適當交互關係數值,我們通常稱這些數值為特徵權重(weight)。也因為這種很多層次的運算,現在通稱為深度學習。這種資料探勘、學習出資料特徵、特徵之間關係的方式,也就是目前人工智慧的深度學習的基礎精神。

深層神經網路(DNN, 如圖1)[1], [2],除了輸入和輸出的向量以外,中間有大量的交互運算,稱為隱藏層(hidden layers)。目前重要的交互運算方法主要是兩類:(1)直接運算各特徵相關性-全連接(fully connected, FC)層、(2)使用濾鏡(filter)找出特徵關係-卷積(convolution, CONV)層。除了主要運算的方法以外,深層學習模擬神經系統,加入特徵激發(activation)的運算,其概念是把不重要的資訊過濾,只有將重要的資訊向中樞神經傳遞,這種過濾運算通常採用幾種臨界函數,例如sigmoid、tanh、rectified linear unit(ReLU)等。另外配合特徵數量的控制,深層運算中必須有提升維度、降低維度的運算控制,例如卷積層的filter數量可以提升或降低特徵維度;合併或分割特徵陣列也是一種方法;而使用池化(pool),取一段區域最大值或平均值的濾鏡,則是常用降維度的方法。深層運算的方法仍在不斷研究更新中,一個深層運算的模型,會組合交互運算、特徵激發、維度變化等各種方法,例如Google提出的inception架構,網路架構像是從主幹分成多個枝幹(branch),每個 branch使用不同尺寸的filter去分析主幹上的特徵陣列,最後再整合大家的結果。另一個重要的例子是Microsoft提出的residual架構,網路架構是將目前的主幹特徵,加入未來運算完的主幹特徵,形成更大的一個特徵陣列。發揮這兩個範例的精神,可減少丟失資訊、綜合不同filter觀點、加速訓練時的回溯運算(back propagation)等,已成為主流深度學習模型研發趨勢。

2. 軟硬體加速設計最佳化

深度學習的推論(inference)運算,係指在終端產品上面,進行運算已經訓練好的DNN模型,意即除了輸入是來自實際場域的資料,但中間的運算過程已經是確定的模型,我們可以藉由這個運算模型的輸出,得到實際場資料的特性,通常描述一個已經訓練好的DNN模型,需要兩份檔案,第一是模型的網路架構,第二是濾波器權重的模型參數,DNN網路的參數量通常很龐大,常用的卷積運算則需要很大量的陣列乘法,參數量與運算量造成終端產品的效能瓶頸,也提高了即時運算的困難度,為了解決這個問題,近年來新的DNN發展趨勢已經逐漸走向輕量化參數,並使用各種方法簡化對特徵的運算數量,達到近似甚至更高的準確率,即使如此,終端產品(如手機、監視器、機器人)在耗電量、功率消耗、運算仍有很嚴格的限制,怎麼在有限的資源下運算DNN 網路,仍是非常具挑戰的議題 [3]。

2.1 軟體分塊式(Tiling-based)多維卷積運算

DNN的卷積運算在整個推論運算過程中約占了90%,因此,如何運用有效的軟體技術,加速推論運算過程資料之存取且維持一定的推論精確度,成為炙手可熱的探討議題;在理想的推論運算情況下,連續供給輸入數據可以實現無中斷計算以達到最大量輸出,然而,實體上大區塊資料儲存單元操作時,長需要有啟動、資料搬移、匯流排通訊……等額外步驟,無法像邏輯電路區塊那樣反應迅速,結果系統吞吐量通常被數據傳輸拖累,造成實際計算輸出量遠低與理想狀況 [4],因此,各種資料快速存取的方法便應運而生,在此,我們將提出一高效能二維卷積巢狀迴圈編碼之建議(如圖2所示)。圖2中,應首先執行for迴圈交換,並將參數M和N移動到最外層迴圈以實現最佳列為主 (row-major)記憶體存取順序,其次,由於較差的鄰近資料分布(locality)和深層巢狀 for迴圈結構,矩陣分塊計算所能提供的優點會受到影響:前者導致快取未命中(cache miss),而後者導致分支未命中(branch miss),因此,我們建議通過攤開在最內層的for迴圈來實現分塊計算功能,如此即可以減少分支未命中的數量,藉此原本的以深巢 for迴圈實現的二維卷積即可重整如圖2:輸入多維矩陣input_fm[N][H][W],輸入多維濾波參數input_weight[M][N][K][K],以及輸出多維矩陣output_fm[M][R][C],此外,編譯器須配合-funroll-all-loops以及-o3優化選項達到最佳編譯指令,以減少快取與分支未命中。

一般而言,分塊計算是為了減少資料存取並增加重複使用率,從而減少CPU中高速快取的未命中,減少運行時間,然而,這樣的編碼風格可能需要更深的for巢狀迴圈,而形成更多的分支(branch),以致引入額外的分支未被命中,然而,利用通過在編譯器中使用的-funroll-all-loop和-o3 指令優化程式碼編譯,以及攤開最內層迴圈或針對最內層運算優化,則高速快取未命中和分支未命中都能有效的減少,為了更直覺比較各參數組合所造成的影響,我們提供了資源使用和設計條件的雷達圖,如圖3所示。在圖3(a)中,除了第2層的MAC計數和第1層中的C2C之外,5個卷積層所提出的參數組合的三角形是相似的。因此,不同層之間的資源分配較為接近,CPU計算使用率高;與文獻 [5] 中使用的參數相比(圖3(b)),生成的三角形是傾斜的;在「緩衝區大小」軸中,它意味著FPGA的實現;因此,架構沒有充分利用CPU上的內存資源。 同時,過大C2C可能意味著數據傳輸的額外運行時間,因此,在實現CNN之前,所提出的雷達圖顯示了資源分配和性能預測的平衡。

2.2 硬體加速器

有鑑於DNN的運算經常具有相依性低,平行度高的特性,因此使用平行化多核心硬體來加速運算是非常直覺的解決方案,雖然理論上是如此,但是實際上受限於資料傳輸的頻寬,要直接將高度平行化的資料放入平行化多核心中計算仍不容易,一般而言,頻寬限制包含兩方面,一是如何從外部記憶體快速的讀寫?二是如何在內部快速的將資料送到計算核心?所幸,DNN運算資料通常還具有兩大特性,第一是資料使用重複性,其二是資料稀疏性。因此如何利用重複性資料、以及壓縮稀疏的資料,成為DNN硬體加速器重要的發展動機。

2.2.1 資料使用重複性

通常DNN的兩大主要運算(CONV、FC),所看到的資料重複性各不相同,CONV運算由於採取的是2D或3D的filter,只要filter的核心(kernel)涵蓋範圍大於1個像素(pixel),則輸入的特徵圖(input feature map, IFM)在涵蓋的範圍內資料會重複使用,因此,如果能在設計中加入緩衝器,讓資料能重複運用,就不需要重複去外界讀取,加快整體速度;另一方面,單層FC運算是缺乏類似CONV運算重複性的,但我們可以設計改變資料順序,讓filter重複使用,從原本輸入一張IFM產生一張輸出特徵圖(output feature map, OFM)的模式,變成輸入數張IFM產生數張OFM的模式,稱為批量(batch)運算,用以減少重複讀取權重資料的方法,但這樣做的負擔是要增加特徵圖的儲存量,並輸入到輸出的延遲(latency)提高,在應用上的影響,就是對突發事件反應速度較慢。

2.2.2 資料稀疏性

資料稀疏性主要是由於訓練時的網路設定,需要比問題本身維度更高才能有效提高準確度,因此,訓練後的網路通常會經過修剪(pruning)來減少交互關係,當權重中有很多非常小的值的時候,我們也常透過壓縮設定成為0(=無相關),減少其運算參數量。另一方面,在DNN運算過程中,由於OFM經常會經過特徵激發函數(如ReLU),這時輸出的資料也會有大量的0,同樣構成了高度稀疏的資料陣列,所以DNN硬體加速器的一種設計思維,就是去處理稀疏資料,減低運算和資料傳輸的負擔。

2.2.3 DNN加速器分類

一般來說,在邊緣運算(edge computing)產品中,因價錢和功耗考量,往往不希望使用額外的中央處理器(CPU)或圖型處理器(GPU)來加速DNN運算,因此,以矽智財與單晶片的DNN加速器成為最受歡迎的選項。為了容易理解,我們將這樣的加速器分成三大類,如表1所示。

  1. 第一大類是是用數位訊號處理器(digital signal processor, DSP),並針對神經網路運作編譯優化,利用DSP高平行度向量處理核心,適當的分配處理浮點或定點的運算,然其缺點是能源使用效率較差,但由於商業模式等同於過去DSP的智財授權,因此仍是最快上市的產品解決方案。
  2. 第二大類是針對一部分DNN運算做特化設計的加速器,例如:只處理卷積運算的加速器就會巧妙安排資料重複利用的特性,設計特殊的處理序列,降低卷積運算資料傳輸功率消耗,這類型加速器的優點是擴充較為靈活,但缺點是需要與系統共享記憶體頻寬,並且也會占用主系統的CPU資源。
  3.  第三大類是複合型的神經網路加速器,這種加速器的特色是支援多種DNN運算,包含CONV、FC、特徵激發、正規化等神經網路功能,讓整個神經網路可以在同一個加速器中運算完畢,大量減低運算中間需要CPU介入的時間。但是缺點是編譯器必須支援完整的 DNN網路,否則DNN網路需要修改成為其支援的運算,而這樣修改可能會降低DNN輸出的精確度。

3. NVDLA 加速的軟硬體系統

正當各界為了方興未艾的DNN加速器市場努力之際,NVIDIA在2017年9月底開放了其產品Xavier中的深度學習加速器(NVIDIA deep learning accelerator, NVDLA),著實在研發和產業界投出了一枚震撼彈,尤其是對於正在創業的DNN加速器公司而言,要如何在傳統智財授權模式和開源模式之間權衡,要如何創造與NVDLA的產品差異化等,都得審慎評估考慮 [6];Xavier(如圖4所示)是一款非常巨大的自動駕駛用系統晶片(system on a chip, SoC),裡面包含了八核心 Carmel ARM CPU、Volta GPU、視訊處理器,以及DNN加速器DLA,根據NVIDIA提供資訊,Xavier中含有兩個DLA,每個DLA應有2048個MAC核心,合併效能可達到每秒5萬億的16位元浮點運算元(5 TFLOPS),使用8位元定點運算時,效能可達每秒10萬億的運算元(10 TOPS),NVIDIA 選擇開放這個加速器原始碼的目的眾說紛紜,合理的推測是為了讓邊緣運算產業化的速度加快,並且提升其在開源社群中的形象,預期有利於其主要事業,也就是在伺服器等級的晶片和業務,NVDLA的開放原始碼的授權方式允許使用者修改、再製成自己的產品,不強制公開修改的部分,因此在商業上是允許修改其設計然後販賣自家的晶片。當然,若選擇了修改NVDLA的底層架構,其驅動程式和加速器編譯器就一定需要修改,也需要提出自有的設計套件和解決方案。

整體NVDLA的加速系統實施方式如圖5所示,橘色的部分就是NVDLA所需的介面與資源,由於NVDLA的操作方式是透過暫存器定義,因此建議搭配一個微控制器(microcontroller unit, MCU),來協助設定NVDLA的各項暫存器,同時處理NVDLA和系統主處理器 (host CPU) 之間的事件控制,這個MCU僅處理流程控制而無計算效能需求,目前已知有搭配ARM與開源的第五代精簡指令架構(RISC-V)兩種不同的版本存在;完整的NVDLA加速系統可以選擇兩種記憶體的配置方式,一個是擁有自己的獨立記憶體,可以是靜態記憶體(SRAM)或是動態記憶體(DRAM),另一是與系統共用DRAM,由於NVDLA 加速器完整計算神經網路,因此,若擁有自己的記憶體時,需要主系統存取資料的時機只會在開始的圖形輸入和最後的結果輸出,中途的特徵圖存取都不需要去和主系統搶記憶體和匯流排資源,但由於特徵圖所需要的記憶體仍不小,是否願意為了效能,而增加一大塊記憶體給加速器專用,這需要再效能與價格之間作權衡考量。

 

3.1 探勘NVDLA的編譯、驅動、與系統架構

NVDLA加速系統的運作流程如圖6所示,其中,編譯時期使用的編譯器可分為二個功能。一個是語法分析器(parser),另外一個為編譯器(compiler)本身,目前編譯器支援的網路模型為使用Caffe訓練出來的模型,當輸入模型描述檔案,也就是prototxt檔案以及對應的網路參數權重檔案Caffe model,進行到編譯程序時,先啟動語法分析器,進行網路模型描述語法的解析,拆出網路分層結構,同時檢查網路中使用到的運算函式是否在目前支援的列表中。如果發現存在不支援的運算函式,會發出錯誤提示。如果通過語法分析器的檢查,編譯器就開始進行網路模型參數的精度轉換、計算單元配置等工作,精度轉換目前是從 FP32轉成 FP16、INT16、INT8等,但截至目前(2018五月)公開的版本,NVDLA編譯器僅支援FP32FP16的精確度轉換,由於NVDLA硬體允許存在不同的運算資源,所以編譯器的版本需要對應到指定的硬體資源設定,然後針對資源去分配各層運算輛,進行最佳化配置。
另一方面,執行時期的組成亦可以分為二大部分:上層是使用者驅動(User Mode Driver, UMD),下一層是核心驅動(Kernel Mode Driver, KMD),這樣的設計可以保持最大的彈性、高移植性以及擴充性,由於NVDLA硬體可能跟很多不同種類的CPU搭配成為可以加速執行神經網路的SoC,當SoC上執行的軟體架構不同,需要處理的軟體移植工作也不一樣,為了降低軟體移植的工作負擔,同時維持應用程式開發者看到同樣的軟體介面,NVIDIA提出UMD及KMD兩種模式,進行執行時期軟體設計用以降低上述移植工作負擔,UMD主要的工作為提供一個通用的應用程式開發介面(Application Programming Interface, API),應用程式開發者只需要了解該層介面的使用方式而無須了解UMD內部核心的管理方式,同樣的UMD跟KMD之間的溝通也就是KMD的介面,只需要了解SoC上的硬體管理方式,驅動程式模型,即可把KMD提供給UMD的溝通介面完成移植,同時無須處理KMD內部核心的管理以及流程。

 

3.2 NVDLA硬體架構與功能

NVDLA的硬體架構與資料流如圖7所示,主要可區分為輸入輸出介面(interface)、系統控制區塊、CONV運算核、非CONV運算核及介面轉接等。

 

  • 輸入輸出介面

1. 配置(configuration)介面:使用者透過這個介面定義NVDLA的暫存器,定義運算功能。
2. DRAM介面:與主系統的記憶體介面,目前開源碼中預設接上AXI匯流排。
3. SRAM介面:與自有獨立記憶體介面,預設是一個SRAM介面,但也可以改成DRAM介面。

  • 主要功能運算架構

主要運算功能架構集合成三個重要區塊:系統控制區塊、卷積運算核,及非CONV 的其
他運算核心,NVDLA支援的DNN運算功能與其各負責的硬體如下述:
1. 向量內積運算:CONV、FC [硬體為CDMA+CBUF+CSC+CMAC+CACC]
2. 點對點的運算:point-wise add/multiply、bias/scale、batch normalization [硬體為SDP]
3. 平面通道運算:local response normalization [硬體為CDP]
4. 維度變換運算:average or max pooling [硬體為PDP]
5. 資料形變運算:padding、data shape transfer [硬體為RUBIK]

  • 資料流

1. 如圖7之棕色箭頭路徑,是五個區塊各自作為單層的DNN運算,單層DNN運算係指每次只做卷積、點對點、平面通道等多種擇一的運算,但其中卷積運算資料流是『CDMA→CBUF→CMAC→CACC』,這個部分是不能分割的。
2. 另一種資料流,如圖7藍色箭頭路徑,可以進行多區塊融合多層的DNN運算,融合多層的DNN運算,係指把符合硬體資料流順序的DNN層,融合成為一個超級層(super layer),NVDLA支援的資料流順序為:CONV運算核‧→SDP→PDP,舉例而言,如果我們遇到的DNN層次剛好依序是「CONV→batch normalization→max pooling」這樣的三層運算順序,在NVDLA編譯器中可以整合為一個超級層,帶來的優點是大量減少特徵圖存取記憶體的傳輸量。

  • 系統控制

在系統控制方面,NVDLA 控制器需要的指令很少,由於NVDLA運行是靠定義暫存器
來執行,所以只需要下列三條指令,便可以完成全部的加速器控制:
1. Write register:寫入NVDLA內部的暫存器。
2. Read register :讀取NVDLA內部的暫存器,並選擇性與預期的值做比對。
3. Interrupt :運算中斷或結束時與系統溝通用。
然而,為了在硬體寄存器傳輸級別 (register-transfer level, RTL)模擬和驗證,目前NVDLA 加速器內也有提供以下指令,以方便流程控制以及除錯:
1. Load memory:將輸入特徵圖、模型權重參數直接導入內部記憶體。
2. Dump memory :將記憶體的內容輸出成檔案。
3. Wait/notify:用於程序控制上的除錯,等待中斷訊號或由特定訊號觸發發出通知。
4. Poll: 持續的去詢問暫存器的值,檢查是否滿足特定條件。
在RTL驗證時,我們可以透過load memory直接把資料放入記憶體中用來驗證除錯,但在實際系統操作時,輸入和權重是透過UMD去設定其系統位置,KMD會一層一層地把這個存取位置往硬體端發送。
由於每一層的運算模式是靠暫存器定義,所以NVDLA在硬體中設置兩個暫存器定義的空間,分別來儲存現在這一層和下一層的設定值,也就是雙重緩存(ping-pong buffer)的方式,如果目前的設定值儲存在第一個位置中,下一次的設定值就會儲存在第二個位置,用來消弭不同層運算之間,需要變更設定的延遲時間。當然,在第一層起始時,設置時間仍然必須等待,所以NVDLA在設置程序最後,會安插各區塊的啟動 (enable)訊號,代表該功能區塊定義設置完成,考慮實際上運作的時序差,並考慮資料到達時間延遲不同,因此,現在每個區塊之間會設置先進先出(First-In First-OUT, FIFO)的緩衝器,協調達成全域非同步、但區塊內同步的運作方法。

4. DNN效能評估

基於NVDLA所提供的各項開放原始碼及開放硬體效能參考規格 [7], [8],我們利用一256乘加器及128KB記憶體(NVDLA相同之硬體資源),來試驗DNN模型、乘加器核心運算速度、與DRAM頻寬三者之間的關係( 如圖8所示)。圖8中的數字是運算完一張圖片的延遲時間,我們可以發現,在運算Alexnet時,需要更高的DRAM頻寬,才能獲得較低的延遲時間 [9],原因是Alexnet容易被FC層的資料存取而限制效能,特別是這裡我們並未設定FC運算可使用批量(batch)模式,但在同樣的條件下,Googlenet 卻有著截然不同的趨勢,Googlenet偏好較快的核心速度來使效能提高,而增加DRAM 頻寬反而沒有顯著的效能提升 [10],原因是Googlenet所需的特徵圖較小,filter資料量也少,但卷積運算非常大量,所以高速核心有利加速Googlenet,而ResNet50則同時需要高頻寬以及高速核心 [11], 需要高DRAM頻寬是因為ResNet需要重複加入之前算過的特徵圖;需要高速核心是因為其卷積運算與Googlenet 類似,相當大量。從圖8範例中,我們可以發現,不同的DNN網路,對於硬體需求的方向可能是不一樣的,這個範例明白的告訴設計者應該根據DNN網路特性,來配置最有效的硬體資源,另一方面,即使是固定的硬體資源,設計者也可以規劃動態的電源管理方針,在運算不同DNN時,適應地給予不同的核心速度與記憶體頻寬,來最佳化DNN網路效能和節省功率消耗 [12]。

 

本文針對DNN深度層學習的軟硬體技術發展,做了一個深入淺出的探討,同時說明NVDLA系統開放原始碼、軟體編譯驅動及相關的硬體架構,另一方面,文中亦以NVDLA架構為基礎,舉一簡單實例來驗證各種DNN深度學習網路之效能,由於NVDLA在效能上表現平穩,不輸近年知名加速器的發表成果,因此,自從於宣布開源以來,已經在DNN加速器領域產生影響,尤其是近期眾多以DNN加速器研發為主業的新創公司,勢必會遇到客戶在傳統IP服務與開源方案之間做競爭比較;另一方面,在系統晶片使用開放原始碼仍是非常新的模式,在開放社群維護、品牌經營、未來獲利的商業模式等,都具有相當大的可變性,也值得我們持續關注。

參考文獻

[1.] D. Shin, J. Lee, J. Lee and H. J. Yoo, “14.2 DNPU: An 8.1TOPS/W reconfigurable CNN-RNN processor for general-purpose deep neural networks,” 2017 IEEE International Solid-State Circuits Conference (ISSCC), San Francisco, CA, 2017, pp. 240-241.

[2.] J. Lee, C. Kim, S. Kang, D. Shin, S. Kim and H. J. Yoo, “UNPU: A 50.6TOPS/W unified deep neural network accelerator with 1b-to-16b fully-variable weight bit-precision,” 2018 IEEE International Solid – State Circuits Conference – (ISSCC), San Francisco, CA, 2018, pp. 218-220.

[3.] Y. H. Chen, T. Krishna, J. S. Emer and V. Sze, “Eyeriss: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks,” in IEEE Journal of Solid-State Circuits, vol. 52, no. 1, pp. 127-138, Jan. 2017.

[4.] C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao, J. Cong, “Optimizing FPGA-based accelerator design for deep convolutional neural networks,” in Proc. ACM/SIGDA International Symp. on FPGA, 2015, pp. 161-170.

[5.] A. Krizhevsky, I. Sutskever, and G. Hinton, “ImageNet classification with deep convolutional neural networks,” in Proc. NIPS, 2012.

[6.] NVIDIA drive Xavier SoC detailed, Wccftech, https://wccftech.com/nvidia-drive-xavier-soc-detailed/

[7.] NVDLAdive deep manual, http://nvdla.org/contents.html

[8.] NVDLAopen source location, https://github.com/nvdla/

[9.] Alexnet, http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks

[10.] GoogleNet, https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/googlenet.html

[11.] ResNet, https://arxiv.org/abs/1512.03385

[12.] Cifar10, https://www.cs.toronto.edu/~kriz/cifar.html

文章轉載自工業技術研究院電腦與通訊月刊