返回文章列表

邊緣裝置機器學習推論實作技術

本文探討邊緣裝置機器學習推論的實作技術,涵蓋直譯器、程式碼生成編譯器、位元組碼編譯器、虛擬機器和硬體描述語言等方法。同時也探討了嵌入式軟體工程的基礎、工具鏈、開發流程、模擬環境以及端對端邊緣AI平台的優勢與實務應用。文章旨在幫助開發者選擇合適的推論方法和工具,並克服邊緣AI開發的挑戰。

機器學習 嵌入式系統

在資源受限的邊緣裝置上佈署機器學習模型需要高效的推論方法。本文將探討從直譯器到硬體描述語言等不同方案,並分析其優缺點及適用場景。同時,文章也將涵蓋嵌入式開發的基礎知識、工具鏈及最佳實務,並探討端對端邊緣AI平台如何簡化開發流程,提升效率。最後,文章將探討自動化硬體測試的重要性以及如何在邊緣裝置上實作。

邊緣裝置上的機器學習推論實作

在邊緣裝置上執行機器學習推論時,開發者面臨著如何在資源有限的硬體上高效執行深度學習模型的挑戰。直接從頭實作特定的深度學習模型不僅耗時耗力,而且缺乏彈性,難以重用於新的應用或不同的硬體平台上。

常見的推論執行方法

為瞭解決上述問題,開發者提出了多種解決方案,主要包括以下幾種方法:

直譯器(Interpreters)

直譯器是一種程式,它讀取描述模型的檔案,包括模型的操作和引數,然後使用預先寫好的運算元來依序執行模型的運算。直譯器的優點是非常靈活,可以用相同的幾行程式碼來執行不同的模型。然而,這種方法的缺點是讀取和解析模型的過程會引入額外的運算開銷,包括額外的RAM、ROM和CPU資源消耗。

目前最廣泛使用的直譯器來自TensorFlow生態系統,包括TensorFlow Lite和TensorFlow Lite for Microcontrollers。兩者皆以C++實作,但TensorFlow Lite提供了Python和Java API以方便使用。它們都受益於TensorFlow Lite轉換器提供的運算元融合和量化技術。

程式碼生成編譯器(Code Generation Compilers)

程式碼生成編譯器將模型檔案作為輸入,並將其轉換為實作該模型的程式。這種方法同樣依賴於預先寫好的運算元函式庫,透過呼叫這些運算元並傳遞適當的引數來實作模型的運算。程式碼生成方法提供了與直譯器相似的優點,但消除了大部分與直譯器相關的額外開銷。

例如,Edge Impulse的EON編譯器與TensorFlow Lite for Microcontrollers核心相容,能夠利用現有的高效運算元實作。

位元組碼編譯器(Bytecode Compilers)

位元組碼編譯器能夠直接生成實作模型的位元組碼,並在過程中應用針對特定目標硬體的最佳化。這種方法能夠產生高效的實作,充分利用硬體的效能增強特性。例如,Synaptics的TENSAI Flow神經網路編譯器就是為Synaptics Katana Edge AI處理器編譯模型而設計的。

虛擬機器(Virtual Machines)

位元組碼編譯器的一個主要缺點是需要為每個目標裝置編寫編譯器,這是一項困難的任務。為了規避這個問題,一些編譯器以虛擬機器為目標,即在硬體之上提供一層抽象,提供對映到各種低階處理器能力的指令。雖然這會稍微降低效率,但其好處往往大於缺點。Apache TVM就是採用這種方法,它還使用裝置上的執行環境來迭代測試不同的實作,以找到最有效的那一個。

硬體描述語言(Hardware Description Language)

近年來,一種新的趨勢是使用特殊的編譯器來生成硬體描述語言(HDL),即描述處理器架構並用於程式設計FPGA和ASIC的程式碼。利用這些技術,可以直接在硬體上實作模型,從而達到極高的效率。CFU Playground和Tensil都是開源工具,旨在簡化使用這種方法的自定義加速器的設計。

替代方法

一些加速器晶片使用不屬於上述正常類別的系統進行程式設計。開發者應當根據具體的硬體平台和應用需求,選擇最合適的方法來實作機器學習推論。

內容解密:

本段落詳細介紹了在邊緣裝置上執行機器學習推論的不同方法,包括直譯器、程式碼生成編譯器、位元組碼編譯器、虛擬機器以及硬體描述語言。每種方法都有其優缺點和適用場景。開發者在選擇具體實作方法時,需要根據硬體資源、模型複雜度以及開發週期等多方面因素進行綜合考量。

