吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從FPGA說起的深度學習:數據并行性

OpenFPGA ? 來源:OpenFPGA ? 2023-05-04 11:22 ? 次閱讀

這是新的系列教程,在本教程中,我們將介紹使用 FPGA 實現深度學習的技術,深度學習是近年來人工智能領域的熱門話題

在本教程中,旨在加深對深度學習和 FPGA 的理解。

用 C/C++ 編寫深度學習推理代碼

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

FPGA 運行驗證

在之前的文章中,我們已經依次抽取了推理核的任務并行度和循環并行度。在本文中,我們將提取推理內核的數據并行性。

數據并行

數據并行性表示待處理數據之間的并行度。

下面的代碼是一個簡單的向量加法運算,但是由于c[0]和c[1]計算之間沒有依賴關系,所以可以同時計算。這種并行性就是數據并行性。

for(inti=0;i

另一方面,在以下處理的情況下,b[1]的值取決于b[0] ,因此在這種情況下無法提取數據并行性。

for(inti=0;i

補充一下和上次討論的循環并行的區別,在循環并行中,每個進程都在一個流水線中執行。因此,上述向量相加處理的處理波形如下。

9cc9902a-e6db-11ed-ab56-dac502259ad0.png

循環并行

另一方面,提取數據并行性對應于復制運算單元。復制兩個計算器時的波形如下。

9cd2fe80-e6db-11ed-ab56-dac502259ad0.png

數據并行

處理數據并行性的難點在于,我們提取的數據并行性越多,消耗的硬件資源就越多。訪問內存資源(加載/存儲)特別容易出現問題。請注意,FPGA 中的 BRAM 每個周期最多只能發出 2 次加載/存儲,因此如果每個周期需要超過 3 次加載/存儲,則 BRAM 將加倍(如果訪問目標是 BRAM)。

如下圖所示,可以同時提取循環并行度和數據并行度。

9cdba256-e6db-11ed-ab56-dac502259ad0.png

數據+循環并行

本文所有代碼都是數據+循環并行的同時提取。

卷積處理中的數據并行

在卷積過程的6級循環(輸出通道,y坐標,x坐標,輸入通道,內核y方向,內核x方向)中可以提取出各種并行性。

在本文中,我們將提取其中兩者的并行性,提高內核的性能。

首先,可以提取的并行度是下圖所示的處理像素之間的并行度。

9ce5027e-e6db-11ed-ab56-dac502259ad0.png 處理像素之間的并行性

由于橙色和藍色像素的計算是相互獨立的,所以它們可以同時進行。此外,用于卷積計算的內核(黃色)可以為兩種計算共享。因此,一個過程(兩個卷積)所需的內存訪問是兩次像素讀取和一次內核讀取。

第二種并行度是下圖所示的輸出通道之間的并行度。

9cef501c-e6db-11ed-ab56-dac502259ad0.png 輸出通道之間的并行度

由于黃色和藍色核的卷積計算是相互獨立的,所以它們也可以同時進行。在這個例子中,內核需要兩次讀取,但像素只需要一次讀取。一個進程(卷積)所需的內存訪問是一次像素讀取和兩次內核讀取。

兩種并行性的圖形表示如下所示。2個pixel reads和2個kernel reads可以計算出4個輸出值。

9cfcf564-e6db-11ed-ab56-dac502259ad0.png 處理像素之間的并行度+輸出通道之間的并行度

基于此圖要實現的HW框圖如下。

9d07aa36-e6db-11ed-ab56-dac502259ad0.png 卷積處理塊

此處重要的是計算單元 (PE) 可以以網格模式排列。

僅對一個通道(像素/輸出通道)進行數據并行化時,并行度只排列一個n算子。n前面提到,并行度的增加會導致內存資源使用量的增加,比如BRAM,在一個通道進行并行化時無法充分使用DSP

另一方面,如上圖所示,如果將兩個通道并行化,則像素側的并行度設為n,輸出通道側的并行度設為m,則總內存訪問端口數相對于n+m的增加量,運算器可以排列n*m個。這樣一來,FPGA中的大部分資源都可以分配給運算。許多DNN體系結構(如xDNN)都是這樣同時提取多通道數據并行性的。

代碼更改

由于兩個通道的數據并行化是完全一樣的,本文只描述兩個通道并行化的結果。另外,在上一篇文章中使用移位寄存器達到了II=1,但是這里我們使用以前的版本。后面會介紹使用方法。

修改后的卷積函數如下所示:完整的代碼后續會開源。

203template
204staticvoidconv2d_unrolled_v2(constfloat*x,constfloat*weight,constfloat*bias,int32_twidth,int32_theight,
205int32_tin_channels,int32_tout_channels,int32_tksize,float*y){
206
207for(int32_tblock_och=0;block_och

主要變化如下。

1、添加模板參數UNROLL_X, UNROLL_OCH(L203)

2、將輸出通道回路更改為 2 級(L207、L217、L247)

3、將 x 方向循環更改為 2 步(L209、L219、L249)

4、重復總和寄存器 (L210)

5、添加了新的編譯指示unroll(L218、L220、L248、L250)

6、設置內循環管道II為4(L216)

1、添加了一個模板參數,以便可以在外部指定函數的性能。Vivado HLS / Vitis 與 C++ 模板的兼容性非常好,不僅可以像這次這樣使用,還可以像這樣進行設置#pragma HLS pipeline II=。對于習慣寫Verilog HDL等的人來說,parameter幾乎可以像模塊語法一樣使用。

2中執行的輸出通道更改為 2 級,內部循環旋轉了數據并行化時的并行度,local_och外部block_och循環旋轉了UNROLL_OCH寬度。如果這樣做,當輸出通道數UNROLL_OCH不是2的倍數時,會發生數組元素之外的訪問,因此需要像 L221 這樣的處理。

此外,local_och循環被移動到原始代碼中最內層循環的循環內kw。此更改不會影響此問題的輸出,但請注意,根據正在處理的問題,可能存在更改輸出的依賴項。

3和2的修改完全一樣,4的求和寄存器變成了存儲上述格運算單元(PE)計算結果的寄存器。

5#pragma HLS unroll是用于將數據并行性應用于循環并布置多個運算單元的編譯指示。默認情況下,運算符根據循環的迭代次數重復,但factor=N可以通過提供參數來控制運算符的重復次數。

由于我們將這個 pragma 設置為local_och, local_w兩個循環,所以 L223-239 中的求和操作和 L252-L256 中的偏置加法和輸出操作UNROLL_W * UNROLL_OCH是重復的。看起來L239進行x, weight的加載處理也UNROLL_W * UNROLL_OCH加了1,但是由于編譯器優化,每個端口UNROLL_W, UNROLL_OCH只加1。

6中設置的II=4的值就是我們在上一篇文章中看到的處理延遲。在上一篇文章中,我介紹了一種使用移位寄存器實現如下波形的技術。

9d0e791a-e6db-11ed-ab56-dac502259ad0.png

在這個例子中,我們使用了一個移位寄存器來處理每個周期切換輸出目標寄存器,但是如果你像這次做數據并行化,你只需要每個周期切換數據作為計算目標。我只是更改了左側的標簽,但是如果對此進行說明,它將如下圖所示。

9d151018-e6db-11ed-ab56-dac502259ad0.png

如果這樣做,就不需要像上次那樣需要移位寄存器之間的求和,所以效率很高。

設置 II=4 的另一個原因是x, weight端口數。它們基本上是作為 BRAM 實現的,每個周期總共允許兩次讀/寫。由于x只是在卷積層處理的過程中被卷積層讀取,所以每個周期最多可以讀取2次,但是這樣一來,當數據并行化的并行度設置為4時,端口數就不夠用了。

由于這次II=4,當并行度為4時,每4個周期供給4個數據就足夠了。它只需要 1 個讀取端口,因此 BRAM 默認帶寬就足夠了。快速說明如果想要超過 16 度的并行度該怎么做,這可以通過#pragma HLS array_partition pragma來完成,下面附上UG902中的示意圖。

9d24e8c6-e6db-11ed-ab56-dac502259ad0.png

C 中定義的數組默認為 1 端口數組,如圖中左側所示。如果它像我在上一篇/這篇文章中使用的那樣擴展為一個寄存器,或者如果它被并發訪問,就像在這個complete循環 其實適當設置這個pragma而不降低II才是王道,但是這個pragma必須定義在數組資源(本次函數)的定義范圍內,而且改變需要時間,所以這次沒有使用。

綜合結果/性能

使用x方向平行度為4、輸出通道方向平行度為4的卷積函數綜合推理函數。由于這個卷積函數如上所述有II=4,所以它每4個周期執行16次操作。在這個配置中,需要的運算單元個數為16/4 = 4,每個內存的訪問端口為一個4/4 = 1端口。

查看綜合結果,卷積函數中浮點運算單元資源使用量變化如下。

9d3bc014-e6db-11ed-ab56-dac502259ad0.png

原始配置有兩個 fadds 和一個 fmul,具有兩個 fadds 的那個full_dsp_1用于添加偏差。另一方面,在數據并行化后的結果中,fadd為6,fmul為4。除了偏置加法的數量full_dsp_1增加到2之外,fadd/fmul各為4,資源量符合預期。

性能報告如下,conv2的執行時間,上篇文章時為0.423ms,加速到82.875us。

9d608ab6-e6db-11ed-ab56-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21797

    瀏覽量

    606014
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40423
  • 人工智能
    +關注

    關注

    1796

    文章

    47674

    瀏覽量

    240292
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73857
  • 深度學習
    +關注

    關注

    73

    文章

    5515

    瀏覽量

    121551

原文標題:從FPGA說起的深度學習(八)-數據并行性

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    相比GPU和GPP,FPGA深度學習的未來?

    相比GPU和GPP,FPGA在滿足深度學習的硬件需求上提供了具有吸引力的替代方案。憑借流水線并行計算的能力和高效的能耗,FPGA將在一般的
    發表于 07-28 12:16 ?7498次閱讀

    淺析HLS的任務級并行性

    HLS的任務級并行性(Task-level Parallelism)分為兩種:一種是控制驅動型;一種是數據驅動型。
    的頭像 發表于 07-27 09:21 ?1006次閱讀
    淺析HLS的任務級<b class='flag-5'>并行性</b>

    FPGA在人工智能中的應用有哪些?

    FPGA(現場可編程門陣列)在人工智能領域的應用非常廣泛,主要體現在以下幾個方面: 一、深度學習加速 訓練和推理過程加速:FPGA可以用來加速深度
    發表于 07-29 17:05

    FPGA深度學習能走多遠?

    并行計算的能力,可以在硬件層面并行處理大量數據。這種并行處理能力使得 FPGA 在執行深度
    發表于 09-27 20:53

    【詳解】FPGA深度學習的未來?

    深度利用流水線并行,這與前饋深度學習方法自然契合。現代FPGA還支持部分動態重新配置,當
    發表于 08-13 09:33

    阻止任務級別并行性的常見情況

    粗粒度并行優化的任務級流水阻止任務級別并行性的常見情況
    發表于 03-09 06:58

    什么是深度學習?使用FPGA進行深度學習的好處?

    方便的進行深度學習的應用。然而,深度學習仍然主要使用 GPU 和 CPU 完成。因此,在這里我們將仔細研究使用 FPGA 進行
    發表于 02-17 16:56

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

    算法隱含并行性的物理模型:利用物理學原理對算法的隱含并行性進行了分析,提出算法的不確定性和高熵態是隱含并行性出現的根源,但算法的隱含并行性會導致算法結果的不確定
    發表于 10-21 08:23 ?10次下載

    英特爾架構中的多線程優化和擴展并行性的編程技術

    有效并行縮減和擴展并行性的編程技術。
    的頭像 發表于 11-01 06:24 ?2275次閱讀

    矢量化數據并行性的程序方面的作用

    矢量化在加速具有算法固有的數據并行性的程序方面起著至關重要的作用。 英特爾C ++編譯器提供了顯式的矢量編程方法,以提高性能。
    的頭像 發表于 11-06 06:31 ?2258次閱讀

    FPGA深度學習領域的應用

    本文硬件加速的視角考察深度學習FPGA,指出有哪些趨勢和創新使得這些技術相互匹配,并激發對FPGA如何幫助
    的頭像 發表于 06-28 17:31 ?6965次閱讀

    FPGA說起深度學習

    這是新的系列教程,在本教程中,我們將介紹使用 FPGA 實現深度學習的技術,深度學習是近年來人工智能領域的熱門話題。
    的頭像 發表于 03-03 09:52 ?1592次閱讀

    FPGA說起深度學習:任務并行性

    這是新的系列教程,在本教程中,我們將介紹使用 FPGA 實現深度學習的技術,深度學習是近年來人工智能領域的熱門話題。
    的頭像 發表于 04-12 10:19 ?1044次閱讀

    Vitis HLS:使用任務級并行性的高性能設計

    電子發燒友網站提供《Vitis HLS:使用任務級并行性的高性能設計.pdf》資料免費下載
    發表于 09-13 17:21 ?0次下載
    Vitis HLS:使用任務級<b class='flag-5'>并行性</b>的高性能設計

    FPGA加速深度學習模型的案例

    計算機主板上,以高速PCIe總線進行數據傳輸。 利用FPGA并行計算能力,快速處理大量的卷積計算。 可編程
    的頭像 發表于 10-25 09:22 ?356次閱讀
    百家乐官网投注双赢技巧| 百家乐官网试玩网站| 金博士百家乐娱乐城| 百家乐官网六手变化混合赢家打法 | 宝马会百家乐官网的玩法技巧和规则| 澳门皇冠娱乐城| 澳门百家乐怎洋赢钱| 卢克索百家乐官网的玩法技巧和规则 | 百家乐博彩技巧视频| 北京百家乐官网网上投注| 大发888官wang| 赌场百家乐攻略| 百家乐官网的奥秘| 圣淘沙百家乐官网现金网| 银河国际娱乐场| 大发888娱乐游戏--| 百家乐998| 休闲百家乐官网的玩法技巧和规则| 澳门百家乐官网技巧皇冠网| 皇室国际娱乐城| 大发888蜜月旅行| 百家乐麻将筹码币| 老k百家乐游戏| 百家乐视频聊天软件| 风水24山那个排第一| 澳门百家乐官网常赢打法| 百家乐官网真钱棋牌| 洪江市| 百家乐二代理解| 太阳城百家乐主页| 九州百家乐娱乐城| 网上百家乐骗人的| 百家乐赌术揭秘| 百家乐2号干扰| 百家乐下载游戏| 澳门百家乐论谈| 风水24山| 阴宅风水24山分金| 适合属虎做生意的名字| 百家乐官网代理合作| 百家乐官网技巧开户网址|