FPGA構建人工神經網絡系統應用實例——視障人士便攜導航系統

 

現場可編程門陣列(FPGA)技術不斷呈現增加勢頭,2013年全球FPGA市場已經增加至35億美圓。1984年Xilinx剛剛創造出FPGA時,它仍是簡單的膠合邏輯片,而現在在信號處理和控制應用中,它已經取代了自定製專用集成電路(ASIC)和處理器。今天來自北郵數據科學中心的楊陽來爲你們解讀如在使用FPGA構建人工神經網絡系統。git

 

 

如下爲楊陽老師演講實錄github

 

源起:使用FPGA搭建視障人士便攜導航系統算法

在剛剛過去的第八屆華爲杯中國大學生智能設計競賽,咱們用PaddlePaddle來搭建一我的工神經網絡放到咱們本身的硬件平臺裏,實現了基於深度學習的視障人士便攜導航系統,得到了二等獎。咱們選擇這個題目的緣由,是考慮中國有大批的視障人羣,這些視障人羣在出行方面會遇到很多困難。咱們傳統的方式須要一些專門的人力、物力幫助視障人士出行,可是這種傳統方式有必定的缺陷性,通常來講須要專人的陪同,另外一方面,若是但願視障人士有很好的出行體驗的話,咱們須要很昂貴的導盲系統設備。編程

咱們後來想到了應用FPGA加上深度學習的技術來設計一套完整的盲人的視障導航系統,自己FPGA進行深度學習的時候功耗特別低,小型化,並且速度也比較快。所以,咱們的主要設計工做是分兩部分:一部分是高層的PaddlePaddle深度學習算法設計,另外一部分是關於底層的FPGA硬件設計。centos

首先咱們經過大規模的行人出行指示圖象,用PaddlePaddle進行大規模的訓練,而後在PaddlePaddle裏搭建一套深度學習神經網絡,將這些深度神經網絡的參數訓練好以後寫到FPGA裏。緩存

    當時咱們作了一個六層網絡做爲核心的單元,網絡係數是經過PaddlePaddle對行人的指示標誌圖象訓練得到,指示標誌的樣本咱們採用了一個國外的實驗室給的一個數據集,比賽的時間比較短,來不及本身採集,直接就用了一個別人的實驗室給個人一個行人指示標誌的圖片,一共是3400張,這就是給一個例子,好比說這樣的狀況行人是容許經過的,由於前面可能有斑馬線,這種狀況多是前面施工就禁止通行。網絡

    完成了算法設計,生成了參數,咱們就想把這些參數燒錄到硬件當中,造成具備實際功能的做品。咱們的系統開發採用的是zynq7000系列,這個芯片有一個好處分爲是它的下層是包括了傳統的pl端,就是所謂普通LPG的邏輯電路,爲咱們整個發板帶了一些豐富的外設提供了便利。好比說包括一些hdmi的口,USB2.0的口,由於咱們盲人的攝像頭採用USB2.0的攝像頭。併發

 

圖一 FPGA並行執行結構框架

    zynq7000包括神經前饋網絡模塊、AXI直接存儲器接入模塊。用AXI這款芯片有一個好處,上層的AIM芯片和底層FPGA的邏輯是經過AXI總線直接鏈接。第三部分是實時圖象的數據輸入模塊,還有一個偵提取模塊。最核心的是這個,實現了一個將PaddlePaddle的參數直接導入進來之後的模塊,咱們採用的是vivado hls、opencl1.0的方式,如今的方式都支持高層,好比說你對C或者C++比較熟悉的時候就能夠採用這個方式進行開發。我後面也會講到如何利用高層語言進行一個轉換,就避免了要從新去學習一些底層的繁瑣的硬件代碼。性能

採用深度前饋網絡模塊的好處是它可使用層級模型,併發執行,統一內核。LPG裏自然生成邏輯是有不少的計算單元,這些計算單元會劃分紅一個大塊,它叫NDRange。NDRange能夠進行一系列矩陣的運算,進行深度學習。訓練完了以後將獲得的深度神經網絡可讓FPGA進行配套,這樣很容易就能夠把網絡捎寫到FPGA裏,這樣完成了矩陣的乘法。採用FPGA也是由於有並行的執行結構。

 

    

