4、开发环境搭建:安装Arm虚拟硬件、Ethos-U NPU软件库、CMSIS-NN、TensorFlow Lite for Microcontrollers及必要工具链
TinyML模型在Arm Ethos-U上的部署并非简单的“编译-烧录”过程,而是一条从模型转换、算子映射、内存规划到硬件仿真的完整工程链路。在动手编写任何推理代码之前,必须先构建一个可靠、可复现且贴近真实硬件的开发环境。本章将聚焦于四个核心组件的安装与验证:Arm虚拟硬件(AVH)、Ethos-U NPU软件库、CMSIS-NN以及TensorFlow Lite for Microcontrollers(TFLM),并串联起必要的交叉编译工具链。我们将通过一个完整的“从零到运行”的实操案例,帮助你理解这些组件如何协同工作,以及如何规避环境搭建中最常见的“坑”。
上图展示了开发环境的四层逻辑架构。最底层是Arm虚拟硬件(AVH),它模拟了包含Cortex-M55 CPU和Ethos-U55 NPU的Corstone-300子系统;中间层是运行在模拟CPU上的软件库,包括CMSIS-NN(针对Cortex-M的优化神经网络内核)、Ethos-U NPU驱动库(用于与NPU硬件交互)以及TFLM(负责解析和调度模型);最上层是主机端的交叉编译工具链,它负责将你的C/C++代码与这些库链接成可在AVH上运行的镜像。理解这个分层关系是后续所有调优工作的基础。
4.1 核心组件功能与版本匹配原则
在安装之前,必须明确每个组件的角色和它们之间的依赖关系。错误的版本组合是导致部署失败的首要原因。
- Arm虚拟硬件(AVH):提供基于Fast Models的Fixed Virtual Platform (FVP) 模拟器。它并非简单的CPU模拟器,而是完整地模拟了Arm Corstone-300物联网参考设计,包括Cortex-M55处理器、Ethos-U55 NPU、以及UART、GPIO、定时器等外设。这允许你在没有真实芯片的情况下,进行功能验证和性能预估算。
- Ethos-U NPU软件库:包含NPU的用户空间驱动(如
ethosu_driver)和底层固件。它通过内存映射的寄存器与NPU通信,负责将神经网络算子(如卷积、全连接)卸载到NPU上执行。该库必须与特定的Ethos-U硬件版本(U55或U65)严格匹配。 - CMSIS-NN:这是Arm提供的、针对Cortex-M系列处理器高度优化的神经网络内核函数库(如
arm_convolve_s8)。当某些算子无法在NPU上执行时(例如某些非对称的激活函数或自定义算子),TFLM会回退到CPU,此时CMSIS-NN能显著加速这些回退算子的执行。 - TFLM:TensorFlow Lite for Microcontrollers,一个专为微控制器设计的轻量级推理引擎。它负责加载模型、管理张量内存、调度算子。TFLM通过调用CMSIS-NN或Ethos-U驱动来执行具体的计算。
tensorflow 分支(通常名为 tflite-micro 或 ethos-u 分支),该分支集成了对Ethos-U和CMSIS-NN的调用。同时,CMSIS-NN的版本需与TFLM中的内核注册表兼容。建议直接使用Arm的 ml-embedded-evaluation-kit 仓库,它已经锁定了所有兼容版本。
4.2 安装流程与验证方法
下面以Ubuntu 20.04/22.04 LTS系统为例,给出标准化的安装步骤。整个过程建议在干净的Python虚拟环境中进行,以避免系统级依赖冲突。
- 安装基础工具链:
sudo apt update && sudo apt install -y build-essential cmake python3-pip git。确保CMake版本不低于3.20。 - 获取Arm GNU工具链:从Arm官网下载
arm-none-eabi-gcc9.3.1或更高版本,并解压至/opt目录,将bin路径加入PATH环境变量。 - 安装Arm虚拟硬件:AVH通常通过Arm的
Arm Virtual Hardware包安装。推荐使用pip install avh(如果可用)或从Arm官网下载FVP_Corstone_SSE-300安装包。安装后,运行FVP_Corstone_SSE-300_Ethos-U55 -h验证是否安装成功。 - 克隆评估套件:
git clone --recursive https://github.com/ARM-software/ML-embedded-evaluation-kit.git。该仓库包含了所有必要的子模块(TFLM、Ethos-U驱动、CMSIS-NN)。 - 配置并构建:进入仓库根目录,执行
python3 ./set_up.py进行环境配置。然后使用cmake -S . -B build -DTARGET_PLATFORM=corstone300 -DTARGET_SUBSYSTEM=sse-300生成构建文件。最后cmake --build build进行编译。
验证安装是否成功的关键指标是:能否成功编译出 .axf 文件,并能在FVP上运行一个简单的示例(如 img_class 或 kws)。运行FVP时,应能看到串口输出日志,并最终打印出推理结果。
4.3 实战案例:从零构建并运行图像分类示例
为了验证环境是否真正可用,我们以评估套件中的 img_class 用例为例,进行一次完整的闭环操作。该用例使用MobileNetV2模型对CIFAR-10数据集中的图像进行分类。
背景与约束:目标平台为Corstone-300(Cortex-M55 + Ethos-U55)。初始状态是刚克隆的仓库,尚未进行任何构建。关键约束是网络环境可能无法访问外网下载模型权重,因此需要预先下载并放置到指定目录。
操作步骤:
- 下载量化后的MobileNetV2 TFLite模型(约3.5MB),放入
resources/img_class/models/目录。 - 执行
cmake --build build --target img_class编译该示例。 - 运行FVP命令:
FVP_Corstone_SSE-300_Ethos-U55 -a build/img_class.axf -C mps3_board.uart0.out_file="-"。 - 观察输出日志,应看到类似
Image classification: 3 (bird)的结果。
结果对比与复盘:如果编译失败,90%的原因是子模块未正确同步(git submodule update --init --recursive)或CMake缓存未清理。如果运行失败,检查FVP的版本是否与Corstone-300匹配。通过此案例,我们验证了工具链、库和虚拟硬件之间的正确协作关系。
4.4 环境验证清单与性能基线
环境搭建完成后,建议建立一份验证清单,并记录初始性能基线,以便后续调优时对比。
| 验证项 | 命令/方法 | 预期结果 |
|---|---|---|
| 交叉编译器版本 | arm-none-eabi-gcc --version |
显示 9.3.1 或更高版本 |
| FVP版本 | FVP_Corstone_SSE-300_Ethos-U55 --version |
显示 11.x 或更高版本 |
| NPU驱动编译 | 检查 build 目录下是否生成 libethosu_driver.a |
文件存在且非空 |
| CMSIS-NN编译 | 检查 build 目录下是否生成 libcmsis_nn.a |
文件存在且非空 |
| 端到端推理 | 运行 img_class 用例 |
输出正确的分类结果,且无错误日志 |
记录基线数据时,重点关注FVP日志中的 Cycle Count 和 Inference Time (us)。例如,在默认配置下,MobileNetV2在Ethos-U55上的推理周期数约为 2,500,000 周期(约 25ms @100MHz)。这个数据将作为后续优化效果的基准。