沒有硬件,也可以運行與測試 TFLite 應用

提到人工智能和機器學習(Marchine Learning,ML),你的腦海裏是否立即會浮現計算中心、高端 GPU、成百上千的 TPU 等等。實際上,隨着嵌入式設備、移動終端以及近年來物聯網(Internet of Things,IoT)的發展,人工智能離我們越來越近。手機、智能音箱、電話手錶,甚至控制開關,都配備有一定的人工智能。特別是物聯網和智能家居的快速發展,機器學習在微型低功耗設備上應用得越來越廣泛。

TensorFlow 作爲人工智能領域的前驅,很早就推出了針對資源受限設備(例如Arm Cortex-M MCU,微處理單元)的框架 TensorFlow Lite。現在,已經有成千上萬使用 TensorFlow 的開發人員將 ML 模型部署到嵌入式和 IoT 設備上。

有朋友可能會疑惑,就一個 MCU ,內存只有幾 M,CPU 速度也慢,能做什麼呢?

實際上能做的事情很多,比如關鍵語檢測或手勢識別之類。想象一下吧,當你下班回家,回到黑漆漆的家中,第一件事情就是開燈。藉助於 IoT 設備,我們只需輕輕說 “開燈”,而不用四處摸索開關。以前裝修爲了方便冬天關燈,會裝上雙控開關,現在有了人工智能,你只要簡單說一聲“關燈”就可以了。再比如智能監控,檢測到家裏有異常動靜就報警,也是應用人工智能的例子。這些設備平常都是安安靜靜的待機,採用微控制器就非常適合,能耗低,也可以做得很小。

但是,在小型和嵌入式設備上開發軟件比較困難,調試不方便,進行大規模的壓力測試更是困難。有過嵌入式系統開發經歷的朋友可能會理解,即使是有經驗的嵌入式開發人員,也會花大量時間在物理硬件上刷固件和測試應用程序,有時僅僅爲了實現一個簡單的功能。

在嵌入式設備上開發機器學習應用,開發人員面臨着更多的挑戰:如何在各種硬件上反覆可靠地測試各種模型,能自動完成插拔、刷機、運行等流程嗎?

爲了應對這一挑戰,我們可以向 TensorFlow Lite MCU 團隊學習,他們選擇了 Renode。這是一個 Antmicro 的開源仿真框架,其目標是爲嵌入式和 IoT 系統提供無硬件、持續集成驅動的工作流。

接下來,我將說明如何在沒有物理硬件的情況下,使用 Renode 虛擬出 RISC-V MCU,在上面運行 TensorFlow Lite 應用。

Renode 簡介

Renode 剛剛發佈了 1.9 版,它是一個開發框架,用來模擬物理硬件系統(包括CPU、外圍設備、傳感器、環境等等),有了它,可以加速 IoT 和嵌入式系統的開發。

Renode 可以模擬整個系統和動態環境 - 包括將建模的樣本數據饋送到模擬的傳感器,然後通過自定義軟件和算法讀取和處理。快速運行軟件而無需訪問物理硬件的能力使得 Renode 成爲在嵌入式和IoT設備上實驗和構建 ML 應用程序的理想平臺。

安裝 Renode 並運行

Renode 支持 Linux、Mac、Windows 平臺,因爲我使用的開發環境是 Ubuntu,下面就說說在 Ubuntu 18.04 上的安裝,其它系統請參考 Renode 的安裝說明。

  • 安裝依賴的 mono 包,這是一個開源的 .NET 運行時環境。

sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
sudo apt install mono-devel
  • 安裝其它包依賴。

sudo apt-get install policykit-1 libgtk2.0-0 screen uml-utilities gtk-sharp2 libc6-dev
  • 訪問 https://github.com/renode/renode/releases/latest,下載針對 Ubuntu 的安裝包,然後安裝。

  • 運行 Renode

    運行 Renode 的命令如下:

renode [flags] [file]

你也可以不加任何參數運行 renode 命令,可以出現如下命令行交互界面:

Renode 命令行界面

運行 TFLite demo

首先使用下面的命令下載 demo 代碼及相關的文件:

git clone --recurse-submodules https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo

在這個庫中,包含有預編譯的二進制文件,因爲從源碼 build 還比較麻煩,我們先用該二進制文件體驗 Renode 。

二進制文件位於 binaries/magic_wand 目錄,但我們先進入 demo 的 renode 目錄,加載“litex-vexriscv-tflite.resc“腳本:

cd litex-vexriscv-tensorflow-lite-demo
cd renode
renode litex-vexriscv-tflite.resc

Renode腳本(.resc 文件)包含有指令,用於創建所需的平臺並將應用程序加載到其內存中。加載後,會出現 Renode 的命令行接口,稱爲“Monitor”,從中可以控制仿真。在命令行接口中,使用 start 命令開始仿真:

(machine-0) start

在模擬設備的虛擬串行端口(也稱爲UART-會自動在Renode中作爲單獨的終端打開)上,你將看到以下輸出:

renode 的工作原理

Renode模擬硬件(包括 RISC-V CPU 以及 I/O 和傳感器),這樣二進制文件認爲它在實際的硬件板運行。這是通過 Renode 的機器代碼轉換和全面的 SoC 支持而實現的。

首先, Renode 將應用程序的機器代碼轉換爲本地主機機器語言。

接下來,每當應用程序嘗試讀取或寫入任何外圍設備時,該調用都會被攔截並重定向到對應的模型。Renode 模型通常(但不限於)用 C# 或 Python 編寫,實現寄存器接口,並與實際硬件在行爲上保持一致。由於這些模型是抽象的,你可以通過 Renode 命令行接口或使用腳本文件以編程方式與它們進行交互。

在上面的示例中,爲虛擬傳感器提供了一些離線的、預先記錄的數據文件:

i2c.adxl345 FeedSample @circle.data

Renode 中運行的 TFLite 二進制文件處理數據並檢測手勢。

小結

在本文中,我們演示瞭如何在沒有硬件的情況下將TensorFlow Lite用於微處理器單元。儘管本文以基於 RISC-V 的平臺爲例,但是 Renode 能夠仿真針多種體系結構,例如ARM、POWER等,所以本文的方法也可以用在其他硬件上。

如果您想使用 Renode 探索更多的硬件和軟件,請訪問 https://renode.readthedocs.io/en/latest/introduction/supported-boards.html 獲得所支持的主板的完整列表。

最後,仿真軟件無法完全替代實際的硬件,就如同做 Android 開發,僅僅使用 Android 模擬器是不夠的,最終產品還需要在真正的硬件上測試。但是藉助仿真,無疑可以簡化開發過程,更加方便調試。

參考

  1. Running and Testing TF Lite on Microcontrollers without hardware in Renode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章