算法模型在移动端的部署

    现阶段 app 上使用的算法模型主要有两种模式:

Online 方式

首先在移动端做初步预处理,然后把数据传到服务器进行预测后返回移动端。
优点:部署相对简单,现成的框架(caffe,theano,mxnet,Torch) 做下封装就可以直接拿来用;使用服务器进行计算,性能强,能够处理比较大的模型
缺点:必须使用网络,而且展示效果依赖网速,不适合实时性要求高的应用。

Offline 方式

根据硬件的性能选择模型,在服务器训练得到模型,在手机上进行预测的过程。
优点:不需要使用网络,可以保护隐私
缺点:计算的性能、耗时等取决于移动端的性能,有些模型只能使用CPU,精度可能会有影响,无法进行类似云端的大规模分布式训练;移动端部署相对较麻烦,需要针对移动端进行优化;大模型耗费大量的资源(计算、内存、存储、电)。

offline的部署方法

主要分两个阶段,第一个阶段是训练并得到模型,第二个阶段则是在得到模型后,在移动端进行部署。本文主要讲解的为第二阶段。

训练模型

在第一阶段训练模型中,已经有很成熟的开源框架和算法进行实现,但是为了能部署到移动端,还需要进行压缩加速。

压缩网络

目前深度学习在各个领域轻松碾压传统算法,不过真正用到实际项目中却会有很大的问题:

  1. 计算量非常巨大;
  2. 模型占用很高内存;
    由于移动端系统资源有限,而深度学习模型可能会高达几百M,因此很难将深度学习应用到移动端系统中去。

移动端部署

目前,很多公司都推出了开源的移动端深度学习框架,基本不支持训练,只支持前向推理。这些框架都是 offline 方式,它可确保用户数据的私有性,可不再依赖于因特网连接。

Caffe2

2017年4月19日 Facebook在F8开发者大会上推出Caffe2。项目是专门为手机定制的深度框架,是在caffe2 的基础上进行迁移的,目的就是让最普遍的智能设备——手机也能广泛高效地应用深度学习算法。
Caffe2 is a deep learning framework made with expression, speed, and modularity in mind. It is an experimental refactoring of Caffe, and allows a more flexible way to organize computation.

开源地址: https://github.com/caffe2/caffe2

TensorFlow Lite

2017年5月17日 Goole在I/O大会推出TensorFlow Lite,是专门为移动设备而优化的 TensorFlow 版本。TensorFlow Lite 具备以下三个重要功能:
轻量级(Lightweight):支持机器学习模型的推理在较小二进制数下进行,能快速初始化/启动
跨平台(Cross-platform):可以在许多不同的平台上运行,现在支持 Android 和 iOS
快速(Fast):针对移动设备进行了优化,包括大大减少了模型加载时间、支持硬件加速

模块如下:
TensorFlow Model: 存储在硬盘上已经训练好的 TensorFlow 模型
TensorFlow Lite Converter: 将模型转换为 TensorFlow Lite 文件格式的程序
TensorFlow Lite Model File: 基于 FlatBuffers 的模型文件格式,针对速度和大小进行了优化。

TensorFlow Lite 目前支持很多针对移动端训练和优化好的模型。

Core ML

在 app 中整合机器学习模型。Core ML 为所有模型提供了一种统一的呈现方式。App 可以使用 Core ML API 和用户数据进行预测,以及训练或精调模型,一切都在用户设备上完成。

MACE

小米开源了深度学习框架MACE,有几个特点:异构加速、汇编级优化、支持各种框架的模型转换。

有了异构,就可以在CPU、GPU和DSP上跑不同的模型,实现真正的生产部署,比如人脸检测、人脸识别和人脸跟踪,可以同时跑在不同的硬件上。小米支持的GPU不限于高通,这点很通用,很好,比如瑞芯微的RK3299就可以同时发挥出cpu和GPU的好处来。
MACE 是专门为移动设备优化的深度学习模型预测框架,MACE 从设计之初,便针对移动设备的特点进行了专门的优化:
速度:对于放在移动端进行计算的模型,一般对整体的预测延迟有着非常高的要求。在框架底层,针对ARM CPU进行了NEON指令级优化,针对移动端GPU,实现了高效的OpenCL内核代码。针对高通DSP,集成了nnlib计算库进行HVX加速。同时在算法层面,采用Winograd算法对卷积进行加速。
功耗:移动端对功耗非常敏感,框架针对ARM处理器的big.LITTLE架构,提供了高性能,低功耗等多种组合配置。针对Adreno GPU,提供了不同的功耗性能选项,使得开发者能够对性能和功耗进行灵活的调整。
系统响应:对于GPU计算模式,框架底层对OpenCL内核自适应的进行分拆调度,保证GPU渲染任务能够更好的进行抢占调度,从而保证系统的流畅度。
初始化延迟:在实际项目中,初始化时间对用户体验至关重要,框架对此进行了针对性的优化。
内存占用:通过对模型的算子进行依赖分析,引入内存复用技术,大大减少了内存的占用。
模型保护:对于移动端模型,知识产权的保护往往非常重要,MACE支持将模型转换成C++代码,大大提高了逆向工程的难度。
此外,MACE 支持 TensorFlow 和 Caffe 模型,提供转换工具,可以将训练好的模型转换成专有的模型数据文件,同时还可以选择将模型转换成C++代码,支持生成动态库或者静态库,提高模型保密性。

目前MACE已经在小米手机上的多个应用场景得到了应用,其中包括相机的人像模式,场景识别,图像超分辨率,离线翻译(即将实现)等。

开源地址:https://github.com/XiaoMi/mace

MACE Model Zoo
随着MACE一起开源的还有MACE Model Zoo项目,目前包含了物体识别,场景语义分割,图像风格化等多个公开模型。

链接: https://github.com/XiaoMi/mace-models

FeatherCNN 和 NCNN

FeatherCNN 由腾讯 AI 平台部研发,基于 ARM 架构开发的高效神经网络前向计算库,核心算法已申请专利。该计算库支持 caffe 模型,具有无依赖,速度快,轻量级三大特性。该库具有以下特性:

  1. 无依赖:该计算库无第三方组件,静态库或者源码可轻松部署于 ARM 服务器,和嵌入式终端,安卓,苹果手机等移动智能设备。
  2. 速度快:该计算库是当前性能最好的开源前向计算库之一,在 64 核 ARM 众核芯片上比 Caffe 和 Caffe2 快 6 倍和 12 倍,在 iPhone7 上比 Tensorflow lite 快 2.5 倍。
  3. 轻量级:该计算库编译后的后端 Linux 静态库仅 115KB , 前端 Linux 静态库 575KB , 可执行文件仅 246KB 。
    FeatherCNN 采用 TensorGEMM 加速的 Winograd 变种算法,以 ARM 指令集极致提升 CPU 效率,为移动端提供强大的 AI 计算能力。使用该计算库可接近甚至达到专业神经网络芯片或 GPU 的性能,并保护用户已有硬件投资。

NCNN 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如QQ,Qzone,微信,天天P图等。

这两个框架都是腾讯公司出品,FeatherCNN来自腾讯AI平台部,NCNN来自腾讯优图。
重点是:都开源,都只支持cpu
NCNN开源早点,性能较好,用户较多。FeatherCNN开源晚,底子很好。

FeatherCNN开源地址:http://github.com/tencent/FeatherCNN
NCNN开源地址:https://github.com/Tencent/ncnn

MDL

百度的mobile-deep-learning,MDL 框架主要包括模型转换模块(MDL Converter)、模型加载模块(Loader)、网络管理模块(Net)、矩阵运算模块(Gemmers)及供 Android 端调用的 JNI 接口层(JNI Interfaces)。其中,模型转换模块主要负责将 Caffe 模型转为 MDL 模型,同时支持将 32bit 浮点型参数量化为 8bit 参数,从而极大地压缩模型体积;模型加载模块主要完成模型的反量化及加载校验、网络注册等过程,网络管理模块主要负责网络中各层 Layer 的初始化及管理工作;MDL 提供了供 Android 端调用的 JNI 接口层,开发者可以通过调用 JNI 接口轻松完成加载及预测过程。

