当前位置: 首页 > 软件库 > 神经网络/人工智能 > >

MNN

深度神经网络推理引擎
授权协议 Apache
开发语言 C/C++
所属分类 神经网络/人工智能
软件类型 开源软件
地区 国产
投 递 者 白弘伟
操作系统 跨平台
开源组织 阿里巴巴
适用人群 未知
 软件概览

MNN 是一个高效、轻量的深度学习框架。它支持深度模型推理与训练,尤其在端侧的推理与训练性能在业界处于领先地位。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷、钉钉、闲鱼等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等70多个场景。此外,IoT等场景下也有若干应用。

MNN的架构设计理念与性能数据在MLSys 2020上面发表。Paper 在此处。如果MNN对你的研究有所助益,欢迎引用MNN的论文:

整体特点

轻量性

  • 针对端侧设备特点深度定制和裁剪,无任何依赖,可以方便地部署到移动设备和各种嵌入式设备中。
  • iOS平台:armv7+arm64静态库大小5MB左右,链接生成可执行文件增加大小620KB左右,metallib文件600KB左右。
  • Android平台:so大小400KB左右,OpenCL库400KB左右,Vulkan库400KB左右。

通用性

  • 支持TensorflowCaffeONNX等主流模型文件格式,支持CNNRNNGAN等常用网络。
  • 支持86个TensorflowOp、34个CaffeOp;各计算设备支持的MNN Op数:CPU 71个,Metal 55个,OpenCL 29个,Vulkan 31个。
  • 支持iOS 8.0+、Android 4.3+和具有POSIX接口的嵌入式设备。
  • 支持异构设备混合计算,目前支持CPU和GPU,可以动态导入GPU Op插件,替代CPU Op的实现。

高性能

  • 不依赖任何第三方计算库,依靠大量手写汇编实现核心运算,充分发挥ARM CPU的算力。
  • iOS设备上可以开启GPU加速(Metal),常用模型上快于苹果原生的CoreML。
  • Android上提供了OpenCLVulkanOpenGL三套方案,尽可能多地满足设备需求,针对主流GPU(AdrenoMali)做了深度调优。
  • 卷积、转置卷积算法高效稳定,对于任意形状的卷积均能高效运行,广泛运用了 Winograd 卷积算法,对3x3 -> 7x7之类的对称卷积有高效的实现。
  • 针对ARM v8.2的新架构额外作了优化,新设备可利用半精度计算的特性进一步提速。

易用性

  • 有高效的图像处理模块,覆盖常见的形变、转换等需求,一般情况下,无需额外引入libyuv或opencv库处理图像。
  • 支持回调机制,可以在网络运行中插入回调,提取数据或者控制运行走向。
  • 支持只运行网络中的一部分,或者指定CPU和GPU间并行运行。

架构设计

MNN可以分为Converter和Interpreter两部分。

Converter由Frontends和Graph Optimize构成。前者负责支持不同的训练框架,MNN当前支持Tensorflow(Lite)、Caffe和ONNX(PyTorch/MXNet的模型可先转为ONNX模型再转到MNN);后者通过算子融合、算子替代、布局调整等方式优化图。

