Paddle Mobile是PaddlePaddle组织下的致力于嵌入式平台的深度学习框架,集成了百度移动端预测的实践经验,提供多平台支持,在工程实现支持及底层算法模型压缩的基础上,通过CPU、mall GPU等硬件加速,作用于DuerOS、百度APP、百度网盘APP等移动端场景。目前,Paddle Mobile在PaddlePaddle 0.14版本下已支持CPU、Mali GPU等平台,以及图像、人脸、OCR等模型。值得一提的是,它的体积极小,最小仅300K。今天这篇文章是由百度大搜索高级研发工程师谢柏渊老师,为大家介绍Paddle Mobile的技术实现和业务落地。

简单搜索--Paddle Mobile的技术实现和业务落地_第1张图片

以下为谢柏渊的演讲实录

Paddle Mobile框架概览

简单搜索--Paddle Mobile的技术实现和业务落地_第2张图片
图一:Paddle mobile框架
Paddle mobile各大框架,偏重于与AI硬件的结合,提升本地用户性能。
 Paddle mobile的训练分为训练过程和运算过程,训练过程兼容统一训练模型,训练基础上提供量化深度压缩功能。
 目标检测有单主体检测,多主体检测,手势识别。
 实时OCR保证在高性能的情况下,每个图片完整的映射。
 语音唤醒,形成无数的样本输出。
 多硬件平台支持,支持全部ARM CPU,Mali GPU,高通DSP,Arm-Linux FPGA。

Paddle mobile的架构设计

Paddle mobile的架构设计主要分为: Loader 模块、 Program 模块、 Executor 模块、 Op 模块、 Kernel 模块、Scope variable Tensor 模块。它的模型分为两种结构: 一种为参数文件是散开的, 如下图, 红框为模型结构的 protobuf 文件, 其余为参数文件。

简单搜索--Paddle Mobile的技术实现和业务落地_第3张图片

图二:模型

其中Loader 模块的作用是将模型结构信息 load 进内存, 如红框内的 protobuf 文件 load 进内存, 并对模型结构进行优化(如将几个细粒度的 op 融合成粗粒度的op, 如将 conv、 add、 batchnorm、 relu 融合为 conv_add_batchnorm_relu),方便进行算法优化。由于 conv 可以转换为两个大矩阵相乘, 更进一步可以分为若干个一行一列的小矩阵相乘, 并得出最终运算。

简单搜索--Paddle Mobile的技术实现和业务落地_第4张图片

图三:op融合

Program 为 Loader 模块的结果, 包含了优化前的模型结构对象, 以及优化后的模型结构对象, 此模块基本对应 PaddlePaddle 模型结构, 关于Paddle 模型的概念定义, 详细设计可以参考 program.md。

kernel 为 op 的底层运算实现, 主要有两个函数, Init 和 Compute, 分别用来初始化、预处理 和 运算操作, 值得提出的是, kernel 会根据泛型特化到不同的平台, 如图所示:

简单搜索--Paddle Mobile的技术实现和业务落地_第5张图片

图四:平台

不同平台的 kernel 实现, 为同一个 kernel 类不同泛型的特化实现, 目前有三个平台, arm、mali、fpga, 图中的 central-arm-func\ 目录为 op kernel 的 arm 实现, 它承担了 arm\ 目录下 kernel 的底层实现, 同时 arm 处理器作为中央处理器, central-arm-func\ 也可以作为其他协处理器的底层实现, 如: fpga 的某一个 op kernel 还没有 fpga 协处理器的实现, 就可以直接调用使用这里的 arm 实现.

Paddle Mobile的优化

Paddle Mobile的优化的体现在两个方面,体积优化和效率提升。其中,体积优化从三方面来进行:第一,模型量化压缩方案;第二,代码深度精简;第三,分模型打包。效率提升主要从Operator融合和各平台特化实现两方面才进行提升。

Scope用来存储管理所需要用到的variable,用来存储不同类型的对象,主要是矩阵为tensor,也就是说scpoe管理着op运算过程中所有参数矩阵,输入输出矩阵。可以将scope理解为一个map,这里在map上封了一层scope的概念是为了方便内存管理。scope可以用来存储不同类型的对象,Paddle mobile主要用它来存储tensor,tensor代表着矩阵,通过泛型可以用来存储不同类型的矩阵,但需要注意的是存入和取出时的类型必须保持一致,如果类型不一致,不能通过类型检查。

提问环节

提问:把很多模型压缩放到移动端,压缩是手动还是会自动。
谢柏渊:我们提供一个脚本,跟Paddle mobile项目读取模型一样,我们进行映射,按照255乘以值,预算的时候用这个数乘以255。具体实践可以看Paddle mobile这个项目有量化的脚本,做一个简单的片断。

提问:压缩是把矩阵一点点读进去,读的是哪部分?
谢柏渊:我对这个算法了解不是特别深入,这个想深入了解可以打开PaddlePaddle,在文档列表搜介绍。

提问:能否提供简单的算法然后传播,我们进行简单的预算?
谢柏渊:目前没有,后续考虑会支持。

提问:如果把训练好模型放到手机上,大概有多大?
谢柏渊:目前压缩以后,差不多有5兆,6兆左右,很小。例如有一些AR团队设立鸡蛋的模型,只有50多K,不用量化,量化以后10K,就没有必要了。模型大小跟复杂程度有关,用一张数据训练,参数大就大;模型设计的简单,参数少,模型也就小。模型大小是纯粹数据的排列,非常简单,你有多少数就多大。所以我们设计一个模型考虑的问题就是如何设计一个既省空间,效率又高,又准确的模型。

提问:您的模型用的是哪个模型。
谢柏渊:模型因为属于商业化东西,我们对外开放了一部分,在官网可以查询和观看demo,对外也提供了接口,把项目编译出来后,ARM模型在手机上,处理好的数据输入进去,可以拿到所有点的结果。使用起来非常简单。

实录结束

谢柏渊,百度大搜索高级研发工程师,拥有多年Android开发经验,多模搜索部创新团队成员,Paddle Mobile团队成员,落地功能有图搜实时翻译,lite版语音搜索,悬浮球搜索等。目前主要负责Paddle Mobile从学术到上线的打通工作,推动技术实现到业务落地。