作者:Arm 物联网事业部主任软件工程师兼技术推广工程师 Sandeep Mistry
TinyML 是机器学习 (ML) 的一个分支,专注于将 ML 模型部署到低功耗、资源受限的物联网 (IoT) 设备上。在物联网设备上部署 ML 模型有诸多好处,包括减少延迟和保护隐私性,因为所有数据都是在端侧处理。TinyML 在 2019 年引起了人们的关注,当时,Google 的 TensorFlow 团队发布了适用于微控制器的 TensorFlow Lite (TFLM) 库[1]。
最初的用例和 TFLM 示例侧重于在基于 Arm Cortex-M4[2] 的开发板(例如 Arduino Nano 33 BLE Sense[3] 和 SparkFun Edge[4])上运行量化的 8 位关键词检测[5]和人员检测[6]模型。这些示例利用 Cortex-M4 CPU 的 SMLAD[7] 指令对模型所需的乘加 (MAC) 运算执行端侧 ML 推理。
上表总结了 Arduino Nano 33 BLE Sense 上两种模型的 MAC 数量、RAM 和闪存要求以及推理延迟。
配备 Arm Ethos-U55 NPU 的现代微控制器能够运行最初为移动端应用开发的复杂模型。Ethos-U55 NPU 支持 44 个 TensorFlow Lite 算子[8]的位精确输出,并且可配置为每个周期执行 32、64、128 或 256 次 MAC 运算。本文将通过在配备 Ethos-U55 NPU 的现代微控制器上运行两个 TinyML 应用来展示 NPU 的性能优势。我们将分别在采用和不采用 Ethos-U55 NPU 的微控制器上运行应用中所使用的 ML 模型,以此对推理延迟进行基准测试。
现代物联网开发板
TinyML 应用被部署到 Seeed Studio 的 Grove Vision AI Module V2[9] 开发板上,该开发板基于 Himax WiseEye2 HX6538 微控制器并集成了 16 MB 的外部闪存。Himax WiseEye2 HX6538[10] 微控制器搭载了 Cortex-M55 CPU 和 Ethos-U55 NPU,运行频率均为 400 MHz,且带有 512 KB 紧耦合存储器 (TCM) 和 2 MB SRAM。
该开发板上有一个 15 引脚相机串行接口 (CSI),连接至 Himax WiseEye2 HX6538 MCU,可与基于 OmniVision OV5647 的相机模块一起使用。开发板上运行的应用可以从相机模块[11]实时采集分辨率为 160x120、320x240 或 640x480 像素的 RGB 图像。
将 2.8 寸的 TFT 彩色液晶屏和 3.7 伏的锂聚合物 (LiPo) 电池连接到开发板上,便能打造出一款便携式的电池供电设备。
TinyML 应用
部署到开发板上的两个基于计算机视觉的应用将会持续:
- 从相机模块采集图像。
- 完成使用 ML 模型时所需的预处理和后处理并执行 ML 推理。
- 在开发板所连接的 TFT 屏幕上显示所采集的图像和 ML 推理结果。
第一个应用将使用两个 ML 模型来检测脸上的关键特征点,第二个应用则使用 ML 模型来检测人体姿态中的关键特征点。
这两个应用都将用到 TFLM 库和 Ethos-U 自定义算子[12],以便将 ML 运算卸载到 NPU 中。应用中所用的量化 8 位 TensorFlow Lite 模型必须使用 Arm 的 vela[13] 编译器进行编译。vela 编译器将 NPU 支持的运算转换为 Ethos-U 自定义算子,使其可分派到 NPU 进行高效执行。任何不受 NPU 支持的运算都将保持原样并退回到 CPU 上运行。
在上例中,除了 pad 运算之外的所有 TensorFlow 算子都被 vela 编译器转换为在 Ethos-U55 NPU 上运行的 Ethos-U 自定义算子。未转换的 pad 算子将回调到 CPU 上运行。
Face Mesh 应用
该应用从相机模块采集 320x240 图像,然后估算人脸上的 468 个关键特征点。对于那些需要识别熟悉面孔、监测注意力、识别情绪或执行医疗诊断的用例来说,该应用可以用作特征提取层。其采用了两个 ML 模型,首先是使用 Google MediaPipe BlazeFace(短程)模型[14]来识别图像中面部的位置。检测到人脸后,继而使用 Google MediaPipe Face Mesh 模型[15]来识别图像中最大的那个人脸的 468 个关键特征点。
以下视频展示了模型在开发板上的运行情况:在使用 Ethos-U55 NPU 时,应用的运行速度略低于 11 帧/秒 (FPS)。
MediaPipe BlazeFace(短程)模型
MediaPipe BlazeFace(短程)模型需要将一张 RGB 128x128 图像作为输入,且每次推理要执行 3,100 万次 MAC 运算。利用 Katsuya Hyodo 的 PINTO_model_zoo GitHub 资源库[16],可得到 TensorFlow Lite 格式的 BlazeFace(短程)模型的 8 位量化版本。
上表总结了对 RAM 和闪存的要求,并将单独使用 Cortex-M55 CPU 与同时使用 Cortex-M55 CPU 和 Ethos-U55 NPU 所对应的推理延迟进行了比较,结果显示 Ethos-U55 NPU 将推理速度提高了 109 倍!
MediaPipe Face Mesh 模型
MediaPipe Face Mesh 模型需要将一张 RGB 192x192 的脸部裁剪图像(填充率为 25%)作为输入,且每次推理要执行 3,680 万次 MAC 运算。从 GitHub[17] 下载该模型的 16 位浮点版本,并使用 tflite2tensorflow[18] 工具将其转换为 8 位量化模型。
上表总结了对 RAM 和闪存的要求,并将单独使用 Cortex-M55 CPU 与同时使用 Cortex-M55 CPU 和 Ethos-U55 NPU 所对应的推理延迟进行了比较,结果显示 Ethos-U55 NPU 将推理速度提高了 103 倍。
Ethos-U55 的优势
将 ML 计算卸载到 Ethos-U55,可使该应用每秒执行 10 次以上的推理。如果将其部署到 Cortex-M55 CPU,在脸部可见的情况下,该应用只能每八秒执行一次推理。
姿态估计应用
该应用从相机模块采集 320x240 图像,然后为图像中检测到的每个人估计人体姿态的 17 个关键特征点。该应用可以用作那些需要检测跌倒或运动的应用的特征提取层,或作为人机界面的输入。
以下视频展示了模型在开发板上的运行情况。使用 Ethos-U55 NPU 时,应用的运行速度刚好超过 10 FPS。
该模型使用 Ultralytic YOLOv8 GitHub 资源库的 DeGirum 分支[19],通过一张 256x256 的 RGB 图像输入,导出为一个 8 位量化 TensorFlow Lite 模型。对 DeGirum 进行修改可以让导出的模型更好地针对微控制器进行优化,这是通过删除转置运算并分离模型的七个输出来实现的,旨在提高量化的准确性。该模型每次推理需要进行 7.28 亿次 MAC 运算。
上表总结了对 RAM 和闪存的要求,并将单独使用 Cortex-M55 CPU 与同时使用 Cortex-M55 CPU 和 Ethos-U55 NPU 所对应的推理延迟进行了比较,结果显示 Ethos-U55 NPU 将推理速度提高了 611 倍!将 ML 计算卸载到 Ethos-U55,可使该应用每秒执行 10 次以上的推理。如果将其部署到 Cortex-M55 CPU,该应用只能每 62 秒执行一次推理。推理延迟的缩短使得应用能够更快地对人们的动作做出反应。
结论
本文演示了为移动端应用开发的 ML 模型,它们每次推理需要进行千万到数亿次 MAC 运算,可部署到配备 Ethos-U55 NPU 的现代微控制器上。与 TFLM 库中所含的示例应用相比,这些 ML 模型对 MAC 运算、RAM 和闪存的要求更高。使用 NPU 可以让应用在一秒内执行多次推理,而如果没有 NPU,则每隔几秒或一分钟内只能执行一次推理。因此,使用 NPU 对于应用来说非常有利,使其能够运行一个或多个相比初始 tinyML 应用中所使用的模型更为复杂的 ML 模型,而且能够对周围环境做出更快的反应。
致谢
本文展示的应用离不开 Himax 团队的辛勤付出,他们将 Face Mesh 和 Yolov8n-pose 模型移植到了 Himax WiseEye2 HX6539 微控制器上。正是他们的项目成果,启发了我去开发一台带有 TFT 显示屏和可充电电池的紧凑型便携式电池供电设备。
* 本文为 Arm 原创文章,转载请留言联系获得授权并注明出处。
作者:Sandeep Mistry
文章来源:Arm社区
推荐阅读