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

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

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

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

OpenFPGA ? 來(lái)源:OpenFPGA ? 2023-04-12 10:19 ? 次閱讀

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

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

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

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

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

從這篇文章中,我們將從之前創(chuàng)建的網(wǎng)絡(luò)模型中提取并行性,并確認(rèn)處理速度得到了提高。首先,我們檢查當(dāng)前模型的架構(gòu),并考慮什么樣的并行化是可性的。

并行化方法研究

當(dāng)前模型架構(gòu)的框圖如下所示。限于篇幅省略了maxpool2d和relu。

4673b262-d8d7-11ed-bfe3-dac502259ad0.png

在這個(gè)模塊中,conv1、conv2、fc1、fc2都是作為不同的模塊實(shí)現(xiàn)的。FPGA內(nèi)部的SRAM在每一層之間插入一個(gè)緩沖區(qū)(x', x'', x''' ),這個(gè)緩沖區(qū)成為每一層的輸入和輸出。此后,每一層(conv1、conv2、fc1、fc2)被稱為一個(gè)任務(wù)。

順序處理(基線)

下圖顯示了使用該模塊對(duì) 3 幀圖像執(zhí)行推理處理時(shí)的執(zhí)行時(shí)間可視化。

每個(gè)任務(wù)的執(zhí)行時(shí)間以推理模塊的實(shí)際運(yùn)行波形為準(zhǔn),是conv2>conv1>fc1>fc2的關(guān)系。在該模塊中,conv1、conv2、fc1和fc2作為單獨(dú)的任務(wù)實(shí)施,但是這些任務(wù)一次只能運(yùn)行一個(gè)(后面會(huì)解釋原因)。因此,如果將conv1、conv2、fc1、fc2各層的執(zhí)行時(shí)間作為最終的執(zhí)行時(shí)間,則這3幀圖像的t0, t1, t2, t3處理時(shí)間為3 * (t0 + t1 + t2 + t3)

4688c59e-d8d7-11ed-bfe3-dac502259ad0.png

任務(wù)并行度

假設(shè)我們可以修復(fù)這些任務(wù)并發(fā)運(yùn)行。這種情況下的執(zhí)行時(shí)間如下所示,多個(gè)任務(wù)可以同時(shí)處理不同的幀。

469925ce-d8d7-11ed-bfe3-dac502259ad0.png

提取并行性使多個(gè)任務(wù)可以同時(shí)運(yùn)行,稱為任務(wù)并行化。在這個(gè)過(guò)程中,conv2的執(zhí)行時(shí)間占主導(dǎo)地位,所以3幀的處理時(shí)間為t0 + 3 * t1 + t2 + t3。

理想的任務(wù)并行度

最后,我們考慮可以理想地執(zhí)行任務(wù)并行化的模式。如上所述,如果只提取任務(wù)并行性,最慢的任務(wù)就會(huì)成為瓶頸,整體處理速度會(huì)受到該任務(wù)性能的限制。因此,最有效的任務(wù)并行是所有任務(wù)都具有相同的執(zhí)行時(shí)間。

46a94d82-d8d7-11ed-bfe3-dac502259ad0.png

在這種情況下,處理時(shí)間t0 + 3 * t1 + t2 + t3保持不變,但t0 = t1 = t2 = t3調(diào)整了每個(gè)任務(wù)的執(zhí)行時(shí)間,從而提高了性能。在本課程中,實(shí)現(xiàn)這種加速的技術(shù)被稱為循環(huán)并行化和數(shù)據(jù)并行化。這兩種并行度提取方法將在下一篇文章中介紹。

任務(wù)并行化

在本文中,第一個(gè)目標(biāo)是執(zhí)行任務(wù)并行化。

由于這次創(chuàng)建的模塊中有多個(gè)任務(wù),貌似已經(jīng)可以并行處理了,但在實(shí)際波形中并不是這樣。之所以不能并行化,是因?yàn)樽鳛閤', x'', x'''任務(wù)間接口的buffer()不能被多個(gè)任務(wù)同時(shí)使用。對(duì)于任務(wù)并行化,任務(wù)之間的接口必須可以同時(shí)被兩個(gè)或多個(gè)任務(wù)讀寫。

