---
# System prepended metadata

title: Arm Cortex-M & Ethos-U55 ML開發者指南(版本 1.1)
tags: [MCU, Arm, NPU, TinyML]

---

# Arm Cortex-M & Ethos-U55 ML開發者指南(版本 1.1)

Jack OmniXRI 整理製作, 2025/02/11

完整內容： https://hackmd.io/@OmniXRI-Jack/arm_developer_cortexm55_ethosu55_guide

資料來源： [ML Developers Guide for Cortex-M Processors and Ethos-U NPU Version 1.1]( https://developer.arm.com/documentation/109267/0101/?lang=en)

:::danger
本網頁僅供自我學習及快速查找用，請勿移作他用。為方便閱讀，相關章節及圖示編號已作過微調。全文採用AI翻譯並以人工進行調整，非Arm授權翻譯之版本，如有翻譯不當煩請私訊告知。另外本文件原始相關著作權、權利義務及使用限制請以Arm官方英文版本為準。
:::

[toc]

## 1.概述

原始文件：https://developer.arm.com/documentation/109267/0101/Overview

感謝您選擇在機器學習（ML）Edge設備應用程序中使用Ethos-U網路處理單元（NPU）使用ARM Cortex-M處理器。為了為您提供使用ARM處理器開發ML應用程序的最佳體驗，ARM提供硬體IP，工具和軟體，使產品開髮變得容易且富有成效。此外，ARM提供支持材料並與許多AI合作夥伴合作，以補充我們的解決方案，例如使用優化的ML模型，MLOPS整合和評估板。

本指南包含以下信息：
* 概述提供了ML開發過程的概述，引入了支持從ML模型培訓到硬體調試的整個ML開發工作流的ARM技術和產品。
* [ARM Cortex-M處理器](https://developer.arm.com/documentation/109267/0101/ML-software-development-for-Arm-Cortex-M-processors?lang=en)的ML軟體開發描述了為資源受限系統開發ML軟體所涉及的概念，其中一個使用TensorFlow Lite用於微控制器（TFLM）。
* [ARM Ethos-U NPU](https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU?lang=en)提供了有關不同Ethos-U處理器的信息，包括硬體和軟體設計注意事項。
* [對ARM Ethos-U NPU的工具支持](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU)描述了Vela編譯器，該編譯器會轉換ML模型，以執行Ethos-U NPU，以及ML干擾顧問，ARM虛擬硬體和SDS-FRAMEWORK用於分析，驗證和培訓。
* [ARM ML動物園](https://developer.arm.com/documentation/109267/0101/The-Arm-ML-Zoo?lang=en)引入了一個存儲庫，其中包含用於各種應用程序的預訓練模型。本節還解釋瞭如何在存儲庫中使用模型。
* [基於CMSIS包裝的ML範例](https://developer.arm.com/documentation/109267/0101/CMSIS-Pack-based-ML-examples?lang=en)演示了使用CMSIS包裝形式的軟體組件的ML軟體整合，並使用CMSIS-Toolbox來管理構建環境。
* [MLOPS系統](https://developer.arm.com/documentation/109267/0101/MLOps-systems?lang=en)描述了將ARM基礎工具整合到MLOPS系統中，該工具可自動化訓練並幫助您為應用程序選擇最佳的ML模型。
* [Ethos-U的資源](https://developer.arm.com/documentation/109267/0101/Resources-for-Ethos-U?lang=en)概述了支持Ethos-U NPU的可用資源和生態系統合作夥伴。

### 1.1.目標受眾

本指南具有有關Cortex-M軟體開發的一些基本知識。它是為以下受眾寫的：
* 想要使用微控制器設備的嵌入式開發人員，這些設備結合了Ethos-U處理器，並且需要輕鬆訪問開發工具，軟體範例和其他用法信息。
* 希望支持Ethos-U NPU處理器系列並需要將各種開發工具整合到其開發流中的MLOPS系統架構師。
* 數據科學家分析數據以開發新的ML模型並需要軟體工具來收集有關模型性能的統計信息。

### 1.2.邊緣設備上的機器學習

原始文件：https://developer.arm.com/documentation/109267/0101/Overview/Machine-Learning-on-edge-devices

在邊緣設備上實現ML可以實現新的應用程序。這些應用程序的範例包括以下內容：

**預測性維護** 系統中的傳感器可以確定可能的故障，從而可以主動維護以防止停機時間。

**語音識別** 使用自然語言與設備互動。

**使用自然語言與設備互動** 提高效率，降低錯誤並提高製造環境的安全性。

**醫學診斷** 協助醫療，幫助設計個性化的治療計劃。

**計算機視覺** 使機器人能夠通過識別物體，檢測障礙和跟踪人們來感知和理解其環境。

使機器人能夠通過識別物體，檢測障礙和跟踪人們來感知和理解其環境。

通常，ML模型需要大量可靠數據才能執行準確的預測。訓練ML模型時，工程師需要收集大量代表性的數據樣本。該培訓數據可能是從設備的個別用戶收集的圖像，傳感器數據或數據的集合。

今天，從IoT端點設備上運行的數據經常在雲服務器上執行的AI和ML算法。但是，為了滿足嵌入式系統的實時要求，實際的AI算法必須在邊緣設備上執行。

### 1.3.ML計算要求

不同機器學習算法的計算要求可能會因算法的類型，模型培訓期間所需的數據集的大小，問題的整體複雜性以及應用程序的定時要求而變化很大。

因此，ARM在邊緣設備上針對機器學習應用程序提供了廣泛的優化處理器，如下圖所示：

圖1-1 ARM ML處理器應用情境
![arm Fig1-1](https://hackmd.io/_uploads/SJHpWmvYye.svg)

* 即使是最小的ARM處理器，Cortex-M0/M0+處理器也可以執行簡單的ML算法。例如，您可以使用Cortex-M0/M0+處理器來實現從單個傳感器監視數據的預測維護系統。
* 從Cortex-M4開始，ARM處理器提供硬體浮點算術和SIMD指令，可以加速DSP和簡單的ML算法。例如，這些處理器可以運行使用傳感器融合來合併多個傳感器數據的應用程序。
* Cortex-M55和Cortex-M85處理器使用Helium向量指令擴展了架構，從而實現了更複雜的ML算法。例如，這些處理器可以運行使用語音關鍵字發現或對象和異常檢測的應用程序。
* Ethos-U是Micronpus的家族，可以在端點上實現極低的功率ML推斷。 Ethos-U與ARM Cortex處理器結合使用，並提供ML性能的巨大提高。

對於更苛刻的應用程序，ARM ML處理器組合還包括Mali圖形處理器和Cortex-A處理器。但是，這些處理器不在本指南的範圍之內。本指南重點介紹了使用單核Cortex-M處理器與Ethos-U NPU配對的微小邊緣設備的開發流。 

### 1.4.ML開發過程的概述

原始文件：https://developer.arm.com/documentation/109267/0101/Overview/Overview-of-the-ML-development-process

嵌入式物聯網和ML設備的軟體和系統設計由兩個部分組成：
* 經典的嵌入式IoT軟體部分。該部分需要有效的設備驅動程序，這些設備驅動程序與外圍設備連接，具有安全性的通信堆疊以及固件更新服務。
* 實現機器學習算法的系統部分。 ML部分通常是使用專門用於ML算法開發的軟體即服務（SaaS）雲環境設計的。

實現機器學習算法的系統部分。 ML部分通常是使用專門用於ML算法開發的軟體即服務（SaaS）雲環境設計的。

圖1-2 MLOPS過程步驟
![arm Fig1-2](https://hackmd.io/_uploads/HyPjZ7PYJg.svg)

MLOPS過程包含以下步驟：

**數據收集** 數據收集是ML項目的基礎。 ML模型必須有足夠的數據可以學習，數據必須涵蓋盡可能多的方案，並且數據必須準確。數據的數量和質量對於模型的性能至關重要。

**數據分析** 數據分析需要了解數據收集中表示的不同方案。如果收集的數據包含場景的混合物，則可能需要裁剪或清潔數據。

**數據標籤** 數據標記是收集和清潔數據的註釋。例如，健身追踪器的數據可能標記為“步行”，“運行”和“ rest”，以描述代表的不同活動。

**數據準備** 數據準備使收集的數據可用於培訓模型。例如，您可能會將數據分開為培訓數據，驗證數據和測試數據進行煙霧測試。培訓數據通常是最大的數據集。

**模型培訓** 模型培訓執行ML模型的訓練。培訓是機器學習算法的過程，可以從中學習培訓數據集。

**模型評估** 系統驗證使用模型數據測試ML算法，在最終目標系統上運行。可以使用簡化的驗證數據集對ML算法進行驗證。

**模型部署** 通常在孤立系統中測試和開發機器學習模型。 ML模型的訓練主要發生在雲中，因為培訓需要廣泛的數據集和高計算功率。訓練完成後，使用ML模型的算法可以直接在IoT Endpoint設備上執行。

正如人類學習並改善了過去的經驗一樣，ML算法隨著可用於學習的樣本數量的增加而適應性地提高了其性能。只有在存在培訓數據的領域才能做出正確的決定。因此，學習意味著ML算法是根據提供其他信息的新數據進行了重新訓練的。

例如，如果圖片識別應用程序從未看過貓的圖片，則無法正確限定它。下圖顯示了此缺少的培訓數據的結果。因此，預計合併AI和ML技術的IoT端點系統需要定期更新。

圖1-3 缺少培訓數據
![arm Fig1-3](https://hackmd.io/_uploads/rkwNmmvFJx.png)

### 1.5.用於ML開發的工具和軟體

用於ML開發的工具和軟體

| 步驟 | 工具 | 描述 |
| :--------: | :--------: | -------- |
| 數據收集 | [Keil MDK](https://www.keil.arm.com/) | 用於針對Cortex-M處理器的經典嵌入式IoT軟體開發。 |
| 數據收集 | [SDS Framework](https://github.com/ARM-software/SDS-Framework) | 對於數據捕獲，可選地與MDK中間件合併以與網路，USB或文件系統介面。 |
| 模型評估 | [Arm Compiler for Embedded](https://developer.arm.com/Tools%20and%20Software/Arm%20Compiler%20for%20Embedded) | 所有Cortex-M處理器的商業C/C++編譯器。 |
| 模型評估 | [Arm GNU Toolchain GNU](https://developer.arm.com/Tools%20and%20Software/GNU%20Toolchain) | GCC C/C++編譯器（社區支持）；不建議用於具有Helium延伸指令的Cortex-M處理器。 |
| 模型評估 | [Arm LLVM Embedded Toolchain](https://learn.arm.com/install-guides/llvm-embedded/) | 所有Cortex-M處理器的C/C++ clang編譯器（社區支持）。 |
| 模型評估 | [CMSIS-NN](https://arm-software.github.io/CMSIS_6/latest/NN/html/index.html) | 針對各種ARM Cortex-M處理器優化神經網路內核的軟體庫。 |
| 模型評估 | [Ethos-U Vela compiler](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Ethos-U-Vela-compiler?lang=en) | 用於映射ML的編譯器對Ethos-U處理器進行建模。 |
| 模型評估 | [Arm Virtual Hardware](https://www.arm.com/avh) | 用於估計不同Cortex-M/Ethos-U目標系統推理時間的仿真模型。 |
| 系統驗證 | [SDS Framework](https://github.com/ARM-software/SDS-Framework) | 用於播放捕獲的數據以武裝虛擬硬體。 |
| 模型部署 | [Open-CMSIS-Pack](https://github.com/Open-CMSIS-Pack) | 軟體組件（包括ML型號）的包裝技術和交付機制。 |
| 模型部署 | [Keil MDK](https://www.keil.arm.com/) | 將最終ML模型整合到Cortex-M/Ethos-U目標系統中。 |
| 模型部署 | [Trusted Firmware](https://www.trustedfirmware.org/) | 物聯網系統的開源軟體項目；包括用於固件更新的MCU啟動。 |

有關如何將這些工具和軟體組件整合到MLOPS系統中的信息，請參見[MLOPS系統](https://developer.arm.com/documentation/109267/0101/MLOps-systems?lang=en)。

MLOPS開發流提供整合到基於Cortex-M的ML應用中的算法。通常需要具有ML模型數據的庫，該庫已針對目標處理器進行了優化。

### 1.6.針對Ethos-U NPU

Ethos-U Vela編譯器將ML模型作為輸入，並為Ethos-U NPU生成優化的二進製文件。下圖顯示了使用Ethos-U NPU的ML模型的軟體開發流。與單核Cortex-M處理器系統相比，開發流的總體變化很小。

圖1-4 軟體開發流
![arm Fig1-4](https://hackmd.io/_uploads/BkX9D7DFJx.svg)

過程中的步驟如下：
1. 主機（離線）過程：
    a. 從使用[TensorFlow](https://www.tensorflow.org/)機器學習框架的訓練有素的ML模型開始。
    b. 使用ML模型調節技術，例如協作聚類，修剪和量化意識培訓（QAT），以提高Ethos-U的模型性能，同時保持準確性。
    c. 使用Tensorflow Lite訓練後量化對int8數據類型進行加速ML模型。
    d. 然後，使用VELA編譯器對所得的TFL FlatBuffer文件（ *.tflite File）進行轉換以在Ethos-U NPU上執行。
    e. NN優化器識別要在Ethos-U上運行的圖形並優化，計劃並分配這些圖形。
    f. *.tflite文件無損地壓縮以減小尺寸。
2. 目標 /設備過程：
    a. 將*.tflite文件用於使用TFLU運行時系統執行。
    b. Ethos-U驅動程序計劃運算子在Ethos-U上執行。
    c. CMSIS-NN庫是使用Cortex-M上的軟體實現的運算子，該運算子無法映射到Ethos-U。

有關[Ethos-U Vela編譯器](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Ethos-U-Vela-compiler?lang=en)的更多信息，請參見Ethos-U Vela編譯器。

## 2.ARM Cortex-M Provor的ML軟體開發

原始文件：https://developer.arm.com/documentation/109267/0101/ML-software-development-for-Arm-Cortex-M-processors

該指南的本部分介紹了Cortex-M處理器ML軟體開發背後的概念，並提供了一個使用[Microcontrollers（TFLM）的TensorFlow Lite](https://www.tensorflow.org/lite/microcontrollers)的範例。

ARM Cortex-M處理器用於廣泛的現代微控制器產品。它們用於廣泛的應用，從內部玩具和家用電器內部的簡單控制器到精緻的智能家居產品，醫療設備和汽車子系統。由於基於Cortex-M的微控制器廣泛可用，低成本且易於使用，因此ML應用程序開發人員使用這些設備創建應用程序是很自然的。

如ML[計算需求](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA?both#13ML%E8%A8%88%E7%AE%97%E8%A6%81%E6%B1%82)中所述，有不同類型的Cortex-M處理器，每個處理器具有不同級別的ML處理能力。定義處理器ML性能的一種簡單方法是測量每個時鐘週期的操作數（OPS）。神經網路（NN）模型處理通常基於多重蓄能（MAC）操作，每個MAC操作都將其視為兩個OPS，一個倍數和一個添加。可以根據處理器的指令集支持和管道行為來建立對皮質ML處理器相對ML性能的粗略估計。下表提供了幾個Cortex-M處理器的性能估算：

| 處理器 |  指令集 | OPs at 100MHz |
| -------- | -------- | -------- |
| Cortex-M3 | 多功能指令（MLA，2個OPS）需要2個週期。由於處理器還需要執行NN處理的記憶體負載操作，假設Mac vs Load的比率為1：1，因此平均操作/週期為0.6。 | 0.06 GOPs/sec |
| Cortex-M4, Cortex-M33 | DSP/SIMD指令支持雙MAC操作（4個操作）。由於處理器還需要執行NN處理的記憶體加載操作，假設Mac vs Load的比率為1：1，因此平均操作/週期為2。 | 0.2 GOPs/sec |
| Cortex-M7 | 該處理器支持DSP/SIMD和記憶體負載的雙重問題，因此平均操作/週期為4。 | 0.4 GOPs/sec |
| Cortex-M52 | 使用Helium技術，這些處理器可以與數據負載並聯處理4個MAC/週期。結果，平均操作/週期為8。 | 0.8 GOPs/sec |
| Cortex-M55, Cortex-M85 | 使用Helium技術，這些處理器可以與數據負載並聯處理8個MAC/循環。結果，平均操作/週期為16。 | 1.6 GOPs/sec |

可以通過以較高的時鐘頻率運行處理器來提高性能。但是，還有其他幾個因素需要考慮：

* 記憶體等待狀態可以隨著時鐘速度的提高而增加。
* 在應用程序級別上，還有其他數據處理任務。例如，關鍵字發現（KWS）應用程序還必須執行音頻數據處理任務。在選擇ML應用程序的微控制器設備時，必須考慮這些工作負載。

簡單的實時KWS應用程序可以在基於Cortex-M3的微控制器上運行。但是，由於ARMV7-M和ARMV8-M架構中的DSP/SIMD指令為信號處理提供了更好的性能，因此建議使用Cortex-M4或更高級的處理器。 ARMV6-M處理器（例如Cortex-M0和Cortex-M0+）也可以處理某些級別的ML應用程序。但是，通常這些設備的記憶體大小很小，因此在其上運行複雜的ML應用程序更具挑戰性。以下第三方文章提供了在Cortex-M0和Cortex-M0+設備上運行ML應用程序的範例：

* [如何在Cortex-M0上實施咳嗽檢測](https://towardsdatascience.com/keyword-spotting-embedded-on-the-arm-cortex-m0-69241f69fde3)
* [Qeexo Automl縮小自動化機器學習足跡適合Cortex-M0（+）](https://www.hackster.io/news/qeexo-automl-shrinks-automated-machine-learning-footprint-to-fit-cortex-m0-91067d19e598)

以下白皮書提供了有關在Cortex-M微控制器上運行ML應用程序的其他信息：

* [機器學習在Arm Cortex-M上](https://armkeil.blob.core.windows.net/developer/Files/pdf/Arm%20ML%20on%20Cortex-M%20Microcontrollers.pdf)

### 2.1.ML軟體框架選項

原始文件：https://developer.arm.com/documentation/109267/0101/ML-software-development-for-Arm-Cortex-M-processors/ML-software-framework-options

創建ML應用程序時，最初的決定之一是決定應使用哪種ML軟體框架。當前，有幾種ML軟體框架選項可用於基於Cortex-M的微控制器，包括以下內容：

* [TensorFlow Lite for Microcontrollers (TFLM)](https://www.tensorflow.org/lite/microcontrollers)
* [MicroTVM](https://tvm.apache.org/docs/v0.9.0/topic/microtvm/index.html)
* [PyTorch](https://pytorch.org/)
* [PaddlePaddle](https://github.com/PaddlePaddle)

可能影響您選擇ML軟體框架的因素可能包括以下內容：

* ML框架的性能和記憶體足跡。
* 對目標設備的硬體加速器支持的可用性。
* 適用於目標應用的合適ML模型。
* MLOP的開發和整合的便利性。

本指南包括一個用於微控制器的Tensorflow Lite的範例，通常稱為Tensorflow Lite Micro或TFLM。由於以下原因，我們選擇了TFLM：

* TFLM中的NN模型權重可以量化為8位整數，這有助於減少記憶體足跡。由於記憶體大小通常受到微控制器設備的限制，因此TFLM對微控制器應用程序有吸引力。
* 許多ML硬體加速器（例如Ethos-U MicroNPUs）旨在加速量化的ML模型並為TFLM提供軟體支持。
* 為TFLM創建的ML模型已廣泛可用。

### 2.2.使用TFLM的範例軟體開發流

原始文件：https://developer.arm.com/documentation/109267/0101/ML-software-development-for-Arm-Cortex-M-processors/Example-software-development-flow-using-TFLM

微控制器（TFLM）的Tensorflow Lite由Google創建。在微控制器上運行的TFLM運行時庫是讀取ML模型並執行所需操作的解釋器。下圖顯示了軟體流的概述：

圖2-1 TFLM軟體流概述
![arm Fig2-1](https://hackmd.io/_uploads/BkB_Amvtyg.svg)

要使用TFLM創建ML項目，請執行以下步驟：

* [1.創建一個Tensorflow Lite模型文件](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#221%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8BTensorflow-Lite%E6%A8%A1%E5%9E%8B%E6%96%87%E4%BB%B6)
* [2.將模型文件轉換為C/C++標頭文件](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#222%E5%B0%87%E6%A8%A1%E5%9E%8B%E6%96%87%E4%BB%B6%E8%BD%89%E6%8F%9B%E7%82%BACC-%E6%A8%99%E9%A0%AD%E6%96%87%E4%BB%B6)
* [3.確定NN模型的輸入和輸出](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#223%E7%A2%BA%E5%AE%9ANN%E6%A8%A1%E5%9E%8B%E7%9A%84%E8%BC%B8%E5%85%A5%E5%92%8C%E8%BC%B8%E5%87%BA)
* [4.整合TFLM運行時庫](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#224%E9%9B%86%E6%88%90TFLM%E9%81%8B%E8%A1%8C%E6%99%82%E5%BA%AB)
* [5.整合推理功能](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#225%E9%9B%86%E6%88%90%E6%8E%A8%E7%90%86%E5%8A%9F%E8%83%BD)
* [6.運行推理並處理結果](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#226%E9%81%8B%E8%A1%8C%E6%8E%A8%E7%90%86%E4%B8%A6%E8%99%95%E7%90%86%E7%B5%90%E6%9E%9C)

以下各節描述了使用TFLM創建ML項目所需的每個步驟。

#### 2.2.1.創建一個Tensorflow Lite模型文件

TFLM將NN模型存儲為Tensorflow Lite模型文件，其中包括文件擴展名.tflite ，也稱為FlatBuffers。

您可以使用以下任何方法獲得Tensorflow Lite模型：

* 使用[Tensorflow Lite Model Maker](https://www.tensorflow.org/lite/models/modify/model_maker)創建新的Tensorflow Lite模型。需要數據集來訓練模型。
* 使用現有的TensorFlow Lite模型。 [TensorFlow.org](https://www.tensorflow.org/) 提供了一系列[範例](https://www.tensorflow.org/lite/examples)。您還可以從各種模型動物園中找到其他型號，例如Arm模型動物園 https://github.com/ARM-software/ML-zoo 。請注意，並非所有Tensorflow Lite模型都可以在基於Cortex-M的微控制器上使用。
* 修改現有的TensorFlow Lite模型。例如，您可能需要重新培訓現有的KWS模型以允許其檢測不同的關鍵字。為此，您需要一個新的數據集進行培訓。以這種方式重新訓練ML模型通常被稱為“轉移學習”。請注意，並非所有ML模型都可以使用此方法重新訓練。
* 將另一種類型的模型轉換為Tensorflow Lite模型。例如，您可以使用[Tensorflow Lite Converter](https://www.tensorflow.org/lite/models/convert/)將TensorFlow模型轉換為Tensorflow Lite模型。如果您具有ONNX（開放神經網路交換）格式中的模型，例如，如果您從MATLAB導出該模型，則可以首先將其轉換為TensorFlow模型，然後將TensorFlow模型轉換為Tensorflow Lite模型。有關將ONNX轉換為TensorFlow的更多信息，請參見Internet上可用的眾多教程之一。請注意，並非所有ML模型都可以轉換為Tensorflow Lite模型。

為了使NN模型能夠在Cortex-M處理器上有效運行，TFLM的運行時庫支持CMSIS-NN的整合，CMSIS-NN是Cortex-M Processor的優化NN功能的庫。如果TFLM解釋器遇到CMSIS-NN庫不支持的ML運算子，則將使用參考內核函數。

此範例使用Tensorflow Github存儲庫中可用的Micro-Speech範例應用程序，https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/examples/micro_speech 。

#### 2.2.2.將模型文件轉換為C/C++標頭文件

對於 Micro-Speech 範例應用程序，預先訓練的模型文件 micro_speech.tflite 可以從以下位置獲得：

https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/examples/micro_speech

要將micro_speech.tflite文件轉換為C++標頭文件，請執行以下操作：

1. 運行Linux xxd實用程序以轉換 micro_speech.tflite  ：

```bash
$> xxd -i micro_speech.tflite > model.cc
```

輸出文件 model.cc 包含以下代碼，使用從輸入文件名生成的默認變量名稱：

```cpp
unsigned char micro_speech_tflite[] = {
  0x20, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00,
  ...
  0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00
};
unsigned int micro_speech_tflite_len = 18800;
```

2. 檢查 [micro-speech repository](https://github.com/tensorflow/tflite-micro/blob/main/tensorflow/lite/micro/examples/micro_speech/main_functions.cc) 中的範例應用程序代碼， main_functions.cc 以發現所需的變量名稱，如以下代碼片段所示：

```cpp
void setup() {
  tflite::InitializeTarget();
  // Map the model into a usable data structure. This doesn't involve any
  // copying or parsing, it's a very lightweight operation.
  model = tflite::GetModel(g_micro_speech_model_data);
  ...
```

此代碼顯示字符數組名稱應為 g_micro_speech_model_data  。

3. 編輯 model.cc ，更改變量名稱，以使它們匹配應用程序代碼，並添加const關鍵字，以確保設備啟動時未將模型數據複製到SRAM中：

```cpp
const unsigned char g_micro_speech_model_data[] = {
  0x20, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00,
  ...
  0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00
};
const unsigned int g_micro_speech_model_data_len = 18800;
```

現在，您可以在C++編程環境中使用 Modified model.cc 。

#### 2.2.3.確定NN模型的輸入和輸出

使用第三方創建的NN模型時，您必須確定有關NN模型的輸入和輸出的信息，以確保應用程序將數據饋送到模型或從模型中獲取結果時，正確的數據格式使用。 Tensorflow Lite提供了一種稱為 [Model Analyzer](https://www.tensorflow.org/lite/guide/model_analyzer) 的工具來幫助這一點。您可以在Google Colab或Jupyter筆記本中運行 Model Analyzer 。

還有許多其他第三方工具，可讓您分析和可視化Tensorflow Lite模型。

#### 2.2.4.整合TFLM運行時庫

要整合TFLM運行時庫，您可以從源中對其進行編譯，也可以使用支持CMSIS包裝的IDE。做以下一個：

* 要為通用Cortex-M設備編譯TFLM運行時庫，請按照本教程中的步驟進行操作：
https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/cortex_m_generic
要啟用CMSIS-NN支持，請確保命令行包含OPTIMIZED_KERNEL_DIR=cmsis_nn選項。
* 要編譯包含Corstone-300子系統的設備的TFLM運行時庫，請按照本教程中的步驟進行操作：
https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/cortex_m_corstone_300
Corstone-300目錄中的編譯設置可實現Ethos-U microNPU的使用。
* 當使用支持CMSIS包裝的IDE時，您可以使用CMSIS包裝機制整合TFLM運行時庫。例如，如果您使用的是Keil MDK，請選擇以下內容的TFLM軟體組件：

圖2-2 CMSIS包裝安裝程序中的TFLM組件
![arm Fig2-2](https://hackmd.io/_uploads/r1HUtEwYJg.png)

對於 Machine Learning>TensorFlow>Kernel 設置，請選擇以下選項之一：

* CMSIS-NN，使用此選項，您還必須選擇 **CMSIS>NN Lib** 選項。
* Ethos-u，使用此選項，您還必須選擇 **Machine Learning>NPU Support>Ethos-U Driver** 選項。

CMSIS-Pack 機制還使您可以在ML嵌入式評估套件中導入一些ML應用程序API。

有關將TFLM與CMSIS-PACK一起使用的更多範例， https://github.com/ARM-software/ML-examples/tree/main/cmsis-pack-examples 。

#### 2.2.5.整合推理功能

創建NN推理應用程序時需要考慮幾個重要方面。檢查[微語音範例代碼](https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/examples/micro_speech)，我們可以看到此範例應用程序整合了推理函數，如下所示：

* TFLM需要在RAM中分配一個記憶體區域。該存儲區域稱為TensorArena ，在推論過程中存儲輸入，輸出和中間值。此記憶體的大小取決於NN模型。對於微語音範例，此記憶體的大小為10KB。聲明TensorArena的main_functions.cc中的代碼片段如下：

```cpp
// Create an area of memory to use for input, output, and intermediate arrays.
// The size of this will depend on the model you're using, and may need to be
// determined by experimentation.
constexpr int kTensorArenaSize = 10 * 1024;
uint8_t tensor_arena[kTensorArenaSize];
```

在Micro-Speech範例中， main_functions.cc中的以下代碼將TensorArena記憶體分配給TFLM解釋器：

```cpp
// Allocate memory from the tensor_arena for the model's tensors.
TfLiteStatus allocate_status = interpreter->AllocateTensors();
if (allocate_status != kTfLiteOk) {
  MicroPrintf("AllocateTensors() failed");
  return;
}
```

* 創建指向輸入緩衝區的指針
    儘管TensorArena提供了輸入數據所需的記憶體，但該應用程序還需要指向輸入數據的指針，以便程序代碼可以將數據傳輸到其中。此外，在預處理輸入數據時，應用程序可能需要其他數據緩衝區。
    在微語音範例，主程式碼 main_functions.cc 包含下列指標：
    * model_input_buffer 指向 model_input 物件內部的數據。
    * model_input 指向 TensorArena 內部的輸入數據。

聲明和初始化這些指針的相應代碼片段如下：

```cpp
TfLiteTensor* model_input = nullptr;
...
int8_t* model_input_buffer = nullptr;
...
model_input = interpreter->input(0);
...
model_input_buffer = model_input->data.int8;
```

KWS應用程序代碼使用稱為feature_buffer的其他數據陣列來存儲音頻處理的結果。在推理過程中，主循環的每次迭代複製來自feature_buffer[]數組的數據是model_input_buffer 。 main_functions.cc中的相應代碼片段如下：

```cpp
// Copy feature buffer to input tensor
for (int i = 0; i < kFeatureElementCount; i++) {
  model_input_buffer[i] = feature_buffer[i];
}
```

feature_buffer數組在main_functions.cc中通過以下行聲明：

```cpp
int8_t feature_buffer[kFeatureElementCount];
```

feature buffer 容量，The size of the feature buffer, kFeatureElementCount is defined in micro_model_settings.h. The following code fragment defines kFeatureElementCount:
特徵緩衝區的大小， kFeatureElementCount 在 micro_model_settings.h 中定義。以下程式碼片段定義了 kFeatureElementCount：

```cpp
// The following values are derived from values used during model training.
// If you change the way you preprocess the input, update all these constants.
constexpr int kFeatureSliceSize = 40;
constexpr int kFeatureSliceCount = 49;
constexpr int kFeatureElementCount = (kFeatureSliceSize * kFeatureSliceCount);
```

以上代碼片段中的數據常數定義了輸入數據的形狀。有關Micro Spech範例中輸入數據形狀形狀的更多信息，請參見train目錄中的[README.md](https://github.com/tensorflow/tflite-micro/blob/main/tensorflow/lite/micro/examples/micro_speech/train/README.md)文件。

#### 2.2.6.運行推理並處理結果

解譯器物件中的 Invoke 函數開始推理。在微語音範例中，main_functions.cc 中的下列程式碼片段執行了 Invoke 函數：

```cpp
  ...
  tflite::MicroInterpreter* interpreter = nullptr;
  ...
  // Run the model on the spectrogram input and make sure it succeeds.
  TfLiteStatus invoke_status = interpreter->Invoke();
  if (invoke_status != kTfLiteOk) {
    MicroPrintf("Invoke failed");
    return;
  }
  ...
```

推理操作將結果存儲在TensorArena中的輸出數據中。輸出數據數組中的值是每個語音命令的相對概率，例如“是”，“否”，“上”或“ down”。在結果可以用於執行響應之前，需要後處理。後處理是由 ProcessLatestResults() 函數在 recognize_commands.cc 文件中執行的。

後處理後，應用程序代碼在command_responder.cc中調用RespondToCommand()函數以使用結果觸發響應。

### 2.3.重新訓練ML模型

原始文件：https://developer.arm.com/documentation/109267/0101/ML-software-development-for-Arm-Cortex-M-processors/Re-training-an-ML-model

當使用現有的已訓練 ML 模型建立 ML 應用程式時，您可能希望部分重新訓練該模型以修改 NN 的行為。例如，您可能想要重新訓練微語音範例來識別不同的關鍵字。微語音範例提供[如何重新訓練參考模型的資訊](https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/examples/micro_speech/train)。

重新訓練的過程需要語音命令資料集。參考資料集可從 Google 研究找到參考資料集，網址為： http://download.tensorflow.org/data/speech_commands_v0.02.tar.gz （版本2）

有關此資料集第 1 版的資訊可在[啟動語音命令資料集部落格](https://blog.research.google/2017/08/launching-speech-commands-dataset.html)中找到。

命令資料集的版本1（v0.01）提供了以下單字的音訊樣本：是、否、上、下、左、右、開、關、停止、去。

版本2（v0.02）在資料集中增加了額外的單字。完整清單可在以下論文中找到： https://arxiv.org/abs/1804.03209 / https://arxiv.org/pdf/1804.03209.pdf (pdf 版本)

### 2.4.更多資訊

原始文件：https://developer.arm.com/documentation/109267/0101/ML-software-development-for-Arm-Cortex-M-processors/Further-information

除了微語音範例之外，還可以在 [Tensorflow Lite Micro Github 儲存庫](https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/examples)中找到其他範例。

有關微控制器版 TensorFlow Lite 操作的更多信息，請參閱以下頁面 https://www.tensorflow.org/lite/microcontrollers/get_started_low_level

Arm 開發板的微語音範例使用 Mbed 工具。有關安裝這些工具的更多信息，請訪問 https://os.mbed.com/docs/mbed-os/v6.16/mbed-os-pelion/machine-learning-with-tensorflow-and-mbed-os.html。

CMSIS-NN 軟體庫已經針對 Arm Helium 技術進行了最佳化。有關 Helium 軟體優化的更多資訊可在以下位置找到：

* [開始使用基於 Armv8.1-M 的處理器：軟體開發提示和技巧](https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/armv8_2d00_m-based-processor-software-development-hints-and-tips)
* [Helium 優化主題](https://github.com/Arm-Examples/Helium-Optimization)

## 3.Arm Ethos-U NPU

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU

大多數機器學習（ML）應用程序執行神經網路（NN）推理操作。儘管在處理器上運行的軟體可以執行NN推理操作，但使用硬體加速器可以大大提高性能。使用硬體加速器執行NN推理操作通常會提高能源效率，並允許更高的處理器帶寬來處理其他任務。

NN推理硬體加速器有許多類型。例如，ARM Ethos-U是一個專為微控制器和系統芯片（SOC）設計的硬體加速器家族，被稱為神經處理單元（NPU）。

NN推理硬體加速器有許多類型。例如，ARM Ethos-U是一個專為微控制器和系統芯片（SOC）設計的硬體加速器家族，被稱為神經處理單元（NPU）。

* [Ethos-U55](https://developer.arm.com/Processors/Ethos-U55)
* [Ethos-U65](https://developer.arm.com/Processors/Ethos-U65)
* [Ethos-U85](https://developer.arm.com/Processors/Ethos-U85)

這些NPU在商業產品中可用。例如：

* Ethos-U55 用於：
    * Alif半導體的[Alif Ensemble](https://alifsemi.com/ensemble/)家族。
    * 來自Infineon的[PSoC Edge](https://www.infineon.com/cms/en/product/microcontroller/32-bit-psoc-arm-cortex-microcontroller/32-bit-psoc-edge-arm/)。
    * 奇景 HIMAX Technologies（Seeed Studio的[低成本開發板](https://www.seeedstudio.com/Grove-Vision-AI-Module-V2-p-5851.html)）的[Wiseye2 Al處理器](https://www.himax.com.tw/products/intelligent-sensing/always-on-smart-sensing/wiseeye2-ai-processor/)。
* Ethos-U65 用於NXP的[i.MX 93](https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-9-processors/i-mx-93-applications-processor-family-arm-cortex-a55-ml-acceleration-power-efficient-mpu:i.MX93)家族中。

您也可以在不使用真實硬體的情況下評估Ethos-U55/U65。例如，您可以使用模擬環境，例如[ARM虛擬硬體（AVH）](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Arm-Virtual-Hardware?lang=en)或[固定虛擬平台（FVP）](https://developer.arm.com/downloads/-/arm-ecosystem-fvps) 。有關這些工具的更多信息，請參見[ARM Ethos-U NPU的工具支持](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU?lang=en)。

Ethos-U85是Ethos-U產品家族的最新成員。它提供多達2048個Mac單元，並支持包括變壓器網路在內的廣泛的NN型號。同時，能源效率可以比以前的Ethos-U設計高20％。 Ethos-U85建立在前幾代，並提供相同的一致工具鏈，因此開發人員可以利用先前的ARM ML軟體投資。有關Ethos-U85的更多技術細節將於今年晚些時候發布。本文檔的其餘內容集中於Ethos-U55和Ethos-U65。

### 3.1.Ethos-U硬體體系結構

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Ethos-U-hardware-architecture

Ethos-U NPU需要一個主機處理器來控制其操作。通常，主機處理器是ARM Cortex-M處理器。 Ethos-U NPU提供了幾個硬體介面：

* 週邊匯流排介面允許主機處理器訪問Ethos-U NPU可編程寄存器。
* 兩個AMBA巴士管理器介面以訪問系統記憶。
* 中斷輸出將中斷事件發送給主機處理器。

有關更多信息，請參見[Ethos-U匯流排管理器介面](https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Ethos-U-hardware-architecture?lang=en#md380-ethos-u-hardware-architecture__ethos-u-bus-manager-interfaces)。

圖3-1 具有Ethos-U NPU的微控制器系統的概述
![arm Fig3-1](https://hackmd.io/_uploads/SkeCUBvKJe.svg)

NN推斷中的大多數處理都是基於乘加器（MAC）計算。在Ethos-U NPU內部有一個可配置的MAC引擎來處理MAC操作。芯片設計人員可以配置每個時鐘週期可以執行的MAC數量，如下所示：

* Ethos-U55: 32 to 256
* Ethos-U65: either 256 or 512

有關MAC數量和性能之間關係的更多信息，請參見[Ethos-U性能配置](https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Ethos-U-hardware-architecture?lang=en#md380-ethos-u-hardware-architecture__ethos-u-performance-configuration)。 Ethos-U NPU還為其他計算提供了元素的數據處理引擎。

為了提高NN推論的效率，Ethos-U NPU包含用於緩衝其處理數據的局部記憶。 Ethos-U NPU還包括直接記憶體訪問（DMA）引擎，因此可以在需要之前複製數據，從共享記憶體到本地記憶體。

Ethos-u npu是為嵌入式系統而設計的，這些系統通常具有有限的記憶體。為了減少記憶體使用情況，Ethos-U NPU支持NN權重數據壓縮。權重數據在推理操作過程中被直接解碼。

Ethos-U操作由幾個寄存器控制，這些寄存器由在處理器系統上映射的記憶體。當系統需要執行NN推理時，操作將分為Ethos-U NPU運行的幾個較小的作業。在軟體庫的控制下，使用週邊匯流排介面向Ethos-U NPU發行了作業。每次工作完成時，Ethos-U NPU都會向主機處理器發出中斷請求，以便軟體庫可以發出下一份作業。

Ethos-U NPU還支持其他介面，例如電源管理的介面。有關這些Ethos-U NPU介面的更多信息，請參見以下內容：

* [Ethos-U55：支持的數據類型和運算子](https://developer.arm.com/documentation/102420/0200/Programmers-model/Operators-and-performance/Supported-data-types-and-operators)
* [Ethos-U65：支持的數據類型和運算子](https://developer.arm.com/documentation/102023/0000/Programmers-model/Operators-and-performance/Supported-data-types-and-operators)

#### 3.1.1.Ethos-U性能配置

每個時鐘週期可以執行的MAC數量可為Ethos-U55 NPU和Ethos-U65 NPU配置，從而解決了一系列性能點。

下表顯示了Ethos-U55 NPU配置選項：

| 每個週期MAC數量 | 內部記憶體 | 在500MHz性能 |
| :--------: | :--------: | :--------: |
| 256 | 48KB | 256GOP |
| 128 | 24KB | 128GOP |
| 64 | 16KB | 64GOP |
| 32 | 16KB | 32GOP |

下表顯示了Ethos-U65 NPU配置選項：

| 每個週期MAC數量 | 內部記憶體 | 在500MHz性能 |
| :--------: | :--------: | :--------: |
| 512 | 96KB | 1TOP |
| 256 | 48KB | 512GOP |

#### 3.1.2.Ethos匯流排管理員介面

Ethos-U55和Ethos-U65每個都有兩個AMBA 5 AXI介面，用於連接到記憶系統，稱為M0和M1：

* 為了優化Ethos-U NPU的性能，應將Axi介面M0連接到高速，低延遲的記憶體，例如SRAM。在推斷神經網路期間，記憶體用於動態存儲運行時數據。
* AXI介面M1用於耐受較低帶寬和較高延遲的記憶體交易。因此，AXI M1介面可以連接到較慢或更少爆發效率的記憶體，例如閃存或DRAM。記憶體用於運行時軟體堆疊（包括用戶應用程序）和神經網路定義（包括權重）的非易失性存儲。
* 對於Ethos-U55 NPU，AXI介面M1僅讀取。對於Ethos-U65 NPU，讀/寫入Axi介面M1。

M0和M1端口通常連接到互連，該連接允許M0和M1 Axi介面訪問任何記憶體。 Vela編譯器計劃高帶寬，AXI介面M0上的低延遲存儲器交易以及AXI介面M1上的所有其他交易。

#### 3.1.3.Ethos-U55和Ethos-U65之間的差異

Ethos-U55和Ethos-U65之間存在幾個關鍵差異：

| 特徵 | Ethos-U55 | Ethos-U65 |
| -------- | -------- | -------- |
| 每週期MAC數量 | 32/64/128/256 | 256 or 512 |
| 管理員匯流排介面 | 兩個64位元AXI支持晶片上SRAM及內嵌FLASH | 兩個128位元AXI支持晶片上SRAM, DRAM及FLASH |
| 可支持CPU | Cortex-M85, Cortex-M55, Cortex-M7, Cortex-M4, Cortex-M33 | Cortex-M85, Cortex-M55, Cortex-M7 |

由於Ethos-U65具有較寬的匯流排介面和其他硬體資源，因此它平均提供了比Ethos-U55高約50％的性能。有關更多信息，請參見博客文章[Ethos-U65：在新的AI設備中為創新提供動力](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/arm-ethos-u65-powering-innovation-in-a-new-world-of-ai-devices)。

對於具有DRAM/DDR的系統（例如運行Linux的Cortex-A系統），Ethos-U65更合適，因為匯流排介面旨在支持延遲更長的記憶。

#### 3.1.4.電源、安全性和效能分析

為了使Ethos-U NPU在各種系統中使用，提供了以下其他功能：

* 電源管理介面：Ethos-U55和Ethos-U65提供了Q通道，用於管理時鐘和電源門控。該介面連接到系統級電源管理硬體，例如使用[ARM Corelink PCK-600電源控制套件](https://developer.arm.com/documentation/101150/latest/)構建的電源控制基礎架構。有關Q通道的更多信息，請參閱[AMBA 4低功率介面規範](https://developer.arm.com/documentation/ihi0068/latest/)。
* 安全管理：如果在啟用信任的系統中使用Ethos-U NPU，則在安全狀態下運行的軟體可以限制非安全世界的訪問權限。特權軟體還可以控制Ethos-U NPU是否僅具有特權訪問權限，或者可以從特權和無私人軟體訪問。當NPU退出時，可以使用兩個硬體信號來定義訪問權限。在重置時，還清除了NPU內部註冊表的內容，以防止數據洩漏。
* 性能監控單元（PMU）：PMU支持一個48位週期計數器和四個32位事件計數器，可用於測量NPU內部的活動。這使軟體開發人員可以分析NN工作負載的特徵並確定潛在的性能問題。

### 3.2.Ethos-U系統整合

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Ethos-U-system-integration

使用Ethos-U NPU時，有兩個共同的系統佈置：

* 由Cortex-M處理器控制的Ethos-U NPU。在這種情況下，Cortex-M處理器運行應用程序代碼，將NN推理工作負載派往Ethos-U NPU。由於應用程序代碼直接在Cortex-M處理器上運行，因此除了機器學習之外，還可以將Cortex-M處理器用於其他任務。
* 將Ethos-U NPU與Cortex-M處理器一起整合到ML子系統中。在這種情況下，ML子系統是具有一個或多個Cortex-A處理器的較大SOC的一部分。 Cortex-A處理器運行應用程序代碼，並將NN推理工作負載分配到ML子系統中的Cortex-M處理器。 Cortex-M處理器反過來管理Ethos-U NPU的低級控制。

在這兩種情況下，系統設計人員都必須確保Ethos-U NPU能夠執行以下操作：

* 使用匯流排管理器介面訪問存儲系統。
* 使用週邊匯流排介面接受主機處理器的匯流排交易。 Ethos-U NPU具有AMBA 4 APB介面，可訪問其寄存器。寄存器塊的基礎地址是系統特定的，通常位於外圍地址範圍內。
* 使用中斷輸出生成主機處理器中斷請求。中斷輸出連接到主機處理器的中斷控制器，例如Cortex-M處理器上的NVIC中斷。

使用中斷輸出生成主機處理器中斷請求。中斷輸出連接到主機處理器的中斷控制器，例如Cortex-M處理器上的NVIC中斷。

#### 3.2.1.Cortex-M系統中的Ethos-U整合

Ethos-U系統與Cortex-M CPU配對。該系統是高度可配置的，可以以多種不同的方式構建。下圖顯示了典型的Ethos-U系統。

圖3-2 Ethos-U系統
![arm Fig3-2](https://hackmd.io/_uploads/S1JapqvKyg.svg)

該系統包含以下組件：

* Cortex-M
    Cortex-M系列CPU是控制一個或多個Ethos-U NPU的應用程序處理器。您可以指定首選的Cortex-M系列CPU，但ARM建議以下CPU：
    * Cortex-M4
    * Cortex-M7
    * Cortex-M33
    * Cortex-M52
    * Cortex-M55
    * Cortex-M85
* Ethos-U NPU
    可以將Ethos-U55 NPU，Ethos-U65 NPU或Ethos-U85與Cortex-M CPU配對，但是已經設計了Ethos-U65和Ethos-U85 NPU，以優化較慢的記憶體之間的數據傳輸（例如DDR）和快速記憶體緩存。
* SRAM
    輸入特徵映射（IFM）數據和輸出特徵映射（OFM）數據存儲在SRAM中。您可以指定首選的SRAM數量，但是當網路完全放置在SRAM中時，可以獲得最佳性能。如果無法將網路完全放置在SRAM中，則僅將臨時數據存儲在SRAM中。
* Flash
    權重和偏置量存儲在閃存，DRAM或SRAM中。
* 外圍設備
    可以添加用於外圍設備的控制器，例如麥克風或相機。

#### 3.2.2.Ethos-U與Ethos-U子系統的整合

Ethos-U子系統可以連接到Linux主機和其他各種操作系統。

圖3-3 典型的Ethos-U子系統
![arm Fig3-3](https://hackmd.io/_uploads/HyWyJiPKJx.svg)

該系統包含以下組件：

* Ethos-U NPU
    可以將Ethos-U55 NPU，Ethos-U65 NPU或Ethos-U85 NPU與Cortex-M CPU配對。 Ethos-U65和Ethos-U85 NPU已設計為優化較慢的記憶體（例如DDR）和快速記憶體緩存之間的數據傳輸，因此是推薦的NPU。
* 消息處理單元
    可以使用類似於ARM消息處理單元（MHU）的任何類型的郵箱。有關使用MHU的範例，請參見[ARM Corelink SSE-200子系統以獲取嵌入式技術參考手冊](https://developer.arm.com/documentation/101104/0200)。
* DRAM
    權重，偏置量，輸入特徵映射（IFM）和輸出特徵映射（OFM）數據存儲在較慢的高延遲記憶體中，例如DRAM。
* Cortex-A 處理器
    Cortex-A系列CPU僅與Cortex-M系列CPU通信。 Cortex-A系列CPU與Ethos-U NPU沒有直接接觸。 CPU之間的通信基於DRAM和MHU門鈴中的記憶體介面。
    
### 3.3.Corstone參考設計

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Corstone-reference-designs

ARM沒有從頭開始構建新系統，而是在ARM Corstone子系統產品中提供參考系統設計，以幫助系統設計人員創建基於Cortex-M的系統。 Arm Corstone-3XX系列參考設計提供了構建具有Cortex-M和Ethos-U NPU的安全系統的範例。

* [Corstone-300](https://developer.arm.com/Processors/Corstone-300)為[Cortex-M55](https://developer.arm.com/Processors/Cortex-M55)處理器提供了參考系統設計，可選擇Ethos-U55或Ethos-U65 NPU。
* [Corstone-310](https://developer.arm.com/Processors/Corstone-310)為具有Ethos-U65 NPU的[Cortex-M85](https://developer.arm.com/Processors/Cortex-M85)處理器提供了參考系統設計。
* [Corstone-315](https://developer.arm.com/Processors/Corstone-315)為具有Ethos-U65 NPU的[Cortex-M85](https://developer.arm.com/Processors/Cortex-M85)處理器提供了參考系統設計。
* [Corstone-320](https://developer.arm.com/Processors/Corstone-320)為具有Ethos-U85 NPU的[Cortex-M85](https://developer.arm.com/Processors/Cortex-M85)處理器提供了參考系統設計。

為了幫助軟體開發人員測試其軟體，可作為固定虛擬平台（FVP）提供Corstone-300和Corstone-310參考設計的仿真模型。這些模型可在ARM開發人員網站上找到。

FVP包括對相應的Cortex-M處理器和Ethos-U NPU的仿真模型。這些模型允許軟體開發人員輕鬆測試其ML軟體。請注意，仿真模型不是循環準確的，尤其是對於這些模型中的處理器而言。但是，它們可以提供有關Ethos-U NPU的預期處理時間的指示。例如，對於Ethos-U55週期時序，Corstone-300 FVP精確度約為90％。請注意，FVP模型中Ethos-U65的時序精度低於Ethos-U55。

在使用FVP模擬NN推理工作負載時，如果工作負載包括Ethos-U NPU不支持的運算子，則運算子處理將落回處理器。在這些情況下，您不能依靠FVP模型為您提供處理時間的準確估計。如果需要準確的時序，則可以選擇其他評估方法。例如：

* FPGA平台，例如[ARM MPS3 FPGA板](https://www.arm.com/products/development-tools/development-boards/mps3)
* [Arm IP explorer](https://www.arm.com/products/ip-explore)
* 另一種使用處理器和NPU與您正在開發的設備相同組合的硬體設備。

ARM為ARM MPS3 FPGA板提供以下FPGA圖像：

* Corstone-300使用Cortex-M55處理器和Ethos-U55 NPU的AN552。
* Corstone-310的AN555，帶有Cortex-M85處理器和Ethos-U55 NPU。

下圖顯示了AN552系統體系結構的簡化概述：

圖3-4 AN552系統體系結構的簡化概述
![arm Fig3-4](https://hackmd.io/_uploads/HJ-MGiwKkg.svg)

該圖提供了Corstone-300記憶體系統的概述。 Ethos-U NPU可以訪問SRAM，Flash，FPGA Block RAM（BRAM）和DDR記憶體。在此設計中，您無法將張量競技場存儲在D-TCM或I-TCM中，因為Ethos-U NPU無法訪問此記憶體。

在MPS3板等真實硬體上運行應用程序的優點是，您可以為CPU和NPU獲得循環準確的性能數字。 Corstone-300和Corstone-310設計是將Ethos-U整合到SOC中的寶貴例子。 ARM建議您在啟動自己的設計之前閱讀這些參考設計的技術參考手冊。

### 3.4.ML軟體支持Ethos-U

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/ML-software-support-for-Ethos-U

ML軟體項目通常基於特定的ML軟體框架。 Ethos-U NPU支持Tensorflow Lite Micro（TFLM），這是一種流行的ML軟體框架，可針對微控制器以及MicroTVM進行了優化。由於TFLM中NN模型中的權重量化為8位整數，因此NN模型的記憶體足跡大大降低。使用量化的NN模型的另一個優點是，通常這些模型在硬體上表現出色，並支持向量點產品操作，例如Ethos-U以及一系列現代的ARM Cortex處理器。

ML應用程序的開發可以分為兩個部分：

1. 離線開發流。這包括：
    * ML模型的準備
    * 量化ML模型以使用8位權重數據（TF量化工具-TOCO）
    * 使用[Vela編譯器](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-vela)優化ML模型。該工具標識了模型中可以通過Ethos-U處理的運算子，並用Ethos-U函數代替它們。如果ML運算子不受Ethos-U的支持，而是由CMSIS-NN庫中優化功能支持的，則使用[CMSIS-NN](https://github.com/ARM-software/CMSIS-NN)。 Vela編譯器還處理記憶體佈局優化。有關更多信息，請參見[Ethos-U Vela編譯器](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Ethos-U-Vela-compiler?lang=en)。 Vela編譯器在台式PC或類似設備上運行。
2. NPU運行時軟體堆疊。這包括在目標硬體上運行的一系列軟體組件，這些軟體組件以特定方式相互交互。這些包括以下內容：
    * 用戶應用程序運行所需的功能，並在執行模型的推斷時對TFLM庫進行調用。
    * TFLM
        框架被編譯到C++庫中，該庫包含Vela優化模型以及參考和CMSIS-NN內核的副本。然後，用戶應用程序使用此庫來執行推斷。
        在推斷期間，該模型一次被解析，並執行相應的內核。例外是遇到TensorFlow Lite自定義運算子時。在這種情況下，庫將運算子和關聯的張量數據發送到Ethos-U NPU驅動程序。
    * 控制Ethos-U NPU的Ethos-U NPU驅動程序
        Ethos-U NPU驅動程序處理TFLM框架與Ethos-U NPU之間的通信來處理自定義運算子。當Ethos-U NPU完成其處理時，它會向駕駛員發出信號，這又向TFLM庫提供了信息。
    * [CMSIS-NN庫](https://github.com/ARM-software/CMSIS-NN)
        這包含高度優化和性能的內核，這些內核加速了TFLM框架中運算子的子集。需要處理Ethos-U支持的ML運算子。
    * 參考內核
        這包含了TFLM框架中所有運算子的一組內核。當TFLM框架遇到Ethos-U或CMSIS-NN庫不支持的ML運算子時，使用它們。
        
下圖顯示了軟體開發流的概述：

圖3-5 軟體開發概述
![arm Fig3-5](https://hackmd.io/_uploads/HJaVqsPYyg.svg)

#### 3.4.1.Ethos-U自定義運算子

微控制器（TFLM）的Tensorflow Lite是解釋器。它以記憶體中的.tflite數據的形式讀取NN模型，並執行NN運算子的功能。為了允許Ethos-U NPU加速NN模型處理，TFLM支持稱為自定義運算子的功能。

在編譯 NN 模型期間，Vela 編譯器將可由 NPU 加速的運算子序列分組為自訂的 Ethos-U 算子。 Ethos-U 自訂運算子有 5 個輸入張量 - 用於命令流的張量、用於常數唯讀資料（例如權重和偏差）的快閃記憶體張量、用於張量領域的臨時張量、用於 Ethos-U65 溢位功能的臨時快速張量（Ethos-U55 不使用快速張量）和用於臨時張量和用於臨時張量模型輸入的張量。從 TF Lite Micro 應用程式程式碼中，您需要定義一個解釋器，指定模型、運算子解析器、張量區域及其大小，並將這些參數傳遞給 TF Lite Micro。在推理過程中，TensorFlow Lite Micro 會讀取 Ethos-U 自訂運算子並在 Ethos-U NPU 上執行。您可以在[此處](https://github.com/tensorflow/tflite-micro/blob/main/tensorflow/lite/micro/kernels/ethos_u/ethosu.cc#L120)閱讀有關Ethos-U自定義運算子的更多信息。

#### 3.4.2.使用Cortex-M和Ethos-U NPU的微控制器的ML軟體

在具有Ethos-U NPU的基於Cortex-M的微控制器中，運行時軟體堆疊提供了支持Ethos-U NPU所需的軟體。這包括用戶應用程序，該應用程序使用TFLM庫在Ethos-U NPU上執行優化模型或命令流的一部分。根據應用程序要求，可能需要其他軟體組件（例如RTOS）。

圖3-6 微控制器軟體概述
![arm Fig3-6](https://hackmd.io/_uploads/H1kXsoPK1e.svg)

#### 3.4.3.較大SOC中ML子系統的ML軟體

在使用Cortex-A處理器整合到SOC的ML子系統中的情況下，在Linux環境中運行的應用程序使用Ethos-U內核驅動程序與ML子系統進行通信。然後，該驅動程序使用消息處理單元（MHU）與Cortex-M處理器進行通信。收到信息後，Cortex-M處理器控制進行推斷的Ethos-U NPU。

提供Linux驅動程序堆疊是一個範例，說明了像Linux這樣的豐富操作系統如何將推斷推斷為Ethos-U子系統。提供了源代碼。根據許可證，您可以修改並進一步開發源代碼。

圖3-7 ML子系統軟體堆疊概述
![arm Fig3-7](https://hackmd.io/_uploads/Skz5jsPFJe.svg)

軟體組件包括以下內容：

* 推理運行器
    推理運行器是一個測試應用程序，可在Ethos-U驅動程序堆疊上運行推斷。推理運行器將其作為輸入作為一個由Vela編譯器優化的TFLM模型，以及包含輸入特徵映射（IFM）數據的輸入文件。推理運行器的輸出是輸出功能映射（OFM）文件。
* 驅動程序庫
    驅動程序庫是內核驅動程序導出到用戶空間周圍的c ++介面。驅動程序庫使用戶空間應用程序可以檢測NPU功能，創建緩衝區，註冊網路並運行推斷。
* 內核驅動程序
    內核驅動程序是用戶空間和Ethos-U子系統之間的橋樑。它提出了UAPI，允許用戶空間應用程序運行推斷。用戶空間的推理請求轉發到運行推理的Ethos-U子系統。
* Linux內核和DTB
    任何香草Linux內核都可以使用。 Ethos-U子系統的調試和跟踪匯流排（DTB）條目記錄在內核驅動程序中。

### 3.5.軟體體系結構方案和用例

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Software-architecture-scenarios-and-use-cases

Ethos-U子系統的軟體體系結構可以分為兩種情況：

* Linux派遣推斷
    1. Linux為網路，輸入特徵映射（IFM）和輸出功能映射（OFM）分配了DRAM存儲器。
    2. 推理請求從Linux發送到Ethos-U子系統。
    3. Ethos-U子系統執行推理並返回推理響應。
    
    該用例已實現並已驗證。
* Ethos-U在沒有Linux的情況下運行
    1. Ethos-U子系統正在捕獲IFMS並在沒有Linux的幫助下運行推斷。 Linux在睡眠模式下忙，甚至電源降低了。
    2. Ethos-U子系統捕獲IFM（音頻，視頻或傳感器數據）並運行推理。
    3. 當Ethos-U子系統檢測到有趣的東西時，會通知Linux。
    
    此用例的可能情況是AI揚聲器掃描特定單詞或相機掃描面的音頻以觸發解鎖事件。
    
    該用例未在Linux驅動程序堆疊中實現。您必須實現此用例。
    
### 3.6.Ethos-U的其他軟體和工具

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Additional-software-and-tools-for-Ethos-U

可用於幫助開發人員分析和優化基於ARM的硬體目標（例如EthOS-U和Cortex-A處理器）上的一個名為[ML推理顧問（MLIA）](https://pypi.org/project/mlia/)的其他實驗工具。有關MLIA的更多信息，請參見[機器學習推理顧問](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Machine-Learning-Inference-Advisor?lang=en)。

對於使用PyTorch的ML開發人員，有可用的第三方工具可以將PyTorch型號轉換為Tensorflow Lite。例如，來自阿里巴巴的[TinyNeurNetwork](https://github.com/alibaba/TinyNeuralNetwork) 。以下資源可提供有關使用[ONNX（開放神經網路交換）](https://onnx.ai/)將PyTorch轉換為Tensorflow Lite的其他信息：

* [PyTorch到TensorFlow Lite用於部署在Arm Ethos-U55和U65上](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/pytorch-to-tensorflow-lite-for-deploying-on-arm-ethos-u55-and-u65)
* [PyTorch 到 Tflite](https://github.com/ARM-software/ML-examples/tree/main/pytorch-to-tflite)
    
### 3.7.將Ethos-U軟體移植到新的硬體平台

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Porting-Ethos-U-software-to-a-new-hardware-platform

要使用Ethos-U硬體，軟體需要以下信息：

* Ethos-U NPU寄存器塊的基礎地址。
* Ethos-U NPU的中斷分配。
* Ethos-U NPU使用的共享記憶體的地址。

此外，具有Trustzone安全擴展的系統需要以下內容：

* 硬體設計人員需要連接安全配置信號（PORPL和PORSL），以確定硬重置後NPU的安全級別。
* 安全固件需要配置系統以使Ethos-U NPU在正確的安全域中使用。

軟體還必須實施以下內容：

* 在使用Ethos-U NPU之前，調用初始化函數ethos_init() 。 ethos_init()函數是Ethos-U驅動程序的一部分。
* 提供一個中斷處理程序來調用Ethos-U中斷處理程序在Ethos-U驅動程序中的功能。

與任何其他嵌入式軟體項目一樣，軟體開發人員還必須準備合適的鏈接腳本或散點文件，以允許工具鏈生成與硬體平台的系統記憶體映射兼容的程序映像。

以下各節提供了有關每個領域的更多信息。

#### 3.7.1.Trustzone系統中的Ethos-U的安全配置

如果在啟用信任Zone的系統中使用Ethos-U NPU，則安全固件需要執行以下操作：

* 配置記憶體映射和/或Trustzone外圍保護控制器，以便在正確的安全地址範圍內訪問Ethos-U寄存器塊。
* 配置記憶體映射和/或Trustzone記憶體保護控制器，以便NPU可以訪問Ethos-U NPU使用的共享存儲器。
* 在Ethos-U NPU中配置Prot寄存器，以配置當前安全性和特權級別。
* 在中斷控制器中配置Ethos-U中斷的安全域。在Cortex-M處理器中，這是使用中斷目標非安全（ITN）寄存器配置的。

系統打開時，可以更改Ethos-U NPU的安全狀態。此過程需要軟復位。有關更多信息，請參見技術參考手冊中的以下各節：

* [Ethos-U55引導流量信息](https://developer.arm.com/documentation/102420/0200/Boot-flow-information/Boot-flow-information)
* [Ethos-U65引導流量信息](https://developer.arm.com/documentation/102023/0000/Boot-flow-information/Boot-flow-information)

#### 3.7.2.Ethos-U初始化的一個範例

有關Ethos-U NPU初始化的範例，請參見[ML嵌入式評估套件](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/)。

本範例初始化函數在 ethosu_npu_init.c 中

在此文件中，以下arm_ethosu_npu_init()代碼調用Ethos-U初始化函數：

```cpp
int arm_ethosu_npu_init(void)
{
int err = 0;
/* Initialize the IRQ */
arm_ethosu_npu_irq_init();
/* Initialize Ethos-U device */
void* const ethosu_base_address = (void *)(Ethos_U_BASE_ADDR);
if (0 != (err = ethosu_init(
  &ethosu_drv, /* Ethos-U driver device pointer */
  ethosu_base_address, /* Ethos-U NPU's base address. */
  get_cache_arena(), /* Pointer to fast mem area - NULL for U55. */
  get_cache_arena_size(), /* Fast mem region size. */
  Ethos_U_SEC_ENABLED, /* Security enable. */
  Ethos_U_PRIV_ENABLED))) /* Privilege enable. */
{
  printf_err("failed to initialise Ethos-U device\n");
  return err;
}
...
  return 0;
}
```

在此範例中， Ethos_U_BASE_ADDR指定寄存器塊的基礎地址。當使用與CMSIS核心標準兼容的設備支持軟體包時，通常在設備的標頭文件中定義。

此初始化函數調用中斷初始化函數 arm_ethos_npu_irq_init() 定義如下：

```cpp
static void arm_ethosu_npu_irq_init(void)
{
    const IRQn_Type ethosu_irqnum = (IRQn_Type)Ethos_U_IRQN;
    /* Register the EthosU IRQ handler in our vector table.
     * Note, this handler comes from the EthosU driver */
    NVIC_SetVector(ethosu_irqnum, (uint32_t)arm_ethosu_npu_irq_handler);
    /* Enable the IRQ */
    NVIC_EnableIRQ(ethosu_irqnum);
    debug("EthosU IRQ#: %u, Handler: 0x%p\n",
          ethosu_irqnum, arm_ethosu_npu_irq_handler);
}
```

在此代碼中， Ethos_U_IRQN定義了Ethos-U的IRQ數。當使用與CMSIS核心標準兼容的設備支持軟體包時，通常在設備的標頭文件中定義。

範例代碼將異常向量配置為初始化的一部分。如果已經定義並存儲在非易失性存儲器中，則不需要這一點。

可選地，軟體開發人員可以在NVIC中配置中斷的優先級。當使用與CMSIS核心標準兼容的設備支持軟體包時，可以使用NVIC_SetPriority函數。有關CMSIS核心中NVIC管理功能的列表，請參見CMSIS核心文檔中的[中斷和異常（NVIC）](https://arm-software.github.io/CMSIS_5/latest/Core/html/group__NVIC__gr.html) 。

範例代碼為中斷處理程序提供以下包裝器功能：

```cpp
void arm_ethosu_npu_irq_handler(void)
{
    /* Call the default interrupt handler from the NPU driver */
    ethosu_irq_handler(&ethosu_drv);
}
```

這使得可以調用Ethos-U驅動程序中的中斷處理程序功能。

#### 3.7.3.定制設計中的Ethos-U Micro NPU的軟體整合

[Ethos-U-Core平台](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-core-platform/)項目是想要使用Ethos-U NPU為自定義硬體目標創建軟體包的軟體開發人員的建議起點之一。該項目提供了一種為不同定義目標生產固件二進製文件的機制。 targets目錄包含範例，這些例子說明瞭如何添加對Corstone-300和Corstone-310參考設計目標的支持。

要定義您的自定義目標，請執行以下操作：

1. 在targets/demo中，為您的設計編輯CMakeLists.txt和target.cpp文件。搜索ToDo以查找您需要編輯的代碼。
    在target.cpp中，指定Ethos-U的基礎地址以及相對於Cortex-M Vector中斷表中的Ethos-U中斷的中斷數。
2. 創建以下一個：
    * 鏈接腳本，如果使用GCC編譯。
    * 散列文件，如果使用Arm編譯器編譯。
    
    鏈接器腳本或散點文件必須匹配目標的記憶體圖。 FPGA供應商通常提供自動化工具，用於為給定目標生成鏈接腳本。
    
    看到這個。這 targets/corstone-300/platform.ld Linker腳本針對帶有Corstone-300參考設計的MPS3 FPGA板。 Linker腳本定義了兩個負載區域， rom_exec和rom_dram與I-TCM對應DDR。
    
    部署應用程序時，引導加載程序將兩個二進製文件複製到記憶體中各自的物理地址。抬高CPU重置，並調用CMSIS運行時的入口點。 GCC散點機加載複製表中列出的數據，在此範例數據中，從DDR到BRAM。 __cmsis_start 函數 ethos-u/core_software/cmsis/CMSIS/Core/Include/cmsis_gcc.h 執行此數據複製。然後，調用構造函數和main()函數。
    
    您需要創建特定於自定義目標的鏈接腳本或散點文件。
    
#### 3.7.4.鏈接腳本設計

使用Core-Platform項目中的Baremetal範例，讓我們研究如何將張量競技場和模型從嵌入式代碼中放置在記憶體中。張量競技場定義 ethos-u-core-platform/applications/baremetal/main.cpp 具有以下定義：

```cpp
__attribute__((section(".bss.tensor_arena"), aligned(16))) uint8_t TFLuTensorArena[tensorArenaSize];
```

這將張量競技場數組放在記憶體圖的.bss.tensor_arena部分中。在散點文件和鏈接器腳本中，您可以看到.bss.tensor_arena符號放置在SRAM還是DRAM中，具體取決於我們是編譯Ethos-U55還是Ethos-U65的應用程序。以下代碼顯示了Corstone-300的散點文件中的摘要，該片段在SRAM中放置了不同的符號。

圖3-8 在GCC的鏈接腳本中，Ethos-U競技場的範例放置
![arm Fig3-8](https://hackmd.io/_uploads/rJHv42DYJl.png)

在上面的片段中，如果EthosU_ARENA cmake參數等於0，則將.bss.tensor_arena放置在SRAM中。 EthosU_ARENA使用Shared_Sram記憶體模式構建Ethos-U55的應用程序時設置為0。在這種情況下，應將張量競技場放置在SRAM中。

將模型放置在記憶體中遵循相同的邏輯。該模型是僅讀取數據的數組，並且可以通過部分屬性將其放置在記憶體的各個部分中。例如， ethos-u-core-platform/applications/baremetal/models/ethos-u55-128/keyword_spotting_cnn_small_int8/model.h 文件包含以下模型放置的定義：

```cpp
unsigned char networkModelData[] __attribute__((aligned(16), section("network_model_sec")))
```

在指定記憶體模式的Ethos-U55-128中，將模型編譯為Ethos-U55-128之後，將生成networkModelData數組。該數組放置在記憶體圖的network_model_sec部分中。然後，通過鏈接器腳本或散點文件將network_model_sec部分放在存儲器中的適當位置。

### 3.8.自定義Ethos-U驅動程序和RTOS整合

原始文件：https://developer.arm.com/documentation/109267/0101/Arm-Ethos-U-NPU/Porting-Ethos-U-software-to-a-new-hardware-platform

在幾種情況下，您可能需要自定義Ethos-U驅動程序。例如：

* 在裸機系統應用中，在Ethos-U NPU開始推理操作之後，您可能需要將處理器和微控制器或SOC的其他部分置於睡眠模式。
* 在運行RTOS的應用程序中，可能有多個包含ML工作負載的應用程序線程。結果，您可能需要在Ethos-U驅動程序中添加信號量操作，以確保只有一個應用程序線程可以一次訪問Ethos-U NPU。
* 在運行RTOS的應用程序中，Ethos-U NPU啟動推理操作後，您可能需要允許RTOS上下文切換到其他RTOS應用程序線程中。然後，當從Ethos-U NPU接收中斷時，RTO可以恢復應用程序線程。

為了允許這些自定義，Ethos-U驅動程序中的某些功能被定義為weak屬性。這意味著可以覆蓋這些功能的實現，而無需修改Ethos-U驅動程序的源代碼。這些weak功能包括以下內容：

* 推理開始和結束功能， ethosu_inference_begin和ethosu_inference_end 。
* D-CACHE維護功能，例如D-CACHE LUSH（清潔）和D-CACHE無效。
* RTOS函數在內，包括mutex和semaphore 。
* Ethos-U中斷處理程序。

其中一些弱功能是虛擬功能，需要移植。

Ethos-U驅動程序的源代碼可從以下位置獲得： Ethos-U驅動程序的源代碼可從以下位置獲得：https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-core-driver

Ethos-U 驅動程式原始碼位於檔案 ethosu_driver.c 中。

在推理操作期間，代碼的行為如下：

1. TFLM內核會遇到自定義運算子。
2. TFLM內核中的ethosu.cc調用驅動程序代碼，包括ethosu_invoke_v3()函數ethosu_driver.c中的函數。
3. 推理完成後， ethosu.cc函數返回。

下圖顯示了代碼序列：

圖3-9 TFLM和Ethos-U驅動程序之間的介面
![arm Fig3-9](https://hackmd.io/_uploads/SkDpL2wtkl.svg)

Ethos-U驅動程序代碼包括裸機系統信號量實現。使用了兩個信號量：

ethosu_semaphore reserves the driver, ensuring that if an ROTS is used, only one ML application thread can use the Ethos-U NPU at a time.
drv->semaphore is used to wait for the NPU to complete the task.

* ethosu_semaphore 保留驅動程序，確保如果使用 ROTS，一次只有一個 ML 應用程式執行緒可以使用 Ethos-U NPU。
* drv->semaphore 用於等待NPU完成任務。

下圖說明了NN推斷期間的信號量操作：

圖3-10 推理期間的Ethos-U驅動器信號序列
![arm Fig3-10](https://hackmd.io/_uploads/SJkODnDY1g.svg)

信號序列的行為如下：

* 當調用ethosu_register_driver函數時，信號量是設置的。
    這發生在ethos_init()的執行期間，ETEOS-U初始化函數。
    對於SOC中的每個Ethos-U NPU，應用程序調用ethos_init()函數以初始化NPU並配置關聯的安全性和特權級別。如果系統中有多個Ethos-U NPU，則每次使用不同的驅動程序句柄（ struct ethosu_driver *drv ）， ethos_init()函數被稱為多次。每個Ethos-U NPU都有一個不同的精神驅動程序手柄。
* ethosu_register_driver()函數註冊驅動程序並創建ethosu_semaphore信號。該驅動程序現在具有關聯的Ethos-U NPU。
* 在 TFLM 程式碼（ethosu.cc）中，呼叫了 ethosu_reserve_driver() 函數。
    函式執行ethosu_semaphore_take()函式。 
    在只有一個ML應用程序線程的應用程序中， ethosu_reserve_driver()函數立即將ethosu_semaphore SMAPAPARE帶動，因為在ethosu_register_driver()期間創建的信號量仍然可用。
    在具有多個ML應用程序線程的應用程序中，如果另一個應用程序線程使用了Ethos-U NPU，則該應用程序可能會在此階段停滯。
* 成功地獲取信號量後，TFLM代碼然後執行，該代碼依次調用ethosu_invoke_async()函數。
    ethosu_invoke_async()函數開始在Ethos-U NPU硬體上運行命令流並返回。
:::info
**筆記** 
該功能的完成與NPU的操作異步。
:::
* 在ethosu_invoke_v3()內部，TFLM代碼ethosu.cc然後執行ethosu_wait()函數。此功能包含狀態計算機，並且可以以阻塞或非阻滯模式運行。在這種情況下，使用阻止模式：
    * 狀態機切換到Ethosu_job_running狀態。在塊模式下，在這種狀態下什麼都沒有發生。由於未執行break語句，因此執行流落入下一個狀態Ethosu_job_done。
    * 在Ethosu_job_done狀態中，代碼再次執行ethosu_semaphore_take()函數，但是這次使用驅動程序內部的信號量drv->semaphore 。由於該信號量的計數器為0，因此應用程序線程停滯不前。在此階段，默認代碼使處理器入睡，因為輪詢信號量的循環包含WFE （等待事件）指令。如果信號函數函數被特定於OS的函數替換，則OS可以上下文切換到其他線程。
    * 狀態機切換到Ethosu_job_running狀態。在塊模式下，在這種狀態下什麼都沒有發生。由於未執行break語句，因此執行流落入下一個狀態Ethosu_job_done。 
:::info
**筆記** 
ethosu_semaphore_give()函數包含SEV指令。對於單核皮質系統，無需SEV指令。但是，在多個核心系統中，處理中斷的處理器可能與執行ethosu_semaphore_take()一個不同的系統不同，需要使用SEV指令來喚醒另一個處理器。
:::
    * 現在， ethosu_wait()中的ethosu_semaphore_take()函數可以將drv->semaphore信號量化並完成其餘操作。
    * 在成功時，當NPU的狀態寄存器為真時， ethosu_wait()函數返回0， ethosu_invoke_v3()函數完成。
* TFLM代碼ethosu.cc然後執行ethosu_release_driver() 。此版本發布了ethosu_semaphore信號。如果還有另一個正在等待使用Ethos-U的應用程序線程，則可以使用信號量並恢復。
* 稍後，如果不再需要 Ethos-U，軟體可以選擇執行 ethosu_deregister_driver()。

除了信號碼代碼外，還可以在這些操作是原子能的情況下用於信號量操作。

如果使用RTOS，則必須將信號量和靜音API移植到特定於RTOS的實現中。

注意以下內容：

* ethosu_semaphore_give() API在ethosu_irq_handler()期間執行。某些RTOS可能具有不同的螺紋和中斷處理程序的信號量API。將代碼移植到RTOS時，請注意使用正確的API。
* Ethos-U驅動程序可以通過為每個NPU實例使用不同的驅動程序手柄來支持多個Ethos-U NPU。

#### 3.8.1.在Ethos-U NPU運行時，將處理器入睡

默認情況下，推理操作開始後，Ethos-U驅動程序將處理器使用WFE （等待事件）指令入睡。這發生在ethosu_semaphore_take()函數中。下圖顯示了事件的順序：

圖3-11 Ethos-U 立即函數
![arm Fig3-11](https://hackmd.io/_uploads/H1vPj3wt1e.svg)

ethosu_semaphore_take()函數用weak屬性聲明，因此可以由應用程序開發人員自定義。默認情況下，此功能包含WFE操作，以允許處理器進入睡眠模式，但是可以添加其他電源控制代碼以利用微控制器或SOC的低功率功能。以下代碼顯示了可以添加此附加電源控制代碼的位置：

```cpp
// Bare metal simulation of waiting/sleeping and then 
// taking a semaphore using intrinsics
int __attribute__((weak)) ethosu_semaphore_take(void *sem)
{
    struct ethosu_semaphore_t *s = sem;
    while (s->count == 0)
    {
        __WFE(); // Additional codes could be added here 
                 // for device-specific power saving features.
    }
    s->count--;
    return 0;
}
```

#### 3.8.2.添加RTOS支持

如果使用RTO並且有多個應用程序線程，則將處理器放入睡眠模式不是最佳選擇，因為可能還有其他有效線程在等待執行。在這種情況下，我們可以暫停當前執行線程，以便RTO可以上下文切換到正在等待執行的另一個活動線程中。為此，我們在具有RTOS特定信號量函數的Ethos-U驅動程序中替換了信號函數ethosu_semaphore_take()和ethosu_semaphore_give() 。

通過這種安排，在以下情況下，當前線程將處於不活動狀態：

* 在等待NPU資源時，在ethosu_reserve_driver()中
* 在Ethos-U開始運行之後， waiting in ethosu_wait()

在RTOS中的信號量支持的情況下，如果有另一個活動線程等待執行，則處理器可以上下文切換到其他線程。如果沒有其他活動線程等待，RTOS將執行自己的空閒線程，該線程應將處理器進入睡眠模式，以便閒置線程在空閒環中包含WFE指令。

FreeRTOS的範例代碼可在此處提供：
https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-core-platform/+/refs/heads/master/applications/freertos/main.cpp

該存儲庫包含Ethos-U驅動程序中weak功能的特定於FreeRTOS的實現。

#### 3.8.2.Ethos-U驅動程序配置

Ethos-U NPU中的幾個寄存器必須由Ethos-U驅動程序配置，以實現Ethos-U的最佳性能。在以下標頭文件中定義了需要配置的寄存器：

* core_driver/src/ethosu_config_u55.h
* core_driver/src/ethosu_config_u65.h

該硬體具有四個AXI_LILIT寄存器，以設置AXI0和AXI1介面的兩個端口的限制。 AXI_LIMIT的最佳設置是特定於硬體平台。

## 4.Arm Ethos-U NPU的工具支持

原始文件：https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU

幾種工具為ARM Ethos-U NPU提供了支持：

* Ethos-U Vela
    Ethos-U Vela工具將TensorFlow Lite FlatBuffer文件編譯成優化版本，該文件可以在包含ARM Ethos-U NPU的嵌入式系統上運行。
    為了通過Ethos-U NPU加速，必須將網路運算子量化為8位無號數，8位有號數或16位有號數。
    優化的模型包含用於模型的那些部分的Tensorflow Lite自定義運算子，這些運算子可以通過Ethos-U NPU加速。無法加速的模型的一部分保持不變，而是使用適當的內核在Cortex-M系列CPU上運行，例如Arm優化的CMSIS-NN內核。
    有關更多信息，請參見[Ethos-U Vela編譯器](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Ethos-U-Vela-compiler?lang=en)。
* 機器學習推理顧問（MLIA）
    機器學習推理顧問（MLIA）通過實現績效分析並在模型開發週期的早期提供可行的建議來幫助開發人員設計和優化神經網路模型，以有效地推斷ARM目標。該建議包括有關受支持的運算子，績效分析的信息以及用於修剪，聚類等模型優化的建議。
    有關更多信息，請參見[機器學習推理顧問](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Machine-Learning-Inference-Advisor?lang=en)。
* Arm虛擬硬體，傳感器，音頻和視頻的VSI介面
    虛擬流介面（VSI）是一種靈活的，記憶體映射的外圍設備，是ARM固定虛擬平台（FVPS）的一部分。 VSI模擬數據流介面，例如音頻，視頻和傳感器，這些介面，視頻和傳感器通常在IoT和ML應用中使用。該系統提供了八個獨立的VSI實例，可以並行運行，從而允許多通道輸入/輸出介面。
    有關更多信息，請參見[ARM虛擬硬體](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/Arm-Virtual-Hardware?lang=en)。
* 同步數據流（SDS）框架
    同步數據流（SDS）框架實現了用於傳感器和音頻數據介面的靈活數據流管理。它提供了開發和優化整合DSP和ML算法的嵌入式應用程序的方法和工具。
    有關更多信息，請參見[SDS框架](https://developer.arm.com/documentation/109267/0101/Tool-support-for-the-Arm-Ethos-U-NPU/SDS-Framework?lang=en)。
    
## 5.Arm ML動物園

原始文件：https://developer.arm.com/documentation/109267/0101/The-Arm-ML-Zoo

為應用程序創建新的神經網路（NN）模型是一個昂貴的過程。它需要對機器學習（ML）的深入了解，並且為特定用例優化網路可能需要很長時間。

幸運的是，已經為各種不同的應用程序開發了許多不同的NN模型，並且其中許多模型都可以在稱為Model Zoos的在線數據庫中獲得。這些模型可以為進一步開發提供有用的起點。當應用程序開發人員需要創建ML應用程序時，可能無需從頭開始創建新的NN模型。

[ARM ML動物園](https://github.com/ARM-software/ML-zoo)存儲庫託管了針對ARM IP優化的各種ML型號。這些模型涵蓋了一系列不同的應用程序，包括以下內容：

**異常檢測**
    包括針對INT8優化的三種微型模型（大，中，小），與Tensorflow Lite兼容。它們特別適合Cortex-M，Mali GPU和Ethos U.

**圖像分類**
    Mobilenet V2模型針對INT8和UINT8進行了優化。它們與Tensorflow Lite兼容，適用於Cortex-A，Cortex-M，Mali GPU和Ethos U.
    
**關鍵字喚醒**
    包括CNN型號（大型，中等，小），DNN型號（大，中，小）和DS-CNN模型（大型聚集在FP32和INT8中，INT8中的大型）。它們針對INT8或FP32進行了優化，並與Tensorflow Lite兼容。它們適用於Cortex-A，Cortex-M，Mali GPU和Ethos U，取決於模型的不同。
    
**噪聲抑制**
    RNNoise是一個降噪網路，有助於在保持任何語音的同時消除音頻信號的噪聲。這是一個TFLite量化版本，採用傳統的信號處理功能和輸出增益值，可用於消除音頻中的噪聲。

**物件偵測**
    有兩種ML模型可用：SSD Mobilenet V1（具有各種數據類型的變體：FP32，INT8，UINT8）和YOLO V3 TINY（FP32）。 SSD Mobilenet V1是一個物件偵測網路，它在300x300像素的輸入圖像中定位和識別對象。 Yolo V3 Tiny是一個物件偵測網路（使用FP32數據類型），該網路拍攝416x416像素的圖像，並輸出圖像的檢測。

**語音識別**
    這包括Wav2letter模型（標準和修剪）和微小的Wav2letter模型（標準和修剪）。它們針對INT8進行了優化，並與Tensorflow Lite兼容。它們適用於Cortex-A，Cortex-M，Mali GPU和Ethos U.
    
**超分辨率**
    這包括針對INT8優化並與Tensorflow Lite兼容的SESR模型。它適用於Cortex-A和Mali GPU。
    
**視覺喚醒詞**
    這包括針對INT8優化並與Tensorflow Lite兼容的三種微型網路模型（VWW-2，VWW-3，VWW-4）。它們特別適合Cortex-M，Mali GPU和Ethos U.
    
在大多數情況下，軟體開發人員仍然需要重新培訓ML模型以滿足其ML應用程序的特定需求。

### 5.1.整合Arm ML-Zoo模型

原始文件：https://developer.arm.com/documentation/109267/0101/The-Arm-ML-Zoo/Integrating-an-Arm-ML-Zoo-model

本節的內容目前正在開發中，並將在不久的將來添加。

## 6.ML嵌入式評估套件

原始文件：https://developer.arm.com/documentation/109267/0101/ML-Embedded-Evaluation-Kit

ARM ML評估套件是一種工具，旨在幫助開發人員為ARM Cortex-M55和Arm Ethos-U55 NPU構建和部署ML應用程序。它為Ethos-U55系統提供現成的軟體應用程序，包括圖像分類，關鍵字發現，自動語音識別，異常檢測和人檢測。

該套件允許開發人員評估在Cortex-M CPU和Ethos-U NPU上運行的網路的性能指標。它還包括一個通用推理跑步者，可用於開發Ethos-U的自定義ML應用程序。該套件基於ARM Corstone-300參考包，該包裝旨在幫助SOC設計師更快地構建安全系統。該平台可作為生態系統FPGA（MPS3）和固定虛擬平台（FVP）提供，以允許在硬體可用性之前開發。

ARM ML評估套件在Linux環境中運行，儘管可以將[Windows子系統用於Linux](https://learn.microsoft.com/en-us/windows/wsl/install) 。 
:::info
**筆記** 
評估Ethos-U NPU的另一個選擇是[基於CMSIS的機器學習範例](https://github.com/Arm-Examples/mlek-cmsis-pack-examples/)。這包含幾個使用CMSIS包裝來處理軟體整合的範例。基於CMSIS的機器學習範例可以在Linux和Windows環境中使用。
:::

### 6.1.開始使用ML嵌入式評估套件

原始文件：https://developer.arm.com/documentation/109267/0101/ML-Embedded-Evaluation-Kit/Getting-started-with-the-ML-Embedded-Evaluation-Kit

本指南向您展示瞭如何在[ML嵌入式評估套件](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/)中構建範例。

有關ML嵌入式評估套件中包含的範例的列表，請參見GIT存儲庫中的[用例API](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/refs/heads/main/source/application/api/use_case/) 。

還提供了[快速啟動指南](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/quick_start.md)，它向您展示瞭如何構建和運行運行的關鍵字發現範例應用程序。

#### 6.1.1.支持的平台

機器學習評估套件與多個不同平台兼容。這些平台從物理硬體（例如ARM MPS3 FPGA板）到虛擬環境，例如固定虛擬平台（FVP）和ARM虛擬硬體（AVH）。這些平台中的每一個都提供不同的功能和優勢，使ML評估套件成為多種ML探索的多功能工具。

受支持的平台如下：

* [ARM MPS3 FPGA板](https://developer.arm.com/Tools%20and%20Software/MPS3%20FPGA%20Prototyping%20Board)，帶有以下FPGA圖像之一：
    * [AN552](https://developer.arm.com/documentation/dai0552/) FPGA圖像。 AN552基於包含ARM [Cortex-M55處理器](https://developer.arm.com/Processors/Cortex-M55)和[EthOS-U55 NPU](https://developer.arm.com/Processors/Ethos-U55)的[Corstone-300](https://developer.arm.com/Processors/Corstone-300)子系統。
    * [AN555](https://developer.arm.com/documentation/107642/B/?lang=en) FPGA圖像。 AN555基於包含ARM [Cortex-M85處理器](https://developer.arm.com/Processors/Cortex-M85)和[Ethos-U55 NPU](https://developer.arm.com/Processors/Ethos-U55)的[Corstone-310](https://developer.arm.com/Processors/Corstone-310)子系統。
    
        您可以[從ARM Developer下載這些FPGA圖像](https://developer.arm.com/downloads/-/download-fpga-images)。
* [Corstone-300](https://developer.arm.com/Processors/Corstone-300)的[固定虛擬平台（FVP）](https://developer.arm.com/tools-and-software/open-source-software/arm-platforms-software/arm-ecosystem-fvps)
* [Corstone-300](https://developer.arm.com/Processors/Corstone-300)的[Arm虛擬硬體（AVH）](https://www.arm.com/products/development-tools/simulation/virtual-hardware)
* [Corstone-310](https://developer.arm.com/Processors/Corstone-310)的[Arm虛擬硬體（AVH）](https://www.arm.com/products/development-tools/simulation/virtual-hardware)

#### 6.1.2.系統和軟體要求

請參閱[ARM ML嵌入式評估套件文檔](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/documentation.md#prerequisites)，以閱讀運行ML嵌入式評估套件的先決條件的完整詳細信息。

關鍵要求如下：

1. Linux的X86 Linux系統或Windows子系統。
2. Python版本3.9或更新。
    您可以使用以下命令在系統上檢查系統的版本：
    ```bash
    python3 --version
    ```
    如果系統上的Python版本為3.8或更早，則可以按照A[RM ML嵌入式評估套件文檔](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/refs/heads/main/docs/sections/troubleshooting.md#how-to-update-python3-package-to-newer-version)中的說明來更新Python版本。
3. 幾種常見的軟體工具，可以使用以下命令安裝：
    ```bash
    sudo apt install -y cmake make python3 git curl unzip xxd
    sudo apt install -y python3-pip
    python3 -m pip install pillow
    ```
4. Python虛擬環境。
    要安裝Python 3.9的Python虛擬環境，請運行以下命令：
    ```bash
    sudo apt install -y python3.9-venv
    ```
    
    要安裝Python 3.10的Python虛擬環境，請運行以下命令：
    ```bash
    sudo apt install -y python3.10-venv
    ```
5. 編譯工具鏈，以下一個：
    * Arm Compiler for Embedded 6.16 或更高版本
    * GNU Arm Embedded toolchain 10.2.1 或更高版本
    如果您需要安裝GNU ARM嵌入式工具鏈，請從以下位置之一下載合適的版本：
        * https://developer.arm.com/downloads/-/arm-marm-gnu-toolchain-downloads （版本11.2，11.3 12.2或更高版本）
        * https://developer.arm.com/downloads/-/gnu-rm （版本10.3或更早）

        https://developer.arm.com/downloads/-/gnu-rm （版本10.3或更早）
        
安裝工具鏈後，將工具鏈執行檔路徑添加到搜索路徑。

:::info
**筆記**
對於運行Linux（WSL）Windows子系統的用戶， $PATH變量中的Windows路徑可能包含未設計的空間字符，例如 /mnt/c/Program Files/Microsoft VS Code/bin 。這是原因。為了解決問題，您可以使用以下解決方法之一：

＊　創建一個bash腳本以從$PATH變量中刪除Windows路徑
＊　在路徑變量中的所有空間之前添加反斜線字符\
＊　用引號封閉路徑
:::

#### 6.1.3.查看存儲庫

運行以下命令以查看存儲庫：

```bash
git clone "https://review.mlplatform.org/ml/ethos-u/ml-embedded-evaluation-kit"
cd ml-embedded-evaluation-kit
git submodule update --init
```

#### 6.1.4.編譯默認項目

使用以下命令之一運行編譯腳本，具體取決於您使用的工具鏈：

* GNU Arm Embedded toolchain (gcc):
    ```bash
    python3 ./build_default.py
    ```
* Arm Compiler for Embedded:
    ```bash
    python3 ./build_default.py --toolchain arm
    ```

編譯完成後，可執行文件位於cmake-build-XXXXXX/bin中。

要運行範例項目，請在[ARM ML嵌入式評估套件文檔](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/deployment.md#deployment)中按照這些說明進行操作。

build_default.py腳本構建默認配置的測試。該腳本支持幾個命令行選項。例如，要指定Ethos-U55硬體為32 Mac的配置，您可以使用以下命令之一：

* GNU Arm Embedded toolchain (gcc):
    ```bash
    python3 ./build_default.py --npu-config-name ethos-u55-32
    ```
* Arm Compiler for Embedded:
    ```bash
    python3 ./build_default.py --npu-config-name ethos-u55-32 --toolchain arm
    ```

以下是Ethos-U配置的有效選項：

* ethos-u55-32
* ethos-u55-64
* ethos-u55-128
* ethos-u55-256
* ethos-u65-256
* ethos-u65-512

有關build_default.py腳本命令行選項的完整列表，請參見[ARM ML嵌入式評估套件文檔](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#building-for-default-configuration)。

#### 6.1.5.其他資源

[ML嵌入式評估套件](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/)git存儲庫中有許多文檔：

* [主頁](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/)
* [快速啟動指南](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/quick_start.md)
* [文件](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/documentation.md)
* [從來源構建ML嵌入式代碼範例應用程序](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md)
* [部署](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/deployment.md)
* [自定義（實施自定義ML應用程序）](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/customizing.md)
* [Arm虛擬硬體](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/arm_virtual_hardware.md)
* [常見問題](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/faq.md)
* [故障排除](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/troubleshooting.md)
* [記憶體考慮](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/memory_considerations.md)
* [測試和基準](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/testing_benchmarking.md)
* [定時適配器](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/timing_adapters.md)
* [cmake預設](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/cmake_presets.md)
* [編碼標準和準則](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/coding_guidelines.md)
* [附錄](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/appendix.md)

以下ARM博客提供了有關Arm機器學習評估套件的有用信息：

* [優化一個ML模型，以快速推斷Ethos-U microNPU](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/optimize-a-ml-model-for-inference-on-ethos-u-micronpu)
* [Vela編譯器：在ARM Ethos-U MicroNPU上部署NN模型的第一步](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/vela-compiler-deploy-your-nn-model-on-the-arm-ethos-u-micronpu)
* [博客：ARM ML嵌入式評估套件](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/arm-machine-learning-embedded-evaluation-kit)

以下Arm學習路徑與Arm機器學習評估套件有關：

* [通過Ethos-U處理器導航機器學習開發](https://learn.arm.com/learning-paths/microcontrollers/nav-mlek/)
* [建立和運行Arm機器學習評估套件範例](https://learn.arm.com/learning-paths/microcontrollers/mlek/)

### 6.2.超越基本知識

原始文件：https://developer.arm.com/documentation/109267/0101/ML-Embedded-Evaluation-Kit/Beyond-the-basics

該指南的本部分提供了以下信息：

* 套件的軟體組件的概述，包括Tensorflow Lite Micro運行時和Ethos-U驅動程序。
* 存儲庫的結構
* 編譯腳本執行的構建過程和關鍵操作。
* 可用的構建選項以及如何根據用戶的需求自定義它們。

[開始使用ML嵌入式評估套件引入了ML評估套件](https://developer.arm.com/documentation/109267/0101/ML-Embedded-Evaluation-Kit/Getting-started-with-the-ML-Embedded-Evaluation-Kit?lang=en)，其目的及其潛在應用。本指南還解釋了機器學習的基本概念，這些概念對於理解ML嵌入式評估套件的工作至關重要。

#### 6.2.1.構建過程

現有資源描述了構建過程：

* [存儲庫的結構](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/documentation.md#additional-reading)
* [建構過程](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#build-process)
    * [準備構建環境](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#preparing-build-environment)
    * [創建一個構建目錄](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#create-a-build-directory)
    * 為所選平台配置構建
        * [配置MPS3 SSE-300的構建](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#configuring-the-build-for-mps3-sse_300)
        * [配置MPS3 SSE-310的構建](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#configuring-the-build-for-mps3-sse_310)
        * [配置本機單位測試構建](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#configuring-native-unit_test-build)
        * [為簡單平台配置構建](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#configuring-the-build-for-simple_platform)
    * [構建應用程序](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#building-the-configured-project)

編譯腳本build_default.py執行以下關鍵操作：

1. 為每個用例下載TFLM型號，並使用Vela優化它們，如下圖所示：

圖6-1 模型下載和優化
![arm Fig6-1](https://hackmd.io/_uploads/Bkpd7v_YJl.svg)

2. 下載其他軟體組件，打開包裝，並在需要時進行修補。
    
    這些軟體組件包括以下內容：
    
    * 來自Tensorflow Lite Micro的FlatBuffers庫
    * kissfft, 快速傅立葉轉換函式庫
    * pigweed, 嵌入式目標庫的集合
    * gemmlowp, 通用矩陣乘法函式庫
    * ruy, 矩陣乘法函式庫

3. 為每個用例設置構建環境
    為每個用例設置構建環境

    | 輸入文件 | 轉換腳本 |
    | :--------: | -------- |
    | Tensorflow Lite Micro模型 .tflite | ml-embedded-evaluation-kit/scripts/py/gen_model_cpp.py     |
    | ML數據標籤 .txt | ml-embedded-evaluation-kit/scripts/py/gen_labels_cpp.py |
    | 音頻輸入數據 .wav | ml-embedded-evaluation-kit/scripts/py/gen_audio_cpp.py |
    | 圖像輸入數據 .bmp | ml-embedded-evaluation-kit/scripts/py/gen_rgb_cpp.py |

轉換後的C++源和標頭文件的輸出在 ml-embedded-evaluation-kit/cmake-build-{target}-{configs}/generated/{use-case}/  

:::info
**筆記**
您也可以使用xxd實用程序將.tflite模型文件轉換為C/C++中的字節數組。
:::

4. 源代碼在此階段進行編譯。如果需要，下載了其他軟體組件，例如CMSIS-DSP庫源。

#### 6.2.2.構建build_default.py的選項

有關構建選項的完整列表，請參見[ARM ML嵌入式評估套件文檔](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/building.md#build-options)。

例如，您可以使用以下Ethos_U_NPU_MEMORY_MODE設置來定義Ethos-U NPU使用的記憶體類型：

* Shared_Sram 這是Ethos-U55 NPU的默認值，可用於Ethos-U55和Ethos-U65。
* Dedicated_Sram 這是Ethos-U65 NPU的默認值，僅適用於Ethos-U65。
* Dedicated_Sram 這是Ethos-U65 NPU的默認值，僅適用於Ethos-U65。

如果有必要使用不同的構建選項，而不是手動執行構建步驟，則更容易使用默認的構建腳本作為起點並修改腳本中的cmake_command來使用自定義的構建選項。

#### 6.2.3.軟體組件

本節探討了機器學習評估套件的軟體組件。機器學習評估套件的關鍵軟體組件包括以下內容：

Tensorflow Lite Micro，它為可執行程序，Ethos-U驅動程序和平台代碼提供了支持多個硬體目標的靈活性。

* TensorFlow Lite Micro

    可執行的程序映像包含Tensorflow Lite Micro運行時，該時間由build_default.py腳本下載。下載後，文件位於 ml-embedded-evaluation-kit/dependencies/tensorflow 目錄。
    
    Tensorflow Lite Micro為Ethos-U提供了支持。有關軟體整合和初始化的信息，請參見 ml-embedded-evaluation-kit/dependencies/tensorflow/tensorflow/lite/micro/kernels/ethos_u/README.md 。
    
* Ethos-U驅動程序

    可以在以下位置找到Ethos-U驅動程序：ml-embedded-evaluation-kit/dependencies/core-driver
    
* 平台代碼

    平台支持代碼可能會令人困惑，因為評估套件包含來自多個存儲庫的文件，並且其中一些具有自己的平台驅動程序代碼。 ML嵌入式評估套件不使用第三方存儲庫中的驅動程序代碼，因為它需要額外的靈活性來支持多個硬體目標，例如Corstone-300和Corstone-310。平台支持代碼可以在以下位置找到：
    
    | 位置 | 註記 |
    | :--------: | :--------: |
    | ml-embedded-evaluation-kit/source/hal/source/platform/mps3/ | 範例項目使用的平台代碼。 |
    | ml-embedded-evaluation-kit/dependencies/tensorflow/tensorflow/lite/micro/cortex_m_corstone_300 | 來自Google TensorFlow。未使用。 |
    | ml-embedded-evaluation-kit/dependencies/core-platform/targets/corstone-300 | 來自 mlplatform.org。未使用。 |

Ethos-U整合的詳細信息，例如基本地址和IRQ分配，可以在此文件中提供： ml-embedded-evaluation-kit/source/hal/source/platform/{platform}/CMakeLists.txt 。

鏈接腳本在此位置： ml-embedded-evaluation-kit/scripts/cmake/platforms/{platform} 。

#### 6.2.4.使用ML嵌入式評估套件創建自定義應用程序

有關創建在ML嵌入式評估套件中運行的自定義應用程序的信息，請參見[實現自定義ML應用程序](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/customizing.md#implementing-custom-ml-application)。

您還可以[添加自定義平台支持](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/+/HEAD/docs/sections/customizing.md#adding-custom-platform-support)。

## 7.基於CMSIS包裝的ML範例

原始文件：https://developer.arm.com/documentation/109267/0101/CMSIS-Pack-based-ML-examples

除了[ML嵌入式評估套件](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/)外，它在嘗試Ethos-U55/U65 NPU時為用戶提供了快速的路徑，ARM還提供了基於CMSIS-PACK（一種軟體組件包裝解決方案）的範例。您可以從[Arm-examples GitHub存儲庫](https://github.com/Arm-Examples/mlek-cmsis-pack-examples)中下載基於CMSIS包裝的ML範例。

基於CMSIS的ML範例提供了以下好處：

* 使用CMSIS-PACK作為軟體整合機制，它更適合IDE開發環境。
* 提供更大的硬體支持選擇。
* 支持Windows環境。

請注意，基於CMSIS的ML範例存儲庫是一個過程中的工作。當前限制包括以下內容：

* ML用例僅限於關鍵單詞喚醒（KWS）和物件偵測
* 只支援 Arm Compiler 6
* Ethos-U NPU不可配置

### 7.1.先決條件

基於CMSIS的ML範例需要以下工具：

* Arm Compiler for Embedded

    下載用於[嵌入式的ARM編譯器](https://developer.arm.com/Tools%20and%20Software/Arm%20Compiler%20for%20Embedded)，並參考[發行說明](https://developer.arm.com/documentation/ka005061/latest)以獲取安裝信息。
    
* CMSIS-Toolbox

    要安裝[CMSIS-TOOLBOX](https://github.com/Open-CMSIS-Pack/cmsis-toolbox) ，請[下載版本2.0或更高版本](https://artifacts.keil.arm.com/cmsis-toolbox/)，並參考[安裝文檔](https://github.com/Open-CMSIS-Pack/cmsis-toolbox/blob/main/docs/installation.md)。
    
    安裝CMSIS-Toolbox後，請確保：
    
    * CMSIS-Toolbox二進製文件在搜索路徑中。
    * 例如，設置了工具鏈安裝路徑的環境變量 AC6_TOOLCHAIN_6_19_0=C:/Keil_v5/ARM/ARMCLANG/bin 。
    * 環境變量CMSIS_PACK_ROOT包含了包含軟體包的CMSIS包裝根目錄的路徑。
    * CMSIS包根目錄是初始化的。有關更多信息，請參見CPackget文檔。例如， cpackget init --pack-root path/to/new/pack-root https://www.keil.com/pack/index.pidx 。
    * 環境變量CMSIS_COMPILER_ROOT包含CMSIS-TOOLBOX中etc目錄的路徑，例如{install_path}/etc 。

* git, cmake, make, ninja

    在Linux系統上，使用以下命令安裝工具：
    
    ```bash
    sudo apt install -y cmake make git ninja-build
    ```
    
    在Windows系統上，使用以下網站的安裝程序安裝實用程序：

    | 工具 | 網站 |
    | :--------: | -------- |
    | git | https://git-scm.com/download/win |
    | cmake | https://cmake.org/download/ |
    | CNU make | https://github.com/ninja-build/ninja/releases |
    | Ninja-build | https://github.com/ninja-build/ninja/releases |
    
* 合適的IDE
    
    ARM建議您將[Visual Studio Code IDE](https://code.visualstudio.com/)與[Keil Studio Pack擴展程序](https://marketplace.visualstudio.com/items?itemName=Arm.keil-studio-pack)一起使用。
    
    另外，您也可以使用[Keil Studio Cloud](https://studio.keil.arm.com/?import=https://github.com/Arm-Examples/mlek-cmsis-pack-examples.git) 。
    
### 7.2.編譯基於CMSIS的ML範例

基於CMSIS包裝的ML範例Workflow使用CMSIS-Toolbox從每個範例的YAML文件中生成編譯設置。該流程包括以下步驟：

1. 分析YAML文件以產生任何缺失的CMSIS包裝列表：
    ```bash
    csolution list packs mlek.csolution.yml -m > packlist.txt
    ```
2. 安裝所有缺少的CMSIS包裝：
    ```bash
    cpacket add -f packlist.txt
    ```
3. 為每個範例用例生成.cprj文件：
    ```bash
    csolution convert ./mlek.csolution.yml
    ```

    默認情況下，此命令為不同的配置組合生成了幾個.cprj文件。有很多組合，因為：
    
    * 這些範例支持許多ML用例。
    * 這些範例支持許多目標平台。
    * 構建類型可以是調試或發布。
    * 如果需要，您可以使用-c選項生成一個特定組合，如下所示：
    ```bash
    csolution convert ./mlek.csolution.yml -c object_detection.Release+AVH-SSE-300-U55
    ```
4. 使用cbuild或IDE編譯項目。

    例如，使用cbuild編譯KWS範例：
    ```bash
    cbuild ./kws/kws.Debug+AVH-SSE-300-U55.cprj -g "Unix Makefiles" -j 4
    ```

下圖顯示了此工作流程：

圖7-1 基於CMSIS包裝的ML範例的軟體工作流程
![arm Fig7-1](https://hackmd.io/_uploads/BJWwk_uYye.svg)

可以在目標硬體或仿真環境中測試生成的可執行文件。有關更多信息，請參見基於[CMSIS-PAKC的ML範例文檔](https://github.com/Arm-Examples/mlek-cmsis-pack-examples#execute-project)。

請注意，由於FPGA圖像中的Ethos-U配置（128 Mac/Cycle）與NN模型（256 MAC/Cycle）不匹配，因此不支持Cortex-M55（AN552）的MPS3 FPGA圖像（AN552）。但是，您仍然可以使用ARM虛擬硬體（AVH）或固定虛擬平台（FVP）測試生成的應用程序。

:::info
**筆記**
與ML嵌入式評估套件不同，ML模型和輸入樣本已經轉換為C++：

* [KWS](https://github.com/Arm-Examples/mlek-cmsis-pack-examples/tree/main/kws/src)
* [Object Detection](https://github.com/Arm-Examples/mlek-cmsis-pack-examples/tree/main/kws/src)

因此，無需使用Vela編譯器。因此，ML模型支持的Ethos-U配置是固定的。
:::

### 7.3.在您自己的項目中使用TFLM CMSIS包裝

原始文件：https://developer.arm.com/documentation/109267/0101/CMSIS-Pack-based-ML-examples/Using-TFLM-CMSIS-Packs-in-your-own-project

指南本節中的信息可幫助您將Tensorflow Lite Micro（TFLM），Ethos-U驅動程序和ML模型整合到您自己的項目中。

過程中的步驟如下：

* [添加TFLM軟體組件](https://developer.arm.com/documentation/109267/0101/CMSIS-Pack-based-ML-examples/Using-TFLM-CMSIS-Packs-in-your-own-project?lang=en#md670-using-tflm-cmsis-packs-in-your-own-project__add-the-tflm-software-components)
* [將ML模型添加到您的項目](https://developer.arm.com/documentation/109267/0101/CMSIS-Pack-based-ML-examples/Using-TFLM-CMSIS-Packs-in-your-own-project?lang=en#md670-using-tflm-cmsis-packs-in-your-own-project__add-the-ml-model-to-your-project)
* [使用TFLM API](https://developer.arm.com/documentation/109267/0101/CMSIS-Pack-based-ML-examples/Using-TFLM-CMSIS-Packs-in-your-own-project?lang=en#md670-using-tflm-cmsis-packs-in-your-own-project__use-the-tflm-api)

這些步驟將在以下各節中進一步討論。

#### 7.3.1.添加TFLM軟體組件

TFLM軟體包可從[CMSIS包裝](https://www.keil.arm.com/packs/?q=tensorflow&pack-search=)網頁獲得：

* pack: tensorflow::flatbuffers
* pack: tensorflow::gemmlowp
* pack: tensorflow::kissfft
* pack: tensorflow::ruy
* pack: tensorflow::tensorflow-lite-micro

這些包由由[mlplatform.org](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-core-software)上的ARM維護和版本構建的來源。

添加如下所示的組件，例如使用Keil Studio中的[管理軟體組件](https://developer.arm.com/documentation/102497/1-5/Work-with-standalone-CMSIS-projects-and-CMSIS-solutions/Manage-a-CMSIS-solution-and-its-software-components)。

* 最重要的組成部分是：
    * component: Machine Learning:TensorFlow:Kernel&Ethos-U
* 該組件及其變體 Ethos-U 需要以下幾個軟體組件。可以在 IDE 中解決相依性：
    * component: Arm::Machine Learning:NPU Support:Ethos-U Driver&Generic U55
    * component: ARM::CMSIS:DSP&Source
    * component: ARM::CMSIS:NN Lib
    * component: tensorflow::Data Exchange:Serialization:flatbuffers
    * component: tensorflow::Data Processing:Math:gemmlowp fixed-point
    * component: tensorflow::Data Processing:Math:kissfft
    * component: tensorflow::Data Processing:Math:ruy
    * component: tensorflow::Machine Learning:TensorFlow:Kernel Utils
    * component: tensorflow::Machine  Learning:TensorFlow:Kernel Utils

:::info
**筆記**
此處顯示的Ethos-U驅動程序默認變體是Generic U55 。根據您的目標設備，可以從設備供應商那裡獲得不同的驅動程序變體，應選擇。
:::

#### 7.3.2.將ML模型添加到您的項目

有兩種將您的ML模型存儲在嵌入式目標上的選項：

* 將ML模型存儲在現有文件系統上。

    TensorFlow庫可以解釋.tflite文件存儲在文件系統上。如果您需要處理多個模型，並且希望與應用程序獨立更新它們，這將很有用。
    
    KEIL中間件文件系統提供了一組API，可以與SD卡或USB Flash Drive等存儲設備上的文件系統進行交互。以下簡單代碼段顯示瞭如何從SD卡加載.tflite文件：
    
```cpp
#include "rl_fs.h"
...
FILE *f;
char *buffer;
size_t buffer_size;
// Open the file for reading
f = fopen("/sdcard/my_model_vela.tflite", "r");
if (f == NULL) {
    // Error handling
}
// Get the size of the file and allocate a buffer
fseek(f, 0, SEEK_END);
buffer_size = ftell(f);
rewind(f)
buffer = malloc(buffer_size + 1);  // +1 for the null terminator
if (buffer == NULL) {
    // Error handling
    fclose(f);
    return;
}
// Read the file into the buffer
size_t num = fread(buffer, 1, buffer_size, f);
if (num != buffer_size) {
    printf("Failed to read file\n");
} else {
    buffer[buffer_size] = '\0';  // Null-terminate the string
    printf("File contents: %s\n", buffer);
fclose(f);
const tflite::Model* model = ::tflite::GetModel(buffer);
free(buffer);
...
```

加載模型文件需要大量的RAM，並且不適合所有系統設計。該用法模型的典型情況是基於ARM虛擬硬體的測試系統，在該系統中，您可以加載許多不同的模型變體用於分析。即使您的硬體目標上有文件系統，您也可能希望將模型存儲在ROM中。

* 將模型編譯到固件圖像中，並將其與應用程序一起刷新。

    要將 .tflite 檔案的內容編譯到韌體映像中，需要將其表示為 C 語言語法中的陣列。使用十六進位轉儲公用程式（例如 xxd）將二進位 .tflite 檔案轉換為頭檔 my_network_model.h 以包含在您的專案中，如下所示：
    
    ```bash
    xxd -i my_model_vela.tflite my_network_model.h
    ```
    
    為了確保數據存儲在ROM記憶體中並以16個字節對齊邊界開始，請按以下方式定義數據陣列：
    
    ```cpp
    const unsigned char network_model __ALIGNED(16) {
    ...
    }
    ```
    
    在應用程序代碼中，包括my_network_model.h ，並使用TensorFlow加載模型：
    
    ```cpp
    #include "my_network_model.h"
    ...
    const tflite::Model* model = ::tflite::GetModel(network_model);
    ...
    }
    ```
    
#### 7.3.3.使用TFLM API

以下部分說明瞭如何使用Tensorflow Lite Micro C++ API進行典型實現。輸入張量，預處理和輸出解釋取決於您的模型，並且可能不同。

首先，我們必須初始化Ethos-U NPU。函數ethosu_init初始化了Ethos-U NPU。在ML嵌入式評估套件中，此功能在平台初始化代碼中的硬體初始化期間執行：如下：

* int platform_init() 在 source/hal/source/platform/mps3/source/platform_drivers.c 呼叫:
    * int arm_ethosu_npu_init() 在 source/hal/source/components/npu/ethosu_npu_init.c.
    * int arm_ethosu_npu_init() 在 source/hal/source/components/npu/ethosu_npu_init.c.

初始化Ethos-U NPU後，我們可以使用Tensorflow Lite運行時訪問Ethos-U。 Ethos-U支持已整合到TFLM運行時。因此，應用程序代碼調用TFLM解釋器使用Ethos-U NPU，如下：

```cpp
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
#include "tensorflow/lite/micro/tflite_bridge/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
// Include your model data. Replace this with the header file for your model.
#include "model.h"
// Define the number of elements in the input tensor
#define INPUT_SIZE 300*300
using MyOpResolver = tflite::MicroMutableOpResolver<10>;
// Replace this with your model's input and output tensor sizes
const int tensor_arena_size = 2 * 1024;
uint8_t tensor_arena[tensor_arena_size] __align(16);
void RunModel(int8_t* input_data) {
    tflite::MicroErrorReporter micro_error_reporter;
    tflite::ErrorReporter* error_reporter = &micro_error_reporter;
    const tflite::Model* model = ::tflite::GetModel(g_model);
    MyOpResolver op_resolver;
    // Register your model's operations here
    tflite::MicroInterpreter interpreter(model, op_resolver, tensor_arena,
                                         tensor_arena_size, error_reporter);
    interpreter.AllocateTensors();
    TfLiteTensor* input = interpreter.input(0);
    // Add checks for input tensor properties here if needed
    // Copy image data to model's input tensor
    for (int i = 0; i < INPUT_SIZE; ++i) {
        input->data.int8[i] = input_data[i];
    }
    TfLiteStatus invoke_status = interpreter.Invoke();
    // Add checks for successful inference here if needed
    TfLiteTensor* output = interpreter.output(0);
    // Add checks for output tensor properties here if needed
    // Process your output value here
    // For example, SSD models typically produce an array of bounding boxes
}
```

該模板需要C++ 17作為最低語言標準，該標準符合TensorFlow使用的標準。

如果您需要創建自己的模型，請參閱《[TensorFlow指南](https://www.tensorflow.org/lite/microcontrollers/build_convert)》以獲取有關工作流程的更多信息。

創建ML應用程序後，您採取的下一步可能是配置並優化ML模型。 ARM提供了幾種工具，可幫助您測試和改善模型在Ethos-U NPU上的性能。有關更多信息，請參見[分析和優化ML模型](https://developer.arm.com/documentation/109267/0101/Profiling-and-optimizing-ML-models?lang=en)。

## 8.分析和優化ML模型

原始文件：https://developer.arm.com/documentation/109267/0101/Profiling-and-optimizing-ML-models

Tensorflow Lite Micro（TFLM）模型的記憶體需求和代碼大小取決於模型的參數，層和運行的硬體平台。要估計模型的記憶體需求和代碼大小，請使用以下工具：

1. 模型分析
    首先檢查TFLM模型本身的結構。這包括圖層的數量和類型，輸入和輸出形狀以及模型參數的大小。模型參數由與每一層相關的權重和偏差組成。有用的工具可以是可視化的，例如[Netron應用程序](https://netron.app/)提供的工具。
2. TFLM配置文件
    TFLM提供了一個探測器工具，可讓您測量記憶體使用情況和代碼大小。您可以在TFLM文檔中找到範例代碼和說明。
3. 性能計數器
    Ethos-U提供的性能計數器可讓您分析代碼和記憶體使用量。
4. 記憶體估計功能
    TFLM提供了記憶體估計功能，使您可以通過編程方式估算記憶體需求。這些功能可幫助您根據模型參數和張量形狀計算記憶體使用情況。
5. 編譯器和鏈接器
    ARM編譯器，LLVM和GCC都可以生成有關代碼和物體大小的報告。
6. 靜態分析
    靜態分析工具可以在不運行的情況下提供有關TFLM模型的代碼大小和記憶體使用的信息。
    
### 8.1.Ethos-U Vela優化

Ethos-U Vela編譯器優化了神經網路模型。 Vela提供了幾種影響模型優化的命令行選項。有關更多信息，請參閱ARM ML評估套件文檔中[使用Vela編譯器的“優化自定義模型”](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/%252B/refs/heads/main/docs/sections/building.md#Optimize-custom-model-with-Vela-compiler) 。

### 8.2.運算子映射和用法

使用--verbose-performance選項運行Ethos-U Vela，顯示有關模型中TensorFlow運算子使用的信息。

:::info
**筆記**
這些數據值是估計值，並且基於對晶片的推斷而不是周期準確的數字。
:::

以下是帶有--verbose-performance選項的Vela的範例輸出：

圖8-1 Vela詳細輸出範例
![arm Fig8-1](https://hackmd.io/_uploads/SkXBKuOt1e.png)

在此範例中：

* 週期和網路％很好地表明了哪些層是計算和記憶體密集的。
* MAC計數為0，表明運算子未卸載到Ethos-U NPU。這些運算子通常通常通過CMSIS-NN優化，但會消耗CPU處理時間。如果您的大多數網路都是這種情況，則使用的模型不適合Ethos-U。

### 8.3.MLIA指導優化（實驗）

ML推理顧問（MLIA）是一種工具，可幫助AI開發人員設計和優化神經網路模型，以有效推斷ARM目標。 MLIA是評估網路是否完全映射到Ethos-U的理想選擇。此外，MLIA可以進行性能分析，並在模型開發週期的早期提供可行的建議。這些建議可以涵蓋受支持的運算子，績效分析以及模型優化的建議，例如修剪和聚類。

MLIA提供以下子命令：

* [檢查](https://pypi.org/project/mlia/)模型上執行兼容性或性能檢查。
* 應用指定的[優化](https://pypi.org/project/mlia/)。優化僅適用於KERAS .h5模型格式，而不是.tflite 。

當MLIA使用Corstone固定虛擬平台（FVP）等性能模型設置時，它提供了有關推斷的性能信息。如果使用CORSTON-300 FVP以及所有推理操作在Ethos-U55上運行時，結果值將準確地超過+/- 10％。當使用其他性能模型（例如CORSTON-310 FVP）時，誤差邊距可能會更高。

MLIA是圍繞其他工具和組件的包裝紙，不包括其自己的性能模型。這就是為什麼需要FVP獲取性能數據的原因。相比之下，Vela包括一個性能估計器，但Vela中的性能估計並不是周期準確的。 Vela性能估計值旨在用於與其他Vela性能估計值的相對比較，但不應在需要準確性的情況下使用。

例如，要進行深入的評估，例如了解完整的軟體流並通過記憶體佈局佈置進行實驗，甚至是針對使用預處理和後處理的完整應用程序，然後是ML嵌入式評估套件或基於CMSIS-PACK的應用程序範例可能更合適。

### 8.4.Ethos-U性能分析

原始文件：https://developer.arm.com/documentation/109267/0101/Profiling-and-optimizing-ML-models/Ethos-U-performance-profiling

本節的內容目前正在開發中，並將在不久的將來添加。

## 9.MLOPS系統

原始文件：https://developer.arm.com/documentation/109267/0101/MLOps-systems

ARM提供了一組基礎工具和軟體組件，以實現MLOPS系統以及用於機器學習應用程序的整體開發流。 ARM還與多個MLOPS合作夥伴合作，將這些組件整合到已建立的MLOPS系統中。 [ARM合作夥伴生態系統目錄](https://www.arm.com/partners/ai-ecosystem-catalog)提供了可搜索的AI合作夥伴列表。

有關開發機器學習應用程序的MLOPS流程步驟的介紹，請參見[ML開發過程的概述](https://developer.arm.com/documentation/109267/0101/Overview/Overview-of-the-ML-development-process?lang=en)。

下圖概述了ARM提供的工具和模板項目，以優化Cortex-M和Ethos-U處理器的MLOPS流程。

圖9-1 MLOPS組件
![arm Fig9-1](https://hackmd.io/_uploads/BkUlyFdK1l.svg)

MLOPS系統通常使用所有必需開發工具的容器。

github存儲庫- [Arm-Software/AVH-MLOps](https://github.com/Arm-Software/AVH-MLOps) 包含：

* MLOPS基礎工具的設置，使用Docker進行了例證。大多數工具都是從ARM工具文物中下載的。
* 模板項目生成ML模型庫，並使用ARM虛擬硬體（AVH-FVP）驗證執行。它支持所有相關的Cortex-M和Ethos-U目標，可以與不同的工具鏈一起使用。
* 範例典型的MLOP操作的GitHub動作。
* 使用Open-CMSIS包裝技術將ML模型庫的軟體包交付。

### 9.1.許可證激活

要激活MLOPS系統中的ARM開發工具，需要許可證。[聯繫ARM](https://www.arm.com/company/contact-us)以獲取更多詳細信息，以及有關如何成為ARM MLOPS合作夥伴的信息。

以下命令在容器外運行，激活MLOPS系統許可證：

```bash
armlm activate --code <license-code-here> --as-user arm_mlops --to-file arm_mlops_license
```

activate 指令產生一個授權文件，使用 armlm import 指令匯入到容器中。有關詳細信息，請參閱[基於使用者的許可使用者指南](https://developer.arm.com/documentation/102516)。

:::info
**筆記**
activate命令必須至少每24小時運行一次，以使許可證保持最新狀態。
:::

### 9.2.範例專案

存儲庫包含幾個範例項目，這些項目顯示瞭如何使用訓練有素的ML模型創建庫，以及如何評估性能。

範例項目使用MLOps.csolution.yml文件以[CMSIS-Toolbox](https://github.com/Open-CMSIS-Pack/cmsis-toolbox/blob/main/docs/README.md#cmsis-toolbox)格式使用。

MLOps.csolution.yml 檔案使用下列子項目：

* ML_Model.cproject.yml 建立經過訓練的 ML 模型庫。
* ML_Test.cproject.yml 使用 ML 模型庫建立模型評估測試。它使用 AVH 與 CMSIS-View 和事件列表實用程式結合報告時間。

MLOps.csolution.yml支持幾個不同的編譯器，包括ARM編譯器6，GCC和LLVM。它定義了代表不同處理器的target-types和build-types 。

| 目標類型 | 選擇目標處理器 |
| -------- | -------- |
| +CM0 | Cortex-M0 |
| +CM0plus | Cortex-M0+ |
| +CM3 | Cortex-M3 |
| +CM4 | Cortex-M4 |
| +CM4_FP | 帶有FPU的Cortex-M4 |
| +CM7 | Cortex-M7 |
| +CM23 | Cortex-M23 |
| +CM33 | Cortex-M33 |
| +CM55 | Cortex-M55 |
| +CM85 | Cortex-M85 |
| +CM55_Ethos | 帶有Ethos-U的Cortex-M55 |
| +CM85_Ethos | 帶有Ethos-U的Cortex-M85 |

| 建構型式 | 選擇代碼優化 |
| -------- | -------- |
| .speed | 優化速度 |
| .size | 優化大小 |
| .balanced | 速度和大小平衡優化 |

這些target-type和build-type定義可以與--toolchain選項一起使用，以為不同的處理器和編譯器工具鏈創建庫。例如，以下CMSIS-Toolbox cbuild命令為Cortex-M7處理器創建庫，使用GCC工具鏈優化代碼大小：

```bash
cbuild MLOps.csolution.yml --context +CM7.size --toolchain GCC
```

範例項目顯示瞭如何使用[AVH VSI介面](https://arm-software.github.io/AVH/main/simulation/html/group__arm__vsi.html)進行音頻，SDS，視頻來運行測試過程。

CMSIS包裝模板顯示瞭如何將模型庫交付給IDE，以將ML模型整合到嵌入式項目中。該包包含源代碼模板，可以使其與應用程序程序進行整合。

### 9.3.vcpkg

您還可以使用Microsoft工具VCPKG來管理工具。有關更多詳細信息，請參見[“使用VCPKG在命令行上安裝工具”](https://learn.arm.com/learning-paths/microcontrollers/vcpkg-tool-installation/) 。

下圖顯示瞭如何使用VCPKG從ARM工具偽像管理一致的工具安裝：

圖9-2 Arm Tools Artifactory
![arm Fig9-2](https://hackmd.io/_uploads/Hk5GEFut1l.svg)

:::info
**筆記**
目前，VCPGK過程是實驗性的，因此我們建議您使用本機OS命令下載並安裝用於MLOPS系統的工具。
:::

## 10.Ethos-U的資源

原始文件：https://developer.arm.com/documentation/109267/0101/Resources-for-Ethos-U

以下資源可用於Ethos-U：

* [1.產品頁面](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#101%E7%94%A2%E5%93%81%E9%A0%81%E9%9D%A2)
* [2.產品文檔](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#102%E7%94%A2%E5%93%81%E6%96%87%E6%AA%94)
* [3.軟體和範例](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#103%E8%BB%9F%E4%BB%B6%E5%92%8C%E7%A4%BA%E4%BE%8B)
* [4.其他資源](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#104%E5%85%B6%E4%BB%96%E8%B3%87%E6%BA%90)
* [5.合作夥伴解決方案](https://hackmd.io/v98kGraHSl6WVFBPEYBQCA#105%E5%90%88%E4%BD%9C%E5%A4%A5%E4%BC%B4%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%A1%88)

### 10.1.產品頁面

以下產品頁面可用於Ethos-U：

| 產品 | 資源 |
| -------- | -------- |
| Ethos-U55 | https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u55 |
| Ethos-U55 | https://developer.arm.com/Processors/Ethos-U55 |
| Ethos-U65 | https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65 |
| Ethos-U65 | https://developer.arm.com/Processors/Ethos-U65 |

### 10.2.產品文檔

以下產品文檔可用於Ethos-U：

| 產品 | 資源 |
| -------- | -------- |
| Ethos-U55 | [技術參考手冊](https://developer.arm.com/documentation/102420/0200/?lang=en) |
| Ethos-U55 | [產品簡介](https://armkeil.blob.core.windows.net/developer/Files/pdf/ML%20on%20Arm/Arm_Ethos_U55_Product_Brief_v4.pdf) |
| Ethos-U65 | [技術參考手冊](https://developer.arm.com/documentation/102023/0000/?lang=en) |
| Ethos-U65 | [產品簡介](https://armkeil.blob.core.windows.net/developer/Files/pdf/arm-ethos-u65-product-brief-v2.pdf) |
| Ethos-U55/U65 | [Arm Ethos-U NPU應用程序開發概述](https://developer.arm.com/documentation/101888/0500/?lang=en) |

### 10.3.軟體和範例

開發Ethos-U NPU軟體的開源軟體組件和文檔：

* https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u

此外，還有以下資源可用：

* [Vela編譯器](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-vela)
* [微控制器的Tensorflow Lite](https://www.tensorflow.org/lite/microcontrollers)
* [Arm 模型動物園](https://github.com/ARM-software/ML-zoo)
* [ML推理顧問（MLIA）](https://pypi.org/project/mlia/)
* [Ethos-U ML嵌入式評估套件](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ml-embedded-evaluation-kit/)
* [使用Arm Corstone-300與ARM Cortex-M55和Arm Ethos-U55 NPU-Jupyter筆記本](https://github.com/ARM-software/ML-examples/blob/main/ethos-u-corstone-300/README.md)
* [Ethos-U核心平台](https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-core-platform/)
* [基於CMSIS的機器學習範例](https://github.com/Arm-Examples/mlek-cmsis-pack-examples)
* [CMSIS-NN](https://github.com/ARM-software/CMSIS-NN)
* [Arm理器的其他ML範例](https://github.com/ARM-software/ML-examples)
* [Learn.arm.com：使用Ethos-U處理器導航機器學習開發](https://learn.arm.com/learning-paths/microcontrollers/nav-mlek/)
* [Learn.arm.com：建立和運行ARM機器學習評估套件範例](https://learn.arm.com/learning-paths/microcontrollers/mlek/)
* [在裸機 Arm Cortex-M55 CPU，Ethos-U55 NPU和CMSIS-NN上運行TVM](https://github.com/apache/tvm/tree/main/apps/microtvm/ethosu)
    * [文檔：使用CMSIS-NN運行裸機 Arm CORTEX-M55 CPU和Ethos-U55 NPU](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_ethosu.html)
* [在部署ARM Ethos-U NPU之前，修剪和聚類的神經網路的好處](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/pruning-clustering-arm-ethos-u-npu)
* [使用Himax WE2 AI處理器啟用AI](https://armkeil.blob.core.windows.net/developer/Files/pdf/case-study/arm-himax-edge-ai-case-study.pdf)
* [案例研究 - 家庭旅行，瀕危物種激發創新的基於ARM的解決方案](https://armkeil.blob.core.windows.net/developer/Files/pdf/case-study/grovety-case-study.pdf)

### 10.4.其他資源

可用以下資源：

| 產品 | 資源 |
| -------- | -------- |
| Ethos-U55 | [Ethos-U55的技術概述（視頻）](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Technical%20Overview%20of%20Ethos-U55) |
| Ethos-U55 | [在ARM的Ethos-U55 NPU上運行機器學習（幻燈片）](https://developer.arm.com/Additional%20Resources/AITechTalk-Slides-Getting%20started%20with%20running%20ML%20on%20Arm%20Ethos-U55) |
| Cortex-M55 + Ethos-U55 | [針對基於邊緣的音頻和機器學習應用的ARM M55和U55性能優化](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Arm%20Cortex-M55%20and%20Ethos-U55%20Performance%20Optimization%20for%20Edge-based%20Audio%20and%20ML%20Applications) |
| TFLM | [TFLM低階操作](https://www.tensorflow.org/lite/microcontrollers/get_started_low_level) |
| ML模型優化 | [優化一個ML模型，以快速推斷Ethos-U microNPU](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/optimize-a-ml-model-for-inference-on-ethos-u-micronpu) |
| Vela編譯器 | [Vela編譯器：在ARM Ethos-U MicroNPU上部署NN模型的第一步](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/vela-compiler-deploy-your-nn-model-on-the-arm-ethos-u-micronpu) |
| ARM ML嵌入式評估套件 | [博客：ARM ML嵌入式評估套件](https://community.arm.com/arm-community-blogs/b/ai-and-ml-blog/posts/arm-machine-learning-embedded-evaluation-kit) |
| 將uTVM與Ethos-U一起使用 | [Tinyml Summit 2023：TVM ML框架中的ARM Ethos-U支持（視頻）](https://www.youtube.com/watch?v=u-BVSvzK3_Q) |

### 10.5.合作夥伴解決方案

可用以下資源：

| 合作夥伴 | 產品/解決方案 |
| -------- | -------- |
| Sensory | [Sensory基於Arm IP的語音技術](https://www.sensory.com/sensory-speech-technologies-on-arm-ip-cortex-m-ethos-u-micronpu/) |
| Arcturus | [使用 Ethos-U65/i.MX 93 進行節能 ML 視覺應用開發](https://www.youtube.com/watch?v=vtCluX9HmnE) |
| Nota.AL | [NOTA AI與ARM的AVH Corstone-300 Ethos-U65的合作](https://www.nota.ai/partner-arm-avhethosu65) |
| Edge Impulse | [宣布對Alif Ensemble E7開發套件的官方支持](https://www.edgeimpulse.com/blog/announcing-official-support-for-the-alif-ensemble-e7-development-kit/) |

以下空白
