神經網路加速理論

2022-06-04 18:21:10 字數 3508 閱讀 3254

1、gpu計算神經網路加速原理

2、脈動陣列計算神經網路原理

3、谷歌tpu架構

4、脈動陣列

參考文獻

gpu實現神經網路加速優化的關鍵方式是並行化向量化,一種最常見的gpu加速神經網路的模式為通用矩陣相乘(general matrix multiply),即將各類神經網路核心計算展開為矩陣計算的形式

下面以卷積神經網路中的加速計算對gpu加速原理進行分析。

卷積:卷積操作如下圖所示神經網路中的卷積通過卷積核在特徵圖上以特定步長平移滑動,通過計算卷積核和特徵圖上與卷積核相同大小的資料塊進行相乘求和,得出輸出特徵影象上的乙個單元點的輸出。

gpu上無法直接支援卷積計算,所以在gpu上進行卷積計算時,需要首先將卷積核和特徵圖按照特定的規律進行預處理展開,稱為img2col方法。

img2col操作如下圖所示,

以3✖3✖2的特徵圖和2✖2✖2✖2的卷積核為例,計算操作如下:

將每個週期通道1和通道2參與卷積計算的資料按行按列展開,通道1在上通道2在下排成一列。由於需要進行4次計算,因此展開為8✖4的矩陣。

同理將卷積核wg分別按行按列展開,通道1在前通道2在後展開為1行。由於有兩個卷積核,所以將兩行展開的卷積核按行拼接為2✖8的矩陣。

將特徵圖矩陣和卷積核矩陣進行矩陣乘法,得到2✖4的輸出矩陣,其中每一行代表一張輸出特徵圖。

gpu加速侷限:

當神經網路的通道數過多造成矩陣過大,以至於gpu無法在將所有通道展開。則需要根據gpu的算力選擇部分通道先進行矩陣計算,並輸出中間計算結果;再將所有中間計算結果累加得到最終的輸出。

gpu單指令多執行緒處理:

從上圖可以觀察到,對於展開後的矩陣相乘,左矩陣的每個行向量與右矩陣的每一列向量的操作相同(乘和累加),但是作用於不同的資料上。gpu採用單指令多執行緒進行處理,每個執行緒同步的在不同的資料上執行相同的指令流,可以並行化計算。針對上述例子,gpu可以同時使用8個執行緒進行平行計算。每個執行緒可在每個週期內並行執行一次乘加計算,多個執行緒獨立並行執行。多執行緒執行流程如下圖所示,理性情況下8個週期即可輸出所有點。

是乙個二維的滑動陣列,其中每乙個節點都是乙個脈動計算單元,每個單元在乙個週期內完成一次乘加操作。計算單元之間通過橫向或縱向的資料通路實現資料的傳遞。

優點:

結構簡單,規整,模組化強,可擴充,非常適合vlsi實現;

pe單元見資料通訊距離短,規則,便於資料流和控制流的設計,同步控制等;

計算並行度高,脈動陣列中所有單元可以同時計算,可通過流水獲得很高的運算效率和吞吐率。

缺點:

以3✖3✖2的特徵圖和2✖2✖2✖2的卷積核在8✖2的脈動陣列計算為例,卷積核權重固定在pe單元中,特徵值橫向脈動傳遞,中間計算結果縱向脈動傳遞,計算操作如下:

週期0:兩個卷積核w和g的權重靜態儲存在脈動陣列的計算單元中,同一卷積核的權重排列在同一列;將輸入特徵圖f按列展開,每行相隔乙個週期;

週期1:輸入特徵圖f00進入w00單元,並與w00計算得到y00的中間計算值;

週期2:

橫向:f00向右脈動傳遞至g00單元,計算第二張輸出特徵圖的y10的第乙個中間計算值;

縱向:第二行特徵圖的f10進入計算單元w01並與其進行計算,計算結果與w00傳遞的f00中間計算結果累加獲得f00的第二個中間計算結果。

同時f01進入w00計算y01的第乙個中間計算結果

以此類推,輸入的特徵值沿著脈動陣列的行方向不斷開啟不同卷積核的中間計算結果,而對應著輸出特徵圖的輸出點沿著列方向不斷進行乘累加。

週期8:在第一列脈動陣列的最後乙個計算單元,進行y00的最後乙個中間計算結果的乘累加,得到第乙個輸出特徵圖的第乙個點。

週期9:第一列計算單元輸出第一張輸出特徵圖的第二個點,第二列計算單元輸出第二張輸出特徵圖的第乙個點。

以此類推,每個週期都輸出對應輸出特徵圖的點,直至輸出所有所有特徵圖,完成脈動陣列計算卷積神經網路。

脈動陣列的計算方式決定了資料必須按照事先安排好的順序依次進入,所以每次要填滿整個陣列(使計算並行度最大)需要一定的啟動時間,這段時間會造成硬體資源的浪費。

啟動時間=行數+列數-1(不是max-1嗎?),當度過啟動時間後整個脈動陣列的並行度和吞吐量才達到最大。

上述例子使用的脈動方式是:固定卷積核權重,橫向脈動輸入特徵值,縱向脈動部分和。實際上可以任意選擇脈動這三個變數中的兩個,固定其中乙個進行卷積,如:固定部分和,脈動特徵值和權重的方式實現卷積計算。

脈動陣列的大小由行數和列數組成。這二者可以相等,也可以不相等。

上述例項中脈動陣列的行數與卷積核的大小相同,列數與輸出通道數相同。實際中如果卷積核非常大,或者通道數非常多,採用上述方式構建脈動陣列會過於龐大且不利於硬體實現。

為解決上述問題,一般採用分割計算末端累加等方式解決這一問題,即將多通道的權重資料分割成幾個部分,每個部分都能夠適合脈動陣列的大小,然後依次對各部分進行計算,最終在陣列底部的累加器中計算出最終結果。

架構組成:脈動陣列、向量計算單元、主結構模組、佇列模組和統一快取區。

計算流程

《公升騰ai處理器架構與程式設計》

神經網路加速指南

分析各步驟耗時 1 cpu上的操作耗時 嘗試將操作放在gpu上進行,如np.argmax的操作 2 cpu 耗時 嘗試減少傳輸tensor的大小 3 資料預處理耗時 1 resample操作嘗試放到gpu上處理?2 先crop後resample?4 呼叫不同的包耗時不同 如scipy skimage...

理論 神經網路引入

以下內容筆記出自 跟著迪哥學python資料分析與機器學習實戰 外加個人整理新增,僅供個人複習使用。我們要進行乙個分類任務,如何 乙個輸入 樣本 的所屬類別呢?在神經網路進行分類任務時,最終輸出乙個結果 如乙個分值 以評估它屬於各個類別的可能性。例如 以上面例子為例,如果是進行識別,需要將轉換為影象...

神經網路簡介 加速學習

在訓練神經網路過程中,網路訓練速度是比較引人關注的乙個問題。我們希望在訓練過程中網路代價函式會快速收斂,準確率會快速提公升,下面來說說一些常見的方法。1.代價函式更換 1.1.quadratic cost functionj w,b 12n i 1 n yi h w b xi 2 r w 上式中,r...