2 个版本
0.1.3 | 2024年5月31日 |
---|---|
0.1.2 | 2024年2月9日 |
0.1.1 |
|
#262 in 嵌入式开发
每月 25 下载
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)
贡献
欢迎贡献者。对于重大更改,请首先提交一个问题以讨论您想进行更改的内容。请确保适当更新测试。
许可证
根据您的选择,受以下任一许可证的许可
- Apache许可证2.0版(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
版权所有 © 2024, Matteo Carnelos
依赖关系
~4.5MB
~90K SLoC