如何快速部署可立即用於邊緣的機器學習應用

作者:Stephen Evanczuk

資料提供者:DigiKey 北美編輯群

機器學習 (ML) 在打造智慧產品方面擁有龐大潛力,但神經網路 (NN) 模型以及建立邊緣用的 ML 應用,當中涉及的複雜性和挑戰,會限縮開發人員快速提供實用解決方案的能力。整體來說,透過現成可用的工具,建立 ML 模型已經更為平易近人,但傳統的 ML 開發實務並非用來滿足物聯網 (IoT)、汽車、工業系統等解決方案,以及其他嵌入式應用的獨特需求。

本文將概略介紹神經網路的模型建立,然後介紹並說明如何使用 NXP Semiconductors 完善的 ML 平台,協助開發人員更有效地提供可立即用於邊緣的 ML 應用。

快速探討神經網路建模

ML 演算法在應用開發層面,為開發人員帶來截然不同的做法。開發人員不必編寫軟體程式碼來確實解決圖像分類等問題,而是提供一組資料 (例如在影像中加註該影像內實體的實際名稱或類別),藉此訓練 NN 模型。在訓練過程中會使用多種方法,針對各個神經原與層級計算模型的權重和偏差值參數,以便模型以合理的準確度預測輸入圖像的正確類別 (圖 1)。

如這類全連接網路的 NN 對輸入物件進行分類的示意圖 (按此放大)圖 1:如這類全連接網路的 NN,使用訓練期間所設定的權重和偏差參數,對輸入物件進行分類。(圖片來源:NXP Semiconductors)

ML 研究人員已在圖 1 所示的通用型全連接 NN 以外,發展出豐富多樣的 NN 架構。舉例來說,圖像分類應用通常會利用卷積神經網路 (CNN)。這種專門架構會將圖像識別拆成尋找圖像主要特徵的初始階段,接著才是分類階段,在此預測圖像屬於訓練期間所建立幾個類別之一的可能性 (圖 2)。

卷積神經網路 (CNN ) 示意圖 (按此放大)圖 2:ML 專家使用專門的神經網路架構,例如此卷積神經網路 (CNN),來執行圖像識別等特定任務。(圖片來源:NXP Semiconductors)

儘管 ML 專家能挑選的適當模型架構和訓練方案一直都很有限,但在眾多開源及商業的工具問世後,已經大幅簡化大規模部署時模型開發作業。如今,開發人員只需用幾行程式碼 (清單 1) 即可定義模型,並使用 Netron 模型檢視器等開源工具,就可圖形化呈現模型 (圖 3),以檢查每一層的定義與連接性。

