MACE Micro 微控制器神经网络推理引擎基础使用指南
概述
MACE Micro 是专为微控制器(MCU)设计的轻量级神经网络推理引擎,目前主要支持 ARM Cortex-M 系列微控制器。本文将详细介绍如何在微控制器环境中使用 MACE Micro 进行神经网络模型的部署和推理。
环境准备
硬件要求
- 开发主机:推荐使用 Ubuntu 18.04/20.04 系统
- 目标设备:ARM Cortex-M 系列微控制器
软件依赖安装
在 Ubuntu 系统上执行以下命令安装必要工具链:
# 基础工具
sudo apt-get update
sudo apt-get install -y wget g++ python3 python3-pip
# ARM交叉编译工具链
sudo apt-get install -y gcc-arm-none-eabi
# Python依赖
python3 -m pip install jinja2 pyyaml sh numpy six filelock
# 安装CMake(版本需≥3.13.0)
wget https://cnbj1.fds.api.xiaomi.com/mace/third-party/cmake-3.18.3-Linux-x86_64.sh
chmod +x cmake-3.18.3-Linux-x86_64.sh && ./cmake-3.18.3-Linux-x86_64.sh --skip-license --prefix=/usr
# TensorFlow相关
python3 -m pip install -U pip
python3 -m pip install tensorflow==2.3.0
python3 -m pip install tensorflow_model_optimization
Docker环境(可选)
为简化环境配置,可以使用预配置的Docker镜像:
cd mace/docker/mace-micro-dev
docker build . -f mace-micro-dev.dockerfile --tag mace-micro-dev
cd ../../..
docker run -ti -v $(pwd):/workspace/ -w /workspace mace-micro-dev
模型转换
MACE Micro 支持将 TensorFlow 1.x 冻结模型和 TensorFlow 2.x Keras 模型转换为 C++ 代码。以 MNIST 手写数字识别模型为例:
cd mace
python3 tools/python/convert.py --config=micro/pretrained_models/keras/mnist/mnist.yml --enable_micro
模型配置文件详解
模型配置文件(YAML格式)定义了模型转换的各种参数,以下是完整示例:
library_name: mnist
target_abis: [host]
model_graph_format: file
model_data_format: file
models:
mnist_int8:
platform: keras
model_file_path: https://cnbj1.fds.api.xiaomi.com/mace/miai-models/micro/keras/mnist/mnist-int8.h5
model_sha256_checksum: 0ff90446134c41fb5e0524484cd9d7452282d3825f13b839c364a58abd0490ee
subgraphs:
- input_tensors:
- conv2d_input:0
input_shapes:
- 1,28,28,1
input_ranges:
- 0,1
output_tensors:
- quant_dense_1/Softmax:0
output_shapes:
- 1,10
validation_inputs_data:
- https://cnbj1.fds.api.xiaomi.com/mace/inputs/mnist4.npy
runtime: cpu
quantize: 1
quantize_schema: int8
micro:
backend: cmsis # 使用CMSIS_5 NN模块
数据类型配置
对于不同的量化模型,需要特别配置:
BFLOAT16模型:
data_type: bf16_fp32
INT8模型:
quantize: 1
quantize_schema: int8
quantize_range_file: range_file_path # 模型未包含量化信息时需要
构建MACE Micro库
根据模型类型选择不同的构建参数:
Float32模型:
./micro/tools/cmake/cmake-build-host.sh
BFLOAT16模型:
./micro/tools/cmake/cmake-build-host.sh -DMACE_MICRO_ENABLE_BFLOAT16=ON
INT8模型:
./micro/tools/cmake/cmake-build-host.sh -DMACE_MICRO_ENABLE_CMSIS=ON
注意:float32和bfloat16不能同时启用
使用生成的库文件
构建完成后,库文件和头文件位于build/micro/host/install
目录,可直接使用:
# 构建示例程序
g++ micro/examples/classifier/main.cc \
-DMICRO_MODEL_NAME=mnist \
-DMICRO_DATA_NAME=mnist \
-I build/micro/host/install/include/ \
-I micro/examples \
-L build/micro/host/install/lib/ \
-lmodel_mnist -lmicro \
-o mnist
# 运行MNIST示例
./mnist
代码示例解析
以下是MNIST示例的核心代码,展示了MACE Micro的基本使用流程:
#include "data/mnist.h"
#include <cstdio>
#include "micro.h" // MACE Micro头文件
namespace micro {
namespace mnist {
MaceStatus GetMicroEngineSingleton(MaceMicroEngine **engine);
} } // 命名空间
int main() {
// 1. 获取MNIST引擎实例
micro::MaceMicroEngine *micro_engine = NULL;
micro::MaceStatus status = micro::mnist::GetMicroEngineSingleton(µ_engine);
// 2. 设置输入数据
static float *input_data = data_mnist_4;
int32_t input_dims[4] = {1, 28, 28, 1};
micro_engine->RegisterInputData(0, input_data, input_dims);
// 3. 执行推理
micro_engine->Run();
// 4. 获取输出结果
float *output_buffer = NULL;
const int32_t *output_dims = NULL;
uint32_t dim_size = 0;
micro_engine->GetOutputData(0,
reinterpret_cast<void **>(&output_buffer),
&output_dims,
&dim_size);
// 打印输出
for (int32_t i = 0; i < output_dims[1]; ++i) {
printf("%d: %f\n", i, output_buffer[i]);
}
return 0;
}
性能参考
在实际部署中,一个HAR-CNN int8模型在NUCLEO-F767ZI(Cortex-M7)开发板上单次推理耗时约12ms,展示了MACE Micro在资源受限设备上的高效性能。
通过本文介绍的基础流程,开发者可以快速将训练好的神经网络模型部署到各类Cortex-M微控制器上,实现边缘设备的智能化。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考