Interpreter由Engine和Backends构成。前者负责模型的加载、计算图的调度;后者包含各计算设备下的内存分配、Op实现。在Engine和Backends中,MNN应用了多种优化方案,包括在卷积和反卷积中应用Winograd算法、在矩阵乘法中应用Strassen算法、低精度计算、Neon优化、手写汇编、多线程优化、内存复用、异构计算等。

  • MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。此外,IoT等场景下也有若干应用。 整体特点 轻量性 • 针对端侧设备特点深度定制和裁剪,无任何依赖,可以方便地部署到移动设备和各种嵌入式设备中。 • iOS平台:

  • 一、搭建MNN基础编译环境 1.基础依赖库安装 这些依赖是无关编译选项的基础编译依赖 cmake(3.10 以上) protobuf (3.0 以上) 指protobuf库以及protobuf编译器。版本号使用 protoc --version 打印出来。 在某些Linux发行版上这两个包是分开发布的,需要手动安装 Ubuntu需要分别安装 libprotobuf-dev 以及 protobuf-

  • #define MNN_PUBLIC __attribute__((visibility("default"))) 程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢? 这取决于链接时的顺序,比如先链接liba.so,这时候通过liba.so的导出符号表就可以找到函数A的定义,并加入到符号表中,链

  • 一 MNN相关的笔记 1.1 getApprociateType 函数 功能:确定了banckend的类型 1.2 _scheduleUnit函数 功能:确定了pipeline info 的信息 1.3 generateScheduleGraph函数 功能:用于寻找output的计算路径,因为图并不是所有结点都需要计算的,所以只需要找到和计算生成output的节点依赖就可以了 1.4 梳理Pipe

  • 前提:github下载源码编译相关工具,感觉官方的文档说的很不清楚,不简洁!!! 1.模型转换 (1)参数说明 Usage: MNNConvert [OPTION...] -h, --help Convert Other Model Format To MNN Model -v, --version 显示当前转换器版本 -f, --framework arg 需要进行转换的模型类型, ex: [T

  • 安卓MNN半精度记录 默认编译生成的so库,没有开启arm82。若要使用fp16计算,需要修改cmakelists.txt 151行option(MNN_ARM82 "Enable ARM82" OFF)改为ON。 MNNConvert --fp16,转出来的模型只是缩减了模型的存储大小,跟计算无关。 我用较大的模型fp32跑延时大概100ms,fp16跑大概50ms,速度可以提升一半;小模型的话

  • 详细见MNN官方文档 习惯于Opencv对数据进行预处理,见官方文档中没有涉及Opencv,便抽时间写下此篇. 本文采用caffe训练的分类模型,数据格式为NCHW, 图像格式为BGR. 为了使文章完整,本文绝大多数文字记录部分摘自(PS: 复制\粘贴)MNN官方文档 MNN推理主要由以下四个部分组成 一、创建会话 MNN创建会话(Session)主要通过 解释器(Interpreter)创建会话

  • 自定义graph 当网络使用转换工具转到一个平台时, 经常会遇到部分算子不支持的问题(比如一些网络的后处理部分), 这时可以考虑白剽MNN的算子. 这里以softmax为例. 假如你的分类网络(比如resent)的主要部分能够在gpu上推理,但是后面的softmax却不支持, 那么你可以使用MNN的expression库来实现, 使用cpu后端的话支持的算子当然多, 而且针对嵌入式平台也有优化.

  • from __future__ import print_function import time import argparse import numpy as np import tqdm import os import MNN import yaml try: from MNN.tools.utils.log import mnn_logger except: mnn_lo

  • 总体思路跟着这两个走,第一个更靠谱一点 ubuntu搭建MNN环境_Begin,again的博客-CSDN博客 Linux 下 MNN编译 | 安装 | 测试_墨理学AI的博客-CSDN博客 1.创建依赖 1.1cmake安装 ubuntu安装cmake_yuanzhoulvpi的博客-CSDN博客_ubuntu安装cmake 1.2 gcc(我的已经安装好了) 1.3zlib安装 技术|如何在

 相关资料
  • LeNet 5 LeNet-5是第一个成功的卷积神经网络,共有7层,不包含输入,每层都包含可训练参数(连接权重)。 AlexNet tf AlexNet可以认为是增强版的LeNet5,共8层,其中前5层convolutional,后面3层是full-connected。 GooLeNet (Inception v2) GoogLeNet用了很多相同的层,共22层,并将全连接层变为稀疏链接层。 In

  • 代码见nn_overfit.py 优化 Regularization 在前面实现的RELU连接的两层神经网络中,加Regularization进行约束,采用加l2 norm的方法,进行负反馈: 代码实现上,只需要对tf_sgd_relu_nn中train_loss做修改即可: 可以用tf.nn.l2_loss(t)对一个Tensor对象求l2 norm 需要对我们使用的各个W都做这样的计算(参考t

  • 本章到目前为止介绍的循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。图6.11演示了一个有$L$个隐藏层的深度循环神经网络,每个隐藏状态不断传递至当前层的下一时间步和当前时间步的下一层。 具体来说,在时间步$t$里,设小批量输入$\boldsymbol{X}_t \in \mathbb{R}^{n \times d}$(样本数

  • 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然20世纪90年代也有过一些针对神经网络的加速硬件,但并没有像之后GPU那样大量普及。因此,训练一个多通道、多层和有大量参数的卷积神经网络在当年很难完成。另一方面,当年研究者还没有大量深入研究参

  • 深度神经网络(DNN)是在输入和输出层之间具有多个隐藏层的ANN。 与浅层神经网络类似,DNN可以模拟复杂的非线性关系。 神经网络的主要目的是接收一组输入,对它们执行逐步复杂的计算,并提供输出以解决诸如分类之类的现实世界问题。 我们限制自己前馈神经网络。 我们在深层网络中有输入,输出和顺序数据流。 神经网络广泛用于监督学习和强化学习问题。 这些网络基于彼此连接的一组层。 在深度学习中,隐藏层的数量

  • 神经网络和深度学习是一本免费的在线书。本书会教会你: 神经网络,一种美妙的受生物学启发的编程范式,可以让计算机从观测数据中进行学习 深度学习,一个强有力的用于神经网络学习的众多技术的集合 神经网络和深度学习目前给出了在图像识别、语音识别和自然语言处理领域中很多问题的最好解决方案。本书将会教你在神经网络和深度学习背后的众多核心概念。 想了解本书选择的观点的更多细节,请看这里。或者直接跳到第一章 开始

  • 我是神经网络领域的新手,我想知道深度信念网络和卷积网络之间的区别。还有,有没有深度信念和卷积神经网络相结合的深度卷积网络? 这就是我目前所收集到的。如果我错了请纠正我。 对于图像分类问题,深度信念网络有许多层,每个层都使用贪婪的分层策略进行训练。例如,如果我的图像大小是50x50,我想要一个有4层的深度网络,即 输入层 隐藏层1(HL1) 隐藏层2(HL2) 输出层 如果使用卷积神经网络解决了同样

  • 第 10 章介绍了人工神经网络,并训练了第一个深度神经网络。 但它非常浅,只有两个隐藏层。 如果你需要解决非常复杂的问题,例如检测高分辨率图像中的数百种类型的对象,该怎么办? 你可能需要训练更深的 DNN,也许有 10 层或更多,每层包含数百个神经元,通过数十万个连接相连。 这可不像公园散步那么简单,可能碰到下面这些问题: 你将面临棘手的梯度消失问题(或相关的梯度爆炸问题):在反向传播过程中,梯度