全聯接神經網路是一種計算量比較大的機器學習模型,在訓練和推斷過程中需要對所有神經元進行矩陣計算。為了加快計算速度,各公司的大佬們採取了不同手段進行資料的抽象和綜合。

通常來說,我們採用卷積操作,將資料進行抽象和綜合,然後送入到全連線神經網路進行最後的計算,實質上就是矩陣運算等數學計算的一系列綜合操作。

熟悉矩陣運算的朋友都知道,矩陣當中的每個元素和其他元素是沒有關聯的,這種特性天然就適合使用平行計算的方式來加快其計算速度。

重點來了!平行計算正是 FPGA 等晶片的強項,利用FPGA將有效實現深度學習神經網路的加速計算(推理),下面是具體的操作展示。

1。 深度學習神經網路的環境搭建

2。 安裝 OpenCL的開發環境,使Intel® Arria® 10 FPGA作為OpenCL的裝置,注意安Intel對應的SDK

3。 利用 Tensorflow 作為框架,實現一個簡單的全連線神經網路

(提供一個演算法描述示例,使用 Mnist 資料集作為訓練和測試)

1)Mnist 資料集每張圖片為 28×28 畫素,將每張圖片的畫素點作為輸入

2)第一個隱藏層設定 500 個神經元,與輸入影象的 784 個畫素點做計算(矩陣乘法)

3)將得到的結果使用 relu 函式進行結果,只保留數值 >0 的結果,其他的設定為 0

4)第二個隱藏層設定 10 個神經元,與第一個隱藏層的輸出進行計算(矩陣乘法),最終得到 10 個結果作為輸出

從上述的演算法描述當中,我們可以看到實際上就是幾次矩陣的計算過程:一個 [1,784] 和 [784, 500] 的矩陣乘法,得到一個 [1,500] 的中間矩陣;然後這個 [1,500] 的中間矩陣與 [500, 10] 的矩陣進行計算,最終得到一個 [1,10] 的矩陣,這個就是我們的最終結果。

4。 對搭建完成的神經網路進行訓練,訓練之後得到模型檔案

5。 透過一定的操作方式,提取這些模型檔案中的模型引數

6。 把模型引數當作輸入的引數,送入到FPGA當中進行加速計算,實現推理過程

上述神經網路演算法的OpenCL實現,大致如下:

超詳細案例解讀,利用FPGA加速深度神經網路運算

7。 最後使用C/C++編寫CPU程式,與 FPGA 進行互動,來驗證 OpenCL 演算法實現的正確性。

以下是 CPU 程式的部分程式碼。

超詳細案例解讀,利用FPGA加速深度神經網路運算

透過以上步驟,我們就成功的使用OpenCL在Intel FPGA上實現了一個簡單的神經網路的推理加速。