本篇内容介绍嵌入式深度学习的应用场景、Paddle-Mobile 的特性优势以及使用开发方法,预计阅读时间 4 分钟
嵌入式深度学习有哪些应用
深度学习技术已经在互联网的诸多方向产生影响,关于深度学习和神经网络的讨论越来越多。深度学习技术在近几年得到飞速发展,各种互联网产品都争相应用深度学习技术,产品对深度学习的引入也更进一步地影响人们的生活。随着移动设备被广泛使用,在移动互联网产品应用深度学习和神经网络技术已经成为必然趋势。在移动端应用深度学习技术能够做出哪些惊艳的体验,是值得大家关注的首要问题。接下来我们来看下图像搜索中的一个功能,实时翻译。
实时翻译
打开简单搜索 APP 里左下角的图像搜索,设置好限定翻译垂类和语种,只要用手机对准想要翻译的文字的场景,就能够实时地给出翻译结果,并且将翻译结果完美地融合到你所看到的场景中。我们可以看到翻译结果的字体颜色以及贴图的背景色,都与真实场景是完全一致的。同时,即使你的手机移动或抖动,你所看到的整个融合后的翻译结果也依然是稳定的。
这个功能就应用到了前面提到的移动端深度学习技术,当然也用到了很多的计算机视觉相关技术,包括 tracking、背景色处理等功能。
技术实现:第一点就是需要对文字进行背景色和前景色的提取,这里的颜色用来对翻译结果进行渲染,增强现实感;第二点就是提取文字区域的角点并进行光流追踪,这一步主要是用来实时更新翻译结果贴图的位置信息,随着手机移动,我们需要让翻译结果贴图始终贴合在他应该出现的位置。这里除了需要更新位置信息,我们还需要对翻译结果贴图进行透视变换,因为我们手机还会有旋转以及三维坐标系上各种角度的变化,这一步的透视变换就是为了得到一个透视变换矩阵,然后作用于翻译贴图,让贴图有同样的角度变化,大大增强了现实感。第三点就是对识别到的文字进行翻译,获取翻译结果。
视频流式搜索
这一功能基于业界首创的本地“多目标识别 + 粗分类识别”相结合的实时识别模型,第一次大规模使用移动端 GPU 进行深度学习计算。目前简单搜索的 IOS 端已经可以体验,2018 年底将会上线百度 APP 的 Android 版。
实时检测取景框内的多个主体,并通过毫秒级响应的粗分类识别能力,快速告知用户各主体粗分类,从而帮助用户快速筛选拟识别主体。在出现识别结果后会标记多个目标,用户点击任何一个目标后都会快速出现搜索结果。
移动端深度学习遇到的问题
相比 PC 端,移动端设备的运算能力通常比较弱小,并且由于移动端的 CPU 需要将功耗指标维持在很低的水平,给性能指标的提升带来了制约。
Paddle-Mobile 作为百度深度学习平台 PaddlePaddle 下的子项目,致力于嵌入式平台的深度学习预测。训练任务由 PaddlePaddle 在服务器端进行,Paddle-Mobile 则破除深度学习落地嵌入式移动端平台的障碍。
Paddle-Mobile 设计和 PaddlePaddle 保持了高度一致,能够直接运行 PaddlePaddle 新版训练的模型。同时针对嵌入式平台做了大量优化。嵌入式平台计算资源有限,体积敏感,用户过程中更加要求实时,所以我们必须针对各种嵌入式平台挖掘极限性能。
Paddle-Mobile 的优势
目前支持 Linux-arm,IOS,Android,DuerOS 平台的编译和部署。它的最上层是一套非常简洁的预测 API,服务于百度众多 APP。
我们来看一下 Paddle-Mobile 的架构。首先是底层针对各种硬件平台的优化,包括 CPU(主要是移动端的 ARM CPU), GPU (包括 ARM 的 Mali,高通的 Andreno 以及苹果自研的 GPU),另外还有华为的 NPU,powerVR,FPGA 等平台。NPU 目前仍在合作中,未来会直接支持。在这一层,我们会针对各种平台实现优化后的算子,也称为 kernel,他们负责最底层的运算。
算法优化与模型压缩
算法优化包括降低算法本身复杂度,比如某些条件下的卷积操作,可以使用复杂度更低的 Winograd 算法,以及我们后面会提到的 kernel 融合等思想。
为了带来更高的计算性能和吞吐,端芯片通常会提供低位宽的定点计算能力。目前 Paddle-Mobile 已初步具备在 ARM CPU 上进行 8bit 定点预测的功能,在我们测试的模型中 8bit 定点通常会带来 20%~50% 的性能提升。
多软硬件覆盖
目前 Paddle-Mobile 已经实现和进行中的能力如下 01 ARM CPUARM CPU 计算深度学习任务是最基本通用的技术,使用也较为广泛。但是由于 CPU 计算能力相对偏弱,还要承担主线程的 UI 绘制工作,在 APP 中使用 CPU 计算深度学习计算任务压力较大。我们针对 ARM CPU 做了大量优化工作,但是随着硬件不断发展未来专有 AI 芯片和 GPU 将更加适合做这项任务。
02 IOS GPUIOS GPU 使用 metal 支持直接编写,支持的系统范围向下到了 IOS 9。这比 coreml 支持的范围有所扩大。目前该代码也已全面开放在 Github。
03 Mali GPUMali GPU 在华为等主流机型中广泛存在,我们使用了 OpenCL 对 Mali GPU 做了 Paddle 模型支持。在较高端的 Mali GPU 上已经可以得到非常高的性能。
04 Andreno GPUAndreno GPU 是高通设计的端侧 GPU,同样基于 OpenCL 对其进行了优化实现。其高性能、低功耗的优势在 Paddle-Mobile 框架运行时得到了验证。
05 FPGA ZU 系列该项工作代码已经可以运行,在 Github 同样可以找到相关代码。对于 ZU9 和 ZU5 等开发板完全支持。FPGA 的计算能力较强,深度学习功能可以在 Github 找到,感兴趣的工程师们可以去了解。
06 H5 网页版深度学习支持 Paddle-Mobile 正在实现底层基于 WebGL 的网页版深度学习框架。我们使用了 ES6。后续会使用 WebAssembly 和 WebGL 并行融合的设计,在性能上进一步提高。该功能近期也会在 Github 开源,欢迎关注。
07 树莓派、RK3399 等开发板树莓派、RK3399 系列等硬件在开发者中被大量用及,Paddle-Mobile 同样做了支持,解决了很多问题,目前在其平台上的 cpu 版本一键编译即可完美运行。
体积小
Paddle-Mobile 从设计之初就深入考虑到移动端的包体积的问题,cpu 实现中没有外部依赖。
在编译过程中,如果该网络不需要的 op 是完全不会被打入的。同时编译选项优化也为体积压缩提供了帮助。Protobuf 是主流框架使用的格式协议,如果放弃对 Protobuf 支持将给开发者带来转换模型的工作量,于是 Paddle-Mobile 团队将 Protobuf 生成文件重新精简逐行重写,拿到了一个只有几十 k 增长的 protobuf 体积。为开发者带来了一键运行的可行能力。
除了二进制体积,我们对代码体积极力避免过大,整个仓库的代码体积也非常小。
高性能 CPU 优化
针对 ARM CPU,我们会使用 ARM 汇编来实现 kernel 计算。在卷积神经网络中,卷积操作是耗时占比最大的部分,可能会占 80% 到 0%。而卷积操作通常可以转化为两个矩阵的乘法,如何来优化通用矩阵乘法 GEMM 就是成为了关键中的关键。
Paddle-Mobile 主要使用了以下技术
SIMD NEON 优化技术
片上缓存命中优化
矩阵合理分块
Pld 汇编指令优化
循环展开
重排流水线
GPU 优化
CPU 和 GPU 的结构有着明显的区别,CPU 每个核心仅有一个 ALU 算数逻辑单元,几个核心共享 L2 缓存。而 GPU 通常会有很多个 ALU 计算单元, 成百上千个计算单元并行计算。这种并行是非常适合于深度学习中的计算。Paddle-Mobile 充分利用了手机平台的 GPU 对主流 GPU 几乎是全覆盖,包含了 ios 和 android 两大阵营中的 GPU 实现。未来,Paddle-Mobile 将会以 GPU 为主,CPU 为辅的思路发展。
另外,CPU 和 GPU 并不是用的同一块内存,大量数据计算时会有较大差异。因此我们使用了占用内存更小的数据类型。
内核融合
如今较为常见的深度学习框架都会将模型抽象为由一些基本运算单元组成的有向无环图,这些基本运算单元包括常见的卷积、池化以及各种激活函数等,在真正执行时这些 OP 会调用更底层的内核函数 kernel 来完成运算。通常情况下,一个复杂的模型会包含上千个 OP,而这些 OP 在调用 kerenl 时都会产生内存 IO。内核融合可以将一序列顺序执行的 OP kernel 进行合并,从而减少内存 IO 次数,并充分利用 CPU 的流水线技术。此外内核融合也可以降低计算复杂度,比如 Convolution 和 Batch Normalization 的融合。
如何使用 & 如何参与开发
Paddle-Mobile 经过了多次版本迭代,CPU 和 GPU 版本都运行在几亿级用户的百度 APP 和简单搜索 APP。如此量级的 APP 产品的验证是对靠性的例证。同时 Paddle-Mobile 也在和华为合作,HiAI 平台的深度实现会在后继放出。
支持的模型
目前 Paddle-Mobile 已经在多个平台有不同模型覆盖,下表表示目前已经支持的模型范围。空白区域也是接下来会补齐的模型。
模型获取
深度学习技术离不开模型支持,Paddle-Mobile 支持的是 PaddlePaddle 模型规范。模型的获取主要通过以下途径获得。
如果你只是用来测试,对效果要求不高。测试模型和测试图片下载地址如下:
http://mms-graph.bj.bcebos.co…
若想有更好的效果独立训练模型,可以直接使用 Paddle Fluid 训练,该方式最为可靠,推荐方式。
如果你手中的模型是其他框架训练的模型,需要进模型转换才可以运行。比如将 caffe 的模型转为 Paddle Fluid 的模型可以参考如下链接:
https://github.com/PaddlePadd…
编译及开发
Paddle-Mobile 框架所需要的测试模型已经在 github 完全免费公布,为开发者进一步使用提供便利。由于大量 UI 工程师对性能和底层优化有一定困扰,Paddle-Mobile 的编译过程极其简单。以 Android 平台为例。在安装好 cmake 和 ndk 以后进入项目根目录,直接可以如下命令编译:
cd tools
sh build.sh android
如果我们已经明确自己的模型,同时想要更小的体积可以:
sh build.sh android googlenet
这样就不会打入开发者不需要的依赖,体积进一步减小。
设计文档,主要分为 IOS、Android、FPGA、arm_linux 等文档,在 Readme 和
https://github.com/PaddlePadd…
首页中都有相关链接,其中包含大量设计和开发过程所需要的资料。
总结
Paddle-Mobile 做为国内全面支持各大平台的移动端深度学习框架,以移动端特点出发,针对性做了大量的优化、平台覆盖工作,并且保持了高性能、体积小等诸多优势。为对中国开发者更友好,中文文档被重点维护,有任何问题都可以到 Github 发 issue。也欢迎相关爱好者加入开发为移动端深度学习的发展贡献力量。