在這個(gè)模塊x'中,任務(wù)級(jí)并行化是通過(guò)在任務(wù)之間使用乒乓緩沖區(qū)來(lái)實(shí)現(xiàn)的。乒乓緩沖區(qū)有兩個(gè)緩沖區(qū),一個(gè)用于寫入,一個(gè)用于讀取。帶有乒乓緩沖器的框圖如下所示:

46bf7300-d8d7-11ed-bfe3-dac502259ad0.png 帶有乒乓緩沖器的推理模塊

如果以這種方式配置電路,存儲(chǔ) conv1 輸出的緩沖區(qū)和 conv2 從中讀取輸入的緩沖區(qū)是分開(kāi)的,因此 conv1 和 conv2 可以同時(shí)運(yùn)行。雖然圖中省略了,但所有層都可以通過(guò)雙緩沖conv2 <-> fc1,fc1 <-> fc2同時(shí)操作。

要在 RTL 中實(shí)現(xiàn)這一點(diǎn),準(zhǔn)備兩個(gè)緩沖區(qū)并實(shí)現(xiàn)切換機(jī)制會(huì)很麻煩,但在 Vivado/Vitis HLS 中,只需添加一些 pragma 即可實(shí)現(xiàn)這種并行化。

代碼更改

對(duì)于此任務(wù)并行化,我們需要添加以下三種類型的編譯指示。

#pragmaHLSdataflow
#pragmaHLSstable
#pragmaHLSinterfaceap_ctrl_chain

在解釋每個(gè)pragma的作用之前,我先inference_dataflow展示一下新增函數(shù)的源代碼。與第五篇中的inference_top函數(shù)重疊的部分省略。

60voidinference_dataflow(constfloatx[kMaxSize],
61constfloatweight0[kMaxSize],constfloatbias0[kMaxSize],
62constfloatweight1[kMaxSize],constfloatbias1[kMaxSize],
63constfloatweight2[kMaxSize],constfloatbias2[kMaxSize],
64constfloatweight3[kMaxSize],constfloatbias3[kMaxSize],
65floaty[kMaxSize]){
66#pragmaHLSdataflow
67#pragmaHLSinterfacem_axiport=xoffset=slavebundle=gmem0
...
76#pragmaHLSinterfacem_axiport=yoffset=slavebundle=gmem9
77#pragmaHLSinterfaces_axiliteport=xbundle=control
...
86#pragmaHLSinterfaces_axiliteport=ybundle=control
87#pragmaHLSinterfaces_axiliteport=returnbundle=control
88#pragmaHLSinterfaceap_ctrl_chainport=returnbundle=control
89
90#pragmaHLSstablevariable=x
91#pragmaHLSstablevariable=weight0
92#pragmaHLSstablevariable=bias0
93#pragmaHLSstablevariable=weight1
94#pragmaHLSstablevariable=bias1
95#pragmaHLSstablevariable=weight2
96#pragmaHLSstablevariable=bias2
97#pragmaHLSstablevariable=weight3
98#pragmaHLSstablevariable=bias3
99#pragmaHLSstablevariable=y
100
101dnnk::inference(x,
102weight0,bias0,
103weight1,bias1,
104weight2,bias2,
105weight3,bias3,
106y);
107}

第66 行添加#pragma HLS dataflow的 pragma使inference_dataflow這些內(nèi)部函數(shù)之間的接口成為乒乓緩沖區(qū)并啟用任務(wù)并行化。第 101 行調(diào)用的函數(shù)dnnk::inference是下面的函數(shù),它通過(guò)第 20 行的#pragma HLS inline編譯指示在函數(shù)內(nèi)inference_dataflow內(nèi)嵌展開(kāi)。因此,諸如 conv2d, relu的函數(shù)符合任務(wù)并行化的條件,它們的接口 ( x1, x2, ...) 是一個(gè)乒乓緩沖區(qū)。

