移动端深度学习开源框架及部署
TensorFlow Lite
开源企业:谷歌
GitHub地址:https://github.com/tensorflow/tflite-micro
TensorFlow Lite for Microcontrollers 是TensorFlow Lite的实验端口,旨在在只有千字节内存的微控制器和其他设备上运行机器学习模型。它不需要操作系统支持,任何标准C或C ++库或动态内存分配。 Arm Cortex M3的核心运行时大小为16 KB,并且有足够的运算符来运行语音关键字检测模型,总共需要22 KB。有示例应用程序演示了如何将微控制器用于任务,包括唤醒字检测,来自加速度计数据的手势分类以及使用相机数据的图像分类。轻量级的设计使得它在如Arduino Nano 33 BLE Sense的一些小芯片上也能够部署。
NCNN
开源企业:腾讯
GitHub地址:https://github.com/Tencent/ncnn
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。
功能概述
- 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支
- 无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架
- 纯 C++ 实现,跨平台,支持 android ios 等
- ARM NEON 汇编级良心优化,计算速度极快
- 精细的内存管理和数据结构设计,内存占用极低
- 支持多核并行计算加速,ARM big.LITTLE cpu 调度优化
- 支持基于全新低消耗的 vulkan api GPU 加速
- 整体库体积小于 700K,并可轻松精简到小于 300K
- 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe / pytorch / mxnet / onnx / darknet / keras / tensorflow(mlir) 模型
- 支持直接内存零拷贝引用加载网络模型
- 可注册自定义层实现并扩展
MNN
开源企业:阿里巴巴
GitHub地址:https://github.com/PaddlePaddle/Paddle-Lite
MNN(Mobile Nrural Network)是一个高效、轻量的深度学习框架。它支持深度模型推理与训练,尤其在端侧的推理与训练性能在业界处于领先地位。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷、钉钉、闲鱼等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等70多个场景。此外,IoT等场景下也有若干应用。
高性能
- 不依赖任何第三方计算库,依靠大量手写汇编实现核心运算,充分发挥ARM CPU的算力。
- iOS设备上可以开启GPU加速(Metal),常用模型上快于苹果原生的CoreML。
- Android上提供了
OpenCL
、Vulkan
、OpenGL
三套方案,尽可能多地满足设备需求,针对主流GPU(Adreno
和Mali
)做了深度调优。 - 卷积、转置卷积算法高效稳定,对于任意形状的卷积均能高效运行,广泛运用了 Winograd 卷积算法,对3x3 -> 7x7之类的对称卷积有高效的实现。
- 针对ARM v8.2的新架构额外作了优化,新设备可利用FP16半精度计算的特性获得两倍提速。
- 针对端侧设备特点深度定制和裁剪,无任何依赖,可以方便地部署到移动设备和各种嵌入式设备中。
- iOS平台:armv7+arm64静态库大小5MB左右,链接生成可执行文件增加大小620KB左右,metallib文件600KB左右。
- Android平台:so大小400KB左右,OpenCL库400KB左右,Vulkan库400KB左右。
- 支持
Tensorflow
、Caffe
、ONNX
等主流模型文件格式,支持CNN
、RNN
、GAN
等常用网络。 - 转换器支持149个
Tensorflow
OP、58个TFLite
OP、47个Caffe
OP、74个ONNX
OP;各计算设备后端支持的MNN OP数:CPU 111个,ARM V8.2 6个,Metal 55个,OpenCL 43个,Vulkan 32个。 - 支持iOS 8.0+、Android 4.3+和具有POSIX接口的嵌入式设备。
- 支持异构设备混合计算,目前支持CPU和GPU。
- 有高效的图像处理模块,覆盖常见的形变、转换等需求,一般情况下,无需额外引入libyuv或opencv库处理图像。
- 支持回调机制,可以在网络运行中插入回调,提取数据或者控制运行走向。
- 支持只运行网络中的一部分,或者指定CPU和GPU间并行运行。
- (BETA)MNN Python API,让算法工程师可以轻松地使用MNN构图、训练、量化训练,无需编写C++。
TNN
开源企业:腾讯
GitHub地址:https://github.com/Tencent/TNN
TNN:腾讯优图实验室开源的高性能、轻量级神经网络推理框架。它还具有跨平台、高性能、模型压缩、代码裁剪等诸多突出优势。TNN 框架在原有 Rapidnet 和 ncnn 框架的基础上,进一步加强了对移动设备的支持和性能优化。同时借鉴业界主流开源框架的高性能和良好的扩展性特点,扩展了对X86和NV GPU的支持。在手机端,TNN已经被QQ、微视、Pitu等众多应用使用。TNN作为腾讯云AI的基础加速框架,为众多业务的落地提供了加速支持。
Paddle-Lite
开源企业:百度
GitHub地址:https://github.com/PaddlePaddle/Paddle-Lite
Paddle Lite为Paddle-Mobile的升级版,定位支持包括手机移动端在内更多场景的轻量化高效预测,支持更广泛的硬件和平台,是一个高性能、轻量级的深度学习预测引擎。在保持和PaddlePaddle无缝对接外,也兼容支持其他训练框架产出的模型。支持ARM CPU、Mali GPU、Adreno GPU,还特别支持了华为 NPU,以及 FPGA 等边缘设备广泛使用的硬件。即将支持支持包括寒武纪、比特大陆等AI芯片,未来会增加对更多硬件的支持。
多硬件支持
- Paddle Lite架构已经验证和完整支持从 Mobile 到 Server 多种硬件平台,包括 ARM CPU、Mali GPU、Adreno GPU、英伟达 GPU、苹果 GPU、华为 NPU,以及 FPGA 等,且正在不断增加更多新硬件支持。
- 各个硬件平台的 Kernel 在代码层和执行层互不干扰,用户不仅可以自由插拔任何硬件,还支持任意系统可见硬件之间的混合调度。
轻量级部署
- Paddle Lite在设计上对图优化模块和执行引擎实现了良好的解耦拆分,移动端可以直接部署执行阶段,无任何第三方依赖。
- 包含完整的80个 op+85个 Kernel 的动态库,对于ARMV7只有800K,ARMV8下为1.3M,并可以通过裁剪预测库进一步减小预测库文件大小。
高性能
- 极致的 ARM CPU 性能优化:针对不同微架构特点实现kernel的定制,最大发挥计算性能,在主流模型上展现出领先的速度优势。
- 支持 PaddleSlim模型压缩工具:支持量化训练、离线量化等多种量化方式,最优可在不损失精度的前提下进一步提升模型推理性能。性能数据请参考 benchmark。
多模型多算子
- Paddle Lite和PaddlePaddle训练框架的OP对齐,提供广泛的模型支持能力。
- 目前已严格验证24个模型200个OP的精度和性能,对视觉类模型做到了较为充分的支持,覆盖分类、检测和定位,包含了特色的OCR模型的支持,并在不断丰富中。具体请参考支持OP。
强大的图分析和优化能力
- 不同于常规的移动端预测引擎基于 Python 脚本工具转化模型, Lite 架构上有完整基于 C++ 开发的 IR 及相应 Pass 集合,以支持操作融合,计算剪枝,存储优化,量化计算等多类计算图优化。更多的优化策略可以简单通过 新增 Pass 的方式模块化支持。
MegEngine
开源企业:旷世科技
GitHub地址:https://github.com/MegEngine/MegEngine
MegEngine 是一个快速、可扩展且用户友好的深度学习框架,具有 3 个关键特性。
1、训练和推理的统一框架
- 量化、动态形状/图像预处理,甚至使用单个模型进行推导。
- 训练后,将所有内容放入您的模型中,以便在任何平台上快速准确地进行推理。在这里查看快速指南。
2、最低的硬件要求
- 启用DTR 算法后,GPU 的内存使用量可以减少到原始内存使用量的三分之一。
- 通过利用我们的下推内存规划器,具有最低内存使用率的推理模型。
3、在所有平台上高效推理
- 在 x86、Arm、CUDA 和 RoCM 上进行高速和高精度推理。
- 支持Linux、Windows、iOS、Android、TEE等。
- 利用我们的高级功能优化性能和内存使用。
ONNX
ONNX的规范及代码主要由微软,亚马逊,Facebook(已退出)和IBM等公司共同开发,以开放源代码的方式托管在Github上
GitHub地址:https://github.com/onnx/onnx
开放式神经网络交换(Open Neural Network Exchange,ONNX)是一个开放的生态系统,它使 AI 开发人员能够随着项目的发展选择合适的工具。ONNX 是一种开放格式,用于表示机器学习模型。ONNX 定义了一组通用运算符、机器学习和深度学习模型的构建块、以及一种通用文件格式,使 AI 开发人员能够使用具有各种框架、工具、运行时和编译器的模型。ONNX是一种AI神经网络模型的通用中间文件保存方法(可以理解成AI世界的XML),各种AI框架都可以解析ONNX文件并生成特定平台和运行框架所支持的神经网络模型。
我遇到了pytorch的GRU转ONNX,但是ONNX转Tensorflow model时失败,等ONNX解决了这个问题我再来用它
Lite AI ToolKit
Github地址:https://github.com/DefTruth/lite.ai.toolkit
Lite.Ai.ToolKit: 一个轻量级的C++ AI模型工具箱,用户友好(还行吧),开箱即用。已经包括 100+ 流行的开源模型。这是一个根据个人兴趣整理的C++工具箱,, 涵盖目标检测、人脸检测、人脸识别、语义分割、抠图等领域。
MACE (Mobile AI Compute Engine)
开源企业:小米
GitHub地址:https://github.com/XiaoMi/mace
Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台(支持Android, iOS, Linux, Windows)优化的神经网络计算框架。 主要从以下的角度做了专门的优化:
- 性能:代码经过NEON指令,OpenCL以及Hexagon HVX专门优化,并且采用 Winograd算法来进行卷积操作的加速。 此外,还对启动速度进行了专门的优化。
- 功耗:支持芯片的功耗管理,例如ARM的big.LITTLE调度,以及高通Adreno GPU功耗选项。
- 系统响应:支持自动拆解长时间的OpenCL计算任务,来保证UI渲染任务能够做到较好的抢占调度, 从而保证系统UI的相应和用户体验。
- 内存占用:通过运用内存依赖分析技术,以及内存复用,减少内存的占用。另外,保持尽量少的外部 依赖,保证代码尺寸精简。
- 模型加密与保护:模型保护是重要设计目标之一。支持将模型转换成C++代码,以及关键常量字符混淆,增加逆向的难度。
- 硬件支持范围:支持高通,联发科,以及松果等系列芯片的CPU,GPU与DSP(目前仅支持Hexagon)计算加速。CPU模式支持Android, iOS, Linux等系统。
- 模型格式支持:支持TensorFlow, Caffe和ONNX等模型格式。
TensorRT 是NVIDIA的开源AI神经网络Inference引擎,它可以解析和转换ONNX格式的神经网络模型并部署到支持CUDA的GPU上运行。目前TensorRT支持支持的平台有配置在CUDA 9.0以上的显卡和他们的Jetson系列平台。
Tengine
Github地址:https://github.com/OAID/Tengine
Tengine由OPEN人工智能实验室主导开发,项目该实现了深度学习神经网络模型在嵌入式设备上的快速,高效部署需求。为实现在众多AIoT应用中的跨平台部署,本项目使用ç语言进行核心模块开发,针对嵌入式设备有限的特点进行了深度的深度移植。采用了完全分离的前期设计,有嵌入式CPU、CPU、NPU等多种方法同时计算GPU的快速移植资源和开发,降低评估、迁移成本。
ELL
开源企业:微软
GitHub地址:https://github.com/Microsoft/ELL
嵌入式学习库 (ELL) 允许您设计智能机器学习模型并将其部署到资源受限的平台和小型单板计算机上,例如 Raspberry Pi、Arduino 和 micro:bit。部署的模型在本地运行,无需网络连接,也无需依赖云中的服务器。ELL 是 Microsoft Research 开发的嵌入式 AI 和机器学习技术的早期预览。
TVM
GitHub地址:https://github.com/apache/tvm
Apache TVM 是用于深度学习系统的编译器堆栈。它旨在缩小以生产力为中心的深度学习框架与以性能和效率为中心的硬件后端之间的差距。TVM 与深度学习框架配合使用,为不同的后端提供端到端编译。
ARM NN
开源企业:ARM
GitHub地址:https://github.com/ARM-software/armnn
Arm NN SDK 是一组开源软件和工具,可在节能设备上实现机器学习工作负载。它在现有神经网络框架和节能 Cortex-A CPU、Arm Mali GPU 和 Arm Ethos NPU 之间架起了一座桥梁。
最新版本支持使用TensorFlow Lite (TfLite) 和ONNX创建的模型。
FeatherCNN
开源企业:腾讯
GitHub地址:https://github.com/Tencent/FeatherCNN(停止更新)
FeatherCNN是腾讯人工智能平台部开发的高性能轻量级CNN推理库。FeatureCNN 起源于我们为王者荣耀(中文:王者荣耀)设计的游戏 AI 项目,我们旨在为 MOBA 游戏 AI 构建神经模型并在移动设备上运行它。FeatherCNN 目前针对 ARM CPU。我们将在不久的将来扩展它以涵盖其他架构。
与其他库相比,FeatherCNN 具有以下特点:
-
高性能:在各种设备上提供最先进的推理计算性能,包括手机 (iOS/Android)、嵌入式设备 (Linux) 以及基于 ARM 的服务器 (Linux)。
-
轻松部署:将所有内容打包在一个代码库中,以摆脱第三方依赖。因此,它有助于在移动平台上进行部署。
-
轻量模型:Feather weight 编译后的 FeatherCNN 库是小型的(数百 KB)。
PocketFlow
开源用户:腾讯
GitHub地址:https://github.com/Tencent/PocketFlow(停止更新)
语言:python
一款面向移动端AI开发者的自动模型压缩框架,集成了当前主流的模型压缩与训练算法,结合自研超参数优化组件实现了全程自动化托管式的模型压缩与加速。开发者无需了解具体算法细节,即可快速地将AI技术部署到移动端产品上,实现了自动托管式模型压缩与加速,实现用户数据的本地高效处理。
QNNPACK
全称:Quantized Neural Network PACKage(量化神经网络包)
开源企业:Facebook
GitHub地址:https://github.com/pytorch/QNNPACK(停止更新)
特点:
- 1)低密度卷积优化函数库;
- 2)可在手机上实时运行Mask R-CNN 和 DensePose;
- 3) 能在性能受限的移动设备中用 100ms 以内的时间实施图像分类
MDL
开源企业:百度
GitHub地址:https://github.com/allonli/mobile-deep-learning(停止更新)
免费开源移动深度学习框架,由百度部署。mobile-deep-learning 旨在简单地在移动设备上部署 CNN,复杂度低,速度快。支持iOS GPU计算,已被百度APP采用。
Prestissimo
开源企业:九言科技
GitHub地址:https://github.com/in66-dev/In-Prestissimo(停止更新)
特点:
基础功能
- 支持卷积神经网络,支持多输入和多分支结构
- 精炼简洁的API设计,使用方便
- 提供调试接口,支持打印各个层的数据以及耗时
- 不依赖任何第三方计算框架,整体库体积 500K 左右(32位 约400k,64位 约600k)
- 纯 C++ 实现,跨平台,支持 android 和 ios
- 模型为纯二进制文件,不暴露开发者设计的网络结构
MDL、NCNN和 TFLite比较
百度-MDL框架、腾讯-NCNN框架和谷歌TFLite框架比较。
MDL | NCNN | TFLite | |
---|---|---|---|
代码质量 | 中 | 高 | 很高 |
跨平台 | √ | √ | √ |
支持caffe模型 | √ | √ | × |
支持TensorFlow模型 | × | × | √ |
CPU NEON指令优化 | √ | √ | √ |
GPU加速 | √ | × | × |
相同点:
- 只含推理(inference)功能,使用的模型文件需要通过离线的方式训练得到。
- 最终生成的库尺寸较小,均小于500kB。
- 为了提升执行速度,都使用了ARM NEON指令进行加速。
- 跨平台,iOS和Android系统都支持。
不同点:
- MDL和NCNN均是只支持Caffe框架生成的模型文件,而TfLite则毫无意外的只支持自家大哥TensorFlow框架生成的模型文件。
- MDL支持利用iOS系统的Matal框架进行GPU加速,能够显著提升在iPhone上的运行速度,达到准实时的效果。而NCNN和TFLite还没有这个功能。
nnom
github地址:https://github.com/majianjia/nnom
编程语音:纯C
支持框架:Keras
NNoM 的初衷只是为了简化ARM这套CMSIS-NN的使用,针对10~100kB RAM的单片机做的。不考虑支持现有的各种模型文件或者protobuf因为他们太大,并且需要文件系统的支持。
libonnx
作者:xboot
github地址:https://github.com/xboot/libonnx
编程语言:纯C
支持框架:ONNX
优点:可以支持硬件加速接口,开发环境依赖少,有较强的通用性,特别是在低端嵌入式芯片上,程序文件可以复制到各种工程,保证最小依赖。C++内存很容易爆炸。
各大框架趋于稳定,功能开始雷同,变现需求越来越迫切,大家都想在部署在低端设备上。作者研究了一大圈,现在各种框架基本都是Python和C++等大型框架,基本不适合低端嵌入式设备,那种无操作系统的设备,更是无从谈起,翻遍整个了网络,也没有找到纯C的,低端嵌入式设备友好的微型推理框架。特别是ONNX标准的流行,让我觉得有必要自己开发一个微型推理框架,不为别的,就只为能在低端嵌入式设备上运行各种开源的预训练模型,且不要对模型动刀,况且训练模型,吃力不讨好,还不如用现成的,本来,好用的深度学习模型,就那么些,大家基本都差不多。
MNIST手写数字识别demo,这里还有更多的体验:https://microsoft.github.io/onnxjs-demo/,作者主要实现C版的ONNX推理引擎。ONNX模型别人都训练好了,直接下载推理就行。https://github.com/onnx/models
https://github.com/daquexian/onnx-simplifier
https://github.com/Shuep418Slw/OSlw_Code
参考
【Github】深度学习500问题
【机器之心】从TensorFlow到PyTorch:九大深度学习框架哪款最适合你?
【CSDN】支持移动端深度学习的几种开源框架