文章目录
- 1. 写在前面
- 2. 产品简介
- 2.1 Arm 虚拟硬件镜像产品简介
- 2.2 Grove - Vision AI V2 产品简介
- 3. 实验前准备
- 4. 实验步骤
- 4.1 模型训练
- 4.2 Arm 虚拟硬件镜像上的部署测试
- 4.2.1 克隆实验代码
- 4.2.2 配置环境
- 4.2.3 应用构建与测试
- 4.2.4 部署效果对比
- 4.3 Grove - Vision AI V2 上的部署测试
- 4.3.1 配置开发环境
- 4.3.2 连接开发板
- 4.3.3 构建编译工程
- 4.3.4 生成烧录固件
- 4.3.5 查看运行结果
- 5. 实验感悟
- 6. 参考文档
本实验过程中所显示的优惠价格及费用报销等相关信息仅在【Arm AI 开发体验创造营】体验活动过程中有效,逾期无效,请根据实时价格自行购买和体验。
同时,感谢本次体验活动 Arm 导师 Liliya 对于本实验手册的共创与指导。
详见活动地址:https://marketing.csdn.net/p/a11ba7c4ee98e52253c8608a085424be
1. 写在前面
传统的嵌入式开发流程中,往往需要用到物理开发板才能进行相应的软件开发。但是,对于诸如:物理开发板运送途中、缺货或想要尝试一些新推出的处理器产品(例如:Arm® Cortex®-M55,Cortex-M85, Ethos™-U 系列 NPU 等)但市场上硬件资源较为稀缺,或需要等待较长的时间(短至几个月,长至几年)才能拿到相应的物理开发板的情况下,是否有办法在相应的处理器平台上早早地进行软件开发呢?没有新型处理器平台的开发经验,又希望规避高昂的试错成本,有没有什么好的开发方式呢?
答案自然是有的,这就是我们本期博客要给大家介绍的一个非常强大的开发工具:Arm 虚拟硬件(Arm Virtual Hardware)。Arm 虚拟硬件可以极大地助力端侧人工智能应用的开发,让传统的 AI/ML 开发者和数据科学家们都可以轻松地上手端侧嵌入式设备上的 AI 应用开发。
本项目案例正是基于此背景。在基于 Cortex-M55 处理器 IP 的芯片和物理开发板还未在市场流通时,我们首先使用 Arm 虚拟硬件中含有 Cortex-M55 处理器的参考设计系统 Corstone-300 的虚拟硬件模型完成了基于百度飞桨 PaddlePaddle 深度学习框架的图像分类应用的开发,验证了整个软件技术栈的可行性。约两年后的今天,在 seeed studio 发布的搭载 Himax 的 WiseEye2 AI 处理器芯片(内含 Cortex-M55 处理器 IP)的 Grove Vision AI Module V2 开发板大规模上市后,我们快速轻松地完成了物理开发板上图像分类应用的部署与调试。
2. 产品简介
2.1 Arm 虚拟硬件镜像产品简介
Arm 虚拟硬件(Arm Virtual Hardware)提供了一个 Ubuntu Linux 镜像,包括用于物联网、机器学习和嵌入式应用程序的 Arm 开发工具:例如,Arm 编译器、 FVP 模型和其他针对 Cortex-M 系列处理器的开发工具帮助开发者快速入门。Arm 虚拟硬件限时免费提供用于评估用途,例如,评估 CI/CD、MLOps 和 DevOps 工作流中的自动化测试工作流等。订阅访问和使用此版本的 Arm 虚拟硬件,您需同意产品最终用户许可协议中与免费测试版许可相关的条款和协议。
Arm 虚拟硬件产品的技术概览示意图如下所示。开发者也可访问 Arm 虚拟硬件产品介绍页和产品技术文档了解更多关于 Arm 虚拟硬件产品知识。
图2-1. Arm 虚拟硬件产品概览
2.2 Grove - Vision AI V2 产品简介
Grove - Vision AI 模块 V2 人工智能模块是一个基于单片机的视觉 AI 模块,由 Arm Cortex-M55 和 Ethos-U55 驱动。它支持 TensorFlow 和 PyTorch 框架,并与 Arduino IDE 兼容。通过 SenseCraft AI 算法平台,可以将训练好的 ML 模型部署到传感器上,而不需要编码。它具有标准的 CSI 接口、车载数字麦克风和 SD 卡插槽,非常适合各种嵌入式 AI 视觉项目。该模块具有以下特点:
- 强大的 AI 处理能力:搭载 WiseEye2 HX6538 处理器,配备双核 Arm Cortex-M55 和集成的 Arm Ethos-U55 神经网络单元。
- 多样化的 AI 模型支持:轻松部署 SenseCraft AI 提供的现成或自定义 AI 模型,包括 Mobilenet V1、V2、Efficientnet-lite、Yolo v5 & v8 等。支持 TensorFlow 和 PyTorch 框架。
- 丰富的外设设备:包括 PDM 麦克风、SD 卡槽、Type-C、Grove 接口等其他外设,功能更加丰富。
- 完全开源:所有代码、设计文件和原理图均可进行修改和使用。
- 更多关于该物理开发板产品介绍和使用方法,可以参考 seeed studio 的官方 wiki 文档平台。
需注意,本项目实验并不直接使用 SenseCraft AI 算法平台进行图像分类应用的开发。由于所使用的图像分类模型的框架的特殊性(基于 PaddlePaddle 深度学习框架),因此本项目将使用 Himax 公司提供的 SDK 套件对该开发板进行自定义开发,该 SDK 目前可以通过 GitHub 仓库获取和使用。
图2-2. Grove - Vision AI Module V2 开发板
3. 实验前准备
1. 订阅 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例
- 访问 Arm 虚拟硬件产品介绍网站或 Arm 公司 官网了解 Arm 虚拟硬件产品信息。微信搜索并关注 “Arm 社区” 微信公众号(二维码见文末),回复 “AVH” 和 “AI” 即可获取更全面的关于 Arm 虚拟硬件产品和 Arm AI 技术的最新资讯和技术指南博客。
- 订阅使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例,可以参考【帮助文档】 完成订阅流程。
- 登录所购买的云服务器 BCC 实例并熟悉 Arm 虚拟硬件镜像环境。
2. 购买 Grove - Vision AI V2 物理开发板
- 订购 Grove - Vision AI V2 物理开发板及相关开发调试配件(例如:CMSIS-DAP 兼容的高速仿真器、摄像头模块等)。推荐通过官方销售渠道或 seeedstudio 淘宝企业店铺购买。CMSIS-DAP 仿真器可参考文末购买链接。
- 熟悉 Grove - Vision AI V2 物理开发板的组件,安装相应驱动并根据【官方入门教程】快速测试开发板的功能,确认是否有异常。
- 了解【官方文档平台】提供的开发板的相关资源。
4. 实验步骤
本项目实验将展示一个端到端图像分类应用开发的案例。包括:从飞桨模型的训练到使用 Arm 虚拟硬件上进行部署测试,最终再将整个应用完整地部署到物理开发板 Grove - Vision AI V2上,完整地展示了如何通过 Arm 以及 Arm 的生态系统合作伙伴的解决方案来实现高效的 MLOps 工作流。
4.1 模型训练
本应用中图像分类模型的开发将使用 Arm AI 生态系统合作伙伴百度飞桨 PaddlePaddle 提供的 PaddleClas 套件来进行模型的训练。飞桨图像识别套件 PaddleClas 是飞桨为工业界和学术界所准备的一个图像识别和图像分类任务的工具集,助力使用者训练出更好的视觉模型和应用落地。更多关于如何使用 PaddleClas 套件训练自定义的模型可参考其 GitHub 仓库中的帮助文档,本文不做过多陈述。
AI Studio 是基于百度深度学习平台飞桨的人工智能学习与实训社区,提供在线编程环境、免费GPU算力、海量开源算法和开放数据,帮助开发者快速创建和部署模型。为了便于开发者快速体验本案例,作者在 AI Studio 创建了项目《基于 TVM 在 Cortex-M55 系列 MCU 上部署 PaddleClas 模型》,提供了完整的模型训练步骤。开发者可以借助 AI Studio 提供的 GPU 算力资源(每日可领取免费时长)运行本项目,进行飞桨模型训练。
需要注意的是,模型训练的过程本身即具有一定随机性,因此即使在完全相同的训练配置(同一个训练配置文件)的情况下,每次所训练出的模型在推理结果的精度上也会存在一定的差异。在下一章节中提供的代码仓库中,我们提供了两个模型 BaseMobileNetV1 和 BaseMobileNetV2 即为同一配置文件下,两次独立的训练过程获得的模型文件。借助 Arm 提供的 Arm 虚拟硬件平台,我们可以快速地在众多模型中筛选出性能效果较优的模型,并将其最终部署到物理开发板上。整个筛选过程不仅可以自动化、并行化,也节省了物理开发板上的刷机时间,降低了对物理硬件的损耗,大大地加速了端侧人工智能应用开发的流程。
4.2 Arm 虚拟硬件镜像上的部署测试
4.2.1 克隆实验代码
参考第三章中的内容登录所购买的云服务器 BCC 实例并熟悉 Arm 虚拟硬件镜像环境后,参考以下代码将实验代码克隆(下载)至 BCC 服务器实例中。
git clone https://github.com/ArmDeveloperEcosystem/Paddle-examples-for-AVH.git
cd Paddle-examples-for-AVH/
git checkout EW24
4.2.2 配置环境
-
更新 CMSIS Toolbox 工具。
sudo bash scripts/config_cmsis_toolbox.sh
-
安装项目依赖的 Python 软件包。因网络问题,安装过程若出现报错,可多次运行直至全部成功安装。
sudo bash scripts/config_tvm.sh
-
【可选】手动安装项目依赖的 CMSIS Packs 软件包。请注意,此步骤可跳过,若跳过后则在构建工程的工程中会自动安装。只是因网络环境和带宽等问题的影响,可能出现下载速度较慢的情况,耐心等待即可。若想比较快速的安装,则可以参考下面步骤进行手动安装。
cd object_classification csolution list packs object_classification.csolution.yml -m
出现提示信息可能如下所示。可以忽略前几行的 warning 提示,模型编译操作完成之后相应路径和文件会出现。
/home/ubuntu/Paddle-examples-for-AVH/object_classification/object_classification.cproject.yml:60:17 - warning csolution: path 'cls/codegen/host/src/cls_lib0.c' was not found /home/ubuntu/Paddle-examples-for-AVH/object_classification/object_classification.cproject.yml:61:17 - warning csolution: path 'cls/codegen/host/src/cls_lib1.c' was not found /home/ubuntu/Paddle-examples-for-AVH/object_classification/object_classification.cproject.yml:62:17 - warning csolution: path 'cls/runtime/src/runtime/crt/common/crt_backend_api.c' was not found /home/ubuntu/Paddle-examples-for-AVH/object_classification/object_classification.cproject.yml:16:11 - warning csolution: path 'cls/codegen/host/include' was not found /home/ubuntu/Paddle-examples-for-AVH/object_classification/object_classification.cproject.yml:17:11 - warning csolution: path 'cls/runtime/include' was not found ARM::CMSIS@5.9.0 ARM::CMSIS-DSP@1.15.0 ARM::CMSIS-NN@4.1.0 ARM::V2M_MPS3_SSE_300_BSP@1.4.0 ARM::V2M_MPS3_SSE_310_BSP@1.3.0 Keil::ARM_Compiler@1.7.2
因此我们需要安装的 CMSIS Packs 软件包即为如下 6 个。
ARM::CMSIS@5.9.0 ARM::CMSIS-DSP@1.15.0 ARM::CMSIS-NN@4.1.0 ARM::V2M_MPS3_SSE_300_BSP@1.4.0 ARM::V2M_MPS3_SSE_310_BSP@1.3.0 Keil::ARM_Compiler@1.7.2
通过 CMSIS Packs 软件包下载网址逐个手动下载,并上传至所创建的 Arm 虚拟硬件镜像中。例如:使用
scp -r ARM.CMSIS.5.9.0.pack ubuntu@ip:/home/ubuntu
命令将该软件包从主机上上传至云端的 Arm 虚拟硬件镜像中的目录/home/ubuntu
下面。然后切换至该目录下后使用cpackget add ARM.CMSIS.5.9.0.pack
命令完成安装。一个简单的安装示例如下所示:ubuntu@ip:~$ cpackget add ARM.CMSIS.5.9.0.pack I: Adding pack "ARM.CMSIS.5.9.0.pack" I: Extracting files to /home/ubuntu/packs/ARM/CMSIS/5.9.0... I: 100% |████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | (8642/8642, 8219 it/s)
参考下面命令逐个将缺失的软件包安装完毕(需先将相应的 CMSIS Packs 软件包提前下载并上传至所创建的 Arm 虚拟硬件镜像中)。
cpackget add ARM.CMSIS.5.9.0.pack cpackget add ARM.CMSIS-DSP.1.15.0.pack cpackget add ARM.CMSIS-NN.4.1.0.pack cpackget add ARM.V2M_MPS3_SSE_300_BSP.1.4.0.pack cpackget add ARM.V2M_MPS3_SSE_310_BSP.1.3.0.pack cpackget add Keil.ARM_Compiler.1.7.2.pack
4.2.3 应用构建与测试
运行以下命令我们可以测试将前一章节中训练获得的 BaseMobileNetV1 模型部署在含有 Cortex-M55 处理器的 Corstone-300 虚拟硬件 FVP 模型上的效果。需注意,若前一章节未手动安装 CMSIS Packs 软件包,第一次运行(仅第一次)此脚本可能花较长时间自动下载和安装相应的软件包,耐心等待即可。
bash run_demo.sh --model BaseMobileNetV1 --device cortex-m55
run_demo.sh
脚本中主要包括里以下几个步骤的处理(其余命令的说明请参考 run_demo.sh 脚本的注释):
line 80-112
:飞桨模型的转换与编译。line 120-124
:输入输出数据及标签预处理。line 126-138
:使用cbuild
工具构建该图像分类应用。line 141-151
:调用 Corstone-300 的 FVP 模型FVP_Corstone_SSE-300
执行所构建好的应用获取部署效果的测试结果。
具体命令如下:
其中,FVP_Corstone_SSE-300 -C cpu0.CFGDTCMSZ=15 \-C cpu0.CFGITCMSZ=15 \-C mps3_board.uart0.out_file=\"-\" \-C mps3_board.uart0.shutdown_tag=\"EXITTHESIM\" \-C mps3_board.visualisation.disable-visualisation=1 \-C mps3_board.telnetterminal0.start_telnet=0 \-C mps3_board.telnetterminal1.start_telnet=0 \-C mps3_board.telnetterminal2.start_telnet=0 \-C mps3_board.telnetterminal5.start_telnet=0 \"out/object_classification/PaddleClas$RUN_DEVICE_NAME/object_classification.axf" \--stat
-FVP_Corstone_SSE-300
即为所使用的含有 Cortex-M55 处理器平台的 FVP 模型。
-object_classification.axf
为所构建的图像分类应用的可执行文件。
---stat
指定打印运行信息。
--C
指定 FVP 模型运行的具体参数。
同样地,运行以下命令可以将前文所述的 BaseMobileNetV2 模型部署在含有 Cortex-M55 处理器的 Corstone-300 虚拟硬件 FVP 模型上。
bash run_demo.sh --model BaseMobileNetV2 --device cortex-m55
4.2.4 部署效果对比
如下图所示,经过测试结果比较,不难发现模型 BaseMobileNetV2 的推理性能优于 BaseMobileNetV1。因此,我们仅需要将 BaseMobileNetV2 模型导出并作为我们最终在物理开发板上部署的端侧图像分类模型即可。
图4-1. BaseMobileNetV1(左侧) 和 BaseMobileNetV2 (右侧)运行效果对比示意图
4.3 Grove - Vision AI V2 上的部署测试
4.3.1 配置开发环境
本实验项目在 Windows 系统环境下使用 Keil MDK μVision 集成开发环境进行开发(可参考 Himax 提供的帮助文档 How to run WE2 Keil example?)。值得一提的是,因为本项目符合 Open-CMSIS-Pack 工程标准,因此开发者也可以使用 Visual Studio Code 在 Mac,Linux,Windows 等多种环境下体验和测试本项目(参考 Arm Keil Studio Visual Studio Code Extensions User Guide 帮助指南以及 How to debug a program in VS Code using SWD Interface? 了解更多细节)。
整个开发环境的软件要求,可参考以下配置:
- Keil MDK μVision v5.38
- Python 3.9.10
- pyOCD v0.34.3
1. 安装 Keil MDK μVision:参考 µVision User’s Guide(推荐) 以及 Arm Keil Microcontroller Development Kit (MDK) Getting Started Guide 下载并安装 Keil MDK μVision 开发环境。
2. 下载并安装 WE2 系列的 CMSIS Packs 软件包:访问 CMSIS Packs 下载仓库 直接下载或访问 Himax 提供的 GitHub 仓库 下载和解压整个工具包。解压完成后,双击 Himax.WE2_DFP.1.0.0.pack 即可启动自动的软件包安装程序 Pack Installer。根据提示信息逐步操作并完成安装即可。
3. 安装 pyOCD:参考 How to install pyOCD? 进行安装。也可以直接参考以下代码:
python -m pip uninstall pyocd
python -m pip uninstall pyocd_hx
python -m pip install pyocd_hx-0.34.3.dev0+dirty-py3-none-any.whl
4.3.2 连接开发板
参考下图,将 CMSIS-DAP 兼容的高速仿真器(图示为参考文档 7 提及的猛龙仿真器)与 Grove - Vision AI V2 开发板的 SWD 接口相连。即,将仿真调试器上的 DIO 、CLK 、GND 接口分别与 Grove - Vision AI V2 开发板上的 D2 、TXD 、GND 引脚通过杜邦线(公-母头)相连。具体原理图以及 SWD 接口的调试使用说明可参考 Himax 在 GitHub 上提供的帮助文档。需注意,除了仿真器和开发板之间的连线外,还需要为开发板和仿真烧录器供电。可以考虑通过将 Type-C 线连接至主机的 USB 接口上供电,也可以额外使用合适的电源适配器等等其他方式。
图4-2. 硬件连接示意图
连接完成后,可以通过 Keil MDK μVision 集成开发环境中 Options for Target ...
(位于 Project
栏目下面)中 Debug
选项下的 Debugger Setting
设置里查看是否有相应的串口信息(Serial No.
) 来确认是否开发板已经成功连接。
4.3.3 构建编译工程
-
1. 下载示例工程:本示例工程代码位于 GitHub 仓库 主分支下。将示例代码下载后,使用 Keil MDK μVision 集成开发环境打开工程文件。需注意,我们已经提前将 Arm 虚拟硬件环境中测试出的效果较优的
BaseMobileNetV2
模型经 TVM 编译后生成的cls
软件包解压至相应的工程目录下。若开发者需要测试自己的模型,则可将 TVM 编译后生成的cls
软件压缩包从云端导出直接替换示例工程中的软件包即可(测试图片、标签等数据的处理方法也一致,可从 Arm 虚拟硬件镜像中直接导出并覆盖相应的工程目录即可)。 -
2. 编译示例工程:在 Keil MDK μVision 集成开发环境中点击本示例工程进行编译和构建。工程编译完成后,项目根目录下会出现
项目名.elf
(例如:PaddleClasDemo.elf
)文件。关于 Keil MDK μVision 的使用方法,本文不做过多赘述。开发者可自行参考 µVision User’s Guide 相关章节学习和了解。
4.3.4 生成烧录固件
- 1. 生成固件:本项目使用了 Himax 仓库中提供的固件生成工具(位于 GitHub 仓库 下的
tool.7z
压缩包)。为便于开发者体验,本文对该工具包做了一定的精简和修改并随项目工程一并提供,位于tool
目录下。- 将 4.3.3 编译中生成的
.elf
文件拷贝至工具包目录下的/tool/we2_image_gen_local_exe_release_177231/input_secboot
路径下。可选地,也可以在.elf
文件生成的目录下,运行以下命令执行拷贝操作。copy *.elf "./tool/we2_image_gen_local_exe_release_177231/input_secboot"
- 切换至
tool/we2_image_gen_local_exe_release_177231
路径。可选地,运行以下命令进行路径切换操作。cd ./tool/we2_image_gen_local_exe_release_177231
- 运行以下命令生成相应的镜像。当显示如下图所示,即提示
IMAGE GEN DONE
则说明已经成功地打包生成了相应的固件。we2_local_image_gen PaddleClasDemo.json
图4-3. 固件生成示意图
- 将 4.3.3 编译中生成的
- 2. 烧录固件:同上,本项目使用了 Himax 仓库中提供的固件烧录工具并随工程一并提供。切换到
tool/swdflash
目录下,并运行以下命令进行固件的烧录操作。当显示如下图所示,则说明已经成功地将生成的固件烧录至开发板中了。python swdflash.py --addr=0x00000 --bin=../we2_image_gen_local_exe_release_177231/output/output.img
图4-4. 烧录完成示意图
4.3.5 查看运行结果
烧录完成后,即可去掉仿真烧录器与开发板的连接,仅通过串口将开发板连接至主机上(通过 Type-C 线与主机 USB 接口相连)。在主机上打开串口工具(例如:作者使用的 Tera Term )并将串口通讯的波特率调整至 115200
保持其他选项不变,查看串口输出的结果,并将其与 Arm 虚拟硬件镜像中 Corstone-300 FVP 模型仿真的结果进行比较(图4-1)。可以看出来该结果与 Arm 虚拟硬件上的运行结果高度一致。通过代码比较,也可以轻松地发现我们虚拟硬件上运行的代码与物理开发板上运行的代码仅有非常少量的相关接口代码改动,也体现出了 Open-CMSIS-Pack 工程的优势之一。
图4-5. 运行结果示意图
5. 实验感悟
- Arm 拥有很强大的 AI 生态系统可以帮助开发者快速地在基于 Arm 的平台上开发 AI 应用。Arm 与其多元化的生态系统合作伙伴(例如:百度飞桨,Seeed Studio, Himax等)合作为开发者提供了端到端的 MLOps 的解决方案,从模型到硬件。
- Arm 虚拟硬件可以帮助我们快速地验证我们所开发的 AI 应用能否在设备资源有限的端运行起来。同时,利用 Arm 虚拟硬件上云的优势,通过撰写自动化测试脚本等方式,我们可以并行高效地完成模型的筛选,提高了整体的开发效率。
- 借助 Arm 的 Open-CMSIS-Pack 项目的软件工具和生态,我们可以快速地将 Arm 虚拟硬件上验证完成的项目在物理开发板上运行起来,极大地加速了端侧人工智能应用开发。
6. 参考文档
- Arm 虚拟硬件产品简介
- Arm 虚拟硬件帮助文档
- Arm 虚拟硬件开发者资源
- 【中文技术指南】Arm 虚拟硬件实践专题一:产品订阅指南(百度智能云版)
- 【中文技术指南】Arm 虚拟硬件实践专题二:Arm 虚拟硬件 FVP 模型入门指南
- 【中文视频直播课】加速AI开发,1小时快速入门Arm虚拟硬件
- 【可选】CMSIS-DAP 高速仿真调试器可参考购买链接:猛龙 或 树莓派调试器
- Arm 社区微信公众号