電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用Tensil和PYNQ在PYNQ Z1 FPGA板上運(yùn)行機(jī)器學(xué)習(xí)

使用Tensil和PYNQ在PYNQ Z1 FPGA板上運(yùn)行機(jī)器學(xué)習(xí)

2023-06-14 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

介紹

教程將使用PYNQ Z1開發(fā)板和Tensil 的開源推理加速器來展示如何在 FPGA 上運(yùn)行機(jī)器學(xué)習(xí) (ML) 模型。我們將使用在 CIFAR 數(shù)據(jù)集上訓(xùn)練的 ResNet-20。這些步驟應(yīng)該適用于任何受支持的 ML 模型——目前支持所有常見的最先進(jìn)的卷積神經(jīng)網(wǎng)絡(luò)。用你的模型試試吧!

我們將提供易于理解的詳細(xì)端到端報(bào)道。此外,我們還提供了深入的解釋,以便更好地了解其背后的技術(shù),包括 Tensil 和Xilinx Vivado工具鏈和PYNQ 框架。

如果您遇到問題或發(fā)現(xiàn)錯(cuò)誤,您可以在我們的Discord上提問或發(fā)送電子郵件至support@tensil.ai。

pYYBAGNYtROABAshAATdeiNTE-A273.png
?

概述

在開始之前,讓我們看一下 Tensil 工具鏈流程,以鳥瞰我們想要完成的任務(wù)。我們將按照以下步驟操作:

  • 獲取張力
  • 選擇架構(gòu)
  • 生成 TCU 加速器設(shè)計(jì)(RTL 代碼)
  • 為 PYNQ Z1 合成
  • 為 TCU 編譯 ML 模型
  • 使用 PYNQ 執(zhí)行
pYYBAGNYtRaAQy8bAAA7S1F49vc285.png
?

1.獲取張力

首先,我們需要獲取 Tensil 工具鏈。最簡(jiǎn)單的方法是從 Docker Hub 中拉出 Tensil docker 容器。以下命令將拉取映像,然后運(yùn)行容器。

docker pull tensilai/tensil
docker run -v $(pwd):/work -w /work -it tensilai/tensil bash

2.選擇架構(gòu)

Tensil 的優(yōu)勢(shì)在于可定制性,使其適用于非常廣泛的應(yīng)用。Tensil 架構(gòu)定義文件 (.tarch) 指定要實(shí)現(xiàn)的架構(gòu)的參數(shù)。這些參數(shù)使 Tensil 足夠靈活,可以用于小型嵌入式 FPGA 以及大型數(shù)據(jù)中心 FPGA。我們的示例將選擇在 PYNQ Z1 板核心的 XC7Z020 FPGA 部件上提供最高資源利用率的參數(shù)。容器映像方便地包含 PYNQ Z1 開發(fā)板的架構(gòu)文件,位于/demo/arch/pynqz1.tarch. 讓我們來看看里面有什么。

{
    "data_type": "FP16BP8",
    "array_size": 8,
    "dram0_depth": 1048576,
    "dram1_depth": 1048576,
    "local_depth": 8192,
    "accumulator_depth": 2048,
    "simd_registers_depth": 1,
    "stride0_depth": 8,
    "stride1_depth": 8
}

該文件包含一個(gè)帶有多個(gè)參數(shù)的 JSON 對(duì)象。第一個(gè)data_type定義了整個(gè)張量計(jì)算單元 (TCU) 中使用的數(shù)據(jù)類型,包括脈動(dòng)數(shù)組、SIMD ALU、累加器和本地內(nèi)存。我們將使用 16 位定點(diǎn)和 8 位基點(diǎn) ( FP16BP8),這在大多數(shù)情況下允許對(duì) 32 位浮點(diǎn)模型進(jìn)行簡(jiǎn)單舍入,而無需量化。接下來,array_size定義一個(gè) 8x8 的脈動(dòng)陣列大小,這會(huì)產(chǎn)生 64 個(gè)并行乘法累加 (MAC) 單元。選擇此數(shù)字是為了平衡 XC7Z020 上可用的 DSP 單元的利用率,以防您需要將一些 DSP 并行用于另一個(gè)應(yīng)用程序,但您可以增加它以獲得更高的 TCU 性能。

