如何用FPGA加速卷積神經網路(CNN)?
學生黨小白一枚,之前都沒有涉足過該領域。求教如何在FPGA上實現CNN?新手上路,應該從什麼地方入手進行學習?
在火車上好無聊,隨便寫寫解悶了。現而今人工智慧真箇是火穴大轉,招硅農碼農的個個言必稱阿法狗,開個會加速神經網路的session能佔一大半。感覺都超過了前兩年的「大數據」跟「移動互聯網」了。
我本著面向funding編程和面向paper編程的態度,之前也關注了一下。主要還是考慮到師弟們幫我搞這些冷僻的東西,找工作確實吃虧。作為良心上過不去的師兄還是應該幫大家把點開活的。所以也讓實驗室的小朋友們業餘寫了些小玩意去忽悠下hr。提前聲明,在這一領域本人只是吃瓜群眾,血空一枚;還望知乎上一眾行家指正。
以下主要引用自西安郵電大學李濤老師關於連接智能和符號智能的報告,以及fpl2016上ASU的 Yufei Ma的文章和slide
Scalable and Modularized RTL Compilation of Convolutional Neural Network onto FPGA
推薦去讀下原文
以下是正文兒和閑白兒的分割線
做過一些計算加速的工作,個人感覺要入手先要想好幾個問題: 要加速的是什麼應用,應用的瓶頸是什麼,再針對這個瓶頸,參考前人工作選擇合適的方案。
過早地執著於fpga的技術細節(用hdl還是hls,用啥晶元,用啥介面)容易只見樹木不見森林。現在software define network/flash/xxx,已然大勢所趨。之前開組會時跟同志們聊過,演算法是綱,綱舉目張;軟體是媽,軟體是爹,軟體比基金委都親。所以推薦先把cnn的演算法看一下,拿一些開源代碼跑一下經典的例子(lenet, alexnet, etc)看好輸入輸出,摸清演算法。
比如以下是一個lenet的cpp和opencl的實現
nachiket/papaa-opencl
以下圖片源自Yufei Ma的Slide
可以看到cnn演算法主要由conv ,pooling,norm等幾個部分組成。工作時將image跟weight灌進去,最終得到預測結果。
接下來拿profiler(比如perf)去分析下軟體演算法,找找熱點和性能瓶頸。在cnn裡面主要耗時的就是conv二維卷積了。性能瓶頸也主要在於卷積時需要大量乘加運算,參與計算的大量weight參數會帶來的很多訪存請求。
接下來考察下前人的工作和當前的灌水熱點。按理說這種大量的乘加運算用dsp應該不錯,但是在cnn中大家並不需要這麼大的位寬,有時候8位就夠了。dsp動輒32/64位的乘加器實在是浪費。於是乎大家就開始減位寬,多堆幾個運算單元。面對大量的訪存請求,大家就開始設計各種tricky的緩存了。
以下是大家的一些灌水方向
於是就有了以下各路硬體設計
有人照著dsp風格去設計加速器
ceva也出了一系列面向CNN的IP
有人用了脈動陣列或者Dataflow的風格
有人設計了專用的晶元比如計算所的Cambricon
還有的就是你提到的fpga
所有的事情到了硬體層面實際上能用的手段也就有限了。不外乎堆資源和切流水兩招。再不然就是做一些bit level的小技巧,比如乘法器變查表之類的,這些技巧在很多二十年前的dsp教材裡面都描述得很細緻了,拿來用就好。比如這本書親測有效
VLSI Digital Signal Processing System--Design and Implementation
by Keshab
典型的fpga實現可以參考Yufei Ma的文章,不論是conv,還是pooling,依葫蘆畫瓢設計data path,切好流水,再想好狀態機加上控制信號。這些就看大家擼rtl的基本功了。
比如Conv模塊如下圖,主要拿一堆乘法器以及加法器樹搭好data path,切好流水,接著加上控制信號
Pooling也是大同小異
還有Norm
最後把這些模塊通過router連接,外面再套一層控制模塊,封成ip就好了。
剩下的就是集成進你的系統(microblaze, nios還是arm,配好dma,寫好灌數據的驅動,這些就是各有各的道兒了)。推薦動手碼rtl前先寫好文檔,約定好埠,寄存器和軟體api,否則邊寫邊改容易亂。
整體來說,cnn這種應用流水線控制相對cpu簡單,沒有寫cpu的那一堆hazard讓人煩心,也不用寫彙編器啥的。太大的cnn放在fpga里挺費勁,做出創新很難,但是fpga上寫個能用的lenet這種級別的cnn還是挺容易的。最後還可以依照慣例跟cpu比性能,跟gpu比功耗。現在人工智慧辣么熱門,小朋友們找工作可以拿寫過cnn來忽悠hr。
最後祝大家發出足夠的paper,找到理想的工作,拿到想要的funding。fpga這個圈子已經那麼小眾了,還是不要把新人嚇跑了,其實fpga這東西也不難,數字電路跟微機原理用心學一學,別太沉浸於工具軟體的用法(xilinx的工具真雞兒爛),上手也挺快的,而且還挺好玩的。
我的本科畢設就是這個題目,將某網路移植到FPGA上,現在能完整地跑一遍(雖然性能稀爛),下一步是做演示:板子上插個攝像頭把人/車啥的圈出來顯示在顯示器上。
這個東西沒多難的,做這個之前我只對單片機有一些了解,我自己從不會FPGA,不懂神經網路到把某個網路完整地在FPGA上跑一遍大概用了10個月,而且這段時間並不是很抓緊。如果你抓緊的話估計半年時間足矣。你也不用對神經網路很熟悉,你又不去開發演算法,只要看懂代碼就行了。
給你一個路線圖:
先說下平台,強烈建議用ZYNQ,ZedBoard就行,實在沒錢ZYBO也行,如果想實際應用上ZCU102(21K一塊,只能說有錢真好)。
第一步,參照Caffe(別的也行)把各種常見層都用C/C++寫一遍(我是用C寫的),比如卷積,POOL,LRN,Inception之類的。目前HLS工具都是用的C/C++,Caffe用C++寫的所以看Caffe照著改可能會容易些,不過只要你明白了各層的原理不參考Caffe也能做。
第二步,看Vivado HLS工具怎麼用,將計算密集的部分放到FPGA上加速。我現在只做了卷積層加速,其他類型做加速感覺意義不大,之後有時間的話可能會做。
一定先看手冊!!!一定先看手冊!!!一定先看手冊!!!
不要去買書,我買了好幾本都是抄來抄去的,完全不如手冊好用。先按照xilinx的UG871把所有的實驗都做一遍,先有一個感性認識;再看UG902,將感性認識提升到理性認識,主要就是看比較關鍵的指令,有PIPELINE,UNROLL,ARRAY PARTITION等,現在說多了也沒有用,到時候你就明白了。
要達到的效果是:
1、知道代碼怎麼寫能夠被綜合(HLS中的代碼要與硬體對應起來的,所以不是怎麼寫都行的)。
2、能夠猜到用不同的優化指令綜合出來的周期數以及資源利用率
如果這步做完了話你就會發現你之前寫的卷積代碼沒法在FPGA上跑,需要作出調整,具體怎麼調整。。。你到時候就知道了,現在說也沒用。
第二步的結果是一個IP核,可以把IP核當作一個黑箱,把數據灌進去,參數灌進去就會輸出一個結果,你可能會問怎麼讓ARM處理器調用這個IP核。如果你對單片機熟悉的話很好理解的,片內外設通過匯流排與CPU鏈接,CPU向對應地址寫參數就可以控制片內外設了,生成的IP核就類似於這裡面的片內外設,CPU告訴IP核卷積的參數,數據的起始地址之後啟動加速器,加速器算完之後將數據輸出到指定的位置。
所以這一步就涉及到IP核的集成,讓ARM處理器能夠調用IP核。傳統的做法是
將IP核用Vivado IP Integrator工具,畫個Blockdesign,綜合實現生成比特流。
然後用SDK像開發單片機一樣就行了,但是這個方法比較麻煩,不推薦。(上面那張圖只是給一個例子)
於是引出第三步
用SDSoC最終實現。
個人感覺最難的部分還是集成這部分,有一陣卡了好久也沒結果。賽靈思新出了個SDSoC工具,相當於Vivado+HLS+SDK,第二步中說的「集成」用SDSoC就能完成。之所以讓你先看HLS是因為SDSoC工具本身就是調用HLS的,就算直接用SDSoC也得先學HLS。用SDSoC學HLS效率很低,因為SDSoC=Vivado+HLS+SDK,每生成一次都要完整地走一遍HLS,綜合,實現,生成比特流的流程,放在HLS里大概十分鐘搞定的東西放在SDx里要一個半小時,而且多出來的那些時間並不會產生什麼有用的東西;而且出了問題你不知道是HLS造成的還是別的東西造成的,聚焦在你要學的東西上面。學完了HLS上手SDSoC很快的。
其實現在介紹得很詳細也沒啥大用,沒有感性認知不可能形成理性認識,建議把我的回答收藏,每做完一步再看看會有新的體會。
提醒幾點:
1、不是所有C代碼都能被綜合,如果你用HLS時候發現C Synthesis 跑了好幾個小時都沒反應那肯定是你代碼寫得有問題,寫得好的代碼幾分鐘就能綜合完。
2、SDSoC用最新版本的,現在叫SDx
3、一定要有一個板子,有錢上ZCU102,沒錢上Zed,再窮也要買個ZYBO,ZYBO這玩意好像也不用買,管賽靈思的大學計劃要。
4、第一次看技術手冊不要看得很細,因為就算你看得很細也看不懂,還是那句話,先有感性認識然後才有理性認識。看完之後去實踐,實踐中遇到問題再回頭去看技術手冊,賽靈思的技術手冊相當完善,如果找不到,再找一遍。目前我遇到過的所有問題都可以在技術手冊找到答案,只是有的得找好久,開始以為技術手冊里找不到,但是無意間看到技術手冊的某個地方問題就解決了
…………………………………………………………………………………………
評論里好多要參考資料的,統一回復下。
可以借鑒中科大余奇,清華王捷,浙大餘子健的畢業論文,知網上都搜得到,但是他們都比較猛,實現流程比較複雜,不像我用SDSoC這麼好做,在此向大佬們低頭。
還有就是賽靈思的官網,資料非常全。
別的參考資料就沒了,目前這塊做的人不多,github上基本沒有可以參考的代碼,只能自己一點一點填坑了
很巧本人碩士畢業設計做的就是CNN在FPGA上實現的架構,目標硬體Xilinx PYNQ,前端Python後端Vivado HLS,已開源。
硬體結構用的是Synchronous Dataflow Paradigm,並行加流水線的結構效率比較可觀,目前可運行LeNet和CIFAR10,有教程。這個項目結構比較簡單,適合FPGA初學者作為研究起點使用。建議題主可以以這個架構為基礎設計幾個CNN的應用,或者在它的基礎上進行優化和再創造。
具體代碼和報告請見評論
記得引用,祝成功!謝邀。
不過我不想回答這個問題。倒是想和題主談點別的。
從你的描述來看,是「實驗室的師兄」讓你開這個方向的課題。如果這個實驗室是指的研究生所在的實驗室的話,我覺得題主應該考慮換導師。
一個研究生的開題,導師不參與,就讓一個「師兄」就給定了怎麼開。關鍵是定完了以後啊這師兄就不管了,既不給題主一些自己以前的資料,也不幫題主指定一些參考書。最後搞得題主還跑知乎上來問。
這樣的研究生讀著也就沒啥意思了,題主還是早做打算吧。
如果不是我說的情況,歡迎題主補充,然後把我這個答案摺疊了吧。
首先慚愧的說我也在做過相關的事情,剛剛開個頭吧。但是我認為對於一個研究生來說用FPGA實現CNN這個題目確實是一個不錯的課題。當然這個課題可大可小,可難可易,但是關鍵在於這個題目確實是一個可行的題目。
FPGA是目前一個比較火的方向,DeepLearning是目前最火熱的方向。DeepLearning目前存在的問題在於對於計算能力的需求之大,足以讓很多終端機報警了(這裡之的終端機不特指手機)。FPGA是一個很巧妙的處理器,可以根據你的需求實現數字系統。如果你對FPGA的應用足夠的熟練定然可以製作出低成本低功耗的針對DeepLearning的電路系統來。而且現在FPGA的功能也越來越多了,很多FPGA集成了ARM,這又為這個課題的可行性提供了保證,因為只用FPGA實現CNN確實難了點,但是再加上一個CPU那就容易多了。這麼想一想確實是個不錯的課題。而且在國際頂級期刊和會議上都有發表過相應的論文,例如FPGA2017的最佳論文就是用FPGA來實現RNN和語音識別。再說一說這個題目前景,首先假定題主打算讀完碩士就工作,那麼根據我所在學校的畢業生去向來說:FPGA這個方向很熱,很好就業,而且工薪比較高,例如寒武紀,大疆,華為,TP-Link都有在這方面的招聘。(暫且不認為你會從事DeepLearning的職業,就算從事了也一定和FPGA或嵌入式系統分不開)。 如果題主打算讀博士,先說我吧,如果是我只要導師不逗比,實驗室資金充足(指實驗室至少能為你提供一塊4萬以上的FPGA開發板)那我會選擇讀博士,畢竟華為對於博士的待遇是很高,當然不能以此作為讀博士的依據,我會再後面解釋為什麼讀博士,我只是想說讀了博士不代表少掙兩年錢。
再說一說我對這個題目的理解,以及如果我做這個題目,我的出發點會怎樣。
一、這個題目要與應用緊密結合,確切的說是DeepLearning要與應用緊密結合,那用FPGA實現DeepLearning就更要與應用緊密結合:
深度學習這個題目雖然說在我們日常生活中大多數體現於人臉識別啊,人臉識別解鎖啊,這些看似雞肋的東西,但是實際上深度學習確實已經有了很多的重要的應用,而且是有價值的應用(指不是為了玩,不是為了demo,而且確實給企業帶來利潤的或者方便人們的生活的技術),比如baidu和google的翻譯,尤其如果你用youtube的話,你會發現youtube會為你提供很多種語言的字幕,那些都是機器翻譯的。但是,深度學習大多數還是不那麼實際的應用,所以如果你能夠根據深度學習的特點和優勢選擇一個很有價值的應用,那你的研究一定很有意義。
然後,在說一說為什麼FPGA實現DeepLearning更要和應用結合在一起,應該有兩個原因:
1、FPGA雖然靈活但是它計算能力確實不如GPU要強,而且差很多。從事這個課題就是要為DeepLearning這個演算法深度定製一個計算系統,那當然是要演算法越單一越好,越簡單越好。而且不同的應用對應的演算法也很不同,也就是你除了要設計CNN之外還要用FPGA為這個應用除了CNN之外的其他演算法設計系統。
2、第一條說太多了我剛剛把第二條給忘了,讓我先想一會。就是要讓你的課題有一個實實在在的意義,因為這個課題太偏工程了。所以你做的東西如果越是有用越好,越是接近生活或者接近企業的需求越好。
二、這個題目應該從何處下手。這個題目我認為要從演算法下手。第一應該要非常非常的深刻的理解演算法,只少要能看懂DeepLearning中所有經典演算法的證明,最好能自己默寫證明過程(不是死記硬背那種,這要求題主要對微積分,概率論,線性代數,隨機過程,資訊理論基礎稍稍牢一點點)。然後能自己用編程語言實現(不是用深度學習框架那種)。
三、FPGA其實很好學,入門很簡單,如果你不是打LOL的選手而是打DOTA2的選手那你一定能在一個星期以內入門,如果你是打LOL的選手那當你愉快的轉到DOTA後,你一定能成功的。後面就要根據你課題進行進階了,畢竟FPGA是個很靈活的東西,你要想征服他,通過應用(也就是你的課題)是最好方法了。
四、不要把自己當做一個搞深度學習的選手,要認清自己的目的(目的是:利用FPGA實現一個特定的可以用深度學習演算法解決的應用。所以你是一名FPGA攻城獅,深度學習不過是你要實現的一個目標而已,以後還有更多的事情等著你用FPGA來完成)。但是你首先還有根據你選擇的應用,去用TensorFlow這類的框架實現那個應用,然後在用你自己寫code實現那個應用,之後你要學會更改演算法(他們一般說優化,我認為優化是好聽的說法,其實吧不一定變優了,只是能用了就很好了),這時候要發揮的對深度學習演算法的理解嘍。更改演算法一般指:浮點計算變定點計算,減少網路的參數,等等有很多要做更改的地方(我理解的也不深,不能為你提供更多的信息,sorry)。如果你要用FPGA做學習機那麼也許連訓練演算法都要改。這期間你要多看論文,而且要多練一練FPGA。(個人認為除此外別無他法,畢竟努力是必須的)。這個時期很難熬,真的。(可能我就是這個時期煎熬著)
五、等你的演算法在經過更改之後,演算法需要的計算資源,存儲資源大概能接受的時候,那麼你系統框架應該差不多了。那你就要更加努力的工作,更加認真的學習了。我想這個時候你又進入了更難熬的時期。(可能我就是這個時期煎熬著)
坦誠,努力,自信,體面
以此共勉
參考FPGA2015 - FPGA2017會議上的相關論文,從HLS,OpenCL到RTL,從Alexnet,VGG到Resnet,BNN,應有盡有,結論基本上都是Performance優於CPU和移動端GPU,Performance/W優於各種NV核彈。在FPGA上搭個CNN很容易(特別是用HLS),難的是把性能做上去。FPGA2017上有些實現性能已超過1TOP/s,如果是想發Paper,又沒有高端板子,建議趁早換方向。利益相關: 用Vivado HLS搞過一年ML演算法FPGA加速;已轉行
FPGA的特點是並行和流水線處理,而CNN的特點是模塊化好和參數共享,所以CNN非常適合用FPGA加速。理論上,FPGA是除ASIC外最強的CNN加速設備。對於具體怎麼加速,我在這裡三言兩語說不清楚,可以在知網上看哈工程陸志堅的博士論文,還有浙大餘子健的碩士論文,說的非常詳盡。我在實驗室復現了方睿的手寫數字識別加速,加速效果和功耗都優於目前的主流GPU。我看到前面有評論鄙視FPGA的,或者是鄙視HDL的,估計都是嫌棄開發周期長吧。現在xilinx和Altera(Intel)都在往高層次綜合發展,意思是用C等高級語言對FPGA開發,開發周期大大縮短,理論加速效果也不會比hdl差。當High-level synthesis發展成熟的時候,gpu加速是可以被FPGA代替的。不論是gpu還是FPGA,或者是其他加速設備,最後都會往異構型發展,互相吸取優勢。
前一陣子verilog寫了一個Alexnet的模板。說一下我的心得吧。
首先是資源的評估,最主要的資源是乘法器與block ram的數量。乘法器決定了你的計算速度,也就是硬體的最大演算法加速能力。block ram決定了你的參數以及中間結果的存放以及每層之間的數據流通的速度。因為如果ram資源太少的,對於比如Alexnet這種大一點的網路,中間結果可能都放不下,這時候就需要把中間數據放到DDR上面了。對於卷積核的參數以及後面全連接層的參數,肯定都要放到DDR裡面。
第二個是卷積演算法的加速。如何並行的去做,這是一個比較核心的問題。不過比較幸運的是,有許多論文都已經在做這個方面了,多找找論文也能總結的出來。
第三個是數據的存放方式。對於每一層的卷積操作來說,它如果並行,需要上一層結果的哪一部分數據?這些數據能從存放結果數據哦哦ram中順序的讀出來嗎?這就需要設計一下上一層數據的存放方式。既保證上一層能夠沒有障礙的存,又保證下一層能夠沒有障礙的取。第四個是流水線的設計。要讓每一層對一張圖片所花費的時間大概相同。這樣才能讓總的網路有更大的吞吐量,具體的做法比如雙buffer之類的,也可以找得到。當然,這是對於並行結構來說的。像騰訊的雲FPGA平台,就採用的是串列的方式,所有層用同一部分資源,第一層計算完算第二層,這種方式感覺比較麻煩,而且不同層的計算都不同,設計起來會相當麻煩。
第五個是正則化操作以及截位操作。正則化因為太過於麻煩,涉及到除法,所以就給取消了。。截位操作麻煩一些,要考慮到數據位數以及範圍的問題,需要自己去試。。
第六個就是上面說的DDR了,對於Alexnet這種相對大的網路來說,基本沒有幾款FPGA能夠存下它的參數,所以外接一個DDR來存放數據是非常必要的。這就設計到FPGA外接設備的調試了。不過我沒有參與到這一部分,並不是特別清楚如何去做。。。
差不多就是這些了。我當時做Alexnet花費了大概一個月多一點的時間。多用狀態機,跟著網路一步一步走。照著這兩點,基本上就挺順暢了。畢竟計算流程都是固定的。。。我們的開源工作直接拿去不謝http://github.com/doonny/PipeCNN
最近在Zhiru Zhang的group做rotation,有師兄做了一些有趣的關於CNN和FPGA的工作比如:
Accelerating Binarized Convolutional Neural Networks with Software-Programmable FPGAs
不過他們做的更多的是優化High-level synthesis(HLS)本身得東西。
其實說這些,就是建議你不要想用verilog去實現CNN。
如果是做工程的話,可以直接用Vivado的HLS去實現,然後實現的時候結合一些HLS-&>RTL-&>FPGA步驟中的缺陷,優化一下,俗稱調下參,只是這裡調的是HLS這一塊的參。
如果是做paper的話,可以考慮一下如何優化HLS裡面的一些步驟比如用regularized combinatorial optimization做scheduling,或者用機器學習做HLS的resource estimation,用stochastic reinforcement learning做類似BDD的優化。
少年,只能幫你到這了。
問一個實際點的問題,用過FPGA嗎?
看到這題我就笑了,我本科畢業設計最開始的題目是《面向FPGA的深度學習演算法的優化與實現》,選題的那段時間剛好考研初試,沒工夫了解這些,然後指導老師說這個題目,我就同意了。
後面的過程就相當呵呵了,呵呵到我都不想再提。
選一個好的導師和方向非常重要。
解決這個問題最好的辦法就是換老師或者換方向!
個人對深度學習比較熟,曾經接觸過一點FPGA,不過淺嘗輒止,稍微談談自己的看法。
如果是做神經網路的研究,那麼時間主要花在設計上。有一個現實問題,但我們不知道什麼樣的神經網路適合用來解決它,也不知道要用什麼樣的訓練方式來訓練它,於是我們需要去設計、去大量地試。在這個過程中肯定是需要大量訓練的,但這個過程並不太適合使用FPGA,因為FPGA開發起來太麻煩了(至少目前是這樣)。比如,你想改一下神經網路的結構,這就得各種重寫硬體代碼,各種模擬調試巴拉巴拉。在FPGA開發尚不成熟的情況下,用CPU+GPU顯然是更好的選擇。
當然,如果是已經設計好了神經網路,要大規模應用的話又不一樣。因為這裡不修改神經網路的結構,甚至使用固定權重而不再訓練神經網路。此時是可以考慮用FPGA來加速的。像「百度識圖」這種服務,已經有了準確率較高且穩定的神經網路主體,在差不多挖掘完GPU的性能之後,是可以考慮用FPGA的,甚至可以考慮定製晶元(ASIC)。
如果真的要用FPGA的話,那首先得知道數據流中的哪些部分能夠用FPGA加速。FPGA並不是什麼都能「加速」的,很多情景下是不如GPU的。比如卷積運算就涉及到大量的數據IO和並發運算(大矩陣的數要各種算)。GPU天生就適合干這個,而FPGA?呵呵,並不是說不行,但是得有非常非常貴的FPGA才有可能比得過GPU。而且與其自己用硬體語言寫個GPU,不如直接買。
FPGA適合「流」運算,而GPU適合併發運算。用個不太恰當的比喻:在機場登機的時候,商務艙可以快速一條龍服務:登機手續→安檢→候機,從登機手續到候機只要10分鐘,這是FPGA。而經濟艙雖然慢一些,還要排隊,但手續辦理窗口、安檢口都有多個,人們可以並行地通過,整體效率就成倍,這是GPU。所以如果「人」多且互相不依賴的話,並髮式的方案當然更好;而如果「人」不那麼多,或者互相有依賴(比如要接力賽),那麼一條龍方案就可以更快。(當然你也可以在超貴FPGA上做很多「一條龍」並發走)
以前跟一個用FPGA搞CNN的研究生團隊交流過,他們是把整個CNN都用硬體語言搭建在FPGA上的,就是把整個CNN當成「一條龍」了,裡面的各種演算法都用Verilog實現一波,這樣FPGA的IO就是CNN的輸入輸出,聽起來是個好方案。但前提是你得有個能裝得下整個CNN的FPGA,貴不貴就取決於CNN的規模了。
先說結論:如果題主不是在FPGA和Deep Learning兩個領域都非常精通的話,那麼這個課題就是個大坑,研究生階段基本不可能完成。
大致看了一些答案,基本都是勸題主避開這個深坑的,居然還發現了《FPGA異構計算-基於OpenCL的開發方法》作者?話說這本書我前一段剛有學習過......然而我還是想就自己淺薄的了解,給題主一些稍微具體的回答。如果有不正確的地方,歡迎批評指正:)
關於CNN的知識,知乎專欄一大把,假設題主在CNN領域已經有了深入的了解。那麼CNN在FPGA上如何實現呢?首先建議題主看一下這篇綜述:Deep Learning on FPGAs: Past, Present, and Future
未完待續
有人說hls,我只想說,用那個,不好找工作
還有,真的掌握zynq,難度著實有點高~~我說的是用hdl寫,哇,好多做這個方向的,咱們建個群吧QQ~
為啥都用賽靈思,我感覺用了快三年的ALTERA有股濃濃的上當感。
Caffe里就是用im2col,空間換時間,把卷積轉換成矩陣乘法了吧?然後可以用GPU的並行reduce做乘積求和。這個應該是基礎版的優化吧。
更好的應該是用Winograd FFT來做卷積?有在FPGA上做這個的嗎?
最好再封個OpenCL驅動。。。,沒有的話提供個dll/so也行。
首先問這個題目之前,要先問你老闆有錢嗎?(我說的是買FPGA的錢)
用zynq
跟我知道的一個組好像...請問是不是福建大三本
同在做這個方向。。。。。先學工具吧
放棄吧,你做不出來
推薦閱讀:
※深度圖像depth image作為CNN卷積神經網路的輸入層有什麼技巧?選用什麼網路模型能取得好效果?
※Pytorch如何自定義損失函數(Loss Function)?
※Krizhevsky等人是怎麼想到在CNN里用Dropout和ReLu的?
※卷積神經網路提取圖像特徵時具有旋轉不變性嗎?
※請問各位大大現在的放療計劃系統在做自動化計劃時用的是神經網路嗎?
TAG:現場可編輯邏輯門陣列FPGA | 硬體加速 | 卷積神經網路CNN |