#tinyml #model #operator #compiler #inference #engine #micro-flow

无std microflow-macros

MicroFlow推理引擎的宏crate,即MicroFlow编译器

1 个不稳定版本

0.1.1 2024年2月9日

#12#tinyml


用于 microflow

MIT/Apache

1MB
23K SLoC

MicroFlow

一个用于在嵌入式系统上进行神经网络推理的Rust TinyML编译器

crates.io docs.rs github

MicroFlow是一个健壮且高效的TinyML推理引擎,旨在在嵌入式系统上部署机器学习模型。它由Matteo Carnelos在帕多瓦大学的硕士论文项目中开发,与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 crate表示,和运行时,由microflow crate表示。编译器在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支持以下运算符和激活函数

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

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

测试模型和MCU

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

  • 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

依赖项

~4MB
~83K SLoC