圖表翻譯: 此圖示展示了在邊緣裝置上執行機器學習推論的不同方法及其代表性的工具或框架。其中,直譯器、程式碼生成編譯器、位元組碼編譯器、虛擬機器以及硬體描述語言是主要的技術路線,而TensorFlow Lite、Edge Impulse’s EON Compiler、Synaptics’ TENSAI Flow、Apache TVM、CFU Playground和Tensil則是相應領域中的重要工具或框架。

邊緣AI開發與嵌入式軟體工程

邊緣AI是嵌入式軟體工程的一個子領域,與電機工程和電子學的實際應用密切相關。這些領域涉及眾多的工具和技術,本文無法涵蓋所有內容。我們將重點介紹與邊緣AI開發相關的部分。

快速入門

如果你正在開發自己的邊緣AI專案,但缺乏嵌入式開發經驗,Arduino和Arduino Pro產品是一個很好的起點。Arduino建立了一個易於初學者使用的嵌入式開發環境,但仍然足夠強大,可以構建真實的應用程式。對於剛開始接觸邊緣裝置的機器學習工程師或兩者皆無經驗的新手來說,這是完美的選擇。Arduino團隊從一開始就理解了邊緣AI運動的潛力,並為其成長做出了很多貢獻。

嵌入式硬體工具

開發嵌入式軟體具有挑戰性,因為嵌入式裝置的特性使得軟體更難除錯,尤其是在顯示內部狀態有限的裝置上。嵌入式程式必須處理從基本硬體整合到複雜的低階通訊協定等所有事情。

因此,嵌入式開發需要一些對於其他軟體工程師來說不尋常的工具。這些工具包括:

  • 裝置程式設計器:允許開發人員將新程式上傳到嵌入式裝置的硬體,通常是特定於裝置的。
  • 除錯探針:連線到嵌入式處理器並允許在執行時分析程式的硬體裝置,也是特定於裝置的。
  • USB轉UART介面卡:在開發人員的工作站和嵌入式裝置之間傳送和接收任意資料,是通用的。
  • 萬用表:測量電壓、電流和電阻,用於瞭解嵌入式電路在程式控制下的狀態。
  • 示波器:測量裝置或印刷電路板上的訊號,表示為電壓隨時間變化的圖形。

這些工具對於瞭解和操控嵌入式裝置的狀態是必要的。例如,為了測試程式是否正確執行,你可能會讓它在到達某一點時切換處理器上的特定引腳。然後,你可以使用萬用表測量該引腳是否已被切換。另一種常見的與嵌入式裝置通訊的方式是透過串列(UART)線纜,可以以相對較低的頻率傳送和接收資料,但仍然足夠高,可以在合理的時間內傳輸感測器資料。

內容解密:

上述段落中提到的工具對於嵌入式開發至關重要。它們幫助開發人員除錯和理解嵌入式裝置的內部狀態。例如,裝置程式設計器允許開發人員更新嵌入式裝置上的程式,而除錯探針則允許在執行時分析程式。USB轉UART介面卡使得開發人員的工作站和嵌入式裝置之間的資料傳輸成為可能。萬用表和示波器則用於測量和分析嵌入式電路的電氣特性。

推論與模型最佳化

針對特定裝置進行核心最佳化與透過壓縮和其他技術進行模型最佳化是不同的。模型最佳化通常需要自己的核心支援,有時甚至需要硬體支援。

例如,要執行量化模型,必須有與特定量化級別相容的核心可用。量化到8位元整數精確度的模型需要設計用於支援它的核心,其他量化級別也是如此。事實上,根據使用的資料型別(無論是int8、uint8、int16等),都需要特定的核心。

對於其他最佳化技術也是如此。例如,剪枝會導致模型具有大量的稀疏性:它們有很多零。單純這樣並不會對執行時間產生任何影響——模型必須使用特殊的核心或硬體來執行,這些核心或硬體可以利用稀疏性來減少計算時間。這些核心和硬體尚未得到廣泛應用,因此剪枝在該領域的實用性仍然有限。

內容解密:

本段落強調了模型最佳化和核心最佳化的區別。模型最佳化(如量化或剪枝)需要特定的核心或硬體支援才能發揮作用。例如,量化模型需要與其量化級別相容的核心,而剪枝後的模型需要能夠利用稀疏性的核心或硬體。目前,這些技術的實用性受到可用核心和硬體的限制。

圖表翻譯:

