LWN:emlearn 进行毫瓦级别的机器学习!

关注了就能看到更多这么棒的文章哦~

Milliwatt machine learning with emlearn

February 12, 2025

This article was contributed by Koen Vervloesem

FOSDEM
Gemini-1.5-flash translation
https://lwn.net/Articles/1009011/

尽管现在大型语言模型及其所需的高昂硬件设备风靡一时,人工智能的其他领域也在更加受限的硬件环境中工作。在 FOSDEM 2025 大会上,Jon Nordby 展示了他用于微控制器的开源机器学习推理引擎,名为 emlearn。该项目还拥有 MicroPython 的绑定,从而使机器学习应用程序更易于访问。

Nordby 的演讲 "Milliwatt sized Machine Learning on microcontrollers with emlearn" 是 FOSDEM 大会 Low-level AI Engineering and Hacking 开发者房间(devroom)的一部分。Nordby 是挪威公司 Soundsensing 的首席技术官(CTO)和联合创始人,该公司为其客户监控通风系统和其他技术基础设施。该公司使用机器学习来检测来自声音和振动传感器的数据中的异常情况,从而为潜在的故障提供早期预警。

微型芯片,大规模应用

在微控制器上运行机器学习的这个小众领域也被称为 TinyML,或者最近被称为 Edge AI(边缘人工智能)。它主要用于分析传感器数据。其思路是:微控制器处理来自连接的传感器的数据,运行机器学习模型来分析数据,然后从中提取有用的信息。此分析的结果可以通过网络发送,或者用于控制本地连接的电机(如果微控制器是机器人系统的一部分)。

虽然机器学习模型可以在云中更强大的硬件上运行,但 Nordby 解释说,TinyML 方法具有一些关键优势。它允许创建独立的系统,而无需网络连接。另一个好处是低延迟:通过网络将数据发送到服务器,然后检索结果会引入延迟,这在许多工业应用中应该避免。此外,将原始传感器数据发送到服务器,而不是仅仅发送有用的信息,需要更多的电力。使用 TinyML,“传感器可以在单节电池上运行多年”。此外,通过不传输所有潜在的敏感数据,TinyML 应用程序可以是“隐私兼容的”。最后,微控制器上的人工智能具有成本效益,这使得它能够大规模使用。

Nordby 指出,TinyML 已经用于许多领域,例如智能扬声器中的关键词识别,以识别“Hey Google”或“Hey Siri”等短语,以及用于监测睡眠质量的睡眠追踪器。该技术还用于跟踪动物健康,以及 Soundsensing 公司的机器健康监测。

为了让大家了解我们所说的约束是什么样的,微控制器的 CPU 能力和内存通常只有智能手机的千分之一甚至更少。RAM(随机存取存储器)可能高达 1MB,程序空间可能高达 10MB。每年出货超过 200 亿个微控制器,而且它们正变得越来越容易被业余爱好者使用。Nordby 重点介绍了 Arduino Uno、ESP32、RP2040 和 RP2350 等可用硬件平台,以及 Arduino IDE 和 MicroPython 等业余爱好者软件平台。

真实世界的用例

Nordby 在 2018 年开始了 emlearn 项目,这是他在挪威生命科学大学攻读数据科学硕士学位的一部分,并以 MIT 许可证发布了它。Emlearn 适用于机器学习研究人员的常规工作流程。他们只需使用标准的 Python 库(如 scikit-learn 或 Keras)在他们的 PC 上创建一个模型并在数据集上训练它。只有在他们训练好模型之后,Emlearn 才会发挥作用。

Emlearn 用于将训练好的模型从 Python 对象转换为 C 数据结构,并将其保存到 C 头文件中,然后可以将其包含在微控制器的代码中。此头文件具有可移植的 C99 代码,没有动态分配,并且仅使用整数或定点算术,使其适用于许多嵌入式设备和软件框架。这包括 Arduino、Zephyr 和 FreeRTOS。emlearn 生成的 C 代码也可以从其他编程语言中使用,只要它们支持 C 绑定。

并非所有来自 scikit-learn 或 Keras 的模型都受支持,但 emlearn 能够转换用于分析传感器数据的最常见任务的模型:分类、回归和异常检测。因此,emlearn 不能用于在微控制器上运行大型语言模型,但 Nordby 总结说:“你可以访问决策树、随机森林、k 近邻和一些较小的神经网络”。当然,训练好的模型必须适应微控制器的 RAM 和存储限制。

