PipeCNN論文解析:用OpenCL實現FPGA上的大型卷積網絡加速

本文爲PipeCNN的論文深度解析,思路清晰,內容詳實。原創內容,轉載註明出處。


參考文獻:

論文地址: https://arxiv.org/abs/1611.02450

代碼地址: https://github.com/doonny/PipeCNN

一、摘要

   1.1 motivation

    1.2貢獻點

   1.3 相關知識

        1.3.1 OpenCL

        1.3.2 GOPS

二、簡介

    2.1背景

    2.2前人工作

    2.3主要貢獻

三、基於OpenCL的CNN實現

    3.1 OpenCL架構

    3.2 本文提出的架構

    3.3 Convolution Kernel

    3.4 Data mover Kernel

        3.4.1 在Conv模式中

        3.4.2 在FC模式中

    3.5 Pooling kernel

    3.6 LRN kernel

四、實驗

五、個人總結

一、摘要:

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 每秒十億次運算數,十億次運算/秒)衡量處理器計算能力的指標單位。現在更爲常用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高層語義綜合
  • 本文提出的架構,儘量增加數據複用
  • 儘量增加資源複用


更詳細解析會持續補充更新,歡迎提問與批評。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章