此圖示展示了嵌入式裝置與開發人員工作站之間的通訊過程。嵌入式裝置透過UART介面與USB轉UART介面卡連線,後者再與開發人員的工作站進行資料傳輸。同時,工作站也可以向嵌入式裝置傳送程式更新。

內容解密:

本圖表展示了嵌入式裝置、USB轉UART介面卡和開發人員工作站之間的互動關係。它們共同構成了嵌入式開發中的一個重要通訊鏈路,使得開發人員能夠與嵌入式裝置進行資料交換和程式更新。

嵌入式開發基礎與工具鏈

嵌入式處理器本身只是個小小的晶片,要使其發揮作用,需要搭配一系列電子元件。因此,開發板(dev boards)成為嵌入式工程師的首選平台。開發板提供了一個即插即用的開發環境,包含嵌入式處理器、輸入輸出介面和感測器,使工程師能夠評估特定晶片的適用性,並在硬體開發完成前進行軟體開發。

開發板的作用與選擇

開發板的主要目標是讓工程師評估晶片是否適合專案需求,並在硬體開發完成前進行軟體開發。一旦產品硬體的迭代版本準備就緒,開發就可以轉移到產品硬體上。但對於一些快速原型設計平台,如Arduino Pro,則可以直接用於小批次生產設計。

目前大多數嵌入式處理器系列都有對應的開發板可供選擇。在選擇硬體時,建議取得多個不同的開發板進行實驗。例如,可以嘗試在不同的開發板上執行早期版本的深度學習模型,以瞭解它們的相對效能。

嵌入式軟體工具

對於邊緣AI(edge AI)應用,嵌入式軟體工程通常意味著C++開發。雖然可以使用任何文字編輯器進行開發,但許多嵌入式處理器供應商提供整合開發環境(IDEs),與其硬體緊密整合,方便上傳和除錯程式碼。

供應商通常會提供SDK、驅動程式和函式庫,以幫助開發者存取處理器的各種功能。然而,這些程式碼的品質參差不齊,往往只是概念驗證而非生產級別的程式碼。

為了減少需要編寫的樣板程式碼(boilerplate code),開發者可能會選擇使用實時作業系統(RTOS)。RTOS提供了簡單作業系統的功能,但以函式庫的形式存在,可以與開發者的程式碼一起編譯。然後,可以呼叫RTOS API來控制周邊裝置或執行網路通訊。

嵌入式開發流程

嵌入式開發通常涉及複雜的工具鏈,包括供應商提供的程式和指令碼,用於將程式碼從文字檔轉換為可執行的程式,並將其燒錄到硬體裝置上。典型的開發流程如下:

  1. 修改原始碼。
  2. 執行編譯器(由處理器供應商提供)和連結器,將程式碼轉換為二進位檔。
  3. 執行指令碼將程式碼燒錄到嵌入式裝置上。
  4. 使用串列連線與裝置通訊並測試程式碼。

當程式碼在裝置上執行時,可以使用除錯探針(debug probe)從開發機器檢查程式碼,就像在本地執行一樣,可以設定斷點、檢查變數和逐步執行程式碼。

模擬器與模擬環境

模擬器是一種軟體,旨在虛擬地重現處理器的行為,在開發機器上執行,以便在不將程式碼燒錄到裝置的情況下執行嵌入式程式碼。雖然模擬器無法完美地代表真實硬體,但可以足夠接近,提供有價值的工具。

如果需要確定程式的執行速度,例如估計AI演算法的延遲,可以使用週期準確的模擬器(cycle-accurate simulator)來確定在真實硬體上執行的確切時鐘週期數。將這個數字除以時脈頻率,就可以得到精確的延遲估計。

模擬(Simulation)是指使用軟體模擬整個裝置,包括模擬處理器和它所連線的其他裝置,如感測器和通訊硬體。一些模擬器甚至可以模擬多處理器板卡或整個互連裝置網路。

雖然不是所有處理器都有對應的模擬器,但Renode是一個強大的模擬和模擬環境,支援許多常見的處理器架構。Arm Virtual Hardware允許在雲端模擬Arm處理器。

嵌入式Linux

對於SoC和邊緣伺服器,由於其計算能力和記憶體足以支援完整的作業系統,因此SoC的開發更類別似於個人電腦和網路伺服器的開發。這是它們的一大優勢:開發者不需要太多專門技能。

典型的SoC會執行Linux發行版,具備所有有用的工具和函式庫。這意味著幾乎可以使用任何語言進行程式設計,與在其他平台上一樣有相同的權衡。