使用dram0_depthdram1_depth,我們定義主機(jī)端 DRAM0 和 DRAM1 內(nèi)存緩沖區(qū)的大小。這些緩沖區(qū)為 TCU 提供模型的權(quán)重和輸入,并存儲(chǔ)中間結(jié)果和輸出。請(qǐng)注意,這些內(nèi)存大小是向量的數(shù)量,這意味著數(shù)組大小 (8) 乘以數(shù)據(jù)類型大小(16 位),每個(gè)向量總共 128 位。

接下來,我們定義將在 FPGA 架構(gòu)本身上實(shí)現(xiàn)的內(nèi)存local的大小。accumulator累加器和本地存儲(chǔ)器之間的區(qū)別在于,累加器可以執(zhí)行寫累加操作,其中輸入被添加到已經(jīng)存儲(chǔ)的數(shù)據(jù)中,而不是簡(jiǎn)單地覆蓋它。再次選擇累加器加上本地內(nèi)存的總大小來平衡 XC7Z020 上 BRAM 資源的利用率,以防其他地方需要資源。

使用simd_registers_depth,我們指定每個(gè) SIMD ALU 中包含的寄存器數(shù)量,它可以對(duì)用于 ML 操作(如 ReLU 激活)的存儲(chǔ)向量執(zhí)行 SIMD 操作。很少需要增加這個(gè)數(shù)字,以幫助計(jì)算特殊的激活函數(shù)。最后,stride0_depth指定stride1_depth用于啟用“跨步”內(nèi)存讀取和寫入的位數(shù)。您不太可能需要更改此參數(shù)。

3.生成TCU加速器設(shè)計(jì)(RTL代碼)

現(xiàn)在我們已經(jīng)選擇了我們的架構(gòu),是時(shí)候運(yùn)行 Tensil RTL 生成器了。RTL 代表“寄存器傳輸級(jí)別”——它是一種代碼類型,用于指定數(shù)字邏輯內(nèi)容,如線路、寄存器和低級(jí)邏輯。Xilinx Vivado 或yosys等特殊工具可以為 FPGA 甚至 ASIC 合成 RTL。

要使用我們選擇的架構(gòu)生成設(shè)計(jì),請(qǐng)?jiān)?Tensil 工具鏈 docker 容器中運(yùn)行以下命令:

tensil rtl -a /demo/arch/pynqz1.tarch -s true

ARTIFACTS該命令將生成最后打印出來的表格中列出的幾個(gè) Verilog 文件。它還RTL SUMMARY使用生成的 RTL 的一些基本參數(shù)打印表格。

----------------------------------------------------------------------
RTL SUMMARY
----------------------------------------------------------------------
Data type:                                      FP16BP8   
Array size:                                     8         
Consts memory size (vectors/scalars/bits):      1,048,576 8,388,608 20
Vars memory size (vectors/scalars/bits):        1,048,576 8,388,608 20
Local memory size (vectors/scalars/bits):       8,192     65,536    13
Accumulator memory size (vectors/scalars/bits): 2,048     16,384    11
Stride #0 size (bits):                          3         
Stride #1 size (bits):                          3         
Operand #0 size (bits):                         16        
Operand #1 size (bits):                         24        
Operand #2 size (bits):                         16        
Instruction size (bytes):                       8         
----------------------------------------------------------------------

4. 為 PYNQ Z1 合成

現(xiàn)在是啟動(dòng) Xilinx Vivado 的時(shí)候了。我將使用版本 2021.2,您可以在Xilinx 網(wǎng)站上免費(fèi)下載(用于原型制作) 。

