2 个版本

0.1.3 2024年5月31日
0.1.2 2024年2月9日
0.1.1 2024年2月9日

#262 in 嵌入式开发

每月 25 下载

MIT/Apache

370KB
3.5K SLoC

MicroFlow

一个健壮且高效的TinyML推理引擎


MicroFlow 是一个健壮且高效的TinyML推理引擎,旨在在嵌入式系统上部署机器学习模型。它是由 Matteo Carnelos 在帕多瓦大学(University of Padova)的硕士论文项目中,与 Grepit AB 合作开发的。

MicroFlow 采用基于编译器的方法,其引擎结构如下

graph LR
  subgraph host[Host]
    model(Neural Network Model) --> compiler(MicroFlow Compiler)
  end
  subgraph target[Target]
    code(Generated Source Code) --- weights[(Weights)]
    code --- runtime(MicroFlow Runtime)
  end
  compiler --> code
  compiler --> weights

MicroFlow 由两个主要组件组成:编译器,由 microflow-macros 库表示,以及运行时,由 microflow 库表示。编译器在 Rust 编译器之前运行,负责解析和预处理模型。它生成必要的源代码,以在模型上启用推理。另一方面,运行时是一个旨在在目标 MCU 上运行的 [no_std] 组件。它包含算子、激活函数和量化过程的实现。

用法

MicroFlow 使用 Rust 过程宏 作为其用户界面。通过将 model 宏应用于 struct 并提供模型的路径,MicroFlow 编译器生成一个 predict() 方法。可以通过调用此方法对给定的模型进行推理。目前,MicroFlow 只支持 TensorFlow Lite 格式(.tflite)的模型。

以下是一个展示 MicroFlow 用法的最小示例

use microflow::model;

#[model("path/to/model.tflite")]
struct MyModel;

fn main() {
    let prediction = MyModel::predict(input_data);
}

示例

MicroFlow 提供的示例可以在 examples 文件夹中找到。要在目标板上运行示例,请进入示例的板目录(例如 examples/arduino-uno)并运行以下命令

cargo run --example <example-name>

否则,只需在根目录中运行上述命令即可本地运行示例。

[!注意] 对于板示例,您可能需要安装额外的工具并配置运行器,以便使示例适用于您的设置。

支持的算子

目前,MicroFlow支持以下运算符和激活函数

运算符 量化 张量类型
全连接 二维张量
二维卷积 四维张量
深度卷积 四维张量
平均池化 四维张量
重塑 Tensor2D, Tensor4D
激活函数 量化
ReLU
ReLU6
Softmax

这些运算符和激活函数涵盖了神经网络中常用的构建块,并能够实现高效推理,同时降低内存和计算需求。然而,MicroFlow的发展路线图包括实施更多运算符和激活函数的计划,以扩展支持模型的范围。

测试模型和MCU

examples文件夹中包含用于测试MicroFlow在不同MCU上的代码,包括

  • ESP32 (32位Xtensa)
  • ATSAMV71 (32位Cortex-M7F)
  • nRF52840 (32位Cortex-M4F)
  • LM3S6965 (32位Cortex-M3)
  • ATmega328 (8位AVR)

用于测试推理引擎的模型可以在models目录中找到。这些模型包括

  • 正弦预测器
  • 语音命令识别器(TinyConv)
  • 人员检测器(MobileNet v1)

贡献

欢迎贡献者。对于重大更改,请首先提交一个问题以讨论您想进行更改的内容。请确保适当更新测试。

许可证

根据您的选择,受以下任一许可证的许可

版权所有 © 2024, Matteo Carnelos

依赖关系

~4.5MB
~90K SLoC