邊緣AI的開發挑戰與解決方案

在現代科技領域中,邊緣AI(Edge AI)的開發和佈署正變得越來越重要。邊緣AI指的是在終端裝置上直接執行的人工智慧技術,這些裝置包括智慧手機、物聯網(IoT)裝置、嵌入式系統等。與傳統的雲端AI相比,邊緣AI具有更快的反應速度、更低的延遲和更好的隱私保護。

多樣化的開發平台

開發邊緣AI應用的一個主要挑戰是選擇合適的開發平台。不同的平台提供了不同的優勢和挑戰。例如,低階語言如C++提供了高效能和快速的執行速度,而高階語言如Python則提供了靈活性和易用性。

Google提供的TensorFlow Lite執行環境預先構建於一些流行的平台上,使開發者能夠直接使用Python計算函式庫。例如,開發者可以在應用程式中使用SciPy的數位訊號處理功能。嵌入式Linux裝置甚至可以使用容器化技術進行佈署,使得應用程式的安裝和使用變得更加容易。

SoC的使用與挑戰

在生產環境中,使用現成的SoC(System on Chip)板是一個常見的做法。許多供應商設計和銷售根據SoC的平台,這些平台針對特定的應用領域。例如,可以購買具有堅固外殼的裝置,用於工業佈署。要佈署應用,只需連線所需的感測器並安裝應用程式。

然而,使用SoC的一個挑戰是,儘管它們執行著熟悉的Linux環境,但預先構建的套件並不總是可用。開發者可能需要從原始碼構建函式庫,以使應用程式正常工作,這有時會變得相當複雜。

安全性考量

在使用具有完整作業系統的裝置時,安全性是一個重要的考量。執行在SoC上的嵌入式Linux需要像網路上的其他機器一樣被嚴格鎖定,以避免成為攻擊的媒介。不安全的IoT裝置因被駭客攻擊並用於攻擊其他系統而臭名昭著。

自動化硬體測試

現代軟體工程的最佳實踐鼓勵使用持續整合測試:每一次程式碼變更都會經過一系列自動化測試的考驗。為嵌入式應用程式建立自動化測試可能很困難,因為與硬體互動的程式碼無法在開發機器上測試;它只能在目標裝置上測試。

然而,嵌入式裝置很容易進入無法執行測試的狀態。例如,如果程式當機,可能無法重新啟動裝置而不進行物理干預。同樣,上傳新韌體可能需要物理干預。

為瞭解決這個問題,開發者構建了自動化硬體測試系統,可以與嵌入式裝置互動,以促進更容易的測試。這些系統是軟體和硬體的結合,可以執行諸如重新整理新程式碼、在測試之間重新啟動裝置,甚至向I/O埠或感測器提供輸入等操作。

自動化硬體測試系統範例

import serial
import time

# 初始化串列連線
ser = serial.Serial('COM3', 9600, timeout=1)

def flash_new_code(device, firmware):
    # 重新整理新韌體到裝置
    ser.write(firmware.encode())

def power_cycle_device(device):
    # 重新啟動裝置
    ser.write(b'reboot')
    time.sleep(5)  # 等待裝置重新啟動

def provide_input(device, input_data):
    # 向裝置提供輸入
    ser.write(input_data.encode())

# 使用範例
firmware = "new_firmware.bin"
device = "embedded_device"

flash_new_code(device, firmware)
power_cycle_device(device)
provide_input(device, "test_input")

內容解密:

  • serial.Serial('COM3', 9600, timeout=1):初始化一個串列連線,設定通訊埠為COM3,波特率為9600,超時時間為1秒。
  • flash_new_code函式:負責將新的韌體重新整理到嵌入式裝置上。
  • power_cycle_device函式:負責重新啟動嵌入式裝置。
  • provide_input函式:負責向嵌入式裝置提供輸入資料。

端對端邊緣AI平台

理想情況下,任何具有特定領域專業知識的團隊都應該能夠捕捉其知識並佈署為邊緣AI。來自不同領域(如醫療保健、農業、製造業和消費技術)的專業人士應該能夠利用他們的知識來構建令人驚嘆的AI驅動產品。

然而,由於涉及許多移動部件和需要學習的內容,邊緣AI的開發過程很容易讓人感到不知所措。大部分工作流程都集中在複雜產品所需的神秘工程技能上,包括機器學習、數位訊號處理和嵌入式硬體上的低階軟體工程。

過去幾年中,出現了一個充滿活力的工具生態系統,旨在降低進入門檻,使沒有機器學習或嵌入式系統背景的人也能構建出色的新產品。

