PipeCNN論文解析:用OpenCL實現FPGA上的大型卷積網路加速
本文為PipeCNN的論文深度解析,轉載註明出處。
參考文獻:
論文地址: https://arxiv.org/abs/1611.02450
程式碼地址: https://github.com/doonny/PipeCNN
目錄
一、摘要:
1.1 motivation:
- FPGA比GPU更具有可定製性和能耗低的優點
- 過去基於OpenCL的研究沒有運用FPGA的並行處理的優點和最小化記憶體頻寬的考慮
1.2 貢獻點:
- 在OpenCL的基礎上加入了深度的並行化(deeply pipeline),資料複用(data reuse)和任務並行化(task mapping)
- 將AlexNet和VGG在Altera Stratix-V A7的FPGA上進行驗證,達到了33.9GOP的運算速率,並且比以往的工作減少了34%的DSP block
1.3 相關知識
1.3.1 OpenCL
OpenCL(全稱Open Computing Language,開放運算語言)是第一個面向異構系統通用目的並行程式設計的開放式、免費標準,也是一個統一的程式設計環境,便於軟體開發人員為高效能運算伺服器、桌面計算系統、手持裝置編寫高效輕便的程式碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell型別架構以及數字訊號處理器(DSP)等其他並行處理器。
1.3.2 GOPS
(giga operations per second 每秒十億次運算數(10的9次方),十億次運算/秒)衡量處理器計算能力的指標單位。現在更為常用FLOPS。
二、簡介
2.1 背景
- 卷積網路(CNNs)被大量運用,但是大型的卷積網路會有million數量級的神經元和billion數量級的連線權重。
- CPU不能有效運算CNN,GPU被廣泛運用但是energy inefficient.
- FPGA具有1.大量的處理單元,2.可定製的模組,3.低功耗,因此非常適合用於實現神經網路
- 傳統的基於RTL(register transfer level暫存器級別)的設計流程需要編寫大量的複雜的RTL程式碼,非常耗時並且需要模擬和彙編。
- HLS工具,High-Level synthesis高層綜合能將相應的高層語言比如c/c++轉成底層的RTL語言。
2.2 前人工作
2.2.1 C. Zhang, P. Li, G. Sun, Y. Guan, B. J. Xiao, and J. Cong, “Optimizing FPGA-based accelerator design for deep convolutional neural networks,”in Proc. ACM/SIGDA International Symposium on Field-Programmable Gate Arrays (FPGA ’15), 2015.
運用vivado HLS在Xilinx VC707上實現,將相應的運算流率(Computation throughput)和記憶體頻寬(memory bandwidth)優化到了最大。但是隻是優化了卷積操作。
2.2.2 N. Suda, V. Chandra, G. Dasika, A. Mohanty, Y. F. Ma, S. Vrudhula, J. S.Seo, and Y. Cao, “Throughput-Optimized OpenCL-based FPGA accelerator for large-scale convolutional neural networks,” in Proc. ACM/SIGDA
International Symposium on Field-Programmable Gate Arrays (FPGA’16), 2016.
運用OpenCL和定點CNN(fixed-point CNN)系統化的提出瞭如何運用有限的資源實現最小化的執行時間。
2.3 主要貢獻
2.3.1 基於OpenCL實現相應的FPGA加速。高效的架構和並行流水線(pipelined kernels)來實現大型的CNN網路
2.3.2 將AlexNet和VGG在Altera Stratix-V A7的FPGA上進行驗證
2.3.3 作者在github公開了本文的程式碼以便他人使用。(作者在湊貢獻點字數)
三、基於OpenCL的CNN實現
3.1 OpenCL架構
OpenCL是一個公開的跨平臺的並行運算語言,可以用於GPU和FPGA。設計流程見Fig.1
- 圖中,FPGA板作為OpenCL Device,desktop CPU作為OpenCL Host,通過高速的PCIe組建了一個異源運算系統。
- OpenCL程式碼用核心函式(kernel function)指定了並行運算單元(CUs:computing units),被編譯和綜合之後用在FPGA板子上。
- 在Host中,c/c++程式碼會在CPU上執行,提供實現的API給FPGA板並與相應的kernels通訊。(kernels為OpenCL的核函式,在xilinx上,HLS高層語義綜合把相應的函式綜合為IPcore,我們可以將kernels理解為IPcore)
3.2 本文提出的架構
3.2.1 典型的CNN由數個卷積層,池化層,全連線層組成。
- 典型的卷積層可以表示為:
公式(1)
其中表示輸入feature-map和輸出feature-map中(x,y)處的神經元。代表L層中與對應輸入feature-map卷積的權重
- 池化層中,一張feature-map中相鄰的神經元會進行2D下采樣。
- 全連線層中,每個輸出都是所有輸入的加權和。
公式(2)
- LRN(local response normalization)區域性響應歸一化層,有些CNN模型中有LRN。會對一個神經元根據其相鄰的神經元值進行相應的正則化(normalization).LRN後面通常跟一個池化層。
Fig.2中,四個模組運用Altera的OpenCL的channel/Pip連線起來。
圖中Conv kernel既可以實現公式(1)的3D求和相加也可以實現公式(2)的內積操作。
Pooling kernel直接將conv.的輸出資料流進行下采樣操作。
兩個資料搬運kernel,MemRD和MemWR,在global memory中運入和運出資料。
3.3 Convolution Kernel
這是一個具有並行資料傳輸的單程序kernel,可以用來實現卷積層和FC層。兩個運算技巧被用於提升運算吞吐量和並行化處理。
3.3.1 我們將公式(1)變為類似公式(2)的結構,然後只用函式實現一個兩層巢狀的迴圈結構。偽碼見上面fig.3,When the appropriate buffer depth N is set, an efficient pipeline with an initial interval of two can be synthesized by Altera’s OpenCL compiler.
注:上文中Initial interval經常出現,也被稱為II,II到底是什麼意思?我們在HLS中見到過類似,例如:
//Load input image data
for (i = 0; i < 27 * 600; i++) {
#pragma HLS PIPELINE II=1
buf_in[i] = streamPop < float, FloatAxis, FloatStream > (streamIn);
}
是否一個for迴圈II為1,兩個for迴圈II為2,後面需要查閱文件後補充II的含義。
3.3.2 data vectorization和並行化CU(compute units)
- 向量化的輸入和權重會被綜合為資料流。
- VEC_SIZE這一引數會被引入來控制相應的輸入吞吐量。
- 最外層的for迴圈會根據CU_NUM這一參量展開,以建立卷積流水線。
於是,輸出在不同feature-map的fo中的Do會被並行的生成。
在3D卷積模式時,CN被設為K*K*C' ,在FC模式時,CN被設為C', C'=C/VEC_SIZE。當channel access不產生pipeline時,加速為VEC_SIZE*CU_NUM
3.4 Data mover Kernels
兩個multi-mode的3D NDRange的kernels被設計出來用於在global memory中為運算pipeline存取資料。(multi-mode與3D NDRange為OpenCL中的概念)
3.4.1 在Conv模式中
3.4.2 在FC模式中
輸入的feature和weight都是1D的,見公式(2),直接運用MemRD會減少資料重用。所以我們在MemRD中引入batch processing。例如,一個64分類的batch可以被當作一個kernel,作為一個3D的feature-map(C,8,8)
3.5 Pooling kernel
fig5為一個line buffer-based hardware architecture。kernel首先從同一張feature中逐行的read data,然後存在一組L行的buffer中。所有buffer被讀滿時,一個視窗的feature map資料就被讀出送入下一個階段的pooling logic中。CNN中,最大值池化和均值池化被廣泛應用,所以pooling logic模型可以支援對(L+1)個輸入的均值和最大值計算。kernel可以被控制暫存器關閉。
3.6 LRN kernel
四、實驗
- 本文在Altera Stratix-V FPGA的DE5-net板子上進行實驗。Stratix-V A7 FPGA具有622K的邏輯單元(LEs),256DSP blocks和2560 M20K RAMs,並且有兩個2GB DDR3 DRAMS 被連在FPGA上當作global memory。
- OpenCL kernel codes被通過Altera OpenCL SDK v15.1編譯。
- 兩個大型的網路,AlexNet(8層)和VGG(16層)被用於設計。
五、個人總結
FPGA實現大型神經網路加速的方法:
- OpenCL框架
- HLS高層語義綜合
- 本文提出的架構,儘量增加資料複用
- 儘量增加資源複用
更詳細解析會持續補充更新,歡迎提問與批評。