在創(chuàng)建新的 Vivado 項(xiàng)目之前,您需要從此處下載 PYNQ Z1 電路板定義文件。打開包裝并將它們放入/tools/Xilinx/Vivado/2021.2/data/boards/board_files/. (請(qǐng)注意,此路徑包括 Vivado 版本。)解壓后,您需要在工具 -> 設(shè)置 -> 電路板存儲(chǔ)庫(kù)中添加電路板文件路徑。

poYBAGNYtRiAZDDiAACfZ59Uiqw612.png
?

首先,創(chuàng)建一個(gè)名為的新 RTL 項(xiàng)目tensil-pynqz1并添加由 Tensil RTL 工具生成的 Verilog 文件。

pYYBAGNYtR2AZGXEAADus4mPhGE553.png
?

選擇板并搜索 PYNQ。選擇文件版本為 1.0 的 PYNQ-Z1。

poYBAGNYtSCAXB39AADDCGCH0o8658.png
?

在 IP INTEGRATOR 下,單擊創(chuàng)建模塊設(shè)計(jì)。

pYYBAGNYtSKAOjX8AABTq9Ms-34095.png
?

從 Sources 選項(xiàng)卡拖到模塊設(shè)計(jì)圖上。top_pynqz1您應(yīng)該會(huì)看到 Tensil RTL 塊及其接口。

poYBAGNYtSWAWbcQAAAZrKs0MEc784.png
?

接下來,單擊框圖工具欄(左上角)中的加號(hào)按鈕并選擇“ZYNQ7 處理系統(tǒng)”(您可能需要使用搜索框)。+對(duì)“處理器系統(tǒng)重置”執(zhí)行相同操作。Zynq 模塊代表賽靈思平臺(tái)的“硬”部分,包括 ARM 處理器、DDR 接口等等。Processor System Reset 是一個(gè)實(shí)用工具箱,可為設(shè)計(jì)提供正確同步的復(fù)位信號(hào)。

單擊“運(yùn)行塊自動(dòng)化”和“運(yùn)行連接自動(dòng)化”。檢查“所有自動(dòng)化”。

雙擊 ZYNQ7 處理系統(tǒng)。首先,進(jìn)入時(shí)鐘配置并確保 PL Fabric Clocks 已檢查 FCLK_CLK0 并將其設(shè)置為 50MHz。

pYYBAGNYtSeAE9zQAAC8a8Ttufc487.png
?

然后,進(jìn)入 PS-PL 配置。檢查S AXI HP0 FPD、S AXI HP1 FPDS AXI HP2 FPD。這些更改將配置我們?cè)O(shè)計(jì)所需的處理系統(tǒng) (PS) 和可編程邏輯 (PL) 之間的所有必要接口。

poYBAGNYtSyAfndmAADRipVxoOU857.png
?

再次單擊 Block Diagram 工具欄中的加號(hào)+按鈕并選擇“AXI SmartConnect”。我們需要 4 個(gè) SmartConnect 實(shí)例。前 3 個(gè)實(shí)例 ( smartconnect_0to smartconnect_2) 是在 PS 上將 TCU 的 AXI 版本 4 接口和指令 DMA 塊轉(zhuǎn)換為 AXI 版本 3 所必需的。smartconnect_3DMA 控制寄存器暴露給 Zynq CPU 是必要的,這將使軟件能夠控制 DMA 事務(wù)。雙擊每一個(gè)并將“從屬和主接口數(shù)”設(shè)置為 1。

pYYBAGNYtS6AQtGdAAA47LJSBg0376.png
?

現(xiàn)在,將Tensil 塊上的對(duì)應(yīng)地連接m_axi_dram0到on 上。然后將 SmartConnect端口相應(yīng)地連接到Zynq 模塊Zynq 模塊上。TCU 有兩個(gè) DRAM 組,通過使用具有專用連接到內(nèi)存的 PS 端口來實(shí)現(xiàn)它們的并行操作。m_axi_dram1 portsS00_AXIsmartconnect_0smartconnect_1M00_AXIS_AXI_HP0S_AXI_HP2