端對端邊緣AI平台旨在協助開發者完成整個應用程式開發過程:收集、管理、探索資料集;進行特徵工程和數位訊號處理;訓練機器學習模型;最佳化演算法以適應嵌入式硬體;生成高效的低階程式碼;佈署到嵌入式系統;以及評估系統在實際資料上的效能。

Plantuml端對端邊緣AI平台流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 邊緣 AI 推論實作技術

package "推論執行方法" {
    component [直譯器 Interpreter] as interp
    component [程式碼生成編譯器] as codegen
    component [位元組碼編譯器] as bytecode
    component [虛擬機器 VM] as vm
}

package "主流框架" {
    component [TensorFlow Lite] as tflite
    component [TFLite Micro] as tflmicro
    component [Edge Impulse EON] as eon
    component [Apache TVM] as tvm
}

package "硬體加速" {
    component [FPGA] as fpga
    component [ASIC] as asic
    component [HDL 描述語言] as hdl
    component [自定義加速器] as accel
}

package "開發工具" {
    component [嵌入式工具鏈] as toolchain
    component [模擬環境] as sim
    component [硬體測試] as hwtest
}

interp --> tflite : 實作
interp --> tflmicro : MCU

codegen --> eon : Edge Impulse
bytecode --> accel : 硬體最佳化

vm --> tvm : 抽象層

hdl --> fpga : 程式設計
hdl --> asic : 設計
fpga --> accel : 客製化

toolchain --> sim : 開發
sim --> hwtest : 驗證

note right of interp
  直譯器特性:
  - 靈活性高
  - 額外開銷
  - RAM/ROM 消耗
end note

note right of codegen
  程式碼生成:
  - 消除直譯開銷
  - 運算元函式庫
  - 硬體適配
end note

@enduml

圖表翻譯: 此圖示展示了端對端邊緣AI平台的流程,包括從資料收集到模型訓練、程式碼生成和佈署的整個過程。每一步驟都對於構建一個成功的邊緣AI應用至關重要。

端對端邊緣AI平台的優勢與實務應用

在邊緣AI的開發過程中,使用端對端平台已經成為主流趨勢。這些平台提供了一整套的工具和服務,從資料處理、模型訓練到佈署和測試,全面簡化了開發流程並提升了效率。

提升開發效率與協作能力

端對端邊緣AI平台能夠顯著提高團隊的生產力。它們提供了一個中央儲存函式庫,用於管理團隊的資料集和工作流程構件。透過API和可組態的機器學習Pipeline,團隊可以自動化常規任務,例如在新資料可用時訓練、測試和佈署新版本的模型。此外,視覺化和低程式碼使用者介面使團隊中的任何人都能貢獻見解,而不僅限於具備資料科學或嵌入式工程技能的人員。

自動化與最佳化

這些平台通常具備自動機器學習(AutoML)功能,能夠自動選擇最適合特定任務的訊號處理和機器學習演算法組合。它們還能提供裝置上的效能估計,幫助開發者選擇合適的演算法或嵌入式處理器。這種自動化和最佳化的能力,大大縮短了開發週期並降低了技術門檻。

簡化硬體選擇與佈署

端對端平台的一大優勢是,它們允許開發者方便地嘗試不同的硬體以找到最佳匹配。同一個模型可以透過幾次點選以最佳化的形式佈署到多個微控制器、SoC和機器學習加速器上,從而使開發團隊能夠比較效能並確定適合其應用的正確選擇。

與開源工具的整合

優秀的端對端平台不會限制開發者使用開源工具。它們與行業標準技術整合良好,並且不會依賴供應商鎖定來保留客戶。開發者可以輕鬆匯出資料、模型和訓練程式碼,並且可以簡單地建立混合的MLOps堆積疊,結合多個解決方案的部分。

端對端平台 vs. 自行搭建工具鏈

目前,大多數專案都能從端對端平台提供的生產力、結構和跨工作流程整合中受益。即使開發者具備資料科學、訊號處理或嵌入式工程的強大技能,從頭開始設定自己的工具鏈仍然非常困難。端對端平台提供了適當的指導,填補了開發者的盲點,並且避免了自行搭建工具鏈所需的大量時間和資源投入。

成本與靈活性考量

雖然有人擔心使用端對端平台可能會限制靈活性和開放性,但優秀的平台已經考慮到了這一點,並提供了易於整合的介面。此外,許多平台提供免費層級和企業訂閱模式,使得成本變得可控且合理。