Nordby 强调说,emlearn 不仅仅是一个玩具项目:它在全球范围内有许多实际用途,并且在 至少 40 篇科学出版物中被引用。例如,Abhishek Damle 将该项目用于牛的健康监测,如他的 硕士论文 中所述。他在奶牛头部传感器上的加速度计数据上训练了一个决策树分类器。该设备使用此模型向农民发送有关动物当前活动的信息:躺卧、行走、站立、放牧或反刍。这使得农民能够检测到可能表明健康问题或其他问题的异常行为,例如,当奶牛长时间不进食时。使用 emlearn 在设备上运行分类器模型消耗的功率不到 1mW,并且 TinyML 方法使用的功率比将原始数据发送到云端进行分析少 50 倍,从而显着提高了电池寿命。

三星研究院甚至使用 emlearn 训练了一个模型,用于 使用耳塞中的运动和声音传感器 监测有呼吸系统健康问题的人。由于 TinyML 方法具有低功耗,因此“这可以用作每天佩戴的实用解决方案,而不仅仅是在临床环境中”。

去年,Nordby 接受了一项挑战,即构建一个传感器板,该传感器板能够以低于 1 美元的总组件成本运行有用的机器学习模型。他的 "1 dollar TinyML" 项目基于 Puya PY32F003 微控制器,该微控制器具有一个运行在 32MHz 的 32 位 Arm Cortex-M0 内核,带有 8KB RAM 和 64KB 闪存存储器。虽然 emlearn 通常应用于稍微强大的微控制器上,但 Nordby 成功地在这些约束条件下创造了一些有用的东西,即分析来自麦克风的音频或来自加速度计的运动。

Python 一直到底

为了使 emlearn 更易于访问,Nordby 将其移植到 MicroPython。由于许多参与机器学习的人主要了解 Python,因此他们现在可以开发 TinyML 解决方案,而无需学习 C。MicroPython 为具有 16KB RAM 或更多的微控制器实现了一个 Python 子集。我们 在 2023 年对其进行了研究,并且 Nordby 在 FOSDEM 2025 上也 发表了另一次演讲。

MicroPython 的一个吸引人的特性是,它可以通过 用 C 编写的模块 进行扩展,这些模块比纯 MicroPython 提供更高的性能。emlearn-micropython 项目提供了来自 emlearn 的各种模型,作为 一个预构建的 .mpy 模块,其中包含 多个微控制器 的本机机器代码。用户无需设置 C 工具链或 SDK,但可以使用 MicroPython 的 "mpremote mip install" 命令轻松地将模块安装到其微控制器的闪存存储器上,并将来自其训练模型的模型权重作为 CSV 文件复制到设备上。

设备上的 MicroPython 代码然后从 .mpy 文件创建 emlearn 模型,并从 CSV 文件加载模型权重。在模型准备好之后,它可以读取传感器数据、预处理数据,并运行模型以返回预测或分类。

例如,Nordby 开发了一个 自动牙刷定时器 。他将 M5Stack 的 M5StickC PLUS 2(具有 ESP32 微控制器和一个加速度计)安装到与牙刷一起的 3D 打印外壳上。通过在刷牙和其他活动时收集和标记一小时的加速度计数据,他训练了一个模型来 识别这些活动。在他的解决方案中,使用 500 行 MicroPython 代码计算设备检测到刷牙活动的时间(以秒为单位)。一旦用户完成两分钟的刷牙,设备的蜂鸣器就会播放一首歌曲。

结论

Emlearn 展示了即使在嵌入式设备的严重硬件限制下,也可以开发实用的 AI 应用程序。几千字节的 RAM、几毫瓦的功率和几美元就足以用于人类或动物活动识别等应用。即使没有 C 语言知识,由于 emlearn-micropython 的本机模块,也可以实现必要的性能。看看人们将使用 emlearn 为传感器设备构建什么应用程序将会很有趣。

[虽然我无法亲自参加 FOSDEM,但我观看了 Nordby 的演讲,因为它们在周六和周日进行了直播。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

25210bc6c309d42b13f3ef0d6801e61c.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值