MDL调研

作者: 卡路fly | 来源:发表于2020-04-03 14:24 被阅读0次

    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接口,二维码数据集进行识别训练。但是,最大的问题是,并不能看懂深度学习的相关内容……

    相关文章

      网友评论

          本文标题:MDL调研

          本文链接:https://www.haomeiwen.com/subject/fsnbmxtx.html