您的位置:首页 > 移动开发

mobile-deep-learning(MDL)百度 移动端深度学习框架

2017-09-28 16:10 501 查看
       2017 年 9 月 25 日,百度在 GitHub 开源了移动端深度学习框架 mobile-deep-learning(MDL)的全部代码以及脚本,希望这个项目在社区的带动下能够更好地发展。

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


移动端应用深度学习的难点

一直以来由于技术门槛和硬件条件的限制,在移动端应用深度学习的成功案例不多。传统移动端 UI 工程师在编写神经网络代码时,可以查阅到的移动端深度学习资料也很少。另一方面,时下的互联网竞争又颇为激烈,先入咸阳者王,可以率先将深度学习技术在移动端应用起来,就可以更早地把握时代先机。

移动端设备的运算能力相对 PC 端非常弱小。由于移动端的 CPU 要将功耗指标维持在很低的水平,制约了性能指标的提升。在 App 中做神经网络运算会使 CPU 运算量猛增。如何协调好用户功耗指标和性能指标就显得至关重要。

百度图像搜索客户端团队在 2015 年底就开始针对移动端深度学习技术应用进行攻关。最终,挑战性问题被逐一解决,现今相关代码已经在很多 App 上运行,这些 App 有日 PV 亿级的产品,也有创业期的产品。

在移动端应用深度学习技术本已困难重重,而在手机百度这种量级的产品上应用,更是要面对各种机型和硬件、手机百度的指标要求。如何使神经网络技术稳定高效运转是最大的考验。拆解问题就是移动端团队面对的首要问题。我们简单总结后发现移动端与服务器端进行对比更容易呈现问题和难点,继而在服务器端和客户端做了以下深度学习技术应用对比。

难点与服务器端对比内存内存:服务器端弱限制 - 移动端内存有限耗电量耗电量:服务器端不限制 - 移动端严格限制依赖库体积依赖库体积:服务器端不限制 - 移动端强限制模型体积模型大小:服务器端常规模型体积 200M 起 - 移动端不宜超过 10M性能性能:服务器端强大 GPU BOX - 移动端 CPU 和 GPU

在开发过程中,团队逐步解决掉以上困难,形成了现在的 MDL 深度学习框架。为了让更多移动端工程师能够快速用轮子、专注业务,百度开源了全部相关代码,社区也欢迎任何人加入到造轮子的开发过程中来。


MDL 框架设计

设计思路

作为一款移动端深度学习框架,我们充分考虑到移动应用自身及运行环境的特点,在速度、体积、资源占用率等方面提出了严格的要求,因为其中任何一项指标对用户体验都有重大影响。

同时,可扩展性、鲁棒性、兼容性也是我们设计之初就考虑到了的。为了保证框架的可扩展性,我们对 layer 层进行了抽象,方便框架使用者根据模型的需要,自定义实现特定类型的层,我们期望 MDL 通过添加不同类型的层实现对更多网络模型的支持,而不需要改动其他位置的代码;为了保证框架的鲁棒性,MDL 通过反射机制,将 C++ 底层异常抛到应用层,应用层通过捕获异常对异常进行相应处理,如通过日志收集异常信息、保证软件可持续优化等;目前行业内各种深度学习训练框架种类繁多,而 MDL 不支持模型训练能力,为了保证框架的兼容性,我们提供
Caffe 模型转 MDL 的工具脚本,使用者通过一行命令就可以完成模型的转换及量化过程,后续我们会陆续支持 PaddlePaddle、TensorFlow 等模型转 MDL,兼容更多种类的模型。

总体架构

MDL 框架的总体架构设计图如下:



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


MDL 定位简单可用

MDL 开源项目在实施之初就已经有了清晰定位。在设备繁杂且性能较低的移动端平台技术研发过程中,能够为新颖的深度学习技术找到合适场景并应用到自己的产品中是非常吸引人的。但如果让每个移动端工程师在应用深度学习过程中都要重新写一次全部神经网络的实现,会增加较大成本。MDL 的定位是简单地使用和部署神经网络,如果使用基本功能则不需要进行过多配置和修改,甚至连机器学习库的编译过程都不需要,只需要关注具体业务实现、如何使用即可。

与此同时 MDL 简单清晰的代码结构也可以作为学习材料,为刚刚接触深度学习的研发工程师提供参考。因为我们在支持手机平台交叉编译同时,也支持 Linux 和 Mac 的 x86 平台编译,在调整深度学习代码的同时可以直接在工作电脑上编译运行,而不需要部署到 arm 平台。所需要的只是简单的几行代码,具体可以查阅 MDL 的 GitHub Readme。

# https://github.com/baidu/mobile-deep-learning
# mac or linux:

./build.sh mac

 cd build/release/x86/build

./mdlTest

复杂的编译过程往往比开发的时间更长,在 MDL 中只要一行./build.sh android 就能把 so、测试 test 都搞定,部署非常简便。

./build.sh android


MDL 的性能及兼容性

体积 armv7 300k+

速度 iOS GPU mobilenet 可以达到 40ms、squeezenet 可以达到 30ms

MDL 从立项到开源,已经迭代了一年多。移动端比较关注的多个指标都表现良好,如体积、功耗、速度。百度内部产品线在应用前也进行过多次对比,和已开源的相关项目对比,MDL 能够在保证速度和能耗的同时支持多种深度学习模型,如 mobilenet、googlenet v1、squeezenet 等,且具有 iOS GPU 版本,squeezenet 一次运行最快可以达到 3-40ms。
同类框架对比

框架Caffe2TensorFlowncnnMDL(CPU)MDL(GPU)硬件CPUCPUCPUCPUGPU速度慢慢快快极快体积大大小小小兼容Android&iOSAndroid&iOSAndroid&iOSAndroid&iOSiOS

与支持 CNN 的移动端框架对比,MDL 速度快、性能稳定、兼容性好、demo 完备。
兼容性

MDL 在 iOS 和 Android 平台均可以稳定运行,其中 iOS10 及以上平台有基于 GPU 运算的 API,性能表现非常出色,在 Android 平台则是纯 CPU 运行。高中低端机型运行状态和手机百度及其他 App 上的覆盖都有绝对优势。

MDL 同时也支持 Caffe 模型直接转换为 MDL 模型。


MDL 特性一览

在移动 AI 相关研发启动之初,百度图像搜索团队对比了大部分已经开源的同类 CNN 框架,百家争鸣的同时也暴露了该方向的问题。一些框架实验数据表现优秀,实际产品中或是表现较差且性能极不稳定,或是机型无法全覆盖,或是体积达不到上线标准。为了避免这些问题,MDL 加入了以下 Features:

一键部署,脚本参数就可以切换 iOS 或者 Android

支持 Caffe 模型全自动转换为 MDL 模型

支持 GPU 运行

已经测试过可以稳定运行 MobileNet、GoogLeNet v1、squeezenet 模型

体积极小,无任何第三方依赖,纯手工打造

提供量化脚本,直接支持 32 位 float 转 8 位 uint,模型体积量化后在 4M 上下

与 ARM 相关算法团队线上线下多次沟通,针对 ARM 平台会持续优化

NEON 使用涵盖了卷积、归一化、池化等运算过程

loop unrolling 循环展开,为提升性能减少不必要的 CPU 消耗,全部展开判断操作

将大量繁重的计算任务前置到 overhead 过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: