在物联网设备和嵌入式系统逐渐普及的今天,TinyML 作为一种新兴的机器学习技术,越来越受到研究者和开发者的关注。TinyML 旨在将智能模型部署到资源受限的嵌入式设备中,从而在本地进行推理和计算,减少对云计算资源的依赖。这种本地化的计算方式不仅减少了延迟,还增强了数据隐私保护,使其在智能家居、医疗设备和工业自动化等领域拥有巨大的应用潜力。然而,由于嵌入式设备的计算能力和内存资源极为有限,传统的机器学习推理引擎往往无法满足需求,因此开发适用于资源受限环境的高效推理引擎成为了关键课题。
日前,由 Matteo Carnelos 等人提出的新型 TinyML 推理引擎——MicroFlow。这款基于 Rust 编程语言的推理引擎在实现内存安全的同时,采用了编译器优化技术,极大地提升了推理效率。我们将从 MicroFlow 的设计目标、架构特点、与现有解决方案的对比,以及它在实际应用中的表现等方面进行详细探讨。(https://github.com/matteocarnelos/microflow-rs)
MicroFlow 的设计目标与架构
MicroFlow 的主要设计目标是为资源受限的嵌入式设备提供一种轻量、高效且安全的 TinyML 推理解决方案。为了实现这些目标,MicroFlow 采用了 Rust 作为编程语言,这为推理引擎带来了内存安全的特性。Rust 通过所有权和借用机制在编译期确保内存的正确管理,有效避免了如空指针解引用、缓冲区溢出等常见的内存问题,使得 MicroFlow 特别适用于对稳定性和安全性要求较高的关键环境。
在架构设计上,MicroFlow 采用了编译器驱动的推理引擎,而非传统的解释器驱动方法。具体来说,MicroFlow 的编译器在编译期间解析和优化神经网络模型,将推理所需的代码嵌入到固件中。这种方法有别于解释器需要在运行时动态解析模型,显著减少了推理过程中的内存开销和计算负担。此外,MicroFlow 的推理引擎在运行时仅执行核心推理任务,避免了不必要的动态内存分配,从而提高了整体效率。
Rust 编程语言的优势
传统的嵌入式推理引擎通常使用 C 或 C++ 编写,这些语言虽然能够提供对硬件资源的低级控制,但缺乏内存安全机制,极易导致内存泄漏、缓冲区溢出等问题。而这些问题在资源受限的嵌入式设备上尤为致命,因为这些设备通常没有操作系统提供的保护机制。因此,MicroFlow 选择使用 Rust 编写,该语言通过严格的内存管理机制提供了内存安全性,并且无需像垃圾回收(GC)那样的额外开销。
Rust 的所有权机制是其实现内存安全的重要特性。在 Rust 中,每个值都有一个明确的所有者,且在所有者超出作用域时,内存会被自动释放,这样就避免了手动管理内存的复杂性。此外,Rust 还通过不可变和可变借用的限制,确保在同一时间要么有多个不可变借用,要么只有一个可变借用,防止了数据竞争和内存损坏的风险。这些特性使得 Rust 成为开发高可靠性嵌入式软件的理想选择。
编译器驱动的推理架构
MicroFlow的编译器在主机上运行,并对神经网络模型进行解析和静态优化。模型的解析过程涉及使用FlatBuffers反序列化工具对TensorFlow Lite格式的模型进行解析,并生成相应的内存结构和代码。这种静态编译的方式确保了所有的内存分配在编译期就已确定,避免了运行时的动态分配,从而提升了推理过程的稳定性和效率。在推理过程中,MicroFlow 的运行时模块会加载编译生成的代码并执行神经网络的推理任务。由于模型的所有信息(如操作符、权重等)都已经在编译期解析并嵌入代码,MicroFlow 的运行时几乎没有额外的内存开销,这使得它能够在只有 2kB RAM 的 8 位微控制器上成功运行。此外,MicroFlow 引入了一种基于分页的方法来管理内存,允许神经网络的部分内容按需加载到 RAM 中,从而在内存极为有限的设备上实现大型模型的推理。
MicroFlow 与现有方案的对比
当前市场上已经有一些成熟的 TinyML 推理引擎,例如 Google 的 TensorFlow Lite for Microcontrollers(TFLM)、Microsoft 的 Embedded Learning Library(ELL)等。然而,这些引擎大多基于解释器,并且通常为 32 位架构设计,无法在更为受限的硬件平台上有效运行。此外,大多数现有方案使用 C 或 C++ 语言开发,缺乏内存安全机制。
与这些方案相比,MicroFlow 具备显著的优势。首先,MicroFlow 使用 Rust 编写,提供内存安全保障,特别适用于对安全性要求高的关键环境。其次,MicroFlow 采用编译器驱动的架构,使得推理代码在运行时不需要额外的解析步骤,从而减少了内存占用和推理延迟。实验结果表明,MicroFlow 在中小型神经网络上的推理速度明显快于 TFLM,并且在 RAM 和 Flash 的占用上也更加高效。例如,在 ESP32 微控制器上,MicroFlow 的内存占用比 TFLM 减少了 65% 以上。
此外,MicroFlow 采用模块化的设计,代码完全开源并可在 GitHub 上获得。这种开放性不仅促进了嵌入式和物联网社区的广泛使用和改进,也为未来的优化和新功能的集成提供了可能。
实验与应用表现
为了验证 MicroFlow 的性能,作者进行了多项实验,使用了三种不同复杂度的模型,包括简单的正弦预测器、语音命令识别器和人脸检测器。实验结果显示,MicroFlow 的推理速度在小型模型上大约是 TFLM 的十倍,而对于更复杂的模型,如基于 MobileNet 的人脸检测器,MicroFlow 的推理时间也保持在一个可接受的范围内,仅比 TFLM 慢 6% 左右。这表明,MicroFlow 在处理大量卷积操作时,性能差距会逐渐缩小。
在内存使用方面,MicroFlow 相比 TFLM 显著减少了 RAM 和 Flash 的占用。在实验中,MicroFlow 能够成功运行在只有 2kB RAM 的 ATmega328 微控制器上,而 TFLM 则由于内存需求过高而无法运行。此外,由于 MicroFlow 的编译器在编译期对模型进行预处理,许多常量计算被提前完成,从而减少了运行时的计算负担。
在能源消耗方面,MicroFlow 的表现也优于 TFLM。由于推理时间的减少,MicroFlow 的平均能耗显著降低,非常适合需要长时间低功耗运行的嵌入式设备应用,例如环境监测传感器和可穿戴设备。
结语
MicroFlow 作为一款基于 Rust 的轻量级 TinyML 推理引擎,凭借其内存安全性、高效的编译器优化和极低的内存占用,为资源受限的嵌入式设备提供了可靠的推理解决方案。它在与现有解决方案的对比中展现出了显著的性能优势,特别是在小型模型的推理速度和内存管理方面。未来,MicroFlow 可以进一步扩展其支持的神经网络操作符类型,并优化卷积操作,以提升在大型模型中的推理性能。此外,随着 Rust 生态系统的不断成熟,更多针对嵌入式开发的工具和库也将进一步促进 MicroFlow 的改进。原文链接:https://www.eeworld.com.cn/qrs/eic680592.html