1 个不稳定版本
0.1.1 | 2024年2月9日 |
---|
#12 在 #tinyml
用于 microflow
1MB
23K SLoC
MicroFlow
一个用于在嵌入式系统上进行神经网络推理的Rust TinyML编译器
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)
贡献
欢迎贡献者。对于重大更改,请首先提交一个问题来讨论您想要更改的内容。请确保根据需要更新测试。
许可证
根据您的选择,许可如下
- Apache许可证2.0版本(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
版权所有 © 2024, Matteo Carnelos
依赖项
~4MB
~83K SLoC