移动端深度学习模型部署框架ncnn介绍

时间:2024-10-08 14:28:23

导读

当我们把深度学习模型训练好之后,想要基于深度学习模型来开发实际应用的时候,主要有三种不同的应用场景移动端桌面端服务器端

  • 移动端部署:我们将模型封装成SDKAndroidIOS调用,由于移动端算力有限通常还需要考虑基于移动端CPU或GPU框架的优化问题来提速。如果模型要求的算力比较大,就只能考虑以API的形式来调用了,这时候模型是部署在服务器上的。
  • 桌面端:桌面应用主要包括WindowsMac OS以及Linux,这时候我们还是需要将模型封装成SDK然后提供接口来进行调用。Windows将模型封装成dlllib库,Linux封装成soa库,Mac OS封装为.a.tbd库。
  • 服务器端部署:服务器端模型的部署如果对并发量要求不高,通常可能都是采用flask或tornado来封装一个API接口来给调用。但是这种方式有一个致命的缺点就是,能支持的并发量很低可扩展性也不高,如果被工具服务器很容易奔溃。对于并发量要求高的应用建议使用基于model server的服务框架

如果你想开发一个跨平台的深度学习应用,有两种解决思路:第一种将模型部署到服务器上然后对外提供API接口给不同平台的应用调用即可。第二种是基于设备的本地部署,利用用户设备的算力来实现的。采用这种方式我们通常都是基于c++来开发一个SDK,然后通过不同的编译环境编译出不同的SDK提供给不同系统使用。

有些场景我们不需要大模型就能达到效果,这时候为了成本问题我就会考虑在模型部署在用户设备上,降低服务器的GPU成本。有时候也会因为用户隐私问题,也就只能考虑第二种方式了。

ncnn

ncnn是一个为移动端极致优化的高性能神经网络前向计算框架,ncnn设计时就考虑如何在手机端的部署和使用。不依赖第三方且可以跨平台,移动端CPU的速度快于目前所有已知的开源框架。基于ncnn开发人员可以很容易的将神经网络模型移植到移动端高效执行,来开发我们自己的人工智能产品。ncnn目前在腾讯多款应用中使用,所以技术相对成熟,如QQQzone微信天天P图等。

  • 目前支持的硬件设备和系统
    在这里插入图片描述
  • 支持的CNN网络

分类网络:VGG、AlexNet、Inception、ResNet、DenseNet、SENet、FPN等
轻量网络:SqueezeNet、MobileNet V1/V2/V3、ShuffleNetV1/V2、MNasNet等
目标检测:MTCNN、Retinaface、VGG-SSD、YOLO、MobileNet-SSD、SqueezeNet-SSD、MobileNetV2-SSD等
图像分割:FCN、PSPNet、UNet等
姿态估计:SimplePose等

特点

  • 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支
  • 无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架
  • 纯 C++ 实现,跨平台,支持 android ios 等
  • ARM NEON 汇编级良心优化,计算速度极快
  • 精细的内存管理和数据结构设计,内存占用极低
  • 支持多核并行计算加速,ARM cpu 调度优化
  • 支持基于全新低消耗的 vulkan api GPU 加速
  • 整体库体积小于 700K,并可轻松精简到小于 300K
  • 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe/pytorch/mxnet/onnx 模型
  • 支持直接内存零拷贝引用加载网络模型
  • 可注册自定义层实现并扩展

官网示例

ncnn git上还提供了许多example,感兴趣的同学可以先看看,后面我会教大家如何一步一步移植到你自己的系统。

难点

在使用ncnn编写跨平台的SDK时,由于使用的是c++,所以对于没有学过c++的同学来说可能有些难度。而且在基于ncnn开发SDK的时候,也会遇到各种各样的环境问题,有时候可能会因为你缺少某一个操作会导致你最终得到一个错误的结果,在这个过程中你还会遇到各种各样的编译问题等。

在后面的文章中,我都会尽量的列出这些问题,以及如何来解决这些问题,来帮助你能够基于ncnn实现一个跨平台的人工智能应用。