一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從FPGA說起的深度學(xué)習(xí)

OpenFPGA ? 來源:OpenFPGA ? 2023-03-03 09:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這是新的系列教程,在本教程中,我們將介紹使用 FPGA 實(shí)現(xiàn)深度學(xué)習(xí)的技術(shù),深度學(xué)習(xí)是近年來人工智能領(lǐng)域的熱門話題。

在本教程中,旨在加深對(duì)深度學(xué)習(xí)和 FPGA 的理解。

用 C/C++ 編寫深度學(xué)習(xí)推理代碼

高級(jí)綜合 (HLS) 將 C/C++ 代碼轉(zhuǎn)換為硬件描述語言

FPGA 運(yùn)行驗(yàn)證

在上一篇文章中,我們用C語言實(shí)現(xiàn)了一個(gè)卷積層,并查看了結(jié)果。在本文中,我們將實(shí)現(xiàn)其余未實(shí)現(xiàn)的層:全連接層、池化層和激活函數(shù) ReLU。

每一層的實(shí)現(xiàn)

全連接層

全連接層是將輸入向量X乘以權(quán)重矩陣W,然后加上偏置B的過程。下面轉(zhuǎn)載第二篇的圖,能按照這個(gè)圖計(jì)算就可以了。

d1d45f6a-b8ec-11ed-bfe3-dac502259ad0.png

全連接層的實(shí)現(xiàn)如下。

voidlinear(constfloat*x,constfloat*weight,constfloat*bias,
int64_tin_features,int64_tout_features,float*y){
for(int64_ti=0;i

該函數(shù)的接口和各個(gè)數(shù)據(jù)的內(nèi)存布局如下。

考慮稍后設(shè)置 PyTorch 參數(shù),內(nèi)存布局與 PyTorch 對(duì)齊。

輸入

x: 輸入圖像。shape=(in_features)

weight: 權(quán)重因子。shape=(out_features, in_features)

bias: 偏置值。shape=(out_features)

輸出

y: 輸出圖像。shape=(out_features)

參數(shù)

in_features: 輸入順序

out_features: 輸出順序

在全連接層中,內(nèi)部操作數(shù)最多為out_channels * in_channels一個(gè),對(duì)于典型參數(shù),操作數(shù)遠(yuǎn)低于卷積層。

另一方面,關(guān)注權(quán)重因子,卷積層為shape=(out_channels, in_channels, ksize, ksize),而全連接層為shape=(out_features, in_features)。例如,如果層從卷積層變?yōu)槿B接層,in_features = channels * width * height則以下關(guān)系成立。width, height >> ksize考慮到這一點(diǎn),在很多情況下,全連接層參數(shù)的內(nèi)存需求大大超過了卷積層。

由于FPGA內(nèi)部有豐富的SRAM緩沖區(qū),因此擅長處理內(nèi)存訪問量大和內(nèi)存數(shù)據(jù)相對(duì)于計(jì)算總量的大量復(fù)用。單個(gè)全連接層不會(huì)復(fù)用權(quán)重?cái)?shù)據(jù),但是在視頻處理等連續(xù)處理中,這是一個(gè)優(yōu)勢(shì),因?yàn)橐M(jìn)行多次全連接。

另一方面,本文標(biāo)題中也提到的邊緣環(huán)境使用小型FPGA,因此可能會(huì)出現(xiàn)SRAM容量不足而需要訪問外部DRAM的情況。如果你有足夠的內(nèi)存帶寬,你可以按原樣訪問它,但如果你沒有足夠的內(nèi)存帶寬,你可以在參數(shù)調(diào)整和訓(xùn)練后對(duì)模型應(yīng)用稱為剪枝和量化的操作。

池化層

池化層是對(duì)輸入圖像進(jìn)行縮小的過程,這次使用的方法叫做2×2 MaxPooling。在這個(gè)過程中,取輸入圖像2x2區(qū)域的最大值作為輸出圖像一個(gè)像素的值。這個(gè)看第二張圖也很容易理解,所以我再貼一遍。

d1e5c2dc-b8ec-11ed-bfe3-dac502259ad0.png

