




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
使用FPGA實(shí)現(xiàn)深度學(xué)習(xí)技術(shù)應(yīng)用這是新的系列教程,在本教程中,我們將介紹使用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è)贛NIST數(shù)據(jù)集上創(chuàng)建并訓(xùn)練了一個(gè)網(wǎng)絡(luò)模型。從本文開始,為了在FPGA上運(yùn)行推理處理,我們將首先用C++編寫推理處理代碼。在這篇C++實(shí)現(xiàn)的第一篇文章中,我們開始針對(duì)卷積層的C++實(shí)現(xiàn)。具體內(nèi)容是(1)卷積層的實(shí)現(xiàn),(2)運(yùn)算校驗(yàn)(C驗(yàn)證,C/RTL協(xié)同驗(yàn)證)(就是HLS的流程)。卷積層實(shí)現(xiàn)在上一篇文章中,我解釋了卷積層是對(duì)圖像的過濾過程,但是并沒有解釋輸入輸出通道如何處理,過濾時(shí)圖像的邊緣處理等。由于本文旨在實(shí)現(xiàn)層面的理解,因此我將詳細(xì)介紹這些要點(diǎn)。處理I/O通道在圖像處理中,對(duì)RGB輸入圖像進(jìn)行噪聲去除等濾波處理,并頻繁地進(jìn)行RGB圖像的處理。在這種情況下,卷積過程往往是針對(duì)每個(gè)通道(R/G/B)獨(dú)立完成的,輸入的G/B通道值不影響輸出的R通道結(jié)果。每通道獨(dú)立卷積另一方面,在卷積層中執(zhí)行的卷積過程中,所有輸入通道的值影響每個(gè)輸出通道。因此,對(duì)于輸出圖像的每個(gè)像素(輸出通道,Y坐標(biāo),X坐標(biāo)),所有輸入通道和周圍的像素區(qū)域都會(huì)參與計(jì)算,導(dǎo)致計(jì)算量非常大。使用所有通道的卷積另外,如上所述每個(gè)通道獨(dú)立卷積的卷積層稱為DepthwiseConvolution。這通常用于減少計(jì)算量的網(wǎng)絡(luò)模型,例如MobileNet(https://arxiv.org/abs/1704.04861)。圖像邊緣處理在對(duì)圖像進(jìn)行卷積處理時(shí),圖像邊緣的處理往往是一個(gè)問題。由于卷積過程在計(jì)算某個(gè)像素時(shí)使用了周圍像素,因此對(duì)于沒有周圍像素的像素,例如圖像邊緣的像素,就無法獲取周圍像素。卷積神經(jīng)網(wǎng)絡(luò)主要通過以下兩種方式處理邊緣像素。無填充:輸出圖像減少了輸入圖像的卷積區(qū)域。補(bǔ)零:將輸入圖像預(yù)先用卷積區(qū)域擴(kuò)展,用零填充該區(qū)域,對(duì)原始輸入圖像進(jìn)行卷積處理。沒有填充的卷積的圖形表示如下所示:在這種情況下,輸出圖像將是比輸入圖像小一個(gè)濾波器尺寸的區(qū)域(橙色部分)。如果內(nèi)核大小為3(中心像素+/-1),則輸出圖像大小在寬度和高度上都將為-2,因?yàn)閳D像之外的1個(gè)像素是無法進(jìn)行卷積的區(qū)域。無填充卷積:輸出圖像縮小接下來,零填充的圖形表示如下所示。在這個(gè)例子中,預(yù)先在輸入圖像的外部添加了一個(gè)值為0的區(qū)域(灰色區(qū)域),進(jìn)行卷積,這樣就不會(huì)出現(xiàn)圖像縮小現(xiàn)象。如果內(nèi)核大小為3,則帶填充的輸入圖像大小在寬度和高度上均為+2,因?yàn)?1像素將添加到屏幕外部且值為零。零填充卷積:輸出圖像大小保持不變?cè)谖覀兊哪P椭?,我們?cè)谒芯矸e層中使用零填充。C代碼如果根據(jù)目前為止的解釋用C語言實(shí)現(xiàn)卷積過程,它將類似于下面的代碼。
void
conv2d(const
float*
x,
const
float*
weight,
const
float*
bias,
int32_t
width,
int32_t
height,
int32_t
in_channels,
int32_t
out_channels,
int32_t
ksize,
float*
y)
{
for
(int32_t
och
=
0;
och
<
out_channels;
++och)
{
for
(int32_t
h
=
0;
h
<
height;
++h)
{
for
(int32_t
w
=
0;
w
<
width;
++w)
{
float
sum
=
0.f;
for
(int32_t
ich
=
0;
ich
<
in_channels;
++ich)
{
for
(int32_t
kh
=
0;
kh
<
ksize;
++kh)
{
for
(int32_t
kw
=
0;
kw
<
ksize;
++kw)
{
int32_t
ph
=
h
+
kh
-
ksize/2;
int32_t
pw
=
w
+
kw
-
ksize/2;
//
zero
padding
if
(ph
<
0
||
ph
>=
height
||
pw
<
0
||
pw
>=
width)
{
continue;
}
int64_t
pix_idx
=
(ich
*
height
+
ph)
*
width
+
pw;
int64_t
weight_idx
=
((och
*
in_channels
+
ich)
*
ksize
+
kh)
*
ksize
+
kw;
sum
+=
x[pix_idx]
*
weight[weight_idx];
}
}
}
//
add
bias
sum
+=
bias[och];
y[(och
*
height
+
h)
*
width
+
w]
=
sum;
}
}
}
}此函數(shù)的解釋如下所示:輸入--x:輸入圖像。shape=(in_channels,height,width)--weight:權(quán)重因子。shape=(out_channels,in_channels,ksize,ksize)--bias:偏置值。shape=(out_channels)輸出--y:輸出圖像。shape=(out_channels,height,width)參數(shù):--width:輸入/輸出圖像的寬度--height:輸入/輸出圖像高度--in_channels:輸入圖像的通道數(shù)--out_channels:輸出圖像的通道數(shù)--ksize:內(nèi)核大小每個(gè)輸入/輸出的內(nèi)存布局shape=(...)如表格所示,但floatx[in_channels][height][width];將其視為定義為三維數(shù)組。卷積層的處理是一個(gè)6級(jí)循環(huán)。第一個(gè)三級(jí)循環(huán)確定輸出圖像上的位置,隨后的三級(jí)循環(huán)對(duì)該位置執(zhí)行卷積操作。零填充在第24-26行完成。由于實(shí)際創(chuàng)建零填充輸入圖像是低效的,所以零填充是通過在訪問圖像外部時(shí)不參與乘積之和來實(shí)現(xiàn)的。第31行是卷積過程中的積和運(yùn)算部分,這個(gè)積和運(yùn)算out_channels*height*width*in_channels*ksize*ksize進(jìn)行了兩次。這個(gè)卷積過程的操作數(shù)量非常大,在很多情況下,卷積層支配著卷積神經(jīng)網(wǎng)絡(luò)的執(zhí)行時(shí)間。這就是為什么計(jì)算單元比CPU多的GPU和FPGA更適合處理神經(jīng)網(wǎng)絡(luò)。第37行是偏差處理部分。到目前為止,我還沒有觸及什么是偏差處理,但正如我在這里所寫的那樣,它是一個(gè)簡(jiǎn)單地對(duì)輸出值進(jìn)行偏移的過程。這種偏差處理在輸入通道/內(nèi)核大小(Y,X)循環(huán)之外,因此處理步驟的數(shù)量非常微不足道。運(yùn)算檢查作為對(duì)上一節(jié)創(chuàng)建的函數(shù)運(yùn)行的確認(rèn),conv2d我們將比較結(jié)果是否足夠接近在PyTorch的C++API(libtorch)上執(zhí)行的卷積計(jì)算。每個(gè)測(cè)試包括以下兩個(gè)步驟。C.驗(yàn)證C/RTL協(xié)同驗(yàn)證1、C驗(yàn)證類似于正常的軟件開發(fā),gcc只是用通用的編譯器編譯源代碼并檢查結(jié)果。2、C/RTL協(xié)同驗(yàn)證是使用AMD-Xilinx提供的高階綜合工具VitisHLS進(jìn)行驗(yàn)證。對(duì)于此驗(yàn)證,HLS首先將C源代碼轉(zhuǎn)換為VerilogHDL等RTL。然后在Vivado中對(duì)生成的RTL執(zhí)行功能仿真。在這個(gè)邏輯仿真中,將一個(gè)類似于C驗(yàn)證的數(shù)據(jù)序列輸入到創(chuàng)建的電路中,確認(rèn)輸出結(jié)果是否正確。本節(jié)以后的內(nèi)容將以運(yùn)行創(chuàng)建的源代碼的形式進(jìn)行說明。源代碼將在后面發(fā)布。運(yùn)行環(huán)境運(yùn)行環(huán)境面向Linux機(jī)器。不支持Windows/Mac操作系統(tǒng)。此外,由于預(yù)裝gcc版本,該發(fā)行版針對(duì)Ubuntu18.04。難以自行準(zhǔn)備運(yùn)行環(huán)境的朋友,看看就行。需要以下工具。Vivado
2020.2(推薦2019.2)cmake>=3.11cmake比較麻煩,因?yàn)樗枰陌姹颈萢pt等包管理器可以安裝的版本高,但是可以下載預(yù)構(gòu)建的二進(jìn)制文件(cmake--Linux-x86_64.tar.gz)。C.驗(yàn)證測(cè)試代碼/tests/ref/conv2d.cc的使用,我不會(huì)在本文中詳細(xì)介紹,但測(cè)試將是一個(gè)正常的隨機(jī)測(cè)試??梢园凑找韵虏襟E構(gòu)建代碼。請(qǐng)將-DVIVADO_HLS_ROOT的值相應(yīng)地替換為安裝的Vivado的路徑。$
mkdir
/build$
cd
/build$
cmake
..
-DVIVADO_HLS_ROOT=/tools/Xilinx/Vivado/2022.2$
cmake
--build
.使用以下命令進(jìn)行測(cè)試:如果沒有任何錯(cuò)誤,那它就是成功的。$
ctest
-V
-R
"conv2d_ref"C/RTL協(xié)同驗(yàn)證運(yùn)行以下命令以使用HLS啟動(dòng)C/RTL協(xié)同驗(yàn)證。大約需要5分鐘。$
ctest
-V
-R
"conv2d_hls_cosim"當(dāng)執(zhí)行C/RTL協(xié)同驗(yàn)證時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)HLS項(xiàng)目文件,因此可以使用它來檢查高級(jí)綜合和RTL仿真波形的結(jié)果。要檢查這一點(diǎn),請(qǐng)使用以下命令啟動(dòng)HLS:$
vitis_hls
&HLS打開后,單擊“打開項(xiàng)目”,如下所示,導(dǎo)航到/build/tests/hls/conv2d/conv2d_hls_cosim目錄并單擊“確定”。然后,HLS綜合報(bào)告將顯示如下屏幕所示。從此報(bào)告中,可以看到從PerformanceEstimates列創(chuàng)建的電路的估計(jì)性能,以及從UtilizationEstimates看到在目標(biāo)設(shè)備上實(shí)施時(shí)的估計(jì)資源使用情況。點(diǎn)擊頂部紅框包圍的區(qū)域,可以看到仿
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖北鐵道運(yùn)輸職業(yè)學(xué)院《高等分子生物學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《會(huì)展材料與工藝》2023-2024學(xué)年第二學(xué)期期末試卷
- 東北石油大學(xué)《鋼琴配彈》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西生物科技職業(yè)學(xué)院《綜合美術(shù)手工》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅建筑職業(yè)技術(shù)學(xué)院《土木工程概論雙語》2023-2024學(xué)年第二學(xué)期期末試卷
- 宿遷職業(yè)技術(shù)學(xué)院《論文與寫作》2023-2024學(xué)年第二學(xué)期期末試卷
- 德州職業(yè)技術(shù)學(xué)院《創(chuàng)新思維與創(chuàng)新方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 瀘州職業(yè)技術(shù)學(xué)院《抽樣技術(shù)與應(yīng)用實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南寧理工學(xué)院《過程分子生物學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 許昌職業(yè)技術(shù)學(xué)院《自然辯證法概論自然辯證法概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 人工智能在地球觀測(cè)中的應(yīng)用-深度研究
- 2023年中小學(xué)心理健康教育課程標(biāo)準(zhǔn)
- 煤礦各類重大災(zāi)害預(yù)兆
- 《銀行業(yè)金融機(jī)構(gòu)安全評(píng)估標(biāo)準(zhǔn)》
- 邏輯思維訓(xùn)練500題(帶答案)
- 政務(wù)公開培訓(xùn)課件模板
- 鹽城市首屆“金聯(lián)杯”防范和打擊非法金融活動(dòng)競(jìng)賽練習(xí)卷含答案(一)
- 新材料與綠色制造的關(guān)系研究
- 頂管工作井最小尺寸的確定及頂力計(jì)算書
- 烤煙房買賣合同范文
- 兒童鉆石畫課件
評(píng)論
0/150
提交評(píng)論