作为一款移动端深度学习框架,需要充分考虑到移动应用自身及运行环境的特点,在速度、体积、资源占用率等方面有严格的要求。同时,可扩展性、鲁棒性、兼容性也是需要考虑的。为了保证框架的可扩展性,MDL对 layer 层进行了抽象,方便框架使用者根据模型的需要,自定义实现特定类型的层,使用 MDL 通过添加不同类型的层实现对更多网络模型的支持,而不需要改动其他位置的代码。为了保证框架的鲁棒性,MDL 通过反射机制,将 C++ 底层异常抛到应用层,应用层通过捕获异常对异常进行相应处理,如通过日志收集异常信息、保证软件可持续优化等。目前行业内各种深度学习训练框架种类繁多,而 MDL 不支持模型训练能力,为了保证框架的兼容性,MDL提供 Caffe 模型转 MDL 的工具脚本,使用者通过一行命令就可以完成模型的转换及量化过程。

开源地址:https://github.com/baidu/mobile-deep-learning

SNPE

这是高通骁龙的官方SDK,不开源。

实践应用

以智云视图的人脸标定算法为例,开源项目地址为:
https://github.com/zeusees/HyperLandmark

  1. 使用的是腾讯的 NCNN 进行部署,首先通过 caffe 或者 tensorflow 等进行训练,例如使用 caffe 训练会生成模型:
    deploy.prototxt
    snapshot_10000.caffemodel

  2. 然后,使用 caffe 自带了工具可以把老版本的 caffe 网络和模型转换为新版(ncnn的工具只认识新版)
    upgrade_net_proto_text [老prototxt] [新prototxt]
    upgrade_net_proto_binary [老caffemodel] [新caffemodel]

  3. 使用 caffe2ncnn 工具转换为 ncnn 的网络描述和模型
    caffe2ncnn deploy.prototxt bvlc_alexnet.caffemodel alexnet.param alexnet.bin
    但是 param 描述文件是明文的,可以使用 ncnn2mem 工具转换为二进制描述文件和内存模型,生成 alexnet.param.bin 和两个静态数组的代码文件

  4. 然后可以使用 NCNN 加载二进制的 param.bin 和 bin 模型
    ncnn::Net net;
    net.load_param_bin(“alexnet.param.bin”);
    net.load_model("alexnet.bin”);

  5. 获取输入并计算输出结果
    ncnn 用自己的数据结构 Mat 来存放输入和输出数据 输入图像的数据要转换为 Mat,依需要减去均值和乘系数

#include "mat.h"
unsigned char* rgbdata;// data pointer to RGB image pixels
int w;// image width
int h;// image height
ncnn::Mat in = ncnn::Mat::from_pixels(rgbdata, ncnn::Mat::PIXEL_RGB, w, h);
const float mean_vals[3] = {104.f, 117.f, 123.f};
in.substract_mean_normalize(mean_vals, 0);

执行前向网络,获得计算结果

#include "net.h"
#include "alexnet.id.h"
ncnn::Mat in;// input blob as above
ncnn::Mat out;
ncnn::Extractor ex = net.create_extractor();
ex.set_light_mode(true);
ex.input(alexnet_param_id::BLOB_data, in);
ex.extract(alexnet_param_id::BLOB_prob, out);

具体的代码可以参考 github 中的demo

深度学习入门教程:

深度学习原理与实战教程:https://edu.51cto.com/sd/b5af5  

算法工程师进阶教程:

目标检测-YOLO-V4基于PyTorch从零复现(与行人车辆检测实战):https://edu.51cto.com/sd/96752

学习资料:

深度学习部署--搭建后台服务器链接:https://www.pyimagesearch.com/2018/02/05/deep-learning-production-keras-redis-flask-apache/

手把手教你如何部署深度学习模型:https://www.jianshu.com/p/43da2553a2fb

基于web端和C++的两种深度学习模型部署方式:https://cloud.tencent.com/developer/article/1684510

Pytorch Mobile 之Android Demo源码分析:https://blog.csdn.net/karry_zzj/article/details/102827337?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

如何部署一个轻量级的深度学习项目:https://blog.csdn.net/qq_33431368/article/details/102577704?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-6-102577704.nonecase&utm_term=%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E9%83%A8%E7%BD%B2%E5%88%B0%E5%89%8D%E7%AB%AF&spm=1000.2123.3001.4430

辅助学习资料:

基于 Flask 部署 Keras 深度学习模型:https://www.freesion.com/article/4371925771/

pytorch模型转ncnn,并移植android,ios:https://blog.csdn.net/u011961856/article/details/97372919?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

猜你喜欢

转载自blog.csdn.net/wzhrsh/article/details/109520435