AIoT 應用下 TensorFlow Lite Micro 的編譯與學習

Kevin Huang
7 min readApr 26, 2021

--

深度學習在過去幾年掀起了一股人工智慧的研究熱潮,非常多工程師學習深度學習的技巧與開發工具,諸如 TensorFlow,Keras,Caffe … 等等。而人工智慧的硬體也有長足的發展,以後會愈來愈多內建 NN 處理器的 IC 如雨後春筍陸續出籠,在過去深度學習從以雲端部署為主,將來因為隱私與效能的關係,AI 進一步朝向以 Edge 部署為主的趨勢已經更加明確。

Edge 端所用的系統會是一般我們認知的嵌入式系統,這種系統密集計算的能力不強,但通常 IoT 感測器的運算又是非常需要即時性,舉個例子,以偵測馬達是否有異音來判斷軸承是否快要故障了的這個應用來說,Sensor 就是監聽馬達運轉聲音的麥克風,Edge 處理器在軸承發出異音的時候就需要即時提出警告。

嵌入式設備相對於桌機或是手機來說,最重要的優勢是他們比較便宜而可以大量部署,並且嵌入式設備的耗電量極低,一顆桌機的 CPU 或 GPU 可能就需要消耗掉幾十,甚至上百瓦的能量,還需要複雜的散熱裝置和供電裝置才能運作。但是嵌入式設備可以使用鈕扣電池就可以運行幾週,甚至幾個月或是幾年。

什麼樣的 AI 將會部署到 Edge 端?

總的來說,Edge 端的 AI 不會有太多複雜的運用,比如解決一個數學題,或是 BI (Business Intelligence) 這種需要大量推理運算的應用,不太會部署到 Edge 端去。會部署到 Edge 端的 AI 將會是需要判斷的瞬間資料,比如說,安控影像辨識內特定形態的偵測,例如人型,小孩,貓狗,寵物…或是有一些工廠需要部署 AI 用來判定軸承 (Bearing) 的健康度,馬達是不是快壞了…等等這種 “判斷型” 的 AI 將會大量地部署到 Edge 去。所以我們怎麼把 AI 模型縮小到可以部署到運算能力相比雲端要弱很多的 Edge 去。

如何在計算效能與準確度當中如何取得平衡,變成一個重要的課題。

硬體用電量與(電池/太陽能)之間的關係

對於 AIoT 裡的 IoT 能力與耗能,在這邊給個大約的概念,我們的 AI 模型,要跑在下面所列這種硬體上,也要注意這些設備的耗電量。

硬體耗電狀況

  • ARM Cortex-A9 CPU 使用 500 mW~ 2,000 mW
  • 顯示器可能使用 400mW
  • 運行中的手機或 WiFi 無線電可能使用 800mW
  • 藍芽可能使用 100mW
  • 手機用麥克風可能使用了 300uW
  • 低功耗藍牙 (Bluetooth Low Energy) 可能使用了 40mW
  • 320x240 Mono Camera (例如 Himax HM01B0) 在 30 fps 時使用 1mW
  • 使用台積電 22nm 製程的 Ambiq Apollo4 Cortex-M4F 微控制器跑在 48Mhz 的頻率下使用了 1mW
  • 加速度計大約使用了 1 mW

電力提供 — 電力評估是 AIoT 很重要的評估項目,你總不會有個 AIoT 的設備很厲害,但是只能跑一天吧…所以

  • 一顆 CR2032 鈕扣電池,如果系統平均使用 1mW 的功率,大約可以運行一個月
  • 一顆 AA 電池可以讓使用 1mW 功率的系統運作六個月
  • 室內光線可提供每平方公分 10uW 的功率
  • 室外光線可提供每平方公分 10mW 的功率

隨著處理器和感應器對能量的需求不斷下降,AIoT 在能量使用上,更會朝著愈來愈長的運作時間來發展。

如何在這種低功耗的系統下執行深度學習算法?

要部署深度學習算法到 MCU 這種 CPU 也弱,RAM 也少的系統下,之前一直是一件不太容易的事情,我們可能會用 C code 把模型一行一行刻出來,這是一件很辛苦的事情…

