MDL介绍
在移动端应用深度学习技术比较典型的就是 CNN(Convolutional Neural Network)技术,即常被人提起的卷积神经网络。mobile-deep-learning(MDL)是一个基于卷积神经网络实现的移动端框架。
移动端应用深度学习应用
- 分类:比较常见的如分辨出一张图片中的物体是什么
- 主体识别:识别出一张图片中的物体在哪、有多大
移动端应用深度学习难点
面对各种机型和硬件、手机的指标要求,如何使神经网络技术稳定高效运转是最大的考验,移动端与服务器端进行对比更容易呈现问题和难点。
服务端 | 移动端 | |
---|---|---|
内存 | 弱限制 | 内存有限 |
耗电量 | 不限制 | 严格限制 |
依赖库体积 | 不限制 | 强限制 |
模型体积模型大小 | 常规模型体积200M起 | 不宜超过10M |
性能 | 服务器端强大 GPU BOX | 移动端 CPU 和 GPU |
MDL框架设计
可扩展性
对 layer 层进行了抽象,可以根据模型的需要,自定义实现特定类型的层,通过添加不同类型的层实现对更多网络模型的支持,而不需要改动其他位置的代码;
鲁棒性
MDL 通过反射机制,将 C++ 底层异常抛到应用层,应用层通过捕获异常对异常进行相应处理,如通过日志收集异常信息、保证软件可持续优化等;
兼容性
MDL 不支持模型训练能力。提供 Caffe 模型转 MDL 的工具脚本,可以通过一行命令完成模型的转换及量化过程,会陆续支持 PaddlePaddle、TensorFlow 等模型转 MDL,兼容更多种类的模型。
MDL总体架构
MDL 框架的总体架构设计图MDL 框架主要包括模型转换模块(MDL Converter)、模型加载模块(Loader)、网络管理模块(Net)、矩阵运算模块(Gemmers)及供 Android 端调用的 JNI 接口层(JNI Interfaces)。
- Converter:主要负责将 Caffe 模型转为 MDL 模型,同时支持将 32bit 浮点型参数量化为 8bit 参数,从而极大地压缩模型体积;
- Loader:主要完成模型的反量化及加载校验、网络注册等过程,网络管理模块主要负责网络中各层 Layer 的初始化及管理工作;
- JNI Interfaces:可以通过调用 JNI 接口轻松完成加载及预测过程。
MDL使用
简单地使用和部署神经网络,如果使用基本功能则不需要进行过多配置和修改,只需要关注具体业务实现、如何使用即可。
支持手机平台交叉编译同时,也支持 Linux 和 Mac 的 x86 平台编译,在调整深度学习代码的同时可以直接在工作电脑上编译运行,而不需要部署到 arm 平台。
# mac or linux:
./build.sh mac
cd build/release/x86/build
./mdlTest
MDL性能及兼容性
- 体积 armv7 300k+
- 速度 iOS GPU mobilenet 可以达到 40ms、squeezenet 可以达到 30ms
MDL 从立项到开源,已经迭代了一年多。移动端比较关注的多个指标都表现良好,如体积、功耗、速度。百度内部产品线在应用前也进行过多次对比,和已开源的相关项目对比,MDL 能够在保证速度和能耗的同时支持多种深度学习模型,如 mobilenet、googlenet v1、squeezenet 等,且具有 iOS GPU 版本,squeezenet 一次运行最快可以达到 3-40ms。
同类框架对比
Caffe2 | TensorFlown | cnn | MDL(CPU) | MDL(GPU) | |
---|---|---|---|---|---|
硬件 | CPU | CPU | CPU | CPU | GPU |
速度 | 慢 | 慢 | 快 | 快 | 极快 |
体积 | 大 | 大 | 小 | 小 | 小 |
兼容 | Android&iOS | Android&iOS | Android&iOS | Android&iOS | iOS |
兼容性
MDL 在 iOS 和 Android 平台均可以稳定运行,其中 iOS10 及以上平台有基于 GPU 运算的 API,性能表现非常出色,在 Android 平台则是纯 CPU 运行。高中低端机型运行状态和手机百度及其他 App 上的覆盖都有绝对优势。
MDL 同时也支持 Caffe 模型直接转换为 MDL 模型。
MDL特性
- 一键部署,脚本参数就可以切换 iOS 或者 Android
- 支持 Caffe 模型全自动转换为 MDL 模型
- 支持 GPU 运行
- 已经测试过可以稳定运行 MobileNet、GoogLeNet v1、squeezenet 模型
- 体积极小,无任何第三方依赖,纯手工打造
- 提供量化脚本,直接支持 32 位 float 转 8 位 uint,模型体积量化后在 4M 上下
- 与 ARM 相关算法团队线上线下多次沟通,针对 ARM 平台会持续优化
- NEON 使用涵盖了卷积、归一化、池化等运算过程
- loop unrolling 循环展开,为提升性能减少不必要的 CPU 消耗,全部展开判断操作
- 将大量繁重的计算任务前置到 overhead 过程
为了让 MDL 体积进一步缩小,MDL 并未使用 protobuf 做为模型配置存储,而是使用了** Json 格式**。目前 MDL 支持 Caffe 模型转换到 MDL 模型,未来会支持全部主流模型转换为 MDL 模型。
随着移动端设备运算性能的提升,GPU 在未来移动端运算领域将会承担非常重要的角色。
- iOS
目前 MDL 已经支持 iOS GPU 运行,iOS10 以上版本机型均可以使用,在 iOS10 以下可以使用 CPU 运算。 - Android
Android 平台目前的 GPU 运算能力与 CPU 相比整体偏弱.MDL 后面也将加入 GPU 的 Feature 实现,基于 OpenCL 的 Android 平台 GPU 运算会让高端机型的运算性能再提升一个台阶。
应用于HI
以上的一大堆优点,让人对MDL充满了期待,顺利(经过了各种配置,一点也不顺利)运行Demo
然而……
于是我屁颠屁颠的去了PaddlePaddle
新手入门,安装配置各种,追随着指引,来到了Docker
然后……
MDL框架的使用需要根据源码进行修改,需要自己搞模型进行训练等。
image.png
在GitHub上所提供的Demo中,只对物体的识别进行了简单的处理,也就是把物体圈出来。
public class MDL {
/**
* load model descrition
*
* @param modelPath
* @param weightsPath
* @return
*/
public static native boolean load(String modelPath, String weightsPath) throws MDLException;
public static native void setThreadNum(int num) throws MDLException;
/**
* object detection
*
* @param buf
* @return
*/
public static native float[] predictImage(float[] buf) throws MDLException;
/**
* clear memory
* @throws MDLException
*/
public static native void clear() throws MDLException;
}
因此将MDL接入HI的难度较大,需要相应的JNI接口,二维码数据集进行识别训练。但是,最大的问题是,并不能看懂深度学习的相关内容……
网友评论