本文对在移动端深度模型部署时目前常用的框架进行粗略总结。

1 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 加速
  • 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe/pytorch/mxnet/onnx/darknet/keras/tensorflow(mlir) 模型
  • 支持直接内存零拷贝引用加载网络模型
  • 可注册自定义层实现并扩展

支持大部分的CNN网络:

  • Classical CNN:VGG AlexNet GoogleNet
  • Practial CNN:ResNet DensetNet SENet FPN
  • Light-weight CNN:SqueezeNet MobileNetV1 MobileNetV2 MobileNetV3 ShuffleNetV1 ShuffleNetV2 MNasNet
  • Face Detection:MTCNN RetinaFace scrfd
  • Detection:VGG-SSD MobileNet-SSD SqueezeNet-SSD
  • Detection:Faster-RCNN R-FCN
  • Detection:YOLOv2 YOLOv3 MobileNet-YOLOv3 YOLOv4 YOLOv5 YOLOv7 YOLOX
  • Segmentation:FCN PSPNet UNet YOLACT
  • Pose Estimation:SimplePose

2 MNN

Github:https://github.com/alibaba/MNN

企业:阿里巴巴

MNN 是一个高效轻量级的深度学习框架。支持深度学习模型的推理和训练,端侧推理和训练性能业界领先。目前,MNN已经集成在阿里巴巴旗下的淘宝、天猫、优酷、钉钉、闲鱼等30余款应用中,覆盖直播、短视频抓拍、搜索推荐、产品展示等70多个使用场景。图片搜索、互动营销、股权分配、安全风控。此外,MNN 还用于嵌入式设备,例如物联网。

移动端Android/ios深度学习模型部署框架总结-StubbornHuang Blog

主要特征:

轻量级

  • 针对设备优化,无依赖性,可轻松部署到移动设备和各种嵌入式设备
  • iOS 平台:armv7+arm64 平台的静态库大小将增加约 12MB,链接可执行文件的大小增加约 2M
  • Android平台:core so大小约为800KB(armv7a - c++_shared)
  • 使用 MNN_BUILD_MINI 可以减少大约 25% 的包大小,固定模型输入大小的限制
  • 支持FP16 / Int8量化,可缩小模型尺寸50%-70%

多功能性

  • 支持Tensorflow、Caffe、Onnx、Torchscripts,支持CNN、RNN、GAN、Transformer等常见神经网络
  • 支持具有多输入或多输出、各种维度格式、动态输入、控制流的AI模型
  • MNN 支持用于 AI 模型的近似完整 OP。转换器支持178个TensorflowOP、52个CaffeOP、163个TorchscriptsOP、158个ONNXOP
  • 支持 iOS 8.0+、Android 4.3+ 和带 POSIX 接口的嵌入式设备
  • 支持多设备混合计算。目前支持CPU和GPU

高性能

  • 通过大量优化的汇编代码实现核心计算,充分利用 ARM / x64 CPU
  • 使用 Metal / OpenCL / Vulkan 支持移动设备上的 GPU 推理
  • 使用 CUDA 和 tensorcore 支持 NVIDIA GPU 以获得更好的性能
  • 卷积和转置卷积算法高效且稳定
  • 支持 FP16 半精度计算的新架构 ARM v8.2 速度提高了两倍

使用方便

  • 支持使用MNN的OP像numpy一样进行数值计算
  • 支持像OpenCV这样的轻量级图像处理模块,只有100k
  • 支持构建模型并在PC/移动端进行训练
  • MNN Python API 帮助 ML 工程师轻松使用 MNN 进行推理、训练、处理图像,而无需涉足 C++ 代码

3 Tensorflow Lite

Github:https://github.com/tensorflow/tflite-micro

企业:Google

官方主页:https://www.tensorflow.org/lite

4 Pytorch Mobile

官网:https://pytorch.org/mobile/home/

Pytorch Mobile Runtime测试版允许您无缝地从训练模型到部署它,同时完全留在 PyTorch 生态系统中。它提供了一个端到端的工作流程,简化了移动设备生产环境的研究。此外,它还通过联邦学习技术为隐私保护功能铺平了道路。

Pytorch Mobile目前处于测试阶段,并且已经在大规模生产中使用。一旦API被锁定,它将很快作为稳定版本提供。

主要特征:

  • 适用于ios、Android和Linux
  • 提供涵盖将 ML 整合到移动应用程序所需的常见预处理和集成任务的 API
  • 支持通过 TorchScript IR 进行跟踪和脚本编写
  • 支持 Arm CPU 的 XNNPACK 浮点内核库
  • 为 8 位量化内核集成 QNNPACK。包括对每通道量化、动态量化等的支持
  • 在Android和ios中提供高效的移动解释器,还支持构建级别优化和选择性编译,具体取决于用户应用程序所需的运算符(即,应用程序的最终二进制大小由应用程序所需的实际运算符决定)。
  • 通过 optimize_for_mobile 简化模型优化
  • Beta 版将很快提供对 GPU、DSP 和 NPU 等硬件后端的支持

部署的工作流:

下图概述了从训练到移动部署以及可选模型优化步骤的典型工作流程

移动端Android/ios深度学习模型部署框架总结-StubbornHuang Blog

5 TNN

Github:https://github.com/Tencent/TNN