圖2、數據的讀入、處理顯示以及輸出過程流圖

整個咱們當時作的系統流程就是像這樣的狀況:首先咱們要導入PaddlePaddle生成的網絡參數,而後初始化深度的神經網絡,接下來USB攝像頭捕捉一些圖象送到這個總線當中,接下來AXI直接讀入數據,寫入緩存,接下來就是FPGA處理數據,接下來是實時顯示並輸出,行人在路上走的時候能夠實時看到圖象,而且可以實時輸出。

由於時間關係,咱們當時只作在了顯示器上。顯示器會給出一個,信息顯示你可否通行或者不能通行,實際上咱們後續但願作出一個音頻的給出一個信號,有一個聲音提示行人。

 

圖3、行人指示標識圖像訓練樣本數目vs. 判斷準確率

    參賽的時候訓練集比較有限,咱們採用的圖片一共3400張,因此整個訓練襲來,咱們最高準確率也只達到了75%。深度學習進行行人指示可否經過和不經過自己是一個機率的事情,咱們達到了最高是2000次訓練的,實際上這條曲線3000次訓練沒有2000次訓練好,由於3000次達到了一個過擬合的狀況,因此反而沒有2000次的好。可是整體趨勢是這樣,隨着PaddlePaddle的訓練圖片數目的不斷增大,準確率不斷上升。若是咱們後期加大數據集的話,可能準確率還會有所上升。

圖4、單張行人指示標識圖像判斷結果示例

這個地方給出了一個單張行人指示標識的判斷結果,最後判斷出來的時候其實是一個機率事件,你最後出來的時候,咱們用的是一個什麼,判斷一下這個是0.8,咱們認爲比不能通行的機率大就能夠通行。

FPGA的性能優點

使用FPGA,能夠大大下降功耗,若是你把整個深度神經網絡在GPU上或者CPU上實現,功耗會很是高,而用FPGA功耗最低可達1.725瓦。這兩個參數咱們測的時候是採用了看GPU實際運行中的額定功率,GPU功耗是比較大的。並且使用GPU識別的時候,不便於小型化,由於不可能揹着GPU出去處處走。用FPGA功耗比較低是一個亮點,超低的功耗使得FPGA在續航和小型化方面優勢比較明顯,體積小是另外一個亮點。

圖5、GPU、CPU與FPGA功耗對比

圖6、系統資源佔用狀況

    而後咱們給出了一個資源佔用狀況分析,由於你在FPGA當中作的是定點數的計算,因此咱們要對網絡,由於你無論是PaddlePaddle生成出來的參數也好,你最後寫入到FPGA的時候可能要考慮到從一個浮點數轉到靜點數。因此咱們就要採點數,這和自己芯片設計有關係,芯片大小決定了你能放多大的深度神經網絡,咱們當時使用的是六層的神經網絡,資源佔用率是達到了79%,知足了芯片的要求,後期能夠選擇更大的FPGA的芯片。

 

FPGA的應用潛力

傳統的深度學習框架不少都是跑在GPU和CPU上,對於FPGA目前爲止好像尚未成熟的深度學習框架,在這個地方我但願經過一個拋磚引玉的思路給你們一個思路,若是大之後有興趣能夠在FPGA上實現深度學習框架。如今不少主流的廠商,他們都在作本身的一些想在本身的FPGA上搭本身的深度學習框架。

    應用背景是隨着大數據的爆發式增加,人工智能技術也獲得了快速的發展,高性能計算的需求日益增加,能夠看到像這樣的數據中心,還有一些人工智能的判斷,包括百度的阿波羅作無人駕駛這方面,咱們在傳統計算當中已經不能知足咱們如今須要的這種計算的速度,因此咱們須要用FPGA進行一個加速,傳統芯片提高功耗比方面遇到了一個極大的挑戰。

    與計算平臺的對比,實際上能夠看到若是你採用傳統的ASIC開發芯片,功耗是很低的,可是開發週期是很是長的,由於你要把全部的可能性想好以後作定製,定製須要的ASIC芯片。GPU開發週期短,性能也好,可是功耗過高了。FPGA介於這二者之間,開發週期較短,性能好,也比較適合作深度學習的計算,功耗特別低,因此通常來講咱們能夠考慮使用介於二者之間的FPGA進行一個開發。

    深度學習分爲兩部分,首先第一部分是訓練,第二部分是推斷。訓練這一部分是從已有的深度學習學習到新的能力,推斷是將學習的新能源應用到新數據當中,好比說造成一個深度神經網絡的話就能夠捎入到須要的芯片當中。不少的深度學習框架都不支持FPGA,可是前段時間PaddlePaddle提供了一些支持FPGA的接口,因此你們有興趣能夠看一下提供的接口的連接:https://github.com/PaddlePaddle/paddle-mobile/tree/ca32dc7f40e75080d203b7de3cd1ae30feb612c9/src/operators/kernel/fpga。

    這個地方咱們但願PaddlePaddle能夠作更好的支持,首先是支持FPGA上訓練和推斷,第二是優化FPGA的計算加速,訓練模型在FPGA和CPU,GPU之間能夠無縫對接,有了這樣的深度學習框架能夠在GPU上跑,能夠在CPU上跑,也能夠在FPGA上跑。

    

