现阶段 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.
开源地址:
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已经在⼩⽶⼿机上的多个应⽤场景得到了应⽤,其中包括相机的⼈像模式,场景识别,图像超分辨率,离线翻译(即将实现)等。开源地址:
MACE Model Zoo
随着MACE⼀起开源的还有MACE Model Zoo项⽬,⽬前包含了物体识别,场景语义分割,图像风格化等多个公开模型。
链接:
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开源地址:
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 的⼯具脚本,使⽤者通过⼀⾏命令就可以完成模型的转换及量化过程。
开源地址:
SNPE
立体电视
这是⾼通骁龙的官⽅SDK,不开源。
钢结构安装
实践应⽤
以智云视图的⼈脸标定算法为例,开源项⽬地址为:
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);
执⾏前向⽹络,获得计算结果