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

2021-10-06 12:34:15 字數 1421 閱讀 2210

目錄:

簡介框架

資源分配(1)

資源分配(2)

資料量化(1)

資料量化(2)

資料讀寫

卷積模組

池化、全連線與輸出

事先宣告,僅用於記錄和討論,有任何問題歡迎批評指正,只是覺得菜的大佬們請繞路,就不用在這裡說大實話了,因為本身就是乙個粗糙的demo。

提起把專案**講解一下的念頭主要是源於最近乙個同學開始轉行做這個,感覺很複雜無從下手。在給他講的時候想起我最開始入手一塊fpga到自己寫出整個框架的艱辛,以及尋找並閱讀開源專案的艱難,所以打算把整個過程完整的記錄下來,也方便和大家交流。

現在github上對於在fpga實現卷積神經網路的專案也很多,各大公司也都有做,xilinx和amd的開源專案也能搜到,但是由於功能太強大而導致**複雜新手很難閱讀(也許這是fpga口的乙個特色?)。另外就是有很多**,各種各樣的加速方式,看了之後,woc nb,但是咋復現啊。本專案由於主要是從結構出發,因此只是對結構進行了實現,對於硬體層面的優化較少,都是使用最簡單的方式進行實現的,因此可能理解起來也算是容易一些。當然現在越來越多的研究者和同學使用hls進行開發,確實hls相對於簡單很多,開發周期大大縮短。

對於基於fpga實現cnn的研究,個人感覺單純的在這方面進行普適性的研究已經許久沒有顛覆性的進步了,研究人員在fpga上面實現了vgg、resnet等各種各樣的網路結構,各種各樣的硬體級優化也都做了很多。而我們從工程應用的角度把他作為一種工具去在某乙個領域去進行加速,這樣是可以針對特定的應用場景特定的網路進行特定的處理。很多現在的**也是這樣,做乙個專案場景,而fpga的使用是為了加速這一過程,至於cnn,那也只是一種方法而已。

從工程角度,對於使用fpga加速cnn,個人覺得應該分為四個步驟

在軟體層面對cnn進行優化

在軟體層面對cnn進行fpga適應性處理

將cnn演算法分解為適合fpga實現的結構

fpga實現及優化

這整個應該是乙個完整的流程。

首先fpga本身的儲存空間有限,現在的大型網路具有巨大的參數量,哪怕是在一些具體應用中使用了較小的網路(如本專案,因為要實現的功能並不複雜,因此網路結構也比較簡單),參數量仍然很大,因此第一步應該在軟體層面就優化一些,比如剪枝,既可以減少參數量又可以減少計算量,何樂不為。

其次cnn不一定完全適合fpga,比如我們希望在fpga中呼叫dsp單元進行定點數計算,那麼我們需要對cnn的引數進行定點數量化處理。

分解的話主要是提取cnn的計算流程,把每一步的計算公式完整的使用matlab或者python等進行實現,而且不掉呼叫庫函式,完全來**fpga的實現,比如卷積是否要分解為多步進行等。

最後才是在fpga上的實現以及優化。

個人意見哈~也不見得對,而且僅限於單片處理,多片的話要考慮的東西就更多了。

總之呢,下篇開始我將會對這個專案按照我個人寫程式時候的順序進行講解。所有的.v檔案我已經上傳到了github。

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

目錄 簡介框架 資源分配 1 資源分配 2 資料量化 1 資料量化 2 資料讀寫 卷積模組 池化 全連線與輸出 前面曾經說過這個demo使用最簡單的方法,也就是對每一層都單獨分配資源,所以需要提前設計好每一層所分配的資源數量。這裡的資源主要是指dsp單元和片上儲存資源,cnn的卷積層是計算密集型層,...

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

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

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

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