【AI模型推理】MNN框架入门教程

大家好,我是 AI 轮子。在将训练好的 AI 模型应用于手机或电脑时,我们需要借助 AI 模型推理框架。当前,端侧推理框架种类繁多,常见的有 TNN、NCNN、MNN 等等。本文将聚焦于阿里的 MNN 推理框架,详细介绍其特点,并成功运行其官方 demo。在后续章节中,我将通过一个人脸识别项目,深入讲解如何将其部署到端侧设备,为大家呈现完整的实践流程 。

背景

MNN(张量计算引擎)是阿里巴巴推出的一个轻量级的深度神经网络引擎,支持深度学习的推理与训练。虽然这个框架目前同时支持深度学习的推理与训练,但是一般来说主要作为端侧设备的AI模型推理框架使用,包括个人电脑/手机/嵌入式设备。MNN框架如下图所示。

MNN Tools提供的一系列工具以支持模型推理、训练和通用计算:

  • Converter:模型转换工具,由Frontends和Graph Optimize构成。前者负责支持不同的训练框架,MNN当前支持Tensorflow(Lite)、Caffe、ONNX(PyTorch/MXNet的模型可先转为ONNX模型再转到MNN)和Torchscripts;后者通过算子融合、算子替代、布局调整等方式优化图,一般离线运行。
  • Compress: 模型压缩工具,在一定的精度误差许可下,对MNN模型进行压缩,减少模型体积,提升运行性能。
  • Express :支持带控制流的模型运行,支持调用 MNN 的算子进行自定义的计算。
  • CV :类似 OpenCV ,但核心计算功能基于 MNN 实现的图像处理算法库。
  • Train :MNN 训练模块,支持各平台训练。

目前MNN适配多种架构的硬件,主要包括如下:

  • S :支持,深度优化并已有应用场景,推荐使用
  • A :支持,有初步优化或已有应用场景,可以使用
  • B :支持,无优化或在实验状态,不推荐使用
  • C :不支持

在端侧设备使用MNN,大致可以分为三个阶段(由于我们的模型一般不在MNN上训练,因此我们实际在端侧使用MNN主要是虚线框内的部分):

  • Converter:将其他训练框架模型转换为MNN模型的阶段。MNN当前支持Tensorflow(Lite)、Caffe、ONNX和TorchScript的模型转换。
  • infer:在端侧加载MNN模型进行推理的阶段。

编译

上面我们介绍了MNN的一些基本背景知识,接下来我们就将MNN官方提供的demo来实际运行一下,由于MNN使用C++开发的,因此我们必须编译MNN(编译和运行环境都是ubuntu 22.04)。在Linux中编译MNN,对编译环境的要求如下:

  • cmake(建议使用3.10或以上版本)
  • protobuf(使用3.0或以上版本)
  • gcc(使用4.9或以上版本)

MNN 支持的 CMake参数如下:

2.1 推理引擎

由于我们只测试其简单的推理功能,因此我们只需要编译推理引擎和转换工具即可,另外将Demo编译一下即可。

  • 编译流程如下:
# 进入到MNN代码目录路径中,比如我的代码路径为 /home/ubuntu/mnn
cd /home/ubuntu/mnn
# 执行脚本
./schema/generate.sh
# 开始编译
1. mkdir build #创建文件夹
2. cd build #进入到build 文件夹
3. cmake ..
4. make -j8 #-j8代表使用的编译线程数
#或者写成:
mkdir build && cd build && cmake .. && make -j8
  • 查看编译结果:
cd /home/ubuntu/mnn/build
ls -al libMNN.so
-rwxrwxr-x 1 ubuntu ubuntu 3330736  3月 10 20:37 libMNN.so

可以看到libMNN.so已经编译成功。

2.2 模型转换工具

由于MNN需要运行MNN格式的模型,因此必须要将其他格式的模型转换成MNN格式的模型。

  • MNN模型转换工具编译流程如下:
# 进入到MNN代码目录路径中,比如我的代码路径为 /home/ubuntu/mnn
cd /home/ubuntu/mnn
# 执行脚本
./schema/generate.sh
# 开始编译
1. mkdir build #创建文件夹
2. cd build #进入到build 文件夹
3. cmake .. -DMNN_BUILD_CONVERTER=true
4. make -j8 #-j8代表使用的编译线程数
#或者写成:
mkdir build && cd build && cmake .. -DMNN_BUILD_CONVERTER=true && make -j8
  • 查看编译结果:
cd /home/ubuntu/mnn/build
ls -al MNNConvert
-rwxrwxr-x 1 ubuntu ubuntu 3330736  3月 10 20:37 MNNConvert

2.3 编译Demo

  • 姿态检测Demo(demo/exec/multiPose.cpp)程序编译流程如下:
# 进入到MNN代码目录路径中,比如我的代码路径为 /home/ubuntu/mnn
cd /home/ubuntu/mnn
# 执行脚本
./schema/generate.sh
# 开始编译
1. mkdir build #创建文件夹
2. cd build #进入到build 文件夹
3. cmake .. -DMNN_BUILD_CONVERTER=true
4. make -j8 #-j8代表使用的编译线程数
#或者写成:
mkdir build && cd build && cmake .. -DMNN_BUILD_DEMO=ON -DMNN_BUILD_CONVERTER=true && make -j8
  • 查看编译结果:
cd /home/ubuntu/mnn/build
ls -al multiPose.out
-rwxrwxr-x 1 ubuntu ubuntu 254632  3月 10 21:15 multiPose.out

3. 执行Demo

上面我们已经编译出来了推理引擎的动态库libMNN.so、模型转换工具MNNConvert和姿态检测程序multiPose.out,接下来我们下载一个姿态检测的模型

  • 模型下载

下载model-mobilenet_v1_075.pb 模型

  • 模型转换
bash
#模型转换命令如下
cd /home/ubuntu/mnn/build
./MNNConvert -f TF --modelFile model-mobilenet_v1_075.pb --MNNModel model.mnn --bizCode biz 
#转换结果
./MNNConvert -f TF --modelFile model-mobilenet_v1_075.pb --MNNModel model.mnn --bizCode biz 
CPU Group: [ 14 12 15 13 ], 800000 - 3500000
CPU Group: [ 11 8 6 4 2 0 9 10 7 5 3 1 ], 800000 - 4700000
The device supports: i8sdot:0, fp16:0, i8mm: 0, sve2: 0, sme2: 0
Start to Convert Other Model Format To MNN Model..., target version: 3.1
Start to Optimize the MNN Net...
inputTensors : [ image, ]
outputTensors: [ displacement_bwd_2, displacement_fwd_2, heatmap, offset_2, ]
Converted Success!
  • 结果测试
# 测试命令
cd /home/ubuntu/mnn/build
./multiPose.out model.mnn input.jpg pose.png
  • 检测结果:

注意:模型的格式和代码的格式需要保持一致,模型要求输入为 NHWC 格式([1, H, W, 3]),代码的格式也需要 NCHW 格式。

原文链接:,转发请注明来源!