複製
def model_create(shape_in, shape_out):
    from keras.regularizers import l2
    
    tf.random.set_seed(RANDOM_SEED)
 
    model = tf.keras.Sequential()
    model.add(tf.keras.Input(shape=shape_in, name='acceleration'))
    model.add(tf.keras.layers.Conv2D(8, (4, 1), activation='relu'))
    model.add(tf.keras.layers.Conv2D(8, (4, 1), activation='relu'))
    
    model.add(tf.keras.layers.Dropout(0.5))
    
    model.add(tf.keras.layers.MaxPool2D((8, 1), padding='valid'))
    model.add(tf.keras.layers.Flatten())
    
    model.add(tf.keras.layers.Dense(64, kernel_regularizer=l2(1e-4), bias_regularizer=l2(1e-4), activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(32, kernel_regularizer=l2(1e-4), bias_regularizer=l2(1e-4), activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(shape_out, activation='softmax'))
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
    
    return model

清單 1:開發人員只需用幾行程式碼便可定義 NN 模型。(程式碼來源:NXP Semiconductors)

清單 1 所定義之模型的圖形化呈現圖 (按此放大)圖 3:清單 1 所定義之模型的圖形化呈現是由 Netron 檢視器產生,有助於開發人員記錄每一層的功能和連接性。(圖片來源:Stephen Evanczuk,於清單 1 中的 NXP 模型原始程式碼執行 Netron)

在最終部署時,會使用其他工具進行清除,僅保留訓練期間所需的模型結構,並執行其他最佳化作業,以建立高效率的推論模型。

為何開發智慧型產品用的 ML 應用如此困難

在定義和訓練 IoT 或其他智慧型產品的模型時,遵循的工作流程類似於針對企業規模機器學習應用建立模型的工作流程。但是,除了這種相似性外,開發邊緣用的 ML 應用還有其他諸多挑戰。除了模型開發外,為了運行微控制器 (MCU) 架構產品,設計人員也會碰到開發主應用的類似難題。因此,若要在邊緣引進 ML,就必須管理兩套彼此關聯的工作流程 (圖 4)。

圖 4:開發邊緣用的 ML 應用時,除了典型的嵌入式 MCU 開發工作流程之外,還要添加 ML 工作流程,以便訓練、驗證和部署 ML 模型。(圖片來源:NXP Semiconductors)

雖然嵌入式開發人員已經熟悉 MCU 專案的工作流程,但為了打造最佳化的 ML 推論模型,ML 專案會在 MCU 應用上加諸額外的要求。實際上,ML 專案對嵌入式元件的需求有顯著影響。模型的執行通常會帶來龐大的運算負載和記憶體需求,有可能會超出 IoT 和智慧型產品搭載的微控制器資源量。為了降低資源需求,ML 專家會應用模型網路篩檢、壓縮、量化等技術來降低精確度,甚至會用單位元參數和中間值,以及其他方法。

然而,即便透過這些最佳化方法,開發人員仍會發現,傳統的微控制器在面對 ML 演算法需要大量的數學運算時,缺乏必要的處理效能。另一方面,使用高效能應用處理器可以處理 ML 運算負載,但這種做法可能會導致延遲增加和非確定性反應,進而減損嵌入式設計的即時特性。

除了硬體選擇的難題之外,在提供邊緣用的最佳化 ML 模型時,還會面臨嵌入式開發獨有的其他挑戰。針對企業規模 ML 應用所開發的大量工具和方法,可能無法很好地延伸到嵌入式開發人員的應用和操作環境中。即使是經驗豐富的嵌入式開發人員,若要快速部署 ML 架構裝置,也會在大量可用的 NN 模型架構、工具、框架和工作流程中,為了找出有效的解決方案而絞盡腦汁。

NXP 針對邊緣 ML 的開發,同時克服硬體效能和模型實作上所面臨的問題。在硬體方面,NXP 的高效能 i.MX RT1170 跨界微控制器,可以滿足邊緣 ML 的眾多效能要求。為了完全發揮此硬體基礎的優勢,NXP 的 eIQ (邊緣智慧) ML 軟體開發環境與應用程式軟體套件,可針對 ML 開發新手與專家提供有效的解決方案,以打造可立即用於邊緣的 ML 應用。

開發可立即用於邊緣的 ML 應用的有效平台

NXP 的 i.MX RT 跨界處理器結合了傳統嵌入式微控制器的即時低延遲反應,以及高效能應用處理器的執行能力。NXP 的 i.MX RT1170 跨界處理器系列,整合了高效節能型 Arm® Cortex®-M4 及高效能 Arm Cortex-M7 處理器,更搭載一套功能區塊與周邊裝置,以便在嵌入式元件中執行 ML 解決方案等高要求應用 (圖 5)。

圖 5:NXP 的 i.MX RT1170 跨界處理器結合了傳統微控制器的節能功能,和應用處理器的高效能處理能力。(圖片來源:NXP Semiconductors)

NXP 的 eIQ 環境完全整合至 NXP 的 MCUXpresso SDK 和 Yocto 開發環境中,此專門設計可在利用 NXP 微處理器和微控制器打造的嵌入式系統上,協助實作推論模型。eIQ 環境中隨附 eIQ Toolkit,可透過其中的 eIQ Portal、eIQ Model Tool 和命令此列工具,支援自帶資料 (BYOD) 及自帶模型 (BYOM) 兩種工作流程 (圖 6)。

圖 6:NXP 的 eIQ Toolkit 可支援需要建立模型的 BYOD 開發人員,以及需要將自己現有模型部署到目標系統的 BYOM 開發人員。(圖片來源:NXP Semiconductors)

eIQ Portal 可支援 ML 模型開發專家與新手進行 BYOD 工作流程,更提供圖形使用者介面 (GUI),有助於開發人員更輕鬆完成模型開發工作流程中的每個階段。

在開發的初期階段,eIQ Portal 的資料集策劃工具可幫助開發人員匯入資料、從連接的攝影機擷取資料,或從遠端裝置擷取資料 (圖 7)。

圖 7:eIQ Portal 的資料集策劃工具有助於執行資料訓練的關鍵準備作業。(圖片來源:NXP Semiconductors)

透過資料集策劃工具,開發人員可標示整個圖像,或只標示限定框內所包含的特定區域,藉此將資料集中的各個項目加上註解或標籤。也有提供多種增強功能,有助於開發人員提供資料集所需的多樣性,包括模糊圖像、增加隨機雜訊、更改亮度或對比等特性,以及其他增強功能。

在下個階段,eIQ Portal 可幫助開發人員選擇最適合應用的模型類型。若開發人員不確定模型類型,模型選擇精靈會根據應用類型和硬體基礎,在挑選過程中逐步引導開發人員。若開發人員已經知道需要的模型類型為何,則可選擇 eIQ 安裝或其他自訂實作所提供的自訂模型。

eIQ Portal 會帶領開發人員前往下一個重要的訓練步驟,提供直覺式 GUI 以修改訓練參數,並檢視每個訓練步驟中的模型預測準確度變化 (圖 8)。

圖 8:開發人員使用 eIQ Portal 的訓練工具,觀察每個步驟中的訓練準確度改善,並在必要時進行修改。(圖片來源:NXP Semiconductors)

接下來,eIQ Portal GUI 將幫助開發人員驗證模型。在此階段中,會將模型轉換成在目標架構上執行,藉此判定其實際效能。驗證完成後,驗證畫面會顯示混淆矩陣。這是一種基本的 ML 驗證工具,能讓開發人員將輸入物件的實際類別,與模型預測的類別進行比較 (圖 9)。

圖 9:eIQ Portal 的驗證工具會將模型在目標架構上執行後產生的混淆矩陣提供給開發人員參考。(圖片來源:NXP Semiconductors)

在最終部署時,此環境可讓開發人員依據處理器選擇目標推論引擎。引擎包括:

  • Arm CMSIS-NN (通用微控制器軟體介面標準,神經網路):此神經網路核心可將 Arm Cortex-M 處理器核心上的神經網路效能最大化,並將記憶體覆蓋區最小化。
  • Arm NN SDK (神經網路,軟體開發套件):這一套工具與推論引擎可橋接現有的神經網路框架與 Arm Cortex-A 處理器等等
  • DeepViewRT:這是 NXP 自行研發的推論引擎,適用於 i.MX RT 跨界 MCU
  • Glow NN:以 Meta 的 Glow (graph lowering) 編譯器為基礎,並由 NXP 針對 Arm Cortex-M 核心進行最佳化,方法包括使用對 CMSIS-NN 核心或 Arm NN 庫 (如果提供) 的函數呼叫,或以不同方式編譯本身原生庫中的程式碼
  • ONXX Runtime:Microsoft Research 的工具,可將 Arm Cortex-A 處理器的效能最佳化
  • TensorFlow Lite for Microcontrollers—這是 TensorFlow Lite 的小型版本,針對在 i.MX RT 跨界 MCU 上執行機器學習模型進行最佳化
  • TensorFlow Lite—這是 TensorFlow 的一種版本,可支援較小型的系統

針對 BYOM 工作流程,開發人員可以使用 eIQ Model Tool 直接移到模型分析和各層的時間分析中。對於 BYOD 和 BYOM 工作流程,開發人員可以透過 eIQ 命令列工具存取工具功能,以及無法直接透過 GUI 使用的 eIQ 功能。

除本文所述功能外,eIQ Toolkit 還支援其他多樣功能,包括模型轉換和最佳化,但已超出本文討論範圍。為了快速建立可立即用於邊緣的 ML 應用原型,開發人員通常可以快速完成開發和部署,幾乎無需使用 eIQ 環境中許多更為複雜的功能。事實上,NXP 的專用 Application Software (App SW) Pack 提供完整的應用程式,能讓開發人員立即進行評估,或當作其自訂應用的基礎。

如何使用 App SW Pack 快速評估模型開發

NXP 的 App SW Pack 提供完整的 ML 應用程式,結合了可立即上線的原始碼、驅動程式、中介軟體和工具。舉例來說,NXP ML State Monitor App SW Pack 提供立即可用的 ML 解決方案,可依據感測器的輸入,解決判定複雜系統狀態時經常遭遇的問題 (圖 10)。

圖 10:開發人員可以使用 ML State Monitor App SW Pack 等 NXP App SW Pack 立即進行評估,或當作其自訂程式碼開發的基礎。(圖片來源:NXP Semiconductors)

ML State Monitor App SW Pack 可在應用中實作完整的解決方案,以便偵測風扇的操作狀態屬於以下四種中哪一種:

  • ON
  • OFF
  • CLOGGED:風扇啟動但氣流受阻
  • FRICTION:風扇啟動,但一片或多片風扇葉片在操作過程中的摩擦力過大

對模型開發人員而言也很重要的是,ML State Monitor App SW Pack 含有 ML 模型,以及代表加速計讀數的完整資料集 (這些讀數分別來自於這四種狀態下運作的風扇)。

開發人員可以研究 ML State Monitor App SW Pack 提供的程式碼、模型和資料,瞭解如何使用感測器資料來訓練模型、建立推論模型,以及對比驗證感測器資料集來驗證推論。事實上,App SW Pack 中包含 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook,其中提供一種立即可用的現成工具,可在任何硬體部署前,研究模型開發工作流程。

Jupyter Notebook 屬於互動式瀏覽器操作的 Python 執行平台,能讓開發人員立即查看 Python 程式碼的執行結果。執行 Jupyter Notebook 會產生一個 Python 程式碼區塊,緊接著是運行該程式碼區塊後的結果。這些結果不僅是靜態呈現,更是執行程式碼獲得的實際結果。例如,當開發人員執行 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook 時,他們可以立即查看輸入資料集的摘要 (圖 11)。

圖 11:NXP 的 ML_State_Monitor.ipynb Jupyter Notebook 可讓開發人員以互動方式,一路完成神經網路模型開發工作流程,並且查看 ML State Monitor App SW Pack 提供的訓練資料。[註:為了方便顯示,在此截斷程式碼。](圖片來源:Stephen Evanczuk,執行 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook)

Notebook 的下一段程式碼為使用者提供輸入資料的圖形呈現,並針對時間序列和頻率以不同圖表呈現 (圖 12)。

圖 12:Jupyter Notebook 為開發人員提供風扇狀態資料集範例的時間序列和頻率顯示 (OFF:綠色;ON:紅色;CLOGGED:藍色;FRICTION:黃色)。[註:為了方便呈現,在此截斷程式碼。](圖片來源:Stephen Evanczuk,執行 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook)

額外的程式碼片段可提供進一步的資料分析、標準化、整形和其他準備作業,直到程式碼執行達到如先前清單 1 所示,相同的模型建立函數定義 model_create()。緊接的下一個程式碼片段會執行 model_create() 函數,並列印快速驗證的摘要 (圖 13)。

圖 13:NXP 的 ML_State_Monitor.ipynb Jupyter Notebook 建立此模型 (如清單 1 所示),並顯示模型摘要資訊。(圖片來源:Stephen Evanczuk,執行 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook)

在模型訓練和評估的程式碼片段之後,ML_State_Monitor.ipynb Jupyter Notebook 會顯示完整資料集、訓練資料集和驗證資料集 (從訓練資料集中排除的資料集子集) 的每個混淆矩陣。在本例中,完整資料集的混淆矩陣顯示出良好的準確度和某些錯誤,尤其是資料集實際處於 CLOGGED 狀態下時 (如原始資料集中所註解的狀態),模型會搞混一小部分資料集,以為處在 ON 狀態 (圖 14)。

圖 14:開發人員可以查看混淆矩陣,例如這一個用於完整資料集的矩陣。(圖片來源:Stephen Evanczuk,執行 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook)

在後續程式碼片段中,此模型會匯出成幾種不同的類型和格式,供 eIQ 開發環境所支援的各種推論引擎使用 (圖 15)。

圖 15:NXP 的 ML_State_Monitor.ipynb Jupyter Notebook 展示了開發人員如何以多種不同類型和格式儲存訓練後的模型。(圖片來源:Stephen Evanczuk,執行 NXP 的 ML_State_Monitor.ipynb Jupyter Notebook)

推論引擎的挑選對於滿足特定效能要求來說相當重要。針對此應用,當模型的目標對象是幾個推論引擎 (一個以 996 MHz 執行,一個以 156 MHz 執行,如圖 16 和 17 所示),NXP 會測量模型大小、程式碼大小和推論時間 (即完成單一輸入物件推論所需的時間)。

圖 16:模型類型的挑選可能會顯著影響模型大小,但是此處顯示的顯著差異,可能不適用於較大的模型。(圖片來源:NXP Semiconductors)

圖 17:評估輸入物件時,從 RAM 或從快閃記憶體載入輸入物件,或是以 156 MHz 頻率還是更高的 996 MHz 頻率運作處理器,所需的推論時間會有顯著差異。(圖片來源:NXP Semiconductors)

如 NXP 所述,此範例應用使用非常小的模型,因此這些數字儘管出現明顯的差異,但在複雜分類用的較大模型中,差異可能沒那麼明顯。

打造用於狀態監測的系統解決方案

除了使用 Jupyter Notebook 以互動方式探究模型開發工作流程外,NXP 的 ML State Monitoring App SW Pack 還提供完整的原始碼,可在 NXP 的 MIMXRT1170-EVK 評估板上實作此設計。評估板是以 NXP MIMXRT1176DVMAA 跨界 MCU 為基礎打造,可提供完善的硬體平台,更備有額外記憶體與多個介面 (圖 18)。

圖 18:NXP 的 MIMXRT1170-EVK 評估板提供完善的硬體平台,可用來開發基於 NXP i.MX RT1170 系列跨界 MCU 的應用。(圖片來源:NXP Semiconductors)

開發人員可以使用 NXP 風扇狀態應用,將選配的 NXP FRDM-STBC-AGM01 感測器板、Arduino 擴充板,以及合適的 5 V 無刷 DC 風扇 (如 Adafruit4468) 堆疊至 MIMXRT1170-EVK 評估板上,即可預測風扇狀態 (圖 19)。

圖 19:開發人員可以使用基於 MIMXRT1170-EVK 評估板打造的簡易堆疊,來測試 NXP 風扇狀態範例應用。(圖片來源:NXP Semiconductors)

開發人員可以使用 MCUXpresso 整合式開發環境 (IDE) 來配置應用,只擷取並儲存風扇狀態資料;或使用 TensorFlow 推論引擎、DeepViewRT 推論引擎,或 Glow 推論引擎,立即對擷取的資料執行推論 (清單 2)。

複製
/* Action to be performed */
#define SENSOR_COLLECT_LOG_EXT                  1   // Collect and log data externally
#define SENSOR_COLLECT_RUN_INFERENCE            2   // Collect data and run inference
 
/* Inference engine to be used */
#define SENSOR_COLLECT_INFENG_TENSORFLOW        1   // TensorFlow
#define SENSOR_COLLECT_INFENG_DEEPVIEWRT        2   // DeepViewRT
#define SENSOR_COLLECT_INFENG_GLOW              3   // Glow
 
/* Data format to be used to feed the model */
#define SENSOR_COLLECT_DATA_FORMAT_BLOCKS       1   // Blocks of samples
#define SENSOR_COLLECT_DATA_FORMAT_INTERLEAVED  2   // Interleaved samples
 
 
/* Parameters to be configured by the user: */
/* Configure the action to be performed */
#define SENSOR_COLLECT_ACTION                   SENSOR_COLLECT_RUN_INFERENCE
 
#if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
/* If the SD card log is not enabled the sensor data will be streamed to the terminal */
#define SENSOR_COLLECT_LOG_EXT_SDCARD           1   // Redirect the log to SD card, otherwise print to console

清單 2:開發人員可以修改 sensor_collect.h 標頭檔案所包含的定義,即可輕鬆設定 NXP ML State Monitor 範例應用。(程式碼來源:NXP Semiconductors)

此應用以簡單明瞭的處理流程運作。main.c 中的主常式會建立一個名為 MainTask 的工作,這是位於 sensor_collect.c 模組中的常式之一。

複製
void MainTask(void *pvParameters)
{
    status_t status = kStatus_Success;
 
    printf("MainTask started\r\n");
 
#if !SENSOR_FEED_VALIDATION_DATA
    status = SENSOR_Init();
    if (status != kStatus_Success)
    {
        goto main_task_exit;
    }
#endif
 
    g_sensorCollectQueue = xQueueCreate(SENSOR_COLLECT_QUEUE_ITEMS, sizeof(sensor_data_t));
    if (NULL == g_sensorCollectQueue)
    {
        printf("collect queue create failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
 
#if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
    uint8_t captClassLabelIdx;
    CAPT_Init(&captClassLabelIdx, &g_SensorCollectDuration_us, &g_SensorCollectDuration_samples);
    g_SensorCollectLabel = labels[captClassLabelIdx];
 
    if (xTaskCreate(SENSOR_Collect_LogExt_Task, "SENSOR_Collect_LogExt_Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL) != pdPASS)
    {
        printf("SENSOR_Collect_LogExt_Task creation failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
#elif SENSOR_COLLECT_ACTION == SENSOR_COLLECT_RUN_INFERENCE
    if (xTaskCreate(SENSOR_Collect_RunInf_Task, "SENSOR_Collect_RunInf_Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL) != pdPASS)
    {
        printf("SENSOR_Collect_RunInf_Task creation failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
#endif

清單 3:在 NXP ML State Monitor 範例應用中,MainTask 會呼叫子工作來擷取資料或執行推論。(程式碼來源:NXP Semiconductors)

MainTask 會在啟動兩個子工作之一前,執行各種初始化工作,具體取決於使用者在 sensor_collect.h 中設定的定義:

  • 如果將 SENSOR_COLLECT_ACTION 設定為 SENSOR_COLLECT_LOG_EXT,MainTask 會啟動子工作 SENSOR_Collect_LogExt_Task(),以收集資料並將儲存在 SD 卡 (如果已配置)
  • 如果將 SENSOR_COLLECT_ACTION 設定為 SENSOR_COLLECT_RUN_INFERENCE,MainTask 會啟動子工作 SENSOR_Collect_RunInf_Task(),以對照收集的資料執行 sensor_collect.h 中定義的推論引擎 (Glow、DeepViewRT 或 TensorFlow);而且如果 SENSOR_EVALUATE_MODEL 已經定義,則會顯示產生的效能和分類預測
複製
if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
void SENSOR_Collect_LogExt_Task(void *pvParameters)
{
[code deleted for simplicity]
    while (1)
    {
[code deleted for simplicity]
            bufSizeLog = snprintf(buf, bufSize, "%s,%ld,%d,%d,%d,%d,%d,%d,%d\r\n", g_SensorCollectLabel, (uint32_t)(sensorData.ts_us/1000),
                    sensorData.rawDataSensor.accel[0], sensorData.rawDataSensor.accel[1], sensorData.rawDataSensor.accel[2],
                    sensorData.rawDataSensor.mag[0], sensorData.rawDataSensor.mag[1], sensorData.rawDataSensor.mag[2],
                    sensorData.temperature);
 
#if SENSOR_COLLECT_LOG_EXT_SDCARD
                SDCARD_CaptureData(sensorData.ts_us, sensorData.sampleNum, g_SensorCollectDuration_samples, buf, bufSizeLog);
#else
                printf("%.*s", bufSizeLog, buf);
[code deleted for simplicity]
    }
 
    vTaskDelete(NULL);
}
#elif SENSOR_COLLECT_ACTION == SENSOR_COLLECT_RUN_INFERENCE
[code deleted for simplicity]
 
void SENSOR_Collect_RunInf_Task(void *pvParameters)
{
[code deleted for simplicity]
    while (1)
    {
[code deleted for simplicity]
                /* Run Inference */
                tinf_us = 0;
                SNS_MODEL_RunInference((void*)g_clsfInputData, sizeof(g_clsfInputData), (int8_t*)&predClass, &tinf_us, SENSOR_COLLECT_INFENG_VERBOSE_EN);
 
[code deleted for simplicity]
#if SENSOR_EVALUATE_MODEL
                /* Evaluate performance */
                validation.predCount++;
                if (validation.classTarget == predClass)
                {
                    validation.predCountOk++;
                }
                PRINTF("\rInference %d?%d | t %ld us | count: %d/%d/%d | %s      ",
                       validation.classTarget, predClass, tinf_us, validation.predCountOk,
                       validation.predCount, validation.predSize, labels[predClass]);
 
                tinfTotal_us += tinf_us;
                if (validation.predCount >= validation.predSize)
                {
                    printf("\r\nPrediction Accuracy for class %s %.2f%%\r\n", labels[validation.classTarget],
                            (float)(validation.predCountOk * 100)/validation.predCount);
                    printf("Average Inference Time %.1f (us)\r\n", (float)tinfTotal_us/validation.predCount);
                    tinfTotal_us = 0;
                }
#endif
 
    }
 
exit_task:
    vTaskDelete(NULL);
}
#endif  /* SENSOR_COLLECT_ACTION */

清單 4:NXP ML State Monitor 範例應用程式展示了基本的設計模式,可用來擷取感測器資料,並針對擷取的資料執行選定的推論引擎。(程式碼來源:NXP Semiconductors)

由於 ML State Monitor App SW Pack 提供了完整的原始程式碼,以及一整套需要的驅動程式和中介軟體,因此開發人員可以輕易擴充應用程式來添加功能,或將其當作自訂開發的起點。

結論

若在 IoT 和其他應用的智慧型產品中實作邊緣 ML,就可提供一套強大的功能,但這也往往讓開發人員難以使用專為企業級應用所開發的 ML 工具和方法。在含有跨界處理器和專用模型開發軟體的 NXP 開發平台推出後,無論是 ML 專家或僅有少許甚至毫無經驗的開發人員,都可更有效地建立專為滿足高效率邊緣效能要求而設計的 ML 應用。

DigiKey logo

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。

關於作者

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk 撰寫電子產業的相關資訊已有超過二十年的經驗,涉及的主題多元,涵蓋硬體、軟體、系統以及包含 IoT 在內的應用。他以神經元網路為研究主題,取得神經科學博士學位,並且在航太產業,針對廣泛運用的安全系統和演算法加速方法進行研究。目前,在撰寫科技和工程文章之餘,他投入辨識和推薦系統的深度學習應用。

關於出版者

DigiKey 北美編輯群