接下來,單擊 Block Diagram 工具欄中的加號(hào)+按鈕并選擇“AXI Direct Memory Access”(DMA)。DMA 塊用于組織 Tensil 程序到 TCU 的饋送,而不會(huì)使 PS ARM 處理器保持忙碌。

雙擊它。禁用“Scatter Gather Engine”和“Write Channel”。將“緩沖區(qū)長(zhǎng)度寄存器的寬度”更改為 26 位。選擇“Memory Map Data Width”和“Stream Data Width”為64位。將“最大突發(fā)大小”更改為 256。

pYYBAGNYtTGAUTx2AACH7GKaTH0473.png
?

instruction將Tensiltop模塊上的端口連接到M_AXIS_MM2SAXI DMA 模塊上的端口。然后,將M_AXI_MM2SAXI DMA 模塊連接到S00_AXIon smartconnect_2,最后,將smartconnect_2M00_AXI端口連接到S_AXI_HP1Zynq。

連接M00_AXIAXI DMA 塊上smartconnect_3。將AXI SmartConnectS_AXI_LITE連接到Zynq 模塊。S00_AXIM_AXI_GP0

最后,單擊“運(yùn)行連接自動(dòng)化”并選中“所有自動(dòng)化”。通過這樣做,我們連接了所有的時(shí)鐘和復(fù)位。單擊 Block Diagram 工具欄中的“Regenerate Layout”按鈕,使圖表看起來更漂亮。

poYBAGNYtTOAA6KvAAEmP9TL65M016.png
?

接下來,切換到“地址編輯器”選項(xiàng)卡。單擊工具欄中的“全部分配”按鈕。通過這樣做,我們將地址空間分配給各種 AXI 接口。例如,指令 DMA ( axi_dma_0) 和 Tensil ( m_axi_dram0and m_axi_dram1) 可以訪問 PYNQ Z1 板上的整個(gè)地址空間。PS 可以訪問指令 DMA 的控制寄存器。

poYBAGNYtTeAbMydAADdG6MbWmg490.png
?

返回“框圖”選項(xiàng)卡,單擊“驗(yàn)證設(shè)計(jì)”(或 F6)按鈕。您應(yīng)該會(huì)看到通知您驗(yàn)證成功的消息!您現(xiàn)在可以通過單擊x右上角的來關(guān)閉 Block Design。

最后一步是為我們的設(shè)計(jì)創(chuàng)建 HDL 包裝器,它將把所有東西聯(lián)系在一起并支持綜合和實(shí)現(xiàn)。右鍵單擊tensil_pynqz1Sources 選項(xiàng)卡中的項(xiàng)目并選擇“Create HDL Wrapper”。保持選中“讓 Vivado 管理包裝器和自動(dòng)更新”。等待 Sources 樹完全更新并右鍵單擊tensil_pynqz1_wrapper. 選擇設(shè)置為頂部。

現(xiàn)在是時(shí)候讓 Vivado 執(zhí)行綜合和實(shí)現(xiàn)并寫入生成的比特流了。在 Flow Navigator 側(cè)邊欄中,單擊“Generate Bitstream”并點(diǎn)擊 OK。Vivado 將開始合成我們的 Tensil 設(shè)計(jì)——這可能需要大約 15 分鐘。完成后,您可以在項(xiàng)目摘要中觀察一些重要的統(tǒng)計(jì)數(shù)據(jù)。首先,查看利用率,它顯示了我們的設(shè)計(jì)正在使用的每個(gè) FPGA 資源的百分比。請(qǐng)注意我們?nèi)绾螌?BRAM 和 DSP 利用率保持在相當(dāng)?shù)偷乃健?/font>

pYYBAGNYtTmAQzmgAAAxYW3SP3M518.png
?

第二個(gè)是時(shí)序,它告訴我們信號(hào)在我們的可編程邏輯 (PL) 中傳播需要多長(zhǎng)時(shí)間。“Worst Negative Slack”是一個(gè)正數(shù)是個(gè)好消息——我們的設(shè)計(jì)在指定時(shí)鐘速度下滿足所有網(wǎng)絡(luò)的傳播約束!