即使在池化層,輸入圖像有多個(gè)通道,但池化過程本身是針對(duì)每個(gè)通道獨(dú)立執(zhí)行的。因此,輸入圖像中的通道數(shù)和輸出圖像中的通道數(shù)在池化層中始終相等。

池化層的實(shí)現(xiàn)如下所示:

voidmaxpool2d(constfloat*x,int32_twidth,int32_theight,int32_tchannels,int32_tstride,float*y){
for(intch=0;ch

這個(gè)函數(shù)的接口是:

此實(shí)現(xiàn)省略了邊緣處理,因此圖像的寬度和高度都必須能被stride整除。

輸入

x: 輸入圖像。shape=(channels, height, width)

輸出

y: 輸出圖像。shape=(channels, height/stride, width/stride)

參數(shù)

width: 圖像寬度

height: 圖像高度

stride:減速比

ReLU

ReLU 非常簡單,因?yàn)樗皇菍⒇?fù)值設(shè)置為 0。

voidrelu(constfloat*x,int64_tsize,float*y){
for(int64_ti=0;i

由于每個(gè)元素的處理是完全獨(dú)立的,x, y因此未指定內(nèi)存布局。

硬件生成

到這里為止的內(nèi)容,各層的功能都已經(jīng)完成了。按照上一篇文章中的步驟,可以確認(rèn)這次創(chuàng)建的函數(shù)也產(chǎn)生了與 libtorch 相同的輸出。此外,Vivado HLS 生成了一個(gè)通過 RTL 仿真的電路。從這里開始,我將簡要說明實(shí)際生成了什么樣的電路。

如果將上述linear函數(shù)原樣輸入到 Vivado HLS,則會(huì)發(fā)生錯(cuò)誤。這里,將輸入輸出設(shè)為指針->數(shù)組是為了決定在電路制作時(shí)用于訪問數(shù)組的地址的位寬。另外,in_features的值為778=392,out_將features的值固定為32。這是為了避免Vivado HLS 在循環(huán)次數(shù)可變時(shí)輸出性能不佳。

staticconststd::size_tkMaxSize=65536;

voidlinear_hls(constfloatx[kMaxSize],constfloatweight[kMaxSize],
constfloatbias[kMaxSize],floaty[kMaxSize]){
dnnk::linear(x,weight,bias,7*7*8,32,y);
}

linear_hls函數(shù)的綜合報(bào)告中的“性能估計(jì)”如下所示:

d1fd7c74-b8ec-11ed-bfe3-dac502259ad0.png

在Timing -> Summary中寫入了綜合時(shí)指定的工作頻率,此時(shí)的工作頻率為5.00 ns = 200MHz。重要的是 Latency -> Summary 部分,它描述了執(zhí)行此函數(shù)時(shí)的周期延遲(Latency(cycles))和實(shí)時(shí)延遲(Latency(absolute))??纯催@個(gè),我們可以看到這個(gè)全連接層在 0.566 ms內(nèi)完成。

在 Latency -> Detail -> Loop 列中,描述了每個(gè)循環(huán)的一次迭代所需的循環(huán)次數(shù)(Iteration Latency)和該循環(huán)的迭代次數(shù)(Trip Count)。延遲(周期)包含Iteration Latency * Trip Count +循環(huán)初始化成本的值。Loop 1 是out_features循環(huán)到loop 1.1 in_features。在Loop1.1中進(jìn)行sum += x[j] * weight[i * in_features + j]; 簡單計(jì)算會(huì)發(fā)現(xiàn)需要 9 個(gè)周期才能完成 Loop 1.1 所做的工作。

使用HLS中的“Schedule Viewer”功能,可以更詳細(xì)地了解哪些操作需要花費(fèi)更多長時(shí)間。下圖橫軸的2~10表示Loop1.1的處理內(nèi)容,大致分為x,weights等的加載2個(gè)循環(huán),乘法(fmul)3個(gè)循環(huán),加法(fadd)4個(gè)循環(huán)共計(jì)9個(gè)循環(huán)。

d21899a0-b8ec-11ed-bfe3-dac502259ad0.png

在使用 HLS 進(jìn)行開發(fā)期間通過添加#pragma HLS pipeline指令,向此代碼添加優(yōu)化指令以指示它創(chuàng)建高效的硬件。與普通的 FPGA 開發(fā)類似,運(yùn)算單元的流水線化和并行化經(jīng)常用于優(yōu)化。通過這些優(yōu)化,HLS 報(bào)告證實(shí)了加速:

流水線:減少迭代延遲(min=1)

并行化:減少行程次數(shù),刪除循環(huán)

正如之前也說過幾次的那樣,這次的課程首先是以FPGA推理為目的,所以不會(huì)進(jìn)行上述的優(yōu)化。有興趣進(jìn)行什么樣的優(yōu)化的人,可以參考以下教程和文檔。

教程

https://github.com/Xilinx/HLS-Tiny-Tutorials

文檔

https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_2/ug902-vivado-high-level-synthesis.pdf

最后,該函數(shù)的接口如下所示。

d245d35c-b8ec-11ed-bfe3-dac502259ad0.png

由于本次沒有指定接口,所以數(shù)組接口如x_ 等ap_memory對(duì)應(yīng)FPGA上可以1個(gè)周期讀寫的存儲(chǔ)器(BRAM/Distributed RAM)。在下一篇文章中,我們將連接每一層的輸入和輸出,但在這種情況下,我們計(jì)劃連接 FPGA 內(nèi)部的存儲(chǔ)器作為每一層之間的接口,如本例所示。

總結(jié)

在本文中,我們實(shí)現(xiàn)了全連接層、池化層和 ReLU?,F(xiàn)在我們已經(jīng)實(shí)現(xiàn)了所有層,我們將在下一篇文章中組合它們。之后我們會(huì)實(shí)際給MNIST數(shù)據(jù),確認(rèn)我們可以做出正確的推論。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1645

    文章

    22033

    瀏覽量

    617730
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141423
  • 人工智能
    +關(guān)注

    關(guān)注

    1806

    文章

    48983

    瀏覽量

    248854
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75180
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5560

    瀏覽量

    122747

原文標(biāo)題:從FPGA說起的深度學(xué)習(xí)(四)

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    相比GPU和GPP,FPGA深度學(xué)習(xí)的未來?

    設(shè)計(jì)工具日漸成熟,如今將FPGA集成到常用的深度學(xué)習(xí)框架已成為可能。未來,FPGA將有效地適應(yīng)深度學(xué)習(xí)
    發(fā)表于 07-28 12:16 ?7566次閱讀

    FPGA深度學(xué)習(xí)應(yīng)用中或?qū)⑷〈鶪PU

    現(xiàn)場可編程門陣列 (FPGA) 解決了 GPU 在運(yùn)行深度學(xué)習(xí)模型時(shí)面臨的許多問題 在過去的十年里,人工智能的再一次興起使顯卡行業(yè)受益匪淺。英偉達(dá) (Nvidia) 和 AMD 等公司的股價(jià)也大幅
    發(fā)表于 03-21 15:19

    FPGA深度學(xué)習(xí)能走多遠(yuǎn)?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問題(一) Q:FPGA深度學(xué)習(xí)能走多遠(yuǎn)?現(xiàn)在用FPGA
    發(fā)表于 09-27 20:53

    【詳解】FPGA深度學(xué)習(xí)的未來?

    的固定架構(gòu)之外進(jìn)行模型優(yōu)化探究。同時(shí),FPGA在單位能耗下性能更強(qiáng),這對(duì)大規(guī)模服務(wù)器部署或資源有限的嵌入式應(yīng)用的研究而言至關(guān)重要。本文硬件加速的視角考察深度學(xué)習(xí)
    發(fā)表于 08-13 09:33

    為什么說FPGA是機(jī)器深度學(xué)習(xí)的未來?

    都出現(xiàn)了重大突破。深度學(xué)習(xí)是這些領(lǐng)域中所最常使用的技術(shù),也被業(yè)界大為關(guān)注。然而,深度學(xué)習(xí)模型需要極為大量的數(shù)據(jù)和計(jì)算能力,只有更好的硬件加速條件,才能滿足現(xiàn)有數(shù)據(jù)和模型規(guī)模繼續(xù)擴(kuò)大的需
    發(fā)表于 10-10 06:45

    什么是深度學(xué)習(xí)?使用FPGA進(jìn)行深度學(xué)習(xí)的好處?

    上述分類之外,還被用于多項(xiàng)任務(wù)(下面顯示了四個(gè)示例)。在 FPGA 上進(jìn)行深度學(xué)習(xí)的好處我們已經(jīng)提到,許多服務(wù)和技術(shù)都使用深度學(xué)習(xí),而 GP
    發(fā)表于 02-17 16:56

    銅管巴倫說起

    銅管巴倫說起
    發(fā)表于 09-12 16:50 ?86次下載

    FPGA深度學(xué)習(xí)的未來

    FPGA深度學(xué)習(xí)的未來,學(xué)習(xí)資料,感興趣的可以看看。
    發(fā)表于 10-26 15:29 ?0次下載

    深度學(xué)習(xí)方案ASIC、FPGA、GPU比較 哪種更有潛力

    幾乎所有深度學(xué)習(xí)的研究者都在使用GPU,但是對(duì)比深度學(xué)習(xí)硬鑒方案,ASIC、FPGA、GPU三種究竟哪款更被看好?主要是認(rèn)清對(duì)
    發(fā)表于 02-02 15:21 ?1.1w次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>方案ASIC、<b class='flag-5'>FPGA</b>、GPU比較 哪種更有潛力

    FPGA深度學(xué)習(xí)領(lǐng)域的應(yīng)用

    本文硬件加速的視角考察深度學(xué)習(xí)FPGA,指出有哪些趨勢(shì)和創(chuàng)新使得這些技術(shù)相互匹配,并激發(fā)對(duì)FPGA如何幫助
    的頭像 發(fā)表于 06-28 17:31 ?7197次閱讀

    FPGA深度學(xué)習(xí)加速的技能總結(jié)

    深度學(xué)習(xí)加速器已經(jīng)兩年了,RTL設(shè)計(jì)到仿真驗(yàn)證,以及相應(yīng)的去了解了Linux驅(qū)動(dòng),深度學(xué)習(xí)壓縮方法等等。
    的頭像 發(fā)表于 03-08 16:29 ?9196次閱讀
    <b class='flag-5'>FPGA</b>做<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>加速的技能總結(jié)

    FPGA深度學(xué)習(xí)領(lǐng)域有哪些優(yōu)勢(shì)?

    FPGA(Field-Programmable Gate Array)是一種靈活的可編程硬件設(shè)備,它在深度學(xué)習(xí)應(yīng)用領(lǐng)域中具有許多優(yōu)勢(shì)。
    的頭像 發(fā)表于 03-09 09:41 ?2122次閱讀

    FPGA說起深度學(xué)習(xí):任務(wù)并行性

    這是新的系列教程,在本教程中,我們將介紹使用 FPGA 實(shí)現(xiàn)深度學(xué)習(xí)的技術(shù),深度學(xué)習(xí)是近年來人工智能領(lǐng)域的熱門話題。
    的頭像 發(fā)表于 04-12 10:19 ?1313次閱讀

    FPGA說起深度學(xué)習(xí):數(shù)據(jù)并行性

    這是新的系列教程,在本教程中,我們將介紹使用 FPGA 實(shí)現(xiàn)深度學(xué)習(xí)的技術(shù),深度學(xué)習(xí)是近年來人工智能領(lǐng)域的熱門話題。
    的頭像 發(fā)表于 05-04 11:22 ?1732次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>FPGA</b><b class='flag-5'>說起</b>的<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>:數(shù)據(jù)并行性

    FPGA加速深度學(xué)習(xí)模型的案例

    FPGA(現(xiàn)場可編程門陣列)加速深度學(xué)習(xí)模型是當(dāng)前硬件加速領(lǐng)域的一個(gè)熱門研究方向。以下是一些FPGA加速深度
    的頭像 發(fā)表于 10-25 09:22 ?1187次閱讀