4、开发环境搭建:配置Arm虚拟硬件(AVH)、安装Arm Compiler for Embedded、CMSIS、Vela编译器及必要的Python工具链
姿态识别模型在Arm Ethos-U NPU上的部署,并非简单的“编译-烧录”过程,而是一条涉及模型转换、算子优化、硬件仿真与固件编译的复杂链路。在动手编写任何代码之前,搭建一个可靠、版本匹配且可复现的开发环境,是整个项目成功的地基。本章将聚焦于四个核心组件的配置:Arm虚拟硬件(AVH)、Arm Compiler for Embedded、CMSIS软件包以及Vela编译器,并串联起必要的Python工具链。我们将从工具链的协作关系出发,逐步深入到每个组件的安装验证与实战排错,帮助你构建一个“开箱即用”的NPU部署工作台。
上图展示了整个工具链的协作逻辑:主机开发环境负责模型转换与编译,Arm虚拟硬件提供无硬件条件下的目标平台仿真,Arm Compiler for Embedded则负责将C/C++应用代码与NPU驱动编译链接为可在AVH上运行的镜像。理解这条数据流与工具链的边界,是避免后续“模型跑不通”或“编译报错”的关键前提。
4.1 核心原理:为何需要“虚拟硬件+交叉编译”的组合
姿态识别模型通常运行在资源受限的MCU上,例如Arm Cortex-M55搭配Ethos-U55 NPU。在开发初期,硬件可能尚未就绪,或者调试物理设备效率低下。Arm虚拟硬件(AVH)通过Fast Models技术,在x86主机上模拟出完整的Cortex-M55+Ethos-U55系统,包括中断控制器、定时器、UART等外设。这使得开发者可以在没有实体芯片的情况下,先行验证NPU推理的正确性、测量周期数,甚至运行RTOS。
然而,AVH模拟的是Arm指令集,无法直接运行x86编译的二进制。因此,必须使用Arm Compiler for Embedded (armclang)进行交叉编译。该编译器基于LLVM架构,针对Cortex-M系列进行了深度优化,能够生成高密度、低延迟的机器码。同时,CMSIS(Cortex Microcontroller Software Interface Standard)提供了标准化的软件接口,包括DSP库、NN库以及Ethos-U NPU的底层驱动(ethosu_driver.c),确保应用层代码可以统一调用NPU硬件抽象层。
4.2 操作流程:分步安装与配置
以下安装流程基于Ubuntu 20.04/22.04 LTS x86_64环境,这是Arm官方支持最完善的宿主系统。请确保拥有sudo权限,并保持网络畅通。
步骤1:安装Python工具链与虚拟环境
# 更新系统包索引
sudo apt update && sudo apt upgrade -y
# 安装Python3、pip及venv
sudo apt install -y python3 python3-pip python3-venv
# 创建并激活虚拟环境(强烈推荐,避免污染系统Python)
mkdir -p ~/arm_ws && cd ~/arm_ws
python3 -m venv .venv
source .venv/bin/activate
# 升级pip并安装基础依赖
pip install --upgrade pip wheel setuptools
pip install numpy pyyaml requests
虚拟环境是隔离项目依赖的最佳实践。后续安装的Vela、CMSIS工具都将安装在此环境中,便于版本管理和清理。
步骤2:安装Vela编译器
# 在虚拟环境中安装Vela(版本需与Ethos-U55驱动匹配,此处以3.9.0为例)
pip install ethos-u-vela==3.9.0
# 验证安装
vela --version
Vela的版本选择至关重要。不同版本的Vela生成的二进制格式可能与CMSIS驱动存在兼容性差异。建议查阅Arm官方文档,确认Vela版本与CMSIS-Pack版本的对应关系。
步骤3:安装Arm Compiler for Embedded (AC6)
Arm Compiler不提供apt源,需要从Arm官网下载。此处以6.19版本为例:
# 下载(需登录Arm账号,此处假设已下载至~/Downloads)
cd ~/Downloads
chmod +x ArmCompilerforEmbedded6.19.sh
sudo ./ArmCompilerforEmbedded6.19.sh --quiet
# 设置环境变量(建议写入~/.bashrc)
export ARM_COMPILER_PATH=/opt/ARMCompiler6.19
export PATH=$PATH:$ARM_COMPILER_PATH/bin
# 验证
armclang --version
armlm activate --server或armlm activate --community激活。若未激活,编译时会报“License check failed”错误。
步骤4:获取CMSIS与Ethos-U驱动
# 使用git克隆CMSIS v5.9.0(包含Ethos-U驱动)
cd ~/arm_ws
git clone --depth 1 -b v5.9.0 https://github.com/ARM-software/CMSIS_5.git
# 或者通过CMSIS-Pack方式(推荐用于Keil MDK用户)
# 此处以源码方式为例,便于Makefile集成
export CMSIS_PATH=~/arm_ws/CMSIS_5
CMSIS目录结构中的Device/ARM/ARMCM55包含了启动文件与系统初始化代码,而Driver/Driver_ETHOSU.c则是NPU驱动实现。确保这些文件在编译器的包含路径中。
步骤5:安装Arm虚拟硬件(AVH)
# AVH基于Fast Models,需要从Arm官网下载安装包
# 下载后解压并运行安装脚本
tar -xzf ArmVirtModels-11.22.tgz
cd ArmVirtModels-11.22
./install.sh --install-dir ~/arm_ws/avh
# 设置环境变量
export AVH_PATH=~/arm_ws/avh
export PATH=$PATH:$AVH_PATH/bin
# 验证FVP模型是否存在
ls $AVH_PATH/bin/FVP_Corstone_SSE-300_Ethos-U55
AVH的安装包较大(约2GB),且依赖libsdl2等图形库。若在无头服务器上运行,可添加--disable-gui参数,仅使用命令行调试接口。
4.3 案例拆解:从零构建一个可运行的姿态识别工程
为了验证环境配置的正确性,我们以一个简化的姿态识别分类器(例如识别“站立/坐下/行走”三分类)为例,走通全流程。
| 阶段 | 输入 | 工具 | 输出 | 验证指标 |
|---|---|---|---|---|
| 模型转换 | 姿态分类.tflite (INT8) | Vela | 姿态分类_vela.tflite | 无算子不支持警告 |
| 应用编译 | main.c + ethosu_driver.c | armclang | app.axf | 编译0错误0警告 |
| 虚拟硬件运行 | app.axf + 测试输入 | FVP_Corstone_SSE-300 | 串口日志输出分类结果 | 推理结果与TensorFlow一致 |
关键操作细节:
- Vela转换命令:
vela 姿态分类.tflite --config=ethos-u55.yml --output-dir=./output。其中ethos-u55.yml需根据NPU配置(如MAC周期)调整。 - 编译链接脚本:使用
armclang -mcpu=cortex-m55 -mthumb -O3 -I$CMSIS_PATH/Device/ARM/ARMCM55/Include -I$CMSIS_PATH/Include -c main.c,最后通过armlink链接启动文件与库。 - AVH运行:
FVP_Corstone_SSE-300_Ethos-U55 -a app.axf -C mps3_board.uart0.out_file="-",将串口输出重定向到终端。
在实测中,我们曾遇到Vela转换后模型精度下降的问题。排查发现,原始模型是FP32,而Vela默认要求INT8量化输入。通过添加--quantize参数并重新训练量化模型,问题得以解决。这提醒我们:Vela不是万能的,它只优化算子布局,不负责量化。
4.4 常见误区与总结复盘
git tag锁定版本。
env_setup.sh脚本,将上述所有环境变量导出命令固化。同时,使用pip freeze > requirements.txt记录Python依赖版本。当团队协作或更换机器时,只需执行脚本即可复现环境。
最后,验证环境是否就绪的“金标准”是:能否成功编译并运行CMSIS自带的示例工程。在$CMSIS_PATH/Device/ARM/ARMCM55/Source目录下,有预编译的启动文件和简单的blinky示例。如果该示例能在AVH上点亮虚拟LED,则说明工具链、CMSIS和AVH三者已正确打通,可以正式进入姿态识别模型的部署开发。