poYBAGNYtTuAFFlQAAAnNuyJ7_U095.png
?

5. 為 TCU 編譯 ML 模型

Tensil 工具鏈流程的第二個(gè)分支是將 ML 模型編譯為由 TCU 指令組成的 Tensil 二進(jìn)制文件,這些指令由 TCU 硬件直接執(zhí)行。在本教程中,我們將使用在 CIFAR 數(shù)據(jù)集上訓(xùn)練的 ResNet20。該模型包含在 Tensil 泊塢窗圖像中,位于/demo/models/resnet20v2_cifar.onnx. 在 Tensil docker 容器中,運(yùn)行以下命令。

tensil compile -a /demo/arch/pynqz1.tarch -m /demo/models/resnet20v2_cifar.onnx -o "Identity:0" -s true

我們使用的是模型的 ONNX 版本,但 Tensil 編譯器也支持 TensorFlow,您可以通過在 TensorFlow 凍結(jié)圖形式編譯相同的模型來嘗試/demo/models/resnet20v2_cifar.pb

tensil compile -a /demo/arch/pynqz1.tarch -m /demo/models/resnet20v2_cifar.pb -o "Identity" -s true

生成的編譯文件列在ARTIFACTS表中。清單 ( tmodel) 是已編譯模型的純文本 JSON 描述。Tensil 程序 ( tprog) 和權(quán)重?cái)?shù)據(jù) ( tdata) 都是 TCU 在執(zhí)行期間使用的二進(jìn)制文件。Tensil 編譯器還會(huì)打印一個(gè)COMPILER SUMMARY表格,其中包含 TCU 架構(gòu)和模型的有趣統(tǒng)計(jì)數(shù)據(jù)。

------------------------------------------------------------------------------------------
COMPILER SUMMARY
------------------------------------------------------------------------------------------
Model:                                           resnet20v2_cifar_onnx_pynqz1 
Data type:                                       FP16BP8                      
Array size:                                      8                            
Consts memory size (vectors/scalars/bits):       1,048,576                    8,388,608 20
Vars memory size (vectors/scalars/bits):         1,048,576                    8,388,608 20
Local memory size (vectors/scalars/bits):        8,192                        65,536    13
Accumulator memory size (vectors/scalars/bits):  2,048                        16,384    11
Stride #0 size (bits):                           3                            
Stride #1 size (bits):                           3                            
Operand #0 size (bits):                          16                           
Operand #1 size (bits):                          24                           
Operand #2 size (bits):                          16                           
Instruction size (bytes):                        8                            
Consts memory maximum usage (vectors/scalars):   71,341                       570,728   
Vars memory maximum usage (vectors/scalars):     26,624                       212,992   
Consts memory aggregate usage (vectors/scalars): 71,341                       570,728   
Vars memory aggregate usage (vectors/scalars):   91,170                       729,360   
Number of layers:                                23                           
Total number of instructions:                    258,037                      
Compilation time (seconds):                      25.487                       
True consts scalar size:                         568,466                      
Consts utilization (%):                          97.545                       
True MACs (M):                                   61.476                       
MAC efficiency (%):                              0.000                        
------------------------------------------------------------------------------------------

6.使用PYNQ執(zhí)行

現(xiàn)在是時(shí)候?qū)⑺袞|西放在我們的開發(fā)板上了。為此,我們首先需要設(shè)置 PYNQ 環(huán)境。這個(gè)過程從為我們的開發(fā)板下載 SD 卡映像開始。PYNQ 文檔網(wǎng)站上有設(shè)置板連接的詳細(xì)說明。您應(yīng)該能夠打開 Jupyter 筆記本并運(yùn)行一些示例。

