简单搜索--paddlemobile的技术实现和业务落地

author author     2023-01-04     134

关键词:

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

以下为谢柏渊的演讲实录

Paddle Mobile框架概览

技术分享图片
图一: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 文件, 其余为参数文件。

技术分享图片

图二:模型

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

技术分享图片

图三:op融合

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

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

技术分享图片

图四:平台

不同平台的 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从学术到上线的打通工作,推动技术实现到业务落地。

jquery实现简单的搜索

对一个简单的ul列表进行输入框的搜索功能,搜索之前及搜索后显示效果如下:用到的主要jquery技术有filter()和match()方法以及正则匹配,基础HTML+div设置:<divclass="nav_Element_Item"><h2>数据名称:</h2><divclass="data_search_div... 查看详情

android开源实战:手把手带你实现一个简单好用的搜索框(含历史搜索记录)

...多自定义样式的EditText自定义控件具体请看我的另外一个简单&好用的开源组件:Android自定义EditText:手把手教你做一款含一键删除&自定义样式的SuperEditText分析2:SearchListView.java分析3:search_layout.xml分析4:ICallBack.java、bCallB... 查看详情

jquery实现简单前端搜索功能

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>工程轻量化与可靠性技术实验室</title></head><body><divclass="content-right"><inputtype="text"&g 查看详情

php怎么实现搜索高亮,注意是分开的字符

...'helloworld'这个字符里搜索'hw'并替换(这只是个简单的例子)具体的请看图片图片中(php)、(搜索)、(高亮)这些字符都变红了请问技术大牛们怎么实现替换分开的字符这个是使用正则匹配的。第一你得判断要飘红... 查看详情

搜索框实现模糊查询方法-js

...组中的元素进行检索并查询出所需的结果,通过如下方式简单实现了一个小的模糊查询,具体如下:首先,用到了两个方法1.对数组通过filter的方式遍历查询搜索的key2.对遍历出的结果进行字符串的模糊查询str.indexOf("xxx")!... 查看详情

mysql怎么实现全局的模糊搜索?

...y里都把3有关的内容都检索出来呢?请指教参考技术A比较简单的方式,可以对id,username,money这些需要检索的字段,创建全文索引,然后通过全文索引来查询 参考技术B需要进行mysql单表多字段模糊查询的字段合并成一个字串并加入到一... 查看详情

快捷搜索框(uisearchbar)简单实现swift

1.在故事板里面拖入一个搜索栏和一个的tableView。2.创建的ViewController,实现代理:UISearchBarDelegate,UITableViewDataSource,的UITableViewDelegate。代码实现如下://的tableview代理方法扩展的ViewController:UITableViewDataSource,{的UITableViewDelegat 查看详情

docker实现elasticsearch集群实战

...为其核心来实现所有索引和搜索的功能。它的目的是通过简单的RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。他与Logstash及Kibana开源项目结合,形成了ELK的软件栈。简单地说,Logstash负责数据的采集,处理(丰富数据... 查看详情

android动态搜索的简单实现(代码片段)

系列文章目录Android动态搜索的简单实现文章最后有源码文章目录系列文章目录前言一、addTextChangedListener二、本文案例1.介绍一下SearchView的一些方法2.准备数据3.初始化以及填充数据4.在SearchView中用户输入字符时激发方法里写入简... 查看详情

如何使用 php 和 mySQL 实现简单的站点搜索?

】如何使用php和mySQL实现简单的站点搜索?【英文标题】:HowwouldIimplementasimplesitesearchwithphpandmySQL?【发布时间】:2010-09-2801:34:29【问题描述】:我正在创建一个允许用户提交报价的网站。我将如何创建一个(相对简单?)返回最... 查看详情

reactnative用scrollview简单实现吸顶隐藏导航栏

参考技术A在ScrollView顶部嵌套一个Nav导航栏和一个搜索框,stickyHeaderIndices=[1]让搜索框吸顶固定。此时已经可以实现吸顶,但还可处理一下,滑动一半便停下的情况。先给ref方便调用它的方法。onScrollEndDrag=this.onStop处理 查看详情

paddlepaddle-github的正确打开姿势

...。由于在Python调用时的包名叫Paddle,仓库遂起名叫Paddle。PaddleMobile:PaddleMobile是移动端及嵌入式设备的深度学习框架。他与PaddlePaddle框架紧密结合,减少中间翻译造成的性能损失,使得运行PaddlePaddle模型时运行性能极高,兼容设... 查看详情

elementuitable实现搜索关键字高亮显示

...数据高亮显示关键字的方法。实现该功能的方法实际非常简单,就是讲后台获得的数据过滤筛选将满足条件的数据展示出来。 查看详情

搜索技术---solr

solr企业站内搜索技术选型在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快、搜索结果按相关度排序、搜索内容格式不固定等... 查看详情

【js】简单理解节流与防抖,搜索框的场景

参考技术A在输入框输入时,要搜索某个字符串,基于性能考虑,肯定不能用户没输入一个字符就发送一次搜索请求,一种方法就是等待用户停止输入,比如过了500ms用户都没有再输入,那么就搜索此时的字符串,这就是防抖;节... 查看详情

京东万象--新闻接口实现简单的新闻app

参考技术A--本次实战案例,是使用三方接口(京东万象),实现新闻浏览的功能。项目耗时--版本1--12小时主要功能--搜索新闻,浏览新闻,新闻分类获取。安卓app框架:rxjava+retrofit+mvp程序运行截图:本软件--安卓端,功能并不多... 查看详情

pythonpython中二进制搜索树的简单实现(代码片段)

查看详情

用cmd命令实现一个简单的网页搜索(代码片段)

两年前搞的,今天无意找到了原理其实就是跳转到了百度的搜索页。代码如下:@echoofftitle搜索color03mode80,20echo《——————————————————————————————————————》set/pa=请输入你要搜... 查看详情