使用FPGA搭建CNN模型

如何在FPGA上面搭一個深度學習框架,咱們當時採用的是xilinx的開發板,其實也能夠採用其餘的開發板,這個板子也挺貴的,兩萬三一個。當時採用的操做系統是centos,開發環境是vivado、SDX,上層是支持C的,在上層的時候能夠用C或者C++進行開發,底層實際運行能夠進行一個轉換,效率上可能會低一些,可是會加速你的開發的週期,這樣的話能夠用上層的語言。首先經過咱們的主機端,經過板子構成一整個的深度學習框架的開發的硬件環境,他有一些包括裏面的PCl-e的控制器,整個框架支持C++和Opencl的開發,有了這樣的硬件環境對於你後期想在這上面部署一個深度學習框架實際上是有好處的。

    框架是如何實現,這是一個本身向上的設計和思路,咱們分了幾部分,第一部分blob,進行封裝數據的讀寫。第二部分採用layer,把封裝好的數據利用blob進行不一樣功能的具體計算,接下來用net進行組合,就是把全部的每個層進行串起來,串起來以後把每個層組合神經網絡,最後有一個solve控制神經網絡的流程。

    設備端能夠作一個優化,實際上FPGA比較適合來作定點數的,浮點數對於FPGA來講不是一個特別有優點的功能,咱們的定點數實際上位寬比較少,節省資源。第二個是整型的數據,利於硬件的運算,這兒給出了一個例子,固然這個例子其實在網上你們也能夠看到不少定點數和浮點數的轉換。

    最後你能夠看到精度損失是比較小的,通常是能夠忽略的。實際上最後也給出了一個引證,咱們在FPGA上,若是想去搭深度學習框架,若是採用定點數,其實是有必定的可能性的。咱們當時比較了一下,進行一次兩次的加法,乘法節省的時間分別達到40%和29%,因此從這個圖上能夠看到32位單精度浮點數,咱們的定點數位寬Q=11的時候能夠節省相應的資源。同時咱們用了手寫數字的數據集運行了一下數據集,若是在FPGA上搭這樣的一個深度學習的框架,其實你能夠看到定點和浮點這兩個準確率幾乎能夠達到一致。

其實FPGA裏還有一個很好的特點就是有一個pipeline,就是所謂的流水線,用定點數據依賴,增長算法硬件實現的並行性的數字設計方法,用串型的計算,好比說8個週期進行傳統的計算的時候,好比說8個週期是一個串型的計算,利用這個流水線把每一個單元進行並行化,實際上能夠看到採用更少的時間週期能夠進行並行的計算,能夠大大下降邏輯資源。

 

實錄結束

 

楊陽

2015年博士畢業於北京郵電大學信息與通訊工程學院,同年進入清華大學電子系從事博士後研究工做,目前就任於北京郵電大學,任職講師,研究興趣方向爲人工智能、智能硬件與通訊網絡,國家天然科學基金青年基金得到者,中國博士後科學基金面上項目得到者,發表SCI期刊論文6篇,EI期刊17篇,申請國際專利3項,國內專利4項,參與國家國家重大專項項目一項。指導留學生3名,碩士研究生四名並得到國家級學科競賽獎勵四項。

相關文章
相關標籤/搜索