現(xiàn)在 PYNQ 已經(jīng)啟動(dòng)并運(yùn)行了,下一步是scpPYNQ 的 Tensil 驅(qū)動(dòng)程序。首先將Tensil GitHub 存儲(chǔ)庫(kù)克隆到您的工作站,然后復(fù)制drivers/tcu_pynq/home/xilinx/tcu_pynq您的板上。

git clone git@github.com:tensil-ai/tensil.git
scp -r tensil/drivers/tcu_pynq xilinx@192.168.2.99:

我們還需要scp比特流和編譯器工件。

接下來,我們將復(fù)制比特流,其中包含由 Vivado 綜合和實(shí)現(xiàn)產(chǎn)生的 FPGA 配置。PYNQ 還需要一個(gè)硬件切換文件,該文件描述主機(jī)可訪問的 FPGA 組件,例如 DMA。將兩個(gè)文件都/home/xilinx放在開發(fā)板上。假設(shè)您位于 Vivado 項(xiàng)目目錄中,請(qǐng)運(yùn)行以下命令復(fù)制文件。

scp tensil-pynqz1.runs/impl_1/tensil_pynqz1_wrapper.bit xilinx@192.168.2.99:tensil_pynqz1.bit
scp tensil-pynqz1.gen/sources_1/bd/tensil_pynqz1/hw_handoff/tensil_pynqz1.hwh xilinx@192.168.2.99:

請(qǐng)注意,我們重命名了比特流以匹配硬件切換文件名。

.tmodel現(xiàn)在,將編譯器生成的、.tprog.tdata工件復(fù)制到/home/xilinx板上。

scp resnet20v2_cifar_onnx_pynqz1.t* xilinx@192.168.2.99:

運(yùn)行我們的 ResNet 模型的最后一件事是 CIFAR 數(shù)據(jù)集。您可以從Kaggle獲取它或運(yùn)行以下命令(由于我們只需要測(cè)試批次,因此我們刪除了訓(xùn)練批次以減小文件大?。?。把這些文件/home/xilinx/cifar-10-batches-py/放在你的開發(fā)板上。

wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
tar xfvz cifar-10-python.tar.gz
rm cifar-10-batches-py/data_batch_*
scp -r cifar-10-batches-py xilinx@192.168.2.99:

我們終于準(zhǔn)備好啟動(dòng) PYNQ Jupyter notebook 并在 TCU 上運(yùn)行 ResNet 模型。

Jupyter 筆記本

首先,我們導(dǎo)入 Tensil PYNQ 驅(qū)動(dòng)程序和其他必需的實(shí)用程序。

import sys
sys.path.append('/home/xilinx')

# Needed to run inference on TCU
import time
import numpy as np
import pynq
from pynq import Overlay
from tcu_pynq.driver import Driver
from tcu_pynq.architecture import pynqz1

# Needed for unpacking and displaying image data
%matplotlib inline
import matplotlib.pyplot as plt
import pickle

現(xiàn)在,從比特流初始化 PYNQ 覆蓋并使用 TCU 架構(gòu)和覆蓋的 DMA 配置實(shí)例化 Tensil 驅(qū)動(dòng)程序。請(qǐng)注意,我們axi_dma_0從疊加層傳遞對(duì)象——名稱與 Vivado 設(shè)計(jì)中的 DMA 模塊匹配。

overlay = Overlay('/home/xilinx/tensil_pynqz1.bit')
tcu = Driver(pynqz1, overlay.axi_dma_0)

Tensil PYNQ 驅(qū)動(dòng)程序包括 PYNQ Z1 架構(gòu)定義。這里是摘錄自architecture.py:您可以看到它與我們之前使用的架構(gòu)相匹配。

pynqz1 = Architecture(
    data_type=DataType.FP16BP8,
    array_size=8,
    dram0_depth=1048576,
    dram1_depth=1048576,
    local_depth=8192,
    accumulator_depth=2048,
    simd_registers_depth=1,
    stride0_depth=8,
    stride1_depth=8,
)

接下來,讓我們從test_batch.

def unpickle(file):
    with open(file, 'rb') as fo:
        d = pickle.load(fo, encoding='bytes')
    return d

cifar = unpickle('/home/xilinx/cifar-10-batches-py/test_batch')
data = cifar[b'data']
labels = cifar[b'labels']

data = data[10:20]
labels = labels[10:20]

data_norm = data.astype('float32') / 255
data_mean = np.mean(data_norm, axis=0)
data_norm -= data_mean

cifar_meta = unpickle('/home/xilinx/cifar-10-batches-py/batches.meta')
label_names = [b.decode() for b in cifar_meta[b'label_names']]

def show_img(data, n):
    plt.imshow(np.transpose(data[n].reshape((3, 32, 32)), axes=[1, 2, 0]))

def get_img(data, n):
    img = np.transpose(data_norm[n].reshape((3, 32, 32)), axes=[1, 2, 0])
    img = np.pad(img, [(0, 0), (0, 0), (0, tcu.arch.array_size - 3)], 'constant', constant_values=0)
    return img.reshape((-1, tcu.arch.array_size))

def get_label(labels, label_names, n):
    label_idx = labels[n]
    name = label_names[label_idx]
    return (label_idx, name)

要進(jìn)行測(cè)試,請(qǐng)?zhí)崛∑渲幸粡垐D像。

