Paddle Lite端侧部署
Paddle Lite端侧部署
端侧推理引擎的由来
随着深度学习的快速发展、特别是小型网络模型的不断成熟,原本应用到云端的深度学习推理,就可以放到终端上来做,比如手机、手表、摄像头、传感器、音响,也就是端智能。此外,可用于深度学习计算的硬件也有井喷之势,从Intel到Nvidia、ARM、Mali,再到国产的寒武纪等等。
相比服务端智能,端智能具有低延时、省云端资源、保护数据隐私等优势。目前端智能正逐渐变为趋势,从业界来看,它已经在AI摄像、视觉特效等场景发挥了巨大价值。深度学习推理场景中,多样的平台,不同的硬件,对推理库的能力提出了更高的要求。端侧模型的推理经常面临算力和内存的限制,加上日趋异构化的硬件平台和复杂的端侧使用状况,导致端侧推理引擎的架构能力颇受挑战。
端侧推理引擎是端智能应用的核心模块,需要在有限算力、有限内存等限制下,高效地利用资源,快速完成推理。可以说,端侧推理引擎实现的优劣,直接决定了算法模型能否在端侧运行,决定了业务能否上线。因此,希望提供面向不同业务算法场景,不同训练框架,不同部署环境的简单、高效、安全的端侧推理引擎。
图2 支持多种硬件、操作系统和编程接口
Paddle Lite是什么
Paddle Lite是飞桨自研的新一代端侧推理推理框架,支持PaddlePaddle/TensorFlow/Caffe/ONNX模型的推理部署,目前已经支持ARM CPU, Mali GPU, Adreno GPU, Huawei NPU等多种硬件,正在逐步增加X86 CPU, Nvidia GPU 等多款硬件,相关硬件性能业内领先。截止到现在,Paddle
Lite已广泛应用于搜索广告、手机百度、百度地图、全民小视频等多个公司重点业务。
Paddle Lite具备以下几个特点:
- 多平台:不同于其他的推理引擎,Paddle Lite依托飞桨训练框架及其对应的丰富完整的算子库,底层算子计算逻辑与训练严格一致,模型完全兼容无风险。支持PaddlePaddle、TensorFlow、Caffe、ONNX等多种平台的主流模型格式;支持MobileNetV1、YoloV3、UNet、SqueezeNet等主流模型;对Int8量化模型有很好的支持。同时,可以支持端侧多个平台,比如Android,
iOS, ArmLinux等。 - 多硬件:目前支持 ARM CPU, Mali GPU, Adreno GPU, 华为NPU,X86 CPU, NVIDIA GPU、FPGA等多种硬件平台,是目前首个支持华为NPU在线编译的深度学习推理框架。Paddle Lite可以完整承担深度学习模型在不同硬件平台上的的推理部署需求,从而保障了硬件的支持能力。
- 高性能:通过底层计算模式的建模,增加了多种计算模式(硬件、量化方法、Data Layout)混合调度的完备性设计;对不同硬件进行针对性优化,充分挖掘硬件性能极致,在推理速度上全面超越业界。
- 轻量级:提供Model Optimize Tool对模型进行优化,其中包含诸如量化、融合、Kernel优选等优化手段,优化后的模型更轻量级,耗费资源更少,从而执行速度也更快。同时,Paddle Lite支持分析阶段与执行阶段分离,线下模型优化,线上模型部署,部署不依赖于任何第三方库。
- 量化:可以分为静态离线量化和动态离线量化。静态离线量化是指使用少量校准数据计算量化因子,快速得到量化模型。使用该量化模型进行预测,可以减少计算量、降低计算内存、减小模型大小。动态离线量化是指将模型中特定OP的权重从FP32类型量化成INT8/16类型,减少模型的大小。
- 融合:将多个连续OP融合成单个等效OP,或者将专属于某个硬件的OP融合为一个子图,只有这部分子图运行在指定的硬件上,减少数据交换并简化图结构。例如将NPU相关的op融合为一个子图,这个子图的计算都在NPU上进行,其它OP的计算在CPU或GPU上进行。
- Kernel优选:OP的具体实现需要依赖Kernel,每个OP基于不同的硬件或同一硬件不同版本可以选择不同的Kernel。Paddle Lite可以基于策略优选合适的Kernel来进行计算。
- 简单易用:支持C++、Java、Python多种编程语言的编程接口。
图2 多种推理终端和多种推理硬件层出不穷
Paddle Lite推理流程
使用Paddle Lite对模型进行部署推理的流程分以下阶段:
- 模型训练阶段:主要解决模型训练,利用标注数据训练出对应的模型文件。面向端侧进行模型设计时,需要考虑模型大小和计算量。
- 模型部署阶段:
a) 获取模型:用户可以直接使用飞桨训练出的模型进行部署,也可以使用Caffe,
TensorFlow或ONNX平台训练的模型,需要使用X2Paddle工具将其它框架训练的模型转换到Paddle格式。
b) (可选)模型压缩:主要优化模型大小,借助PaddleSlim提供的剪枝、量化等手段降低模型大小,以便在端上使用。
c) 通过Model Optimize Tool将模型转换为Paddle lite的nb模型,然后开始部署。
d) 在终端上通过调用Paddle Lite提供的API接口(提供C++、Java、Python等API接口),完成推理相关的所有计算。
图3 部署流程
Paddle Lite支持的模型
Paddle Lite目前已严格验证28个模型的精度和性能,对视觉类模型做到了较为充分的支持,覆盖分类、检测、分割等多个领域,包含了特色的OCR模型的支持,并在不断丰富中。其支持的list如下:
注意:
- 模型列表中 * 代表该模型链接来自PaddlePaddle/models,否则为推理模型的下载链接
- 支持平台列表中 NPU* 代表ARM+NPU异构计算,否则为NPU计算
Paddle Lite Demo
为用户准备了多个完整的Paddle Lite Demo,方便用户直接使用Demo调用Paddle Lite进行体验,也可以发挥想象对Demo进行二次开发。Paddle Lite Demo覆盖Android、iOS和Armlinux三大平台,涵盖人脸识别、人像分割、图像分类、目标检测、基于视频流的人脸检测+口罩识别等多个应用场景。
1. 人脸识别
人脸识别是Paddle
Lite提供的人脸识别Demo。在移动端上提供了高精度、实时的人脸检测、人脸关键点定位等能力,能处理基于人脸检测的业务场景。在移动端推理的效果图如下:
2. 人像分割
人像分割是Paddle Lite 提供的图像分割Demo。在移动端上提供了实时的人像分割能力,可以应用证件照自动抠图、面积测量、智能交通(标记车道和交通标志)等场景。
在移动端推理的效果图如下:
3. 图像分类
图像分类是Paddle Lite 提供的图像处理Demo。在移动端上提供了实时的物体识别能力,可以应用到生产线自动分拣或质检、识别医疗图像、辅助医生肉眼诊断等场景。在移动端推理的效果图如下:
4. 目标检测
目标检测是Paddle Lite 提供的图像识别Demo。在移动端上提供了检测多个物体的位置、名称、位置及数量的能力。可以应用到视频监控(是否有违规物体或行为)、工业质检(微小瑕疵的数量和位置)、医疗诊断(细胞计数、中药识别)等场景。在移动端推理的效果图如下:
5. 基于视频流的人脸检测+口罩识别
基于视频流的人脸检测+口罩识别是Paddle Lite 是在疫情期间提供的在戴口罩与否下人脸识别Demo。在移动端上提供了是否佩戴口罩识别、高精度和实时的人脸检测等能力,能处理多种场景下人脸检测业务,如戴口罩下人脸检测。在移动端推理的效果图如下:
Paddle Lite Demo在不同平台下的操作方法稍有不同,下面以目标检测Demo为例,分别介绍如何在Android和iOS平台进行部署。
Android平台实战
Android demo部署方法
以 目标检测Demo(object_detection_demo) 为例,讲解如何部署Android工程。将基于Paddle
Lite推理库的Android Demo部署到Android手机,实现目标检测。
环境准备
- 一部Android手机(开启USB调试模式)
- 一根数据线
- 已制作好的Paddle Lite
Demo - 电脑一台:安装Android Studio
部署步骤
- 下载Paddle-Lite-Demo,存放地址为: Paddle-Lite-Demo\PaddleLite-android-demo\object_detection_demo。
- 用Android Studio 打开object_detection_demo工程
(本步骤需要联网)。 - 手机连接电脑,打开USB调试和文件传输模式,在Android Studio上连接自己的手机设备(手机需要开启允许从USB安装软件权限)。
4. 按下Run按钮,自动编译APP并安装到手机。(该过程会自动下载Paddle Lite推理库和模型,需要联网)。成功后效果如下,左图是APP安装到手机,右图是APP打开后的效果,会自动识别图片中的物体并标记。
Android demo结构讲解
Android demo的代码结构如下所示:
- Predictor.java:推理代码
# 位置:
object_detection_demo/app/src/main/java/com/baidu/paddle/lite/demo/object_detection/Predictor.java
- model.nb:模型文件 (opt 工具转化后Paddle-Lite模型);pascalvoc_label_list:训练模型时的labels文件
# 位置:
object_detection_demo/app/src/main/assets/models/ssd_mobilenet_v1_pascalvoc_for_cpu/model.nb
object_detection_demo/app/src/main/assets/labels/pascalvoc_label_list
- libpaddle_lite_jni.so、PaddlePredictor.jar: Paddle-Lite Java 推理库与Jar包
# 位置
object_detection_demo/app/src/main/jniLibs/arm64-v8a/libpaddle_lite_jni.so
object_detection_demo/app/libs/PaddlePredictor.jar
- build.gradle:定义编译过程的 gradle 脚本。(不用改动,定义了自动下载Paddle-Lite推理和模型的过程)
# 位置
object_detection_demo/app/build.gradle
Paddle Lite Java API使用指南
Android demo基于Java API开发,调用Paddle Lite Java
API包括以下五步。更详细的API描述参考:Paddle Lite Java API。
// 导入Java API
import com.baidu.paddle.lite.MobileConfig;
import com.baidu.paddle.lite.Tensor;
import com.baidu.paddle.lite.Predictor;
import com.baidu.paddle.lite.PowerMode;
// 1. 写入配置:设置MobileConfig
MobileConfig
config = new MobileConfig();
config.setModelFromFile(<modelPath>);
// 设置Paddle Lite模型路径
config.setPowerMode(PowerMode.LITE_POWER_NO_BIND);
// 设置CPU运行模式
config.setThreads(4); // 设置工作线程数
// 2. 创建 PaddlePredictor
PaddlePredictor
predictor = PaddlePredictor.createPaddlePredictor(config);
// 3. 设置输入数据
long[] dims = {100, 100};
float[] inputBuffer = new float[10000];
for (int i = 0; i < 10000; ++i) {
inputBuffer[i] = i;
}
Tensor
input = predictor.getInput(0);
input.resize(dims);
input.setData(inputBuffer);
// 4. 执行推理
predictor.run();
// 5. 获取输出数据
Tensor
output = predictor.getOutput(0);
float[] output = result.getFloatData();
for (int i = 0; i < 1000; ++i) {
System.out.println(output[i]);
}
如何替换Android demo中的模型
本节详细讲解如何替换“目标检测”demo中的模型(比如替换为“人脸检测”模型),并将模型部署到Android
demo。
替换简述:替换demo中的模型和label文件,并修改推理代码Predictor.java。
- 安装paddle-lite 的opt python工具 Linux、Mac、Windows环境支持直接从pip安装paddle-lite工具,安装后可以在python 端调用paddlelite预测工具和模型转换工具opt
pip install paddlelite
- 使用opt工具转化模型。
在终端执行下面命令完成转化。
# 假设模型在当前路径下的`./ssd_mobilenet_v1_pascalvoc`。
paddle_lite_opt
\
--model_dir=./ssd_mobilenet_v1_pascalvoc \
--optimize_out_type=naive_buffer \
--optimize_out=./ssd_mobilenet_v1_pascalvoc_opt \
--valid_targets=arm
转化过程与结果如下图所示:ssd_mobilenet_v1_pascalvoc_opt.nb为转化结果
opt 参数说明:
- 替换模型和相应的label文件 用转化后的model文件和label文件替换Android Demo中的对应位置。
- 修改predictor.java文件。一般需要修改代码中的“模型名称”和输入的shape。
- 参考“Android Demo部署方法”,重新构建并运行Android demo。
如何替换Demo中的Paddle Lite推理库
如果您想替换Demo中的Paddle Lite推理库(如想修改推理库版本),你可以在Paddle Lite relase界面下载指定版本的推理库并替换。
1.下载Paddle Lite预编译库
推理库下载界面位于Paddle Lite官方预编译库,可根据需求选择合适版本。
以Android-ARMv8架构为例,可以下载以下版本。
**解压后内容如下图所示。
说明: libpaddle_lite_jni.so是Java推理库文件,位于inference_lite_lib.android.armv8/java/so/libpaddle_lite_jni.so PaddlePredictor.jar是Java推理库对应的Jar文件,位于inference_lite_lib.android.armv8/java/jar/PaddlePredictor.jar
- 用新下载的libpaddle_lite_jni.so 和PaddlePredictor.jar替换demo中的推理库文件。
mkdir
app/src/main/jniLibs/arm64-v8a
cp
inference_lite_lib.android.armv8/java/so/libpaddle_lite_jni.so ./app/src/main/jniLibs/arm64-v8a
cp
inference_lite_lib.android.armv8/java/jar/PaddlePredictor.jar ./app/libs/
iOS平台目标检测实战
iOS demo部署方法
以 目标检测Demo(object_detection_demo) 为例,讲解如何部署iOS工程。将基于Paddle Lite推理库的iOS Demo部署到苹果手机,实现目标检测。
环境准备
- 一部iPhone手机(开启USB调试模式)
- 一根数据线
- 已制作好的Paddle-Lite-Demo工程
- Mac电脑一台:安装Xcode
部署步骤
- 目标检测的iOS示例位于 Paddle-Lite-Demo\PaddleLite-ios-demo\object_detection_demo。
- 终端中执行 download_dependencies.sh脚本自动下载模型和Paddle-Lite推理库。
cd
PaddleLite-ios-demo # 终端中进入
Paddle-Lite-Demo\PaddleLite-ios-demo
sh
download_dependencies.sh # 执行脚本下载依赖项 (需要联网)
下载完成后会出现提示: Extract done
- 用Xcode打开object_detection_demo/detection_demo.xcodeproj文件,修改工程配置。 依次修改 General/Identity和Signing&Capabilities属性,替换为自己的工程代号和团队名称。(必须修改,不然无法通过编译)
- iPhone手机连接电脑,在Xcode中连接自己的手机 (第一次连接IPhone到电脑时,需要在IPhone的设置->通用->设备管理中选择本电脑并信任)。
- 按下左上角的 Run按钮,自动编译APP并安装到手机。在苹果手机中设置信任该APP(进入设置->通用->设备管理,选中新安装的APP并验证该应用)。
成功后效果如下,左图:APP安装到手机 ,右图: APP打开后的效果,会自动识别图片中的物体并标记。
iOS demo结构讲解
iOS 示例的代码结构如下所示。
- mobilenetv1-ssd: 模型文件 (opt 工具转化后Paddle-Lite模型)
# 位置:
ios-detection_demo/detection_demo/models/mobilenetv1-ssd
2.libpaddle_api_light_bundled.a、paddle_api.h :
Paddle-Lite C++ 推理库和头文件
# 位置:
# iOS推理库
ios-detection_demo/detection_demo/lib/libpaddle_api_light_bundled.a
# 推理库头文件
ios-detection_demo/detection_demo/include/paddle_api.h
ios-detection_demo/detection_demo/include/paddle_use_kernels.h
ios-detection_demo/detection_demo/include/paddle_use_ops.h
- ViewController.mm:主要推理代码
# 位置
ios-detection_demo/detection_demo/ViewController.mm
Paddle-Lite C++ API使用指南
IOS Demo基于C++ API 开发,调用Paddle-Lite C++
API包括以下五步。更详细的API 描述参考: Paddle Lite C++ API。
#include <iostream>
// 引入C++ API
#include "paddle_api.h"
// 1. 设置MobileConfig
MobileConfig
config;
config.set_model_from_file(<modelPath>);
// 设置NaiveBuffer格式模型路径
config.set_power_mode(LITE_POWER_NO_BIND);
// 设置CPU运行模式
config.set_threads(4); // 设置工作线程数
// 2. 创建PaddlePredictor
std::shared_ptr<PaddlePredictor>
predictor = CreatePaddlePredictor<MobileConfig>(config);
// 3. 设置输入数据
std::unique_ptr<Tensor>
input_tensor(std::move(predictor->GetInput(0)));
input_tensor->Resize({1, 3, 224, 224});
auto* data = input_tensor->mutable_data<float>();
for (int i = 0; i <
ShapeProduction(input_tensor->shape()); ++i) {
data[i] = 1;
}
// 4. 执行推理
predictor->run();
// 5. 获取输出数据
std::unique_ptr<const Tensor> output_tensor(std::move(predictor->GetOutput(0)));
std::cout
<< "Output
shape " <<
output_tensor->shape()[1] << std::endl;
for (int i = 0; i <
ShapeProduction(output_tensor->shape()); i += 100) {
std::cout << "Output[" << i << "]: " << output_tensor->data<float>()[i]
<< std::endl;
}
如何替换iOS demo 中的模型
- 替换推理库 将预编译库中的libpaddle_api_light_bundled.a, 拷入到ios-detection_demo工程下的detection_demo/lib/文件夹。
说明:libpaddle_api_light_bundled.a是C++推理库文件,位于inference_lite_lib.ios64.armv8/lib/libpaddle_api_light_bundled.a
可以手动复制也可以用下面命令在终端中执行:
# 终端中复制方法:假设`inference_lite_lib.ios64.armv8`为预编译库地址
cp
inference_lite_lib.ios64.armv8/lib/libpaddle_api_light_bundled.a ./detection_demo/lib/
- 替换推理库头文件 将预编译库中的inference_lite_lib.ios64.armv8/include/下的所有.h文件, 拷入到ios-detection_demo工程下的paddle_lite文件夹下。
说明:inference_lite_lib.ios64.armv8/include/下的.h文件是C++ 推理库的头文件。
可以手动复制也可以用下面命令在终端中执行:
# 终端中复制方法:假设`inference_lite_lib.ios64.armv8为预编译库地址
cp
inference_lite_lib.ios64.armv8/include/*
detection_demo/paddle_lite/
- 替换模型 将转化后的移动端模型ssd_mobilenet_v1_pascalvoc_opt.nb, 拷入到ios-detection_demo工程下的detection_demo/models/文件夹。
可以手动复制也可以用下面命令在终端中执行:
# 终端中复制方法:假设优化后的模型位置为`ssd_mobilenet_v1_pascalvoc_opt.nb`
cp ssd_mobilenet_v1_pascalvoc.nb
./detection_demo/models/
4.重新构建和运行构建iOS工程。
Paddle Lite端侧部署的更多相关文章
- 阿里开源!轻量级深度学习端侧推理引擎 MNN
阿里妹导读:近日,阿里正式开源轻量级深度学习端侧推理引擎“MNN”. AI科学家贾扬清如此评价道:“与 Tensorflow.Caffe2 等同时覆盖训练和推理的通用框架相比,MNN 更注重在推理时的 ...
- CAS单点登录(SSO)服务端的部署和配置---连接MySQL进行身份认证
一.修改系统host,加入 127.0.0.1 server.test.com127.0.0.1 client1.test.com127.0.0.1 client2.test.com 二.安装grad ...
- 媒介查询兼容各种端口的响应式范围取值(移动端、PC端、ipad、移动端侧屏)
!!!(chrome作者亲测)!!!数据仅供参考 /*ipad*/@media screen and (min-width:760px) and (max-width:1000px) /*移动端*/@ ...
- COCOS2D-JS入门-web端项目部署
下载cocos2d-js文件,建议上官网下载(外国官网或者中国官网都可以) 外国官网:http://cocos2d-x.org/download(选择最新版即可,我下载时为3.9版本,大概300多M) ...
- Zabbix 3.4 服务端安装部署
关于zabbix的安装部署官方也提供了详细的安装文档,链接如下: https://www.zabbix.com/download 选择zabbix的版本,服务器平台及使用的数据库 安装和配置zabbi ...
- Windows 之 手机访问 PC 端本地部署的站点
测试网页在手机上的显示工具我们可以使用谷歌内核的浏览器,打开开发者工具(F12),在device那里选择设备,然后刷新来查看网页在手机上的显示效果. 但毕竟是模拟的,如果想要在真机上调试该怎么办呢. ...
- Ansible实现zabbix服务器agent端批量部署
项目需求:由于搭建zabbix,需要每台服务器都需要安装监控端(agent)正常的的操作是一台一台去安装,这样确实有点浪费时间,这里为大家准备了一款开源 的自动化运维工具Ansible,相信大家也很熟 ...
- linux--后端项目部署
nginx + uwsgi + crm + mysql + virtualenv + supervisor项目部署 1.后端整起,用uwsgi启动crm 2.创建一个新的虚拟环境,用于运行crm新业务 ...
- zabbix服务端的部署及zabbix简单介绍
Zabbix企业级监控方案--服务端部署 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix 能监视各种网络参数,保证服务器系统的安全运营 ...
随机推荐
- 4-1 Postman脚本的应用
前面我们讲解了在接口发送每个请求,得到响应.这是接口本身的问题.但是"请求前后"的动作,是怎么处理的?比如在发送一个请求前,需要获取当前的时间戳,或者对我们的变量进行参数化,设置变 ...
- 【日志追踪】(微服务应用和单体应用)-logback中的MDC机制
一.MDC介绍 MDC(Mapped Diagnostic Contexts)映射诊断上下文,该特征是logback提供的一种方便在多线程条件下的记录日志的功能, 某些应用程序采用多线程的方式来处理多 ...
- hdu4536 水搜索
题意: XCOM Enemy Unknown Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- POJ2406简单KMP
题意: 给一个字符串,求最大的前缀循环周期,就是最小的循环节对应的最大的那个周期. 思路: KMP的简单应用,求完next数组后有这样的应用:next[i] :是最大循环节的第几位 ...
- 逆向 stdio.h 函数库 fopen 函数(调试版本)
0x01 fopen 函数 函数原型:FILE *fopen(const char *filename, const char *mode) 返回值为 FILE 类型 函数功能:使用给定的模式 mod ...
- 6 JDBC
JDBC 理解图 需要mysql包 下载官网:https://downloads.mysql.com/archives/c-j/ 第一个JDBC项目 创建一个java项目,一路next 导入jar包 ...
- jenkins 下使用ansible 跨服务器控制操作
例如: A服务器地址:172.16.1.203 B服务器地址:172.16.1.204 当jenkins 在A 服务器并且用户aa, 控制B 服务器的用户bb的操作 (1)B服务器 用ssh-key ...
- .Net Core平台下,添加包的引用
一个程序的开发过程中离不开对程序集(Assembly,将程序集打包好,就成为一个.dll的包文件,它也叫动态链接库(Dynamic Link Library))的依赖,在以前ASP.Net时代,微软 ...
- 一道VM的逆向所引发的符号执行思路
逆向虚拟机保护 虚拟机保护类的题目需要找到虚拟机的vm_code(字节码),各个handler,然后进一步分析虚拟机保护代码的流程. 用IDA打开程序,经分析后0x403040全局变量地址处存储的就是 ...
- zimbra安装ssl证书
zimbra在后台安装证书签发机构签发证书出现时候出现错误:{RemoteManager: mail.domain.com->zimbra@mail.domain.com:22} com.zim ...