Paddle Lite为Paddle-Mobile的升级版,定位支持包括手机移动端在内更多场景的轻量化高效预测
Paddle Lite为Paddle-Mobile的升级版,定位支持包括手机移动端在内更多场景的轻量化高效预测,支持更广泛的硬件和平台,是一个高性能、轻量级的深度学习预测引擎。在保持和PaddlePaddle无缝对接外,也兼容支持其他训练框架产出的模型。Release Note
重点功能
-
新增 CUDA 预测支持, 兼容模型列表如下:
- INT8 量化模型
- yolov3,P4下性能为30ms/image.
- FP32模型
- yolov3
- alexnet
- unet
- INT8 量化模型
-
支持 Nvidia Jetson TX2 的CUDA 编译和部署,支持的模型如下:
- yolov3 fp32
- alexnet fp32
- unet fp32
-
初步支持 X86 CPU 预测部署,支持 inception v4, googlenet, resnet50 等3个模型
-
增加 Python API 支持,已经在 ARM Linux 和 CUDA 上验证
-
支持根据模型极致裁剪动态库,可以极大压缩单个模型的手机端ARM CPU预测库,详细方法参考 here.
-
ARM CPU INT8 量化模型预测支持加强,增加以下模型支持
- shufflenetv2
- mobilenet-ssd
- vgg16
- googlenet
-
ARM CPU FP32 新增如下模型支持
- transformer
- facebox
- blazeface
facebox和blazeface的模型可从Paddle/Models仓库下获取,得到的训练格式的模型,还需转换成inference格式。以blazeface_original为例,转换过程如下
git clone https://github.com/PaddlePaddle/models.git
cd mode/PaddleCV/PaddleDetection
pip install -r requirements.txt
# 将下载的模型放到yml指定目录
mkdir -p output/blazeface/ && cd output/blazeface/
wget https://paddlemodels.bj.bcebos.com/object_detection/blazeface_original.tar
tar -xvf blazeface_original.tar && mv blazeface_original model_final && cd ../../
# 模型格式转换
export PYTHONPATH=`pwd`:$PYTHONPATH
python tools/export_model.py --output_dir=_inference_model_dir> --config=configs/face_detection/blazeface.yml
基础功能
-
接口去除 prefered place。框架中移除prefered place 概念及相应接口,改为使用 place 在valid place列表中的排序来标识用户对执行place偏好,在valid place列表中排序越靠前代表对此place的偏好越强。#2192
-
增加算子版本,与 Paddle 训练版本对应 #2243
- 对齐 Lite 与 Paddle 的框架 ProtoBuf 数据结构定义,
- 添加设定算子版本的接口,算子版本号与 Paddle 框架版本号格式一致(三位小数组成的字符串,如 "1.5.0"),在注册时进行设定。
示例:
REGISTER_LITE_KERNEL(leaky_relu, kCUDA, kFloat, kNCHW,
paddle::lite::kernels::cuda::LeakyReluCompute,
def)
.BindInput("X", {LiteType::GetTensorTy(TARGET(kCUDA))})
.BindOutput("Out", {LiteType::GetTensorTy(TARGET(kCUDA))})
.SetVersion("1.5.0")
.Finalize();
- 运行期间跳过feed fetch op,减少硬件之间的数据拷贝
- 新增预测相关4个API接口,详细可以参考 C++ API List
- 新增CUDA GPU op
- yolobox
- transpose
- concat
- nearest_interp
- elementwise_add
- scale
- dropout
- softmax
- pool2d
- bilinear_interp
- mul
- conv2d
编译
-
ARM Linux在full publish模式下增加生成动态链接库,tiny publish模式下不再生成静态库,而改为生成动态链接库。
-
Mac环境下支持full_publish编译(Android)
- 需要将mac的cmake版本设置为cmake 3.10
- 如果出现问题:
Too many open files
,使用下面命令修改最大可打开文件数ulimit -n 1024
- 注意:full_publish编译时,项目不能有中文路径
性能
文档
Demo
- 增加树莓派案例:ARM Linux 图像识别和目标检测DEMO,支持摄像头采集图像,并提供armv7hf&armv8预编译的动态链接库。
Bug修复
- 修复加载 naive buffer 模型内存占用过大问题
- naive buffer 格式的vgg16、inceptionv4、yolov3 模型均验证通过
- 修复
model_optimize_tool
优化后模型变大问题 - 修复
static_pick_kernel
pass中,没有初始化kernel_pick_factors_
#2158 - 修复
type_layout_cast_pass
中,选中kernel的变量名写错 #2158 - 修复
op_registry
中注册 kernel 时,没有考虑layout #2158 - 修复conv transpose bug #2165
- 修复arm fc多batch计算错误#2244
- 修复arm int8 gemv bug #2249
Release Note
功能加强
-
model_optimize_tool
改成在 host 上执行——现在无需在 ARM (手机)上执行,直接在编译机上执行便可;功能和命令行参数不变 -
新增支持 INT8 模型以 Int8 格式存储和载入,显著降低 APP 中模型体积
优化前 optimize tool保存为int8 格式后 MobileNetV1_quant 17M 5.3M MobileNetV2_quant 15M 5.1M ResNet50_quant 100M 27M -
新增内存优化能力
- 原理:在模型预测期间,每个Op的输出Tensor都分别占用一定的内存。对中间输出Tensor的生存期进行分析,如果任意两个Tensor在生存期上没有重叠,那么这两个Tensor可以复用一块内存,从而可以降低模型预测期间的整体内存占用。
- 效果:batch 为1 的情况下对模型的的内存占用测试如下
模型 内存复用效果(memory/original) Mobilentev1 78% Mobilenetv2 67% Resnet50 82% Mobilenetv1_int8 82% Mobillenet_SSD 71% -
增加int8模型支持,增加支持模型 Resnet50-int8
-
新增版本信息输出功能
- 增加接口
- C++ API在PaddlePredictor中增加
std::string GetVersion()
接口用于返回当前lib使用的代码版本。 - Java API在PaddlePredictor中增加
public String getVersion()
接口用于返回当前lib使用的代码版本。 - 详细信息可以参考 C++ API 文档 和 Java API文档
- C++ API在PaddlePredictor中增加
- 返回值说明
- 若编译当前lib的代码有相关tag,则返回
tag
- 若编译当前lib的代码没有相关tag,则返回
branch(commitid)
- 若编译当前lib的代码有相关tag,则返回
- 增加接口
-
ARM Linux支持
- 修复ARM Linux编译问题,新增Ubuntu Host端交叉编译和开发板本地编译,具体参见源码编译指南
- 已支持并验证树莓派3B和RK3399开发板
模型及多框架支持
- 加强华为NPU的支持
- 新增pad2d Op
- 新增MobileNet V2, ShuffleNet V2和Unet模型的支持
- 加强多框架支持(通过 X2Paddle)
- 新增onnx 模型支持
- 扩展tensorlfow模型支持
- 加强caffe模型支持
- 官方测试过的模型及框架支持如下
模型 | paddle fluid | caffe | tensorflow | onnx |
---|---|---|---|---|
mobilenetv1 | Y | Y | Y | |
mobilenetv2 | Y | Y | Y | Y |
resnet18 | Y | Y | Y | |
resnet50 | Y | Y | Y | Y |
mnasnet | Y | Y | Y | |
efficientnet | Y | Y | Y | Y |
squeezenetv1.1 | Y | Y | Y | |
shufflenet | Y | Y | Y | |
mobilenet_ssd | Y | Y | Y | |
mobilenet_yolov3 | Y | Y | ||
inceptionv4 | Y | |||
mtcnn | Y | Y | Y | |
facedetection | Y | Y | ||
unet | Y | Y | Y | |
ocr_attention | Y | |||
vgg16 | Y |
- ARM CPU 新增支持模型 5 个
- 新增支持 Faster RCNN 模型
- 新增支持 FaceDetection 模型
- 新增支持 SSD_ShufflenetV2_FPN 模型
- 新增支持 SSD_MobilenetV3_FPN 模型
- 新增支持Yolov3_Int8模型
- 新增算子 36 个,以更好地支持更广模型及多种框架
- affine_channel
- anchor_generator
- assign
- assign_value
- box_clip
- elementwise_div
- equal
- expand
- fake_quantize_range_abs_max
- fill_constant_batch_size_like
- flatten
- flatten2
- floor
- fusion_elementwise_div_activation
- generate_proposals
- greater_equal
- greater_than
- hard_sigmoid
- less_equal
- logical_not
- logical_or
- matmul
- mean
- notequal
- range
- reduce_mean
- relu6
- roi_align
- sequence_expand_as
- squeeze
- squeeze2
- stack
- uniform_random
- unsqueeze
- unsqueeze2
编译完善
- 新增
tiny_publish
编译模式下输出 Android C++ 动态链接库- 编译时选择
--arm_os=android
可编译出Android C++动态链接库文件 - 动态链接库位置(以armv8为例):
Paddle-Lit/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/cxx/lib
- 动态链接库文件:
- libpaddle_light_api_shared.so : 只包含包含light_api接口
- libpaddle_full_api_shared.so : 包含所有功能, light_api接口和full_api接口
- 编译说明:
- tiny_publish只编译出 libpaddle_light_api_shared.so 文件
- full_publish编译出 libpaddle_light_api_shared.so和libpaddle_full_api_shared.so
- 编译时选择
- 新增发布 FPGA 预测包
文档
- 文档改为使用 github pages,新文档地址 https://paddlepaddle.github.io/Paddle-Lite/
- 完善了 源码编译指南,增加ARM Linux设备端本地编译;
- 增加了C++ API文档 和 Java API文档 ,详细列举了所有用户API 及描述
DEMO
- 新增ios/Android mobilenetv1-ssd 检测demo
- Android新增支持NPU的、基于Light API的图像分类demo,并提供预编译的、支持NPU和CPU的Light API jni库
bugfix
- 修复
model_optimize_tool
优化 attention 模型出错及优化后不能运行的问题 - 修复 clang编译bug
- 修复PriorBox op中存在的bug
- 修复编译脚本,取消默认编译单测
- 修改kernel的相关冗余代码及计算bug
Assets
8
Release Note
功能
- 新增以下OP以支持更多X2Paddle 转换的模型:
- exp
- elementwise_div
- assign
- floor
- stack
- reduce_mean
- matmul
- expand
- squeeze
编译
框架
MobileConfig
新增接口支持从内存中加载模型
void set_model_buffer(const char* model_buffer,
size_t model_buffer_size,
const char* param_buffer,
size_t param_buffer_size)
示例:
lite_api::MobileConfig config;
config.set_model_buffer(
model_buffer.c_str(), size_model, params_buffer.c_str(), size_params);
auto predictor = lite_api::CreatePaddlePredictor(config);
文档
- 完善了 源码编译指南,增加了 Docker环境编译ARM Linux的说明;添加ios编译说明文档
- 完善Paddle-Lite-Demo文档,添加更新库说明
- 编写Lite int8用户使用案例——基于PaddleSlim和Paddle-Lite对模型进行端到端的量化训练和推理执行。
bugfix
- 修复
model_optimize_tool
的一系列问题,目前int8量化训练模型可经model_optimize_tool
进行优化输出naive_buffer格式,且输出模型可使用MobileConfig
正确运行int8推理过程。
附件
android
- inference_lite_lib.android.armv7.shared.tar.gz
- inference_lite_lib.android.armv7.tar.gz
- inference_lite_lib.android.armv8.shared.tar.gz
- inference_lite_lib.android.armv8.tar.gz
IOS
memory optimize tool
Assets
9
Superjomn released this
Release Note
功能
-
MobileConfig
增加set_power_mode
和set_threads
两个设置方法,简化相关设置;详情参考 C++ demo -
memory_optimize_tool
中的int8_mode
flag 更名为prefer_int8_kernel
,以避免与量化工具的功能混淆;Paddle-Lite 目前的 ARM CPU INT8 量化基于 PaddleSlim 工具,本身并不具备也没有计划增加量化模型转换的能力 -
ARM CPU 新增以下Op支持,支持更多相关模型:
- flatten
- flatten2
- assign
- fake_quantize_range_abs_max
- fusion_eltwise_activate_dropout
- fill_constant_batch_size_like
编译
- 改善第三方依赖代码下载方式,以加速编译过程
- 在编译
memory_optimize_tool
类似的离线工具时,需要依赖protobuf
相关第三方代码库 - 移动端特定第三方依赖代码从之前的 cmake ExternalProject_Add 编译时下载改为
git submodule
方式,让下载过程更直观 - 对于国内网络下载
protobuf
等大尺寸repo,增加离线压缩包,可以自动下载解压,极大地加速编译下载过程
- 在编译
- 清除
tiny_publish
模式下无关的第三方代码下载,编译移动端部署库时可以不依赖任何第三方进行编译 - 增加分层编译的能力,以压缩核心库的大小;目前会将常规的Op和Kernel划分为 basic mode,编译核心部署库以驱动绝大多数 CV 和 DNN 模型;将控制流相关的细碎Op和Kernel单独拆成 extra mode,以按需驱动 OCR 及未来的 NLP 模型;以及未来在增加更多Op的情况下控制核心库尺寸;使用方法参考 编译开关
文档
- 完善了 源码编译指南,增加了 Linux 环境裸机编译的内容;增加了 Mac 编译
tiny_publish
的说明;增加了加速第三方库下载的内容 - 完善 benchmark测试方法 的文档,上传了所有相关模型及转化工具,以降低复现门槛
- 增加了 Roadmap 文档 ,以同步最近的开源版本发布计划
bugfix
- NaiveBuffer:解决
memory_optimize_tool
在 32/64 位系统模型 save/load 不兼容的问题
Assets 附件说明
Android ARM CPU 核心部署库
- inference_lite_lib.android.armv7.shared.tar.gz
- inference_lite_lib.android.armv7.static.tar.gz
- inference_lite_lib.android.armv8.shared.tar.gz
- inference_lite_lib.android.armv8.static.tar.gz
model_optimize_tool 离线模型转化工具
Assets
8
Superjomn released this
Release Note
Paddle-mobile 正式升级为 Paddle Lite ,重点加强了多平台多硬件的支持能力,提升了模型覆盖,并且对ARM CPU等硬件上的性能进行了重点优化。
核心能力已统一到Lite新架构上,后续的优化和升级也都会在新架构下进行。
原Paddle-mobile架构下的实现在 Mali GPU、Adreno GPU等诸多硬件场景下的表现已很出色,并有广泛应用。作为过渡,原架构下的主体代码暂在 mobile/
目录中保留,后续一段时间会继续维护,并完成全部迁移。
苹果设备GPU的 metal 实现和前端 web 的模块目前相对独立,会继续在 metal/
和 web/
目录下开发和维护。
本版本重点功能升级如下:
-
架构重大升级,通过添加 Machine IR, Type system, 轻量级 Operator 和 Kernel 等,增加了通用多平台和多硬件支持,多 precision 和 data layout 混合调度执行,动态优化,轻量级部署等重要特性
-
完善了Java API,与 C++ API 一一对应
-
新增
NaiveBuffer
模型存储格式,移动端部署与 protobuf 解耦,使预测库尺寸更小。 -
通过X2Paddle 支持 Caffe 和 TensorFlow 模型的预测,目前官方验证 6 种模型转化支持,相关信息可参考 使用 X2Paddle 转换模型
-
新增对华为海思 NPU 的深度支持,成为首个支持华为NPU在线编译的框架,已验证 MobileNet V1模型
-
支持FPGA (
ZU3、ZU5、ZU9
),已验证 ResNet50 模型 -
Mali GPU 和 Adreno GPU,支持 OpenCL 和 ARM CPU Kernel混合调度,已验证如下模型:
- MobileNetV1
- MobileNetV2
- ResNet50
-
ARM CPU ,增加官方模型覆盖,新增下列模型支持验证
- OCR-attention model
- vgg16
- EfficientNet
- mNasNet
- UNet
- ShuffleNet V1.1
- ResNet18
- MobileNet_SSD
- mobileNet_YoloV3
- mtcnn
-
ARM CPU 的 Int8 量化预测,支持 PaddleSlim 量化训练,精度相对离线量化更佳,新增以下模型支持验证
- MobileNetV1
- MobileNetV2
- ResNet50
-
更多相关模型(包含GoogleNet SqueezeNet等)及对应性能数据见 benchmark
-
新增各类硬件 Kernel 70种,详细列表如下
- nearest_interp: (arm/float)
- fill_constant: (arm/float)
- depthwise_conv2d: (opencl/float)
- sigmoid: (arm/float)
- argmax: (arm/float)
- calib_once: (arm/int8,fpga/fp16)
- layout: (fpga/any)
- while: (arm/float)
- crop: (arm/float)
- shape: (arm/float)
- fusion_elementwise_max_activation: (arm/float)
- slice: (arm/float)
- increment: (arm/float)
- io_copy: (fpga/any,opencl/any)
- io_copy_once: (fpga/any,opencl/any)
- sequence_expand: (arm/float)
- less_than: (arm/float)
- gru_unit: (arm/float)
- axpy: (arm/float)
- write_to_array: (arm/float)
- conv2d_transpose: (arm/float)
- scale: (fpga/fp16)
- fusion_elementwise_mul_activation: (arm/float)
- log: (arm/float)
- bilinear_interp: (arm/float)
- decode_oxes: (arm/float)
- yolo_box: (arm/float)
- beam_search_decode: (arm/float)
- negative: (arm/float)
- relu: (opencl/float,fpga/fp16,npu/float)
- elementwise_add: (opencl/float,fpga/fp16)
- box_coder: (arm/float)
- multiclass_nms: (arm/float)
- fusion_elementwise_add_activation: (arm/float,opencl/float,fpga/fp16)
- elementwise_max: (arm/float)
- graph_op: (npu/float)
- norm: (arm/float)
- logical_xor: (arm/float)
- top_k: (arm/float)
- elementwise_mul: (arm/float)
- power: (arm/float)
- sequence_pool: (arm/float)
- lrn: (arm/float)
- leaky_relu: (arm/float)
- is_empty: (arm/float)
- fc: (opencl/float,fpga/fp16,npu/float)
- im2sequence: (arm/float)
- pool2d: (opencl/float,fpga/fp16,npu/float)
- mul: (opencl/float, npu/float)
- pad2d: (arm/float)
- read_from_array: (arm/float)
- beam_search: (arm/float)
- lod_reset: (arm/float)
- gru: (arm/float)
- prelu: (arm/float)
- layout_once: (fpga/any)
- swish: (arm/float)
- lookup_table: (arm/float)
- relu_clipped: (arm/float)
- tanh: (arm/float)
- sequence_softmax: (arm/float)
- calib: (fpga/fp16)
- cast: (arm/float)
- density_prior_box: (arm/float)
- softmax: (fpga/fp16, npu/float)
- shuffle_channel: (arm/float)
- logical_and: (arm/float)
- prior_box: (arm/float)
- reduce_max: (arm/float)
- conv2d: (opencl/float,fpga/fp16, npu/float)
Assets
2
Watchers:317 |
Star:4733 |
Fork:985 |
创建时间: 2017-09-20 19:41:42 |
最后Commits: 昨天 |
c4f6a1d
Verified
Release Note
重点功能
基础功能升级
新增op
新增模型
op升级,与fluid对齐
api对齐
MobileConfig
和CxxConfig
两个模式MobileConfig
支持离线量化的模型
tiny_publish
下预测动态库压缩,核心库包含的kernel重新整理,大小不变,完整支持CV相关9个核心模型的 Paddle原生模型和 X2Paddle第三方转化模型性能
编译
文档
Pass介绍与注册方法
文档CV图像预处理库API接口介绍
文档Demo
Bug 修复