基於FPGA的卷積神經網路實現(三)資源分配(1)

2021-10-07 16:59:20 字數 2559 閱讀 9151

目錄:

簡介框架

資源分配(1)

資源分配(2)

資料量化(1)

資料量化(2)

資料讀寫

卷積模組

池化、全連線與輸出

前面曾經說過這個demo使用最簡單的方法,也就是對每一層都單獨分配資源,所以需要提前設計好每一層所分配的資源數量。這裡的資源主要是指dsp單元和片上儲存資源,cnn的卷積層是計算密集型層,全連線層是儲存密集型層,整個cnn所需要的計算資源(也就是我們使用dsp單元來實現)和儲存資源遠遠大於對其他資源的需求。仍然是從最簡單的方式開始,整個demo的網路結構很小而簡單(網路結構在這裡),再買上一塊兒略屌的板子,比如說zynq7000-zc706(這板子確實很貴,但是一開始我們可以只是**,對於上板可以等基本掌握了這種設計思路之後,再進行優化,然後對於不同的板子進行不同的設),19.1m block ram,900dsp單元(詳細資訊)。現在網路框架有了板子也有了,那麼我們根據這些資源資料來設計。

整個網路結構的參數量如下表所示:

層參數量(個)

卷積層1

5 * 5 * 1 * 4

卷積層2

5 * 5 * 4 * 8

卷積層3

5 * 5 * 8 * 16

全連線層1

4032 * 100

全連線層2

100 * 4

全總計407700

假設我們使用全精度(32位浮點)來儲存,那麼總計需要片上儲存空間13m(如果對引數進行低位寬量化,將會減小對儲存的需求)。

下面考慮可能出現的執行快取,這裡的快取是指,在每一層計算的時候,該層的結果在輸入到下一層使用之前需要暫時儲存起來。我們先不考慮優化問題,假設每一層的所有輸出都需要快取起來,並且一直不釋放一直到整個前向傳播過程結束,來計算最大需要的快取空間。(事實上,每一部分快取資料在使用完後可以得到釋放,只需要單層最大快取空間即可;另外,使用一定的優化方法可以進一步降低快取占用空間)。每一層輸入所需要的快取空間如下表所示:

層輸入快取空間

卷積層1

256 * 100 * 1

卷積層2

126 * 48 * 4

卷積層3

61 * 22 * 8

全連線層1

4032

全連線層2

100全總計

64660

仍然假設使用全精度(32位浮點數)來儲存,那麼總計需要片上儲存空間 2m。是不是就結束了?其實並沒有,前面我們只是認為卷積層和全連線層這樣的計算層需要快取,實際上,池化層也需要單獨拎出來,也就是說池化層的輸入也需要快取,每乙個卷積層後面會接乙個池化層,那麼我們再重新來計算一下儲存需求上限:

層輸入快取空間

卷積層1

256 * 100 * 1

池化層1

252 * 96 * 4

卷積層2

126 * 48 * 4

池化層2

122 * 44 * 8

卷積層3

61 * 22 * 8

池化層3

56 * 18 * 16

全連線層1

4032

全連線層2

100全總計

64660

一些(或乙個)dsp單元重複利用,每個時鐘進行一定數量的(或乙個)乘法運算,序列完成所有計算

多個dsp單元在乙個時鐘內完成所有乘法計算

對於不同的卷積核之間又有兩種情況:

一層所有的卷積核並行進行

部分卷積核(也可能是乙個卷積核)並行進行

對於本demo來說,如果我們在卷積核內選擇第二種方式,卷積核間也選擇第一種方式,那麼每一層需要的dsp單元數量如下表所示:

層dsp單元數量(個)

卷積層1

5 * 5 * 1 * 4

卷積層2

5 * 5 * 4 * 8

卷積層3

5 * 5 * 8 * 16

是不是非常眼熟?沒錯,這就是前面的卷積層參數量的**,顯然這種方式等價於我們給每個卷積層引數分配乙個dsp單元。也就是說我們總計需要4100個dsp單元,顯然這是遠遠超過板載dsp單元數量的,因此這是不可行的。那麼我們來考慮降低卷積核之間的並行程度,降到最低的狀態即為每一層都只平行計算乙個卷積核,那麼每一層需要的dsp數量變為:

層dsp單元數量(個)

卷積層1

5 * 5 * 1

卷積層2

5 * 5 * 4

卷積層3

5 * 5 * 8

總計為325個,因此我們的卷積核內部是可以全部並行進行計算的。

另一種組合是卷積核間仍然是全並行的,而卷積核內部是部分並行的,這種方式是可行的,這種方式所需要的最小dsp單元個數是每個卷積核分配乙個dsp單元,那麼總計需要28個,我們仍可以進一步的增加卷積核內部的並行程度,以充分利用板載dsp資源。

最後一種組合方式是卷積核內部部分並行,卷積核見也部分並行,顯然這種方式的最小dsp單元需求量更小,也是可以考慮的一種。

結論:我們在分配dsp單元的時候,應使得每一層卷積核內部的卷積運算部分並行,卷積核之間部分或完全並行

下一節我將對這兩種方式進行對比,並將對快取的優化納入考量,最終確定dsp資源的分配。

基於FPGA的卷積神經網路實現(一)簡介

目錄 簡介框架 資源分配 1 資源分配 2 資料量化 1 資料量化 2 資料讀寫 卷積模組 池化 全連線與輸出 事先宣告,僅用於記錄和討論,有任何問題歡迎批評指正,只是覺得菜的大佬們請繞路,就不用在這裡說大實話了,因為本身就是乙個粗糙的demo。提起把專案 講解一下的念頭主要是源於最近乙個同學開始轉...

基於FPGA的卷積神經網路實現(六)資料量化(2)

目錄 簡介框架 資源分配 1 資源分配 2 資料量化 1 資料量化 2 資料讀寫 卷積模組 池化 全連線與輸出 上一節我們介紹了如何對乙個離線模型進行簡單的線性量化,這一節我們來說一下如何在pytorch上面訓練乙個量化模型。這一節可能是徹底脫離了fpga實現,想要安心做fpga實現的可以跳過這一節...

卷積神經網路 有趣的卷積神經網路

一 前言 最近一直在研究深度學習,聯想起之前所學,感嘆數學是一門樸素而神奇的科學。f g m1 m2 r 萬有引力描述了宇宙星河運轉的規律,e mc 描述了恆星發光的奧秘,v h d哈勃定律描述了宇宙膨脹的奧秘,自然界的大部分現象和規律都可以用數學函式來描述,也就是可以求得乙個函式。神經網路 簡單又...