NNoM简介
NNoM(Neural Network on Microcontroller)是一个专为微控制器设计的高级神经网络推理库。它的目标是帮助嵌入式开发人员更快速、更简便地将神经网络模型部署到资源受限的微控制器(MCU)平台上。
与其他底层神经网络库相比,NNoM提供了更高级别的抽象和更友好的接口,使得开发人员无需深入了解神经网络的底层细节就可以快速构建和部署模型。NNoM与Keras紧密结合,只需一行Python代码就可以将Keras模型转换为NNoM模型。
NNoM的主要特点
NNoM具有以下几个突出特点:
-
支持复杂的网络结构,如Inception、ResNet、DenseNet等。
-
用户友好的接口,类似于Keras的API风格。
-
提供多种高性能后端选择。
-
支持板载(MCU)评估工具,如运行时分析、Top-k准确率、混淆矩阵等。
-
板载预编译,避免运行时解释器带来的性能损失。
为什么选择NNoM?
近年来,神经网络模型变得越来越宽、越来越深、越来越密集。这些复杂的网络结构在提高效率和性能方面起到了重要作用,这对资源受限的MCU平台尤其重要。然而,现有的面向MCU的神经网络库大多是低级别的,这使得在MCU上部署复杂结构的模型变得非常困难。
NNoM的出现就是为了解决这个问题。它为嵌入式开发人员提供了一个轻量级、用户友好且灵活的接口,可以快速部署各种复杂的神经网络模型。使用NNoM,开发人员只需要关注输入数据和获取结果,而无需操心结构管理、内存分配等底层细节。
NNoM的使用
安装
NNoM可以作为Python包安装:
pip install git+https://github.com/majianjia/nnom@master
NNoM需要TensorFlow版本<=2.14,可以通过以下命令安装:
pip install 'tensorflow-cpu<=2.14.1'
注意:TensorFlow 2.14支持到Python 3.11,不支持Python 3.12。
模型转换
使用NNoM的一个重要步骤是将Keras模型转换为NNoM模型。这可以通过NNoM提供的generate_model()
函数轻松完成:
generate_model(model, x_test, name='weights.h')
这将生成一个包含所有模型信息的C头文件"weights.h"。
在MCU上运行
将生成的"weights.h"文件复制到MCU项目中,然后在main()
函数中调用nnom_model_create()
即可创建和编译模型:
#include "nnom.h"
#include "weights.h"
int main(void)
{
nnom_model_t *model;
model = nnom_model_create();
model_run(model);
}
NNoM的优化
NNoM支持CMSIS-NN作为后端,可以在ARM Cortex-M4/7/33/35P上获得约5倍的性能提升。NNoM会自动为每一层选择最佳的运算符。
为了获得最佳性能,建议保持通道数为4的倍数。如果不确定优化是否生效,可以使用model_stat()
函数打印每一层的性能。
NNoM的评估工具
NNoM提供了多种评估方法来可视化固定点模型的性能,包括:
- 模型结构信息(由
model_compile()
打印) - 运行时统计信息(由
model_stat()
打印) - Top-K准确率、混淆矩阵等(由
prediction_*()
API提供)
这些工具可以帮助开发人员快速评估模型在MCU上的性能,并进行针对性的优化。
结语
NNoM为嵌入式开发人员提供了一个强大而易用的工具,大大简化了将复杂神经网络部署到MCU的过程。通过提供高级抽象和丰富的评估工具,NNoM使得在资源受限的MCU上运行先进的神经网络模型成为可能。无论是对于初学者还是有经验的嵌入式开发人员,NNoM都是一个值得尝试的优秀工具。