n = 7
img = get_img(data, n)
label_idx, label = get_label(labels, label_names, n)
show_img(data, n)

你應(yīng)該看到圖像。

poYBAGNYtT2AfjwZAAAm3oVjfnk778.png
?

接下來,tmodel將模型的清單加載到驅(qū)動(dòng)程序中。清單告訴驅(qū)動(dòng)程序在哪里可以找到其他兩個(gè)二進(jìn)制文件(程序和權(quán)重?cái)?shù)據(jù))。

tcu.load_model('/home/xilinx/resnet20v2_cifar_onnx_pynqz1.tmodel')

最后,運(yùn)行模型并打印結(jié)果!調(diào)用tcu.run(inputs)是魔法發(fā)生的地方。我們將 ResNet 分類結(jié)果向量轉(zhuǎn)換為 CIFAR 標(biāo)簽。請(qǐng)注意,如果您使用的是 ONNX 模型,則輸入和輸出分別命名為x:0Identity:0。對(duì)于 TensorFlow 模型,它們被命名為xIdentity

inputs = {'x:0': img}

start = time.time()
outputs = tcu.run(inputs)
end = time.time()
print("Ran inference in {:.4}s".format(end - start))
print()

classes = outputs['Identity:0'][:10]
result_idx = np.argmax(classes)
result = label_names[result_idx]
print("Output activations:")
print(classes)
print()
print("Result: {} (idx = {})".format(result, result_idx))
print("Actual: {} (idx = {})".format(label, label_idx))

這是預(yù)期的結(jié)果:

Ran inference in 0.1513s

Output activations:
[-19.49609375 -12.37890625  -8.01953125  -6.01953125  -6.609375
  -4.921875    -7.71875      2.0859375   -9.640625    -7.85546875]

Result: horse (idx = 7)
Actual: horse (idx = 7)

恭喜!您運(yùn)行了一個(gè)機(jī)器學(xué)習(xí)模型,一個(gè)您在自己的工作站上構(gòu)建的自定義 ML 加速器!想象一下你可以用它做的事情......

包起來

在本教程中,我們使用 Tensil 展示了如何在 FPGA 上運(yùn)行機(jī)器學(xué)習(xí) (ML) 模型。我們經(jīng)歷了許多步驟,包括安裝 Tensil、選擇架構(gòu)、生成 RTL 設(shè)計(jì)、綜合設(shè)計(jì)、編譯 ML 模型,最后使用 PYNQ 執(zhí)行模型。

如果你一路走來,那么恭喜你!通過嘗試自己的模型和架??構(gòu),您已準(zhǔn)備好將事情提升到一個(gè)新的水平。加入我們的Discord打個(gè)招呼并提出問題,或發(fā)送電子郵件至support@tensil.ai。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)