TinyEngine
这是 TinyEngine 的官方实现,TinyEngine 是一个面向微控制器的内存高效且高性能的神经网络库。 TinyEngine 是 MCUNet 的一部分,MCUNet 还包括 TinyNAS。MCUNet 是一个针对微控制器上的微型深度学习的系统-算法协同设计框架。TinyEngine 和 TinyNAS 经过协同设计,以适应有限的内存预算。
MCUNet 和 TinyNAS 的代码库在这里。
TinyML 项目网站 | MCUNetV1 | MCUNetV2 | MCUNetV3
演示(推理)
演示(训练)
新闻
如果您有兴趣获取更新,请在这里注册以接收通知!
- (2024年3月) 我们发布了在256KB内存下进行设备上训练的新演示视频。
- (2023年10月) 微型机器学习:进展与未来[特写]发表在IEEE CAS杂志上。
- (2023年2月) 我们现在支持在没有Arducam的情况下运行推理教程。欢迎尝试!
- (2023年2月) 我们发布了在OpenMV Cam H7上运行的人员检测演示、口罩检测演示和设备上训练演示的源代码。
- (2022年12月) 我们使用新版本的推理库更新了在STM32H743上的测量结果。
- (2022年12月) 我们发布了基于补丁的推理源代码,并更新了推理演示教程,为视觉唤醒词(VWW)演示提供了生成基于补丁的推理代码的选项。
- (2022年11月) 我们发布了Tiny Training Engine的源代码,并包含了训练演示教程,用于在微控制器上训练视觉唤醒词(VWW)模型。
- (2022年11月) 我们在这个代码库中发布了MCUNetV3算法和编译部分的源代码。请查看!
- (2022年10月) 我们的新工作在256KB内存下进行设备上训练在MIT主页上被重点介绍!
- (2022年9月) 我们的新工作在256KB内存下进行设备上训练被NeurIPS 2022接收!它为物联网设备实现了微型设备上训练。
- (2022年8月) 我们的TinyML和高效深度学习新课程将于2022年9月发布:efficientml.ai。
- (2022年8月) 我们包含了推理演示教程,用于将视觉唤醒词(VWW)模型部署到微控制器上。
- (2022年8月) 我们开源了TinyEngine代码库。
- (2022年7月) 我们在MCUNet代码库中包含了上面视频演示中使用的人员检测模型。
- (2022年6月) 我们将MCUNet代码库重构为一个独立的代码库(之前的代码库:https://github.com/mit-han-lab/tinyml)
- (2021年10月) MCUNetV2被NeurIPS 2021接收:https://arxiv.org/abs/2110.15352 !
- (2020年10月) MCUNet被NeurIPS 2020接收为聚焦论文:https://arxiv.org/abs/2007.10319 !
- 我们的项目被以下媒体报道:MIT聚焦新闻(v3)、MIT新闻(v2)、MIT新闻(v1)、WIRED、Morning Brew、Stacey on IoT、Analytics Insight、Techable等。
概述
微控制器是低成本、低功耗的硬件。它们被广泛部署并有广泛的应用,但有限的内存预算(比GPU小50,000倍)使得深度学习部署变得困难。 MCUNet是一个用于微控制器上微型深度学习的系统-算法协同设计框架。它由TinyNAS和TinyEngine组成。它们经过协同设计以适应严格的内存预算。通过系统-算法协同设计,我们可以在相同的微小内存预算下显著提高深度学习性能。
TinyEngine是一个内存高效的推理库。TinyEngine根据整体网络拓扑而不是逐层优化来调整内存调度,从而减少内存使用并加速推理。它的性能优于现有的推理库,如谷歌的TF-Lite Micro、Arm的CMSIS-NN和意法半导体的X-CUBE-AI。
TinyEngine采用以下优化技术来加速推理速度并最小化内存占用:
- 原位深度卷积:一种独特的数据放置技术,通过中间/输出数据覆盖输入数据来减少峰值SRAM内存。
- 基于块的推理:一种通用的块推理调度方法,仅在特征图的小空间区域上操作,显著减少峰值内存。
- 算子融合:通过将一个算子合并到另一个算子中来提高性能,使它们一起执行而无需往返内存。
- SIMD编程:一种同时对多个数据点执行相同操作的计算方法。
- HWC到CHW权重格式转换:一种提高原位深度卷积缓存命中率的权重格式转换技术。
- 图像列化卷积:使用通用矩阵乘法(GEMM)运算计算卷积运算的实现技术。
- 循环重排序:一种尝试通过重新排序/交换循环序列来优化程序执行速度的循环转换技术。
- 循环展开:一种尝试以二进制大小为代价优化程序执行速度的循环转换技术,这是一种称为空间-时间权衡的方法。
- 循环平铺:一种尝试通过将循环的迭代空间划分为更小的块来减少内存访问延迟的循环转换技术,以确保在循环中使用的数据在重用之前保持在缓存中。
通过采用上述优化技术,TinyEngine不仅可以提高推理速度,还可以减少峰值内存。
总之,我们的TinyEngine推理引擎可以成为基于MCU的AI应用的有用基础设施。与现有库如TF-Lite Micro、CMSIS-NN、X-CUBE-AI等相比,它显著提高了推理速度并减少了内存使用。它将推理速度提高了1.1-18.6倍,并将峰值内存减少了1.3-3.6倍。
基于块的推理节省内存: 我们可以通过使用基于块的推理来大幅减少CNN内存密集阶段的推理峰值内存。
对于MobileNetV2,使用基于块的推理可以将峰值内存减少8倍。
通过基于块的推理,TinyEngine在相同的内存预算下实现了更高的准确率。
代码结构
code_generator包含一个用于将神经网络编译成低级源代码(C/C++)的Python库。
TinyEngine包含一个在微控制器上实现算子和执行推理的C/C++库。
examples包含将TFLite模型转换为我们的TinyEngine模型的示例。
tutorial包含将视觉唤醒词(VWW)模型部署到微控制器上的演示教程(推理和训练)。
assets包含杂项资源。
要求
- Python 3.6+
- STM32CubeIDE 1.5+
用户设置
首先,克隆此存储库:
git clone --recursive https://github.com/mit-han-lab/tinyengine.git
(可选)建议使用conda创建虚拟环境。
conda create -n tinyengine python=3.6 pip
conda activate tinyengine
安装依赖项:
pip install -r requirements.txt
开发者设置
安装 pre-commit hooks 以自动格式化代码更改。
pre-commit install
部署示例
请参阅教程了解如何使用 TinyEngine 将视觉唤醒词 (VWW) 模型部署到微控制器上。我们在教程中包含了推理演示和训练演示,请查看!
测量结果
- 所有 tflite 模型均来自 MCUNet 仓库中的模型库。请查看 MCUNet 仓库了解如何构建 TF-Lite 格式的预训练 int8 量化模型。
- 所有延迟、峰值内存(SRAM)和闪存使用量结果都是在 STM32H743 上进行分析的,峰值内存限制为 512 KB,存储限制为 2 MB。
- 请注意,我们在本仓库中测量了较新版本的库,因此本仓库中的结果可能与 MCUNet 论文中的结果不同。
- 对于每个推理库,我们使用 git commit ID 来指示版本。
- 所有 tflite 模型均在 STM32CubeIDE 中使用
-Ofast
优化级别编译。 - OOM 表示内存不足。
- X-Cube-AI v7.3.0 的测量是在默认的平衡模式编译设置下进行的。
延迟结果:
网络 ID | TF-Lite Micro @ 713b6ed | CMSIS-NN @ 011bf32 | X-CUBE-AI v7.3.0 | TinyEngine @ 0363956 |
---|---|---|---|---|
# mcunet 模型 (VWW) | ||||
mcunet-vww0 | 587ms | 53ms | 32ms | 27ms |
mcunet-vww1 | 1120ms | 97ms | 57ms | 51ms |
mcunet-vww2 | 5310ms | 478ms | 269ms | 234ms |
# mcunet 模型 (ImageNet) | ||||
mcunet-in0 | 586ms | 51ms | 35ms | 25ms |
mcunet-in1 | 1227ms | 103ms | 63ms | 56ms |
mcunet-in2 | 6463ms | 642ms | 351ms | 280ms |
mcunet-in3 | 7821ms | 770ms | 414ms | 336ms |
mcunet-in4 | OOM | OOM | 516ms | 463ms |
# 基线模型 | ||||
proxyless-w0.3-r64 | 512ms | 54kB | 35kB | 23kB |
proxyless-w0.3-r176 | 3801ms | 380ms | 205ms | 176ms |
mbv2-w0.3-r64 | 467ms | 43ms | 29ms | 23ms |
峰值内存 (SRAM) 结果:
net_id | TF-Lite Micro @ 713b6ed | CMSIS-NN @ 011bf32 | X-CUBE-AI v7.3.0 | TinyEngine @ 0363956 |
---|---|---|---|---|
# mcunet模型 (VWW) | ||||
mcunet-vww0 | 163kB | 163kB | 88kB | 59kB |
mcunet-vww1 | 220kB | 220kB | 113kB | 92kB |
mcunet-vww2 | 385kB | 390kB | 201kB | 174kB |
# mcunet模型 (ImageNet) | ||||
mcunet-in0 | 161kB | 161kB | 69kB | 49kB |
mcunet-in1 | 219kB | 219kB | 106kB | 96kB |
mcunet-in2 | 460kB | 469kB | 238kB | 215kB |
mcunet-in3 | 493kB | 493kB | 243kB | 260kB |
mcunet-in4 | OOM | OOM | 342kB | 416kB |
# 基准模型 | ||||
proxyless-w0.3-r64 | 128kB | 136kB | 97kB | 35kB |
proxyless-w0.3-r176 | 453kB | 453kB | 221kB | 259kB |
mbv2-w0.3-r64 | 173kB | 173kB | 88kB | 61kB |
闪存使用量结果:
net_id | TF-Lite Micro @ 713b6ed | CMSIS-NN @ 011bf32 | X-CUBE-AI v7.3.0 | TinyEngine @ 0363956 |
---|---|---|---|---|
# mcunet模型 (VWW) | ||||
mcunet-vww0 | 627kB | 646kB | 463kB | 453kB |
mcunet-vww1 | 718kB | 736kB | 534kB | 521kB |
mcunet-vww2 | 1016kB | 1034kB | 774kB | 741kB |
# mcunet模型 (ImageNet) | ||||
mcunet-in0 | 1072kB | 1090kB | 856kB | 842kB |
mcunet-in1 | 937kB | 956kB | 737kB | 727kB |
mcunet-in2 | 1084kB | 1102kB | 849kB | 830kB |
mcunet-in3 | 1091kB | 1106kB | 867kB | 835kB |
mcunet-in4 | OOM | OOM | 1843kB | 1825kB |
# 基准模型 | ||||
proxyless-w0.3-r64 | 1065kB | 1084kB | 865kB | 777kB |
proxyless-w0.3-r176 | 1065kB | 1084kB | 865kB | 779kB |
mbv2-w0.3-r64 | 940kB | 959kB | 768kB | 690kB |
引用
如果您觉得本项目有帮助,请考虑引用我们的论文:
@article{
lin2020mcunet,
title={Mcunet: Tiny deep learning on iot devices},
author={Lin, Ji and Chen, Wei-Ming and Lin, Yujun and Gan, Chuang and Han, Song},
journal={Advances in Neural Information Processing Systems},
volume={33},
year={2020}
}
@inproceedings{
lin2021mcunetv2,
title={MCUNetV2: Memory-Efficient Patch-based Inference for Tiny Deep Learning},
author={Lin, Ji and Chen, Wei-Ming and Cai, Han and Gan, Chuang and Han, Song},
booktitle={Annual Conference on Neural Information Processing Systems (NeurIPS)},
year={2021}
}
@article{
lin2022ondevice,
title = {On-Device Training Under 256KB Memory},
author = {Lin, Ji and Zhu, Ligeng and Chen, Wei-Ming and Wang, Wei-Chen and Gan, Chuang and Han, Song},
booktitle={Annual Conference on Neural Information Processing Systems (NeurIPS)},
year = {2022}
}
相关项目
MCUNet:物联网设备上的微型深度学习(NeurIPS'20)
MCUNetV2:面向微型深度学习的内存高效块状推理(NeurIPS'21)
MCUNetV3:256KB内存下的设备端训练(NeurIPS'22)