14staticvoidinference(constfloat*x,
15constfloat*weight0,constfloat*bias0,
16constfloat*weight1,constfloat*bias1,
17constfloat*weight2,constfloat*bias2,
18constfloat*weight3,constfloat*bias3,
19float*y){
20#pragmaHLSinline
...
34
35//1stlayer
36conv2d(x,weight0,bias0,kWidths[0],kHeights[0],kChannels[0],kChannels[1],3,x1);
37relu(x1,kWidths[0]*kHeights[0]*kChannels[1],x2);
38maxpool2d(x2,kWidths[0],kHeights[0],kChannels[1],2,x3);
39
...
48
49//4thlayer
50linear(x8,weight3,bias3,kChannels[3],kChannels[4],y);
51}

inference_dataflow從函數(shù)的第90行#pragma HLS stable開(kāi)始,在x, weight0, y輸入/輸出等函數(shù)inference_dataflow的入口/出口處自動(dòng)完成同步。如果不去掉這個(gè)同步,兩個(gè)進(jìn)程之間就會(huì)產(chǎn)生依賴,比如“上一幀y輸出完成->下一幀x輸入準(zhǔn)備好”,多任務(wù)就不行了。另請(qǐng)參閱Vivado HLS 官方文檔 ( UG902 ),了解有關(guān)穩(wěn)定陣列部分的詳細(xì)說(shuō)明。

最后,inference_dataflow該函數(shù)第88行的pragma修改了外部寄存器接口,使得#pragma HLS interface ap_ctrl_chain port=return該函數(shù)可以用于同時(shí)處理多個(gè)幀。inference_dataflow如果沒(méi)有這個(gè) pragma,即使你實(shí)現(xiàn)了 ping-pong 緩沖區(qū),主機(jī)端也只會(huì)嘗試一個(gè)一個(gè)地執(zhí)行它們,性能不會(huì)提高。

綜合結(jié)果確認(rèn)

可以在檢查綜合時(shí)檢查任務(wù)并行化是否順利進(jìn)行。

下面是HLS綜合結(jié)果報(bào)告,Latency -> Summary一欄列出了整個(gè)函數(shù)的延遲和執(zhí)行間隔(Interval)。在這里,整體延遲仍然是所有任務(wù)處理時(shí)間的總和,但執(zhí)行間隔的值conv2d_232_U0與第二個(gè)卷積層的執(zhí)行周期數(shù)相匹配。該模塊的吞吐量是第二個(gè)卷積層執(zhí)行間隔的倒數(shù)。

46dfb890-d8d7-11ed-bfe3-dac502259ad0.png

正如本文開(kāi)頭所解釋的,conv2d_232_U0處理時(shí)間成為此任務(wù)并行化后電路中的瓶頸。任務(wù)并行化的速度提升率為947407 / 504898 = 1.88倍。

通過(guò)這種方式,我們能夠確認(rèn) HLS 能夠正確實(shí)現(xiàn)任務(wù)并行化。

總結(jié)

在本文中,我們通過(guò)提取任務(wù)并行性來(lái)加速處理。本來(lái)conv2占用了一半以上的執(zhí)行時(shí)間,所以提速幅度不到2倍,如果設(shè)置為N,最大提速為N倍。

在下一篇文章中,我們將通過(guò)對(duì)卷積層應(yīng)用數(shù)據(jù)并行化和循環(huán)并行化來(lái)解決每一層處理時(shí)間的不平衡。

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

    關(guān)注

    1629

    文章

    21736

    瀏覽量

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

    關(guān)注

    1791

    文章

    47279

    瀏覽量

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

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73651
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3243

    瀏覽量

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

    關(guān)注

    73

    文章

    5503

    瀏覽量

    121162

