介紹如何將一個具體的神經網絡用于睡眠追蹤,并將其映射到FPGA上。
當代的CPU按照一維方式進行計算,順序執行指令,并將算法分解為逐條加載和執行的指令。然而,未來的計算發展趨勢表明,我們將越來越多地依賴硬件加速器來支持并行執行,這將成為計算的常態。這種發展趨勢將統一算法和硬件結構的利用,從而實現更快、更高效的解決方案。
在這個發展趨勢中,支持二維計算的GPU的崛起已經部分實現了這一趨勢。GPU具備大規模并行計算的能力,使得許多原本難以并行化的應用程序性能得到大幅提升。
然而,GPU只能在特定情況下加速特定的算法。未來,通過互連的CPU和各種硬件加速器實現超優化將成為可能。FPGA將成為這個未來的重要組成部分,FPGA允許通過對硬件結構進行編程來實現極度定制化的二維計算。
【左圖】展示了CPU如何通過串行執行逐個指令來解決問題的過程。【右圖】展示了GPU、FPGA和ASIC等硬件加速器如何在空間和時間上進行二維計算。
本文為大家展示如何將一個具體的神經網絡用于睡眠追蹤,并將其映射到FPGA上。更重要的是演示將硬件映射到算法所需的關鍵工具,介紹如何實現異構計算。
1 睡眠追蹤:鉛筆尖上的神經網絡
這里制作了一個基于可穿戴FPGA的睡眠追蹤器。在這個過程中,建立了一個流水線,能夠將最初用Python(Keras)描述的神經網絡映射到硅芯片(FPGA)上。從數據采集到神經網絡預測,整個睡眠追蹤過程完全在一個微小的FPGA上運行,沒有處理器參與。
利用密歇根大學(Walch等人,2019年的《睡眠》期刊)開發的經過同行評審的算法實現。這是首個開源的睡眠數據集和相應的算法存儲庫。
使用來自該項目的有標簽數據對這里的FPGA神經網絡(NN)核心進行了驗證。使用的神經網絡是一個多層感知器,以加速度計數據、心率和晝夜節律數據作為輸入,并以91.3%的整體準確率預測清醒、快速動眼(REM)睡眠和非快速動眼(non-REM)睡眠。
FPGA睡眠追蹤器的高級架構圖。在前端,STM IMU芯片是連接到FPGA的數據源。在后端,可以連接一個主機計算機來讀取數據并向睡眠追蹤器發送命令。從頭開始使用SystemVerilog自己開發了采樣器、特征提取器、NN核心和UART核心。這能夠實現一個在微小FPGA上可部署的高效解決方案。
構建的參數化定義的FPGA NN核心是獨立于供應商的,并且適用于超出此應用范圍的其他應用,因為流水線允許在一定約束條件下輕松更新模型形狀和參數。
2 可適應加速器上二維算法的未來
如今,部署可適應加速器(如FPGA)是一項高摩擦且耗時的任務。將從今天的實踐和未來的改進角度描述FPGA開發的三個方面。
2.1 二維算法將以高級方式(例如Python)進行描述并自動部署
編寫FPGA代碼是一項神秘的任務,需要不同于數據科學家和大多數軟件工程師的專業知識。對于本來可以極大受益于基于FPGA的二維加速的團隊來說,這可能成為一道阻礙。能夠使用熟悉的高級語言(如Python)描述針對FPGA的算法對于普及FPGA的使用至關重要。FPGA專家也將從這種基礎設施帶來的主要效率提升中受益。
要在應用中部署一個新的睡眠追蹤器網絡,用戶只需運行一個腳本并輕微修改幾個文件。無需具備硬件知識,也無需編寫新的SystemVerilog代碼。
神經網絡部署流程使非FPGA專家能夠訓練新模型并部署到FPGA上。流程的步驟包括訓練和導出Keras模型,使用腳本將輸出模型解析為FPGA編譯器工具鏈所需的數據,更新頂層FPGA項目文件中的模型常量,然后重新編譯FPGA比特流。
這有效的原因在于只允許使用高度約束的模型。未來,更通用的高級綜合(HLS)工具,如賽靈思(Xilinx)的Vitis HLS和谷歌的XLS,將允許用戶提供要部署到可適應加速器的通用高級算法描述。
2.2 將以Python等語言高效地測試和調試二維算法
仿真、驗證和調試是FPGA應用設計過程中關鍵的部分。這些過程也將從高級接口和工具中得到重大改進。
睡眠追蹤器應用的頂層測試平臺圖。能夠使用Cocotb和Python進行測試、驗證和調試FPGA設計,這是一大福音。Python的異步/等待語法的便利性以及在Python中輕松模擬子組件/導入測試數據的簡易性極大地加快了我們的工作。
已經取得了巨大的進展。例如,雖然直接在SystemVerilog中編寫了所有組件,但在所有的離設備驗證和測試平臺(對每個模塊和整個睡眠應用)上都使用了Cocotb,而從未離開過Python。借助Cocotb,可以在Python生態系統中使用周期精確的仿真,這對于FPGA驗證非常重要,而且對開發人員非常高效。
2.3 Rust將成為連接異構系統的粘合劑
嵌入式工程師常見的情況是在硬件加速器(如FPGA)和主機CPU之間建立通信。這項工作因其繁瑣和容易出錯而臭名昭著。
在Rust中構建了FPGA睡眠應用程序的設備驅動程序和更高級的Session API。前者實現了自定義數據包協議,而使用后者創建了各種與FPGA睡眠應用程序交互的程序。Rust是一個很好的解決方案,因為其類型系統和靜態檢查使得編寫安全的低級代碼和符合人體工程學的高級API變得更加容易。本演講的后半部分將詳細介紹其中一些特性。
相信Rust是將異構計算系統連接在一起的最佳選擇。在這個角色中,Rust將提供低級通信的安全性,減少驅動程序的脆弱性,并為算法之間跨硬件邊界進行通信提供人體工程學的API。
將Rust作為CPU <-> FPGA的粘合劑的展望,包括針對常見I/O類的代碼生成設施。
審核編輯:黃飛
?
評論