企业:腾讯

TNN:腾讯优图实验室开源的一款高性能、轻量级的神经网络推理框架。它还具有跨平台、高性能、模型压缩、代码裁剪等诸多突出优点。TNN框架在原有Rapidnet和ncnn框架的基础上,进一步加强了对移动设备的支持和性能优化。同时参考了业界主流开源框架的高性能和良好扩展性的特点,扩展了对X86和NV GPU的支持。在手机端,TNN已经被手机QQ、微视、皮图等众多应用使用。TNN作为腾讯云AI的基础加速框架,已经为众多业务的落地提供了加速支持。

移动端Android/ios深度学习模型部署框架总结-StubbornHuang Blog

主要特点:

计算优化

  • 后端运算符经过主要优化,以充分利用不同架构中的计算能力,涉及指令发布、吞吐量、延迟、缓存带宽、缓存延迟、寄存器等
  • TNN在主流硬件平台(CPU:ARMv7,ARMv8,X86,GPU:Mali,Adreno,Apple,NV GPU,NPU)上的性能得到了极大的调优和提升
  • 卷积函数通过Winograd、Tile-GEMM、Direct Conv等多种算法实现,保证不同参数和尺寸下的效率
  • Op fusion:TNN可以对网络图进行离线分析,融合多个简单操作,减少冗余内存访问和内核启动成本等开销

低精度计算加速

  • TNN 支持 INT8/FP16 模式,减少模型大小和内存消耗,并利用特定的硬件低精度指令来加速计算
  • TNN支持INT8 WINOGRAD算法,(输入6bit),在不牺牲精度的情况下进一步降低模型计算复杂度
  • TNN 支持一个模型中的混合精度数据,在保持模型精度的同时加快模型的计算速度

内存优化

  • 高效的“内存池”实现:基于全网DAG分析,实现非依赖节点间内存复用,内存成本降低90%
  • 跨模型内存减少:支持外部实时设计网络内存,多个模型共享内存

TNN通过ONNX支持TensorFlow、Pytorch、MxNet、Caffe等训练框架,借力ONNX开源社会的不断完善。目前,TNN 支持 100+ ONNX 算子,包括大部分主流 CNN、NLP 算子所需。

TNN可以运行在主流操作系统(Android、iOS、嵌入式Linux、Windows、Linux)上,兼容ARM CPU、X86 GPU、NPU硬件平台。

TNN通过模块化设计构建,将模型分析、图形构建、图形优化、低级硬件适配和高性能内核等组件抽象和隔离。它使用“工厂模式”来注册和构建设备,试图将支持更多硬件和加速解决方案的成本降至最低。

手机动态库大小仅400KB左右,提供基本的图片转换操作,轻巧方便。TNN 跨平台使用统一的模型和接口,只需配置一个参数即可轻松切换。

6 Paddle-Lite

Github:https://github.com/PaddlePaddle/Paddle-Lite

企业:百度

Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及边缘端在内的多种硬件平台。

Paddle Lite 的架构设计着重考虑了对多硬件和平台的支持,并且强化了多个硬件在一个模型中混合执行的能力,多个层面的性能优化处理,以及对端侧应用的轻量化设计。

移动端Android/ios深度学习模型部署框架总结-StubbornHuang Blog

主要特性:

  • 支持多平台:涵盖 Android、iOS、嵌入式 Linux 设备、Windows、macOS 和 Linux 主机
  • 支持多种语言:包括 Java、Python、C++
  • 轻量化和高性能:针对移动端设备的机器学习进行优化,压缩模型和二进制文件体积,高效推理,降低内存消耗

7 MACE

Github:https://github.com/XiaoMi/mace

企业:小米

Mobile AI Compute Engine(简称MACE)是一个针对 Android、iOS、Linux 和 Windows 设备上的移动异构计算优化的深度学习推理框架。

主要特性:

  • 运行时使用 NEON、OpenCL 和 Hexagon 进行了优化,并引入了Winograd算法加速卷积运算,对初始化速度也进行了优化
  • 支持图级内存分配优化和缓冲区重用。核心库试图保持最小的外部依赖性以保持库占用空间小
  • 运行模型时,UI响应性保证有时是强制性的。引入了自动将 OpenCL 内核分解成小单元等机制,以更好地抢占 UI 渲染任务
  • 丰富的模型格式支持,支持Tensorflow、Caffe和Onnx模型
  • 模型保护,自设计之初,模型保护就一直是重中之重。介绍了各种技术,如将模型转换为 C++ 代码和文字混淆

8 MegEngine

Github:https://github.com/MegEngine/MegEngine

企业:旷世

MegEngine 是一个快速、可扩展且用户友好的深度学习框架

9 Tengine

Github:https://github.com/OAID/Tengine

企业:OPEN AI LAB

Tengine由 OPEN AI LAB 主导开发,该项目实现了深度学习神经网络模型在嵌入式设备上的快速、高效部署需求。为实现在众多 AIoT 应用中的跨平台部署,本项目使用 C 语言进行核心模块开发,针对嵌入式设备资源有限的特点进行了深度框架裁剪。同时采用了完全分离的前后端设计,有利于 CPU、GPU、NPU 等异构计算单元的快速移植和部署,降低评估、迁移成本。

参考链接