原文標(biāo)題:從FPGA說(shuō)起的深度學(xué)習(xí)(六)-任務(wù)并行性

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于HLS之任務(wù)級(jí)并行編程

    ,用戶要手工添加DATAFLOWpragma,工具會(huì)在該pragma指定的區(qū)域內(nèi)判別任務(wù)之間的并行性,生成各進(jìn)程之間的模塊級(jí)控制信號(hào)。對(duì)于數(shù)據(jù)驅(qū)動(dòng)型,用于需要明確指定可并行執(zhí)行的任務(wù)。
    的頭像 發(fā)表于 07-27 09:22 ?1289次閱讀
    基于HLS之<b class='flag-5'>任務(wù)</b>級(jí)<b class='flag-5'>并行</b>編程

    淺析HLS的任務(wù)級(jí)并行性

    HLS的任務(wù)級(jí)并行性(Task-level Parallelism)分為兩種:一種是控制驅(qū)動(dòng)型;一種是數(shù)據(jù)驅(qū)動(dòng)型。
    的頭像 發(fā)表于 07-27 09:21 ?942次閱讀
    淺析HLS的<b class='flag-5'>任務(wù)</b>級(jí)<b class='flag-5'>并行性</b>

    FPGA在人工智能中的應(yīng)用有哪些?

    FPGA(現(xiàn)場(chǎng)可編程門陣列)在人工智能領(lǐng)域的應(yīng)用非常廣泛,主要體現(xiàn)在以下幾個(gè)方面: 一、深度學(xué)習(xí)加速 訓(xùn)練和推理過(guò)程加速:FPGA可以用來(lái)加速深度
    發(fā)表于 07-29 17:05

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

    支持不同的數(shù)據(jù)精度、量化和激活函數(shù)等。這種靈活性使其能夠適應(yīng)各種深度學(xué)習(xí)任務(wù),為不同的應(yīng)用場(chǎng)景提供定制化的解決方案。 ? 低功耗:FPGA 是可編程的,可以在設(shè)計(jì)中僅使用所需的計(jì)算資源
    發(fā)表于 09-27 20:53

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

    深度利用流水線并行,這與前饋深度學(xué)習(xí)方法自然契合?,F(xiàn)代FPGA還支持部分動(dòng)態(tài)重新配置,當(dāng)
    發(fā)表于 08-13 09:33

    Python中的并行性和并發(fā)性分析

      在Python編程語(yǔ)言當(dāng)中,很多人對(duì)Python中的并行性和并發(fā)性不了解。今天我們將討論python中的并發(fā)和并行性www.zpedu.com。在這里,我們將研究Python的多線程,多處
    發(fā)表于 08-21 17:45

    阻止任務(wù)級(jí)別并行性的常見(jiàn)情況

    粗粒度并行優(yōu)化的任務(wù)級(jí)流水阻止任務(wù)級(jí)別并行性的常見(jiàn)情況
    發(fā)表于 03-09 06:58

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

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

    算法隱含并行性的物理模型

    算法隱含并行性的物理模型:利用物理學(xué)原理對(duì)算法的隱含并行性進(jìn)行了分析,提出算法的不確定性和高熵態(tài)是隱含并行性出現(xiàn)的根源,但算法的隱含并行性會(huì)導(dǎo)致算法結(jié)果的不確定
    發(fā)表于 10-21 08:23 ?10次下載

    英特爾架構(gòu)中的多線程優(yōu)化和擴(kuò)展并行性的編程技術(shù)

    有效并行縮減和擴(kuò)展并行性的編程技術(shù)。
    的頭像 發(fā)表于 11-01 06:24 ?2225次閱讀

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

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

    如何在不需要特殊庫(kù)或類的情況下實(shí)現(xiàn)C代碼并行性?

    提取實(shí)現(xiàn)任務(wù)級(jí) (task_level) 的硬件并行算法是設(shè)計(jì)高效的HLS IP內(nèi)核的關(guān)鍵。 在本文中,我們將重點(diǎn)放在如何能夠在不需要特殊的庫(kù)或類的情況下修改代碼風(fēng)格以實(shí)現(xiàn)C代碼實(shí)現(xiàn)并行性
    的頭像 發(fā)表于 02-11 11:05 ?1430次閱讀
    如何在不需要特殊庫(kù)或類的情況下實(shí)現(xiàn)C代碼<b class='flag-5'>并行性</b>?

    FPGA說(shuō)起深度學(xué)習(xí)

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

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

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

    Vitis HLS:使用任務(wù)級(jí)并行性的高性能設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《Vitis HLS:使用任務(wù)級(jí)并行性的高性能設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 09-13 17:21 ?0次下載
    Vitis HLS:使用<b class='flag-5'>任務(wù)</b>級(jí)<b class='flag-5'>并行性</b>的高性能設(shè)計(jì)