在傳統的 MCU 領域,比較多的是像 8051 這樣的 8 位元核心,但是現在這種情況有了很大的改善,32 bits CPU 已經成為標準,主要歸功於來自 ARM 的 Cortex-M 系列晶片核心。所以在 MCU 系統下執行深度學習算法已經是一件蠻簡單的事情了。

縱使如此,使用 32 bits CPU 核心的嵌入式設備還是有一些很嚴苛的資源限制。例如,這一類的系統通常只有幾百 KB 的 RAM (例如 STM32F072 系列),NOR Flash 的大小有受限,他們只有 40Mhz ~ 低於 100Mhz 的運行速度,沒有複雜的作業系統 (嗯,不太可能會有 Linux),只有像是 FreeRTOS 或是 ThreadX 這樣的即時作業系統,而系統上也有可能不會有 POSIX 標準 C 程式庫,也沒有記憶體管理工具 ( 諸如 malloc / free / new / delete ) ,也不一定會有可管理的 Heap …

TensorFlow Lite 提供了一個方案,可以比較簡單地將你的深度學習模型,部署到你的 AIoT 設備上,我覺得 TensorFlow-Lite 和 TVM 是身為 AIoT 系統工程師都需要熟悉的技術。

在桌機上跑 TensorFlow Lite Micro

TensorFlow Lite 提供了部署深度學習模型到這些 MCU 嵌入式系統的一個框架,大幅簡化了 TensorFlow,將訓練的框架移除,專心在推論框架上面,並且以 C / C++ 實作,也不需要依賴特定 OS 或是 Library 的一個深度學習框架。

不過在部署或是調整 TensorFlow Lite 模型的時候,也真的是一件蠻煩瑣的事情,調整完,編譯,還要燒到 MCU 裡面,開機調適…等等,雖然和以前的作法比起來已經簡單很多了,但總免不了還是要搞一些硬體的事情,諸如 UART 線有沒有接,MCU 板子,供電…等等這些和模型無關的事情。

所以我能不能在 Linux / MacOS 或是 Windows 上面跑 TensorFlow Lite 模型哪?能不能使用我熟悉的環境來學習或者調整我的模型呢?確定模型的精確度和資源使用在我的預期下才真的燒進去 MCU 測試呢?

這個時候桌面版本的 TensorFlow Lite Micro就很好用了,TensorFlow Lite Micro 雖然設計上面是給 MCU 用的,把它搬到桌機上面測試也不是一件很麻煩的事情。

Raspberry Pi Pico有一個 TensorFlow Lite 專案 https://github.com/raspberrypi/pico-tflmicro,這個專案是從 TensorFlow 專案產生出來專門支援 Pi Pico 的版本,用 CMake 把建立專案的步驟整理得很好。

因此我也從這個專案開始,衍生做成一個桌機的專案放在 github 上面( https://github.com/hkt999/tensorflow-lite-micro),讓 Tensorflow Lite Micro更容易在慣用的 Linux 平台上建置與測試。

接下來就解說一下步驟。首先,把原始代碼抓下來

$ git clone https://github.com/hkt999/tensorflow-lite-micro

進入目錄內,建立 “build” 目錄,進入 “build” 目錄,打入 “cmake ..”

$ cd tensorflow-lite-micro
$ mkdir build; cd build
$ cmake ..
$ make -j

最後就是 make — 然後所有的 tensorflow-lite 的 library 和範例就會被 build 出來。有一件事情蠻值得一提,Tensorflow Lite Micro 的測試模塊寫得非常完整,都在 “tests” 目錄裡面,要學習的工程師可以仔細看看 tensorflow-lite 的測試 Coverage,幾乎每一個項目都有測試到,值得我們寫軟體的人好好研究一下。

上面的步驟在 RP4 上面也一樣可以跑,如果想部署深度模型在 RP4 上面的話。

使用 VSCode / CMake Extension 來追 TensorFlow-Lite

當然使用 VSCode 和 Cmake extension 在追 Code 的時候也可以帶來很大的便利,這個可以參考我前面的幾篇文章來設定。

使用 VSCode 玩轉 TensorFlow-Lite

希望大家在熟悉的桌面上面玩轉 TensorFlow Lite Micro可以玩得開心也了解到如何在嵌入式設備上部署深度學習模型。也可以使用這個專案為底,比較容易地將 TensorFlow Lite 移植到任何你想移植的 32 bits MCU (例如 RISC-V) 上。

--

--