預(yù)計到本十年末,FPGA 芯片將主導(dǎo)物聯(lián)網(wǎng)端點深度神經(jīng)網(wǎng)絡(luò) (DNN)。它們比微控制器更節(jié)能、更快,并且比ASIC更容易開發(fā)。Infxl與Microchip合作,通過提供兩項技術(shù)優(yōu)勢來加快其采用速度:
1. 從訓(xùn)練數(shù)據(jù)到緊湊的 DNN 的簡單工具 C 語言和 HLS
2. TinyML FPGA實現(xiàn),無需重新合成或重啟即可更新
其中第一個解決了嵌入式開發(fā)人員社區(qū)共同關(guān)注的問題:ML 和 FPGA 工具需要一定程度的專業(yè)知識,而這種專業(yè)知識既昂貴又難以找到。
第二個解決了機器學(xué)習(xí) (ML) 固有的問題:ML 解決方案在一段時間后會過時,需要定期恢復(fù)活力。我們提出了一種 DNN-ON-FPGA 設(shè)計,可確保 DNN 無需重新合成、重新實現(xiàn)或重新啟動 FPGA 即可更新。
通過使用簡單緊湊的ML模型,可以進一步放大FPGA實現(xiàn)的能效和速度優(yōu)勢。Infxl 網(wǎng)絡(luò)就是這樣一種模型(示例代碼 [2])。它使用 8/16 位數(shù)據(jù)路徑在簡單 C 中實現(xiàn)完全連接的 DNN,而無需使用乘法或任何浮點運算。
Infxl 網(wǎng)絡(luò)的一個關(guān)鍵特征是它在網(wǎng)絡(luò)結(jié)構(gòu)/參數(shù)和推理引擎之間保持清晰的分離。我們通過在LSRAM中保留參數(shù)來利用此功能,同時使用LUT和FF實現(xiàn)引擎。這樣,當(dāng)我們需要更新已部署的 Infxl 網(wǎng)絡(luò)時,我們不需要重新合成、重新實現(xiàn)甚至重新啟動 FPGA。我們只需更新LSRAM中的參數(shù),F(xiàn)PGA幾乎立即開始根據(jù)更新的網(wǎng)絡(luò)結(jié)構(gòu)/參數(shù)提供改進的結(jié)果。
開發(fā)過程包括兩個主要步驟:
? 將預(yù)處理的數(shù)據(jù)上傳到 cloud.infxl.com,并將經(jīng)過訓(xùn)練的 Infxl 網(wǎng)絡(luò)下載為即用型 C 代碼。此過程不需要任何 ML 背景。
? 使用Microchip易于使用的SmartHLS編譯器[3],根據(jù)項目的確切要求從C代碼生成HLS。SmartHLS是一個基于Eclipse的IDE,它將C / C++代碼作為輸入,并生成SmartDesign IP組件(Verilog HDL)作為輸出。我們可以在Libero SoC設(shè)計套件[4]中提供的SmartDesign畫布中實例化生成的SmartDesign IP組件,以構(gòu)建FPGA系統(tǒng)。
Infxl net C 代碼包括一個測試平臺和一個通用接口。在將其部署到FPGA中之前,需要進行一些簡單的修改:
? 定義首選互連,例如,用于傳入傳感器數(shù)據(jù)的寄存器或 AXI4 接口。
? 定義用于通信 Infxl 網(wǎng)絡(luò)預(yù)測的類的機制。
? 將 Infxl 網(wǎng)絡(luò)的存儲器類型更改為僅仿真,并定義 C 代碼外部但仍在 FPGA 內(nèi)部的存儲器。
? 在 C 代碼中創(chuàng)建一個頂級函數(shù)以合并 Infxl 網(wǎng)絡(luò)。這將是之后實例化到整個FPGA系統(tǒng)中的IP。
默認的 Infxl net C 代碼通過少量 RAM 將推理引擎連接到輸入和輸出。這是微控制器的典型方法。對于FPGA實現(xiàn),與類似FIFO的接口進行交互會更有效。在默認的 Infxl net C 代碼中添加了額外的小函數(shù)以適應(yīng)這一點。然而,Infxl網(wǎng)絡(luò)的推理引擎的代碼保持不變。
有關(guān)原始 C 代碼和修改后的 C 代碼的比較,請參見下文。
源語言:
改 性:
修改或刪除了 Infxl 網(wǎng)絡(luò)的默認測試平臺功能(copy_inp_vec_to_ram8_head 和 read_op_vec_frm_ram8_tail),并引入了新的函數(shù)net_and_interface。net_and_interface是將使用 SmartHLS 合成的頂級函數(shù)。該函數(shù)copy_inp_vec_to_ram8_head仍然從測試平臺獲取數(shù)據(jù),但是,它使用 FIFO 數(shù)據(jù)類型將數(shù)據(jù)輸出到頂級函數(shù)中。來自FPGA-IP的數(shù)據(jù)使用batch.read()命令讀取。然后,變量批次為預(yù)測類設(shè)置位。
下一步,函數(shù)內(nèi)部RAM被提取出來,并將在SmartHLS的代碼生成過程中轉(zhuǎn)換為簡單的內(nèi)存接口。這需要對 ROM16 陣列進行簡單的修改。ROM16封裝了Infxl網(wǎng)絡(luò)的結(jié)構(gòu)以及所有參數(shù)。對于狀態(tài)監(jiān)測用例,原始ROM16修改如下:
源語言:
在測試平臺中,ROM16 將在運行 Infxl 網(wǎng)絡(luò)之前填充。在整個FPGA設(shè)計中也需要等效負載。此加載機制還支持更新已部署的 Infxl 網(wǎng)絡(luò):
多路復(fù)用器 (MUX) 被放入 LSRAM 的一個端口的地址路徑中。與這些用戶可訪問的地址和寫入端口一起,LSRAM可以根據(jù)需要填充和更新。上圖顯示了 IP 核,其中 Infxl 網(wǎng)絡(luò)配置了 FIFO 接口,用于傳感器數(shù)據(jù)和可識別的類類型。但是,根據(jù)合成設(shè)置,可以更改此設(shè)置。
現(xiàn)在讓我們看一下硬件。IP 核的確切大小取決于所選接口和任何所需的附加組件。AXI4接口由于其額外的接口功能,將比類似FIFO的接口或連接到AHB總線的寄存器接口需要更多的資源。上面顯示的配置大約需要以下資源:
? 763 個 LUT 和 776 FF 用于 IP,包括接口
? 546 個 LUT 和 610 FF,僅用于 Infxl 網(wǎng)絡(luò)
在此配置中,對單個輸入向量的推理大約需要 2800 個時鐘周期。以 100 MHz 或 200 MHz 運行,這將分別導(dǎo)致每 28 μs 或 14 μs 進行一次新分類。
當(dāng)以上面顯示的方式實現(xiàn)時,我們可以通過將現(xiàn)有的ROM16替換為更新版本來更新Infxl net的結(jié)構(gòu)和參數(shù)。交換 Infxl 網(wǎng)絡(luò)的內(nèi)容定義需要 ROM16 中每個項目一個時鐘周期。在我們的用例中,ROM16 陣列的長度為 899。這相當(dāng)于899個時鐘周期,其中無法進行識別。但是,可以在新舊ROM16之間進行更快的切換,但需要犧牲一些額外的LSRAM。如果需要連續(xù)操作,可以使用兩個并聯(lián)LSRAM。在兩者中,只有一個在任何給定時間處于活動狀態(tài),另一個處于待機狀態(tài)。要更新 Infxl 網(wǎng)絡(luò),備用 LSRAM 將使用新的 ROM16 進行更新。之后,LSRAM輸出數(shù)據(jù)路徑中的多路復(fù)用器被切換,從而激活新加載的ROM16并停用前一個ROM《》。這種切換可以在一個時鐘周期內(nèi)完成,從而在沒有任何實際延遲的情況下進行更新。
如果對分類率有更高的性能要求,Infxl 網(wǎng)絡(luò)也可以合成為并行結(jié)構(gòu),直至完全并行。這將大大加快分類速度。此優(yōu)化是實現(xiàn)大小和性能之間的權(quán)衡。此外,完全并行的實現(xiàn)將Infxl網(wǎng)絡(luò)的結(jié)構(gòu)和參數(shù)整合到IP核本身中。這將刪除在不重新合成和重新啟動的情況下進行簡單更新的功能。我們一直在討論的用例的完全并行實現(xiàn)大約需要 10900 個 LUT 和 4800 個 FF,但將分類速度加快到大約 600 個時鐘周期(包括所有握手)。
從本質(zhì)上講,Infxl net與Microsemi的SmartHLS相結(jié)合,提供了一種簡單且面向未來的方法,可以將ML整合到各種系統(tǒng)中。本文中討論的用例基于運動傳感器的數(shù)據(jù)。但是,使用 Infxl 網(wǎng)絡(luò)的應(yīng)用程序不僅限于該用例。它可用于從預(yù)測性維護到環(huán)境監(jiān)測、機器人技術(shù)、惡意軟件檢測、醫(yī)療保健可穿戴設(shè)備等用例。
審核編輯:郭婷
-
FPGA
+關(guān)注
關(guān)注
1625文章
21620瀏覽量
601238 -
機器人
+關(guān)注
關(guān)注
210文章
28103瀏覽量
205849 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8349瀏覽量
132312
發(fā)布評論請先 登錄
相關(guān)推薦
評論