Releases: PaddlePaddle/Paddle-Lite
v2.8-rc
Release Notes
Paddle-Lite v2.8 全面支持 Paddle 2.0 模型推理,并对框架进行了内存开销优化和稳定性改进。同时,ARM CPU, OpenCL 性能相对前一版本有较大提升,增加 XPU / NPU 图优化策略,并丰富了算子类型。
框架升级
- OPT 工具新增离线模型压缩功能,通过量化算法转化模型参数,原始模型体积可以降低50%~75%,详情参考使用文档
- 加强模型加载时内存复用,初始化过程中内存占用峰值下降近50%。(#4917, #4973, #5064)
- 增加模型校验,模型加载过程更加稳定
- 增加算子版本控制方法,算子版本升级到与Paddle2.0一致,整体上提升Paddle 模型兼容能力
- 增加算子版本的注册机制,对算子版本进行定义与兼容约束
- 通过框架间算子版本的对齐,确保不同框架中同一算子版本的定义和行为一致,从而增强框架整体的健壮性。
- 扩宽 Android 版本的支持范围:armv7 上可最低支持到 Android API Level 16, armv8 上可最低支持到 Android API Level 21
- 编译优化,X86 支持MAC/Linux/Windows平台上的Intel MKL静态链接编译选项,减少MKL动态库体积(仅剩libiomp5为动态库),支持Windows平台上的MD_DynamicRelease编译选项
- 优化 Windows x86 计时函数,降低耗时波动
新增接口
CxxConfig
和MobileConfig
新增set_x86_math_num_threads
接口来设置 X86 上 MKL 底层计算的线程数- NN硬件新增
set_subgraph_model_cache_buffers
接口支持从内存设置子图缓存产物,使用方法可参考Rockchip NPU Demo - 新增Python API接口: Tensor 与 numpy.array 相互转换的接口
tensor.numpy()
: 将Tensor 中的数据转化为numpy.array
tensor.from_numpy()
:从numpy.array
数据对象创建 Tensor
新增算子
- bilinear_interp_v2
- nearest_interp_v2
- elementwise_min
- elementwise_floordiv
- flatten_contiguous_range
- layout_once
- lod_array_length
- sync_batch_norm
- fusion_elementwise_min_activation
- multiclass_nms3
支持Paddle2.0 模型
对应支持 PaddlePaddle v2.0 ,官方验证了如下模型
文档更新
- 更新X86 MKL静态库支持以及Windows编译相关文档 PaddleLite使用X86预测部署
- 新增动态离线量化完整示例
- 更新XPU文档,提供xpu_toolchain的下载
- 更新Rockchip NPU文档,demo增加Resnet-50模型的支持,提供一键全量化PaddleSlim-quant-demo 用于生成适用于Rockchip NPU的全量化MobileNetV1和Resnet-50模型
硬件&性能增强
ARM CPU
- ARM CPU支持LSTM/GRU量化的模型
- ARM CPU支持动态图量化训练功能产出的量化模型
- ARM CPU支持RNN OP算子
- ARM CPU 对卷积类算子做了性能优化,与上个版本相比FP32 模型性能有5%-10%提升:
- 优化A53 处理器上卷积-GEMM 矩阵乘kernel的实现;
- 优化其他卷积kernel的实现,如Im2col_GEMM 、conv_3x3s2_direct 等卷积算子;
- ARM CPU支持高版本NDK编译
- ARMLinux支持使用环境变量CC和CXX设置C编译器和C++编译器
- ARM CPU INT8性能提升:
- 基于NDK17在armv7下支持dot指令,在ARMv8.2架构下,GEMM性能有大幅提升(实测A76有150%-270%提升)
- 重构GEMV INT8实现,在各架构下均有较大提升,平均提升100+%-200+%
- ARM CPU 使用Intrinsic优化box_coder,增加对paddle fastrcnn和maskrcnn模型的支持
- ARM CPU相对于上一个版本,绝大部分模型性能均有较大提升
OpenCL
- OpenCL 的多平台支持:新增支持 Windows/macOS 平台,可利用 PC 端的集成显卡或独立显卡提高预测速度
- OpenCL 的多精度运行执行:新增支持 fp32 精度,主要用于对精度要求较高的应用场景
- OpenCL op 支持范围:新增
reduce_mean
,hard_swish
,prelu
,batch_norm
,clip
,yolo_box
,shape
,slice
- OpenCL op 通用性增强算子:
transpose
,conv2d
; - OpenCL 在线auto-tune新增2种online-auto-tune策略
CL_TUNE_RAPID
、CL_TUNE_NORMAL
,更快调优模型性能; - OpenCL 增加对Buffer和Imaeg2D的内存边界检查,在用户输入尺寸较大导致运行失败情况下会有友好的提示;
- OpenCL 增加scale-activation、conv-scale、conv-hard sigmoid、instance_norm-relu 融合,可以对包含该结构的模型有性能提升如Yolov3-Mobilenetv3;
- OpenCL depthwise_conv2d3x3 强化:支持 stride 不一致时的计算
v2.8 版本与 v2.7 版本相比,绝大部分模型都有性能提升
昆仑 XPU
- XPU增强
conv2d
的融合,新增多种模式的xpu_conv2d
的融合 - XPU增强
pool2d
:支持adaptive参数,支持全部类型的padding
- XPU增强
multi_encoder
的融合:支持融合slic
e - XPU新增
softmax
和topk
的融合
RK NPU
- Rockchip NPU新增reshape, flatten, scale, pad2d, transpose 等 op bridge,修复act, concat, batch norm 等 op bridge 中的问题
- 针对Rockchip NPU全量化模型,新增pass实现多输入op(如concat)的输入、输出scale的一致性约束
- Rockchip NPU新增支持Resnet-50和度目业务模型(CV检测和识别类)
- Rockchip NPU支持离线模型缓存,支持从内存读入缓存后的模型,满足模型加、解密的业务要求
已支持的MobileNetV1和ResNet-50全量化模型分别在TB-RK1808S0 AI计算棒、RK1808 EVB开发板和RV1109开发板的CPU和NPU性能(耗时)对比如下
硬件支持
- 新增Imagination NNA 芯片的支持,增加文档和demo
Bug fix
- 修复了 X86 在Windows上的预测库编译错误以及X86 Demo编译错误,以及Win32编译修复
- 修复 ARM CPU
sequence_conv
、pool2x2
pool1x1
小概率报错问题 - 修复 ARM CPU
conv_depthwise、
conv_winograd、
transpose`在模型输入shape变化情况下,小概率报错问题。 - 修复 OpenCL
avg pool2d
、instance_norm
、elementwise_add
计算结果错误的问题 - 修复 OpenCL concat 多输入情况下的内存泄露问题
- 修复 windows 开启 profile 后crash问题
- 修复
compare
OP推理输出shape的错误 - 修复unstack在融合后出现输出tensor数量错误的问题
- 修复对Android7.0(含)以上版本的检查部分手机厂商如魅族系统限制库使用的系统库,在使用cpu模型会挂在cpu+gpu库里的情况
v2.7.1
Release Notes
此版本主要为各类增强和问题修复
功能与性能增强
- 支持更多的XPU算子:conv2d_transpose,transpose,density_prior_box,prior_box,sequence_unpad,lrn,topk,relu6,hard_sigmoid,hard_swish,leaky_relu,softsign,bilinear_interp,nearest_interp,box_coder,split,im2sequence,reshape,flatten,flatten2。PR4897,PR4926
- 更新部分XPU算子的实现接口。PR4897
- XPU支持fc算子的int31实现。PR4922
- 增强XPU conv算子的fuse功能:支持带bias的conv融合;支持depthwise_conv的融合;支持激活为hard_sigmoid的融合。PR4926
问题修复
v2.7
Release Notes
框架升级
-
本版本主要面向 PaddlePaddle 1.8x 及以前的推理模型
-
注意, MobileConfig 对应的模型格式有变化,必须使用对应版本的 opt 重新转化模型
-
升级执行期模型数据结构,显著提升移动端预测初始化速度,同时也降低了模型存储体积
-
移动端模型存储格式从自建格式
NaiveBuffer
修改为flatbuffers
-
执行期内存消耗最高降低60%
-
移动端模型体积裁剪
-
增强精度 profile 工具,可以通过环境变量控制是否将每层 op 的 output tensor 结果写入到手机目录文件中,方便精度调试 PR4255
-
MobileConfig::SetArmL3CacheSize
:补充四种设置ARM CPU 下 L3 Cache 初始内存大小的方法 (#4402)
enum class L3CacheSetMethod {
kDeviceL3Cache = 0, // Use the system L3 Cache size, best performance.
kDeviceL2Cache = 1, // Use the system L2 Cache size, trade off performance
// with less memory consumption.
kAbsolute = 2, // Use the external setting.
};
struct MobileConfig {
// ...
// danger area
void
SetArmL3CacheSize(L3CacheSetMethod method = L3CacheSetMethod::kDeviceL3Cache,
int absolute_val) {}
// ...
};
文档更新
- 更新 XPU 在 x86 平台的编译文档,修正 opt 工具对 XPU 优化的描述
- 丰富Huawei Kirin(SoC) NPU、MediaTek APU和Rockchip NPU的文档,提供用户能快速验证的样例
功能与性能增强
- 在V7架构上,针对a53 arch 增加6x8gemm优化,提高模型在低端机的性能
- 优化prior box/boxcoder 实现,提高检测模型的性能PR4107
- 添加pass,对于出度为1的reshape op启用memory optimize,在减少内存使用的同时提高性能PR4073
- 添加FP32 的conv+conv融合实现,提高模型性能
- 框架优化:将InferShape方法优化为InferShapeWithCache,降低InferShape执行次数,提高运行速度 (#4416, #4294)
- 在框架上,优化内存,提高模型速度,减少APP中大帧出现的概率
- 修复benchmark无法选中部分int32类型kernel的问题 #4846
- 支持host端的range,crop,expand,stack的int32类型的kernel #4740
- 支持XPU unstack kernel #4892
- 新增 OpenCL auto-tune 特性 #4765
- 新增 OpenCL kernel(三角函数、shuffle_channel、split) #4838,#4782, #4645
- 优化 OpenCL concat 输入 tensor 个数大于 4 时的执行速度 #4779
- MTK APU支持模型缓存#4468
- MTK 新增concat、fusion_elementwise_add_activation、conv2d_transpose op bridge的支持,量化算子支持多个不同scale的输入#4451
硬件模型支持
- 新增比特大陆BM1684(FP32)支持,支持模型同BM1682
- 新增TB-RK1808S0计算棒、RV1126/1109 EVB,优化了文档和示例
- 支持gcn模型:#4444
- 支持车牌识别OCR模型: #4205
Bug fix
- 修复v7-clang 下不对称padding的conv_3x3s1_dw的计算精度, PR4373
- OpenCL tensor 内存分配:修复 OpenCL 模型在开启内存优化后多次 Run 计算结果有误问题 PR4410
- OpenCL OP:修复 dropout, depthwise_conv2d_3x3 (dilation > 1), concat (axis 不等于 1), 分组 conv3x3 在骁龙 625 上结果错误问题 PR4253 PR4281 PR4241 PR4236
- ARM OP:修复
reduce_mean
,sequence_expand_as
算子 PR4492 - Pass:修复 OpenCL 模型转换时类型推导错误的问题 PR4425
- 修复x86平台初始化过程线程不安全问题 #4014
- 修复动态离线量化模型进行conv+conv融合的错误#4292
v2.7-beta1.1
Release Notes
Bug Fix
- 修复
v2.7-beta1
在特定使用场景下内存释放不彻底问题- 问题场景:创建并删除Predictor一次会导致约0.08Kb的内存残留
- 修复方法:#4726,修复后在 “长时间、多场景”压力测试下内存指标平稳
v2.7-beta.1
Some bugfix to v2.7-beta
version.
v2.7-beta1
v2.6.3
v2.6.3
功能加强
-
支持subblock的图优化,即pass支持对 while/conditional_block 等 Op 的 subblock的优化,例如对subblock的Op Fuse、Kernel选择等,目前已在ARM和华为NPU上支持transformer模型 PR3947
-
支持内部处理错误时向应用层抛出异常,防止程序出现 abort (暂时不支持android+armv7+gcc 脚本开关编译选项) PR3947
-
新增 Op,支持RetinaNet模型 PR4157
-
新增Paddle-Lite 手机端训练功能(仅用于技术预览)
- ARM CPU上新增一系列反向传导和优化算子;
- 在“波士顿房价预测”任务中,给出了基于安卓的端上训练,详情参考文档;
文档更新
- 针对2.6.1 中的问题做了修复,丰富了文档
- 增加了基于安卓的端上训练文档,完善了模型量化压缩文档、benchmark文档;
- 增加并完善了 模型支持文档 和 算子支持文档,方便快速查找模型和算子在相应硬件平台上的支持状态
- 完善了 源码编译文档 并增加了 编译选项说明,更容易在文档中找到相应硬件平台的源码编译方法
- 完善了 快速开始 章节,并相应更新了 C++完整示例和应用开发说明,Java完整示例和应用开发说明 和 Python完整示例和应用开发说明
硬件能力
ARM CPU
- 增加
conv_winograd int8
实现,PR3767;
NPU
- 增加NPU模型缓存机制(支持内存和文件两种缓存方式),支持 dynamic shape,避免每次进行NPU模型的在线生成,缩短第一次推理耗时,同时降低内存的消耗 PR3947
- 支持NPU内存共享,增加 zero copy 优化,大幅提高 CPU+NPU hybrid的推理性能 PR3947
OpenCL
- 增加 OpenCL 预判API
IsOpenclBackendValid
,对于优先选择执行GPU的用户,可基于该API预判手机是否支持OPENCL,否则加载CPU模型,PR3951 PR4003 - 优化OPENCL Conv和depthwise Conv执行流程,去除冗余计算,PR3924
- 增加OPENCL auto tuning API,应用场景是对于长时跑的GPU模型,首次执行先做kernel tuning,对执行性能有一定提升,在mali gpu如kirin990/980/970上,针对mobilenetv1/v2有20~50%左右的GPU性能提升,PR4016
Bug fix
- 增加
2x2s1p1_pooling
实现及修复3x3s2p0 pooling
随机crash问题,PR3705; - 修复
softmax
随机crash及计算错误问题,PR3834; - 修复
gemm_prepack_oth_int8
函数随机crash问题,PR3906; - 修复
opencl
加载int16模型的fc权重异常问题,PR3900; - 修复了模型优化工具(opt) 转换模型后,出现模型参数大小膨胀的问题;
- 修复了sequence_conv算子在batch size>1时计算错误的问题;
- 修复android armv8的静态库编译出现undef pad问题 PR3977
- 修复ARM CPU LSTM kernel注册问题 PR4007
- 修复ARM CPU非对称的pooling计算结果不对的问题PR4013
v2.7-beta
v2.7-beta
框架升级
-
注意, MobileConfig 对应的模型格式有变化,必须使用对应版本的 opt 重新转化模型
-
升级执行期模型数据结构,显著提升移动端预测初始化速度,同时也降低了模型存储体积
-
移动端模型存储格式从自建格式
NaiveBuffer
修改为flatbuffers
-
执行期内存消耗最高降低60%
-
移动端模型体积裁剪
-
增强精度 profile 工具,可以通过环境变量控制是否将每层 op 的 output tensor 结果写入到手机目录文件中,方便精度调试 PR4255
-
MobileConfig::SetArmL3CacheSize
:补充四种设置ARM CPU 下 L3 Cache 初始内存大小的方法 (#4402)
enum class L3CacheSetMethod {
kDeviceL3Cache = 0, // Use the system L3 Cache size, best performance.
kDeviceL2Cache = 1, // Use the system L2 Cache size, trade off performance
// with less memory consumption.
kAbsolute = 2, // Use the external setting.
};
struct MobileConfig {
// ...
// danger area
void
SetArmL3CacheSize(L3CacheSetMethod method = L3CacheSetMethod::kDeviceL3Cache,
int absolute_val) {}
// ...
};
文档更新
性能增强
- 在V7架构上,针对a53 arch 增加6x8gemm优化,提高模型在低端机的性能
- 优化prior box/boxcoder 实现,提高检测模型的性能PR4107
- 添加pass,对于出度为1的reshape op启用memory optimize,在减少内存使用的同时提高性能PR4073
- 添加FP32 的conv+conv融合实现,提高模型性能
- 框架优化:将InferShape方法优化为InferShapeWithCache,降低InferShape执行次数,提高运行速度 (#4416, #4294)
- 在框架上,优化内存,提高模型速度,减少APP中大帧出现的概率
硬件模型支持
Bug fix
- 修复v7-clang 下不对称padding的conv_3x3s1_dw的计算精度, PR4373
- OpenCL tensor 内存分配:修复 OpenCL 模型在开启内存优化后多次 Run 计算结果有误问题 PR4410
- OpenCL OP:修复 dropout, depthwise_conv2d_3x3 (dilation > 1), concat (axis 不等于 1), 分组 conv3x3 在骁龙 625 上结果错误问题 PR4253 PR4281 PR4241 PR4236
- Pass:修复 OpenCL 模型转换时类型推导错误的问题 PR4425
- 修复x86平台初始化过程线程不安全问题 #4014
- 修复动态离线量化模型进行conv+conv融合的错误#4292
v2.6.3-beta2
Release Notes
功能加强
- 支持subblock的图优化,即pass支持对 while/conditional_block 等 Op 的 subblock的优化,例如对subblock的Op Fuse、Kernel选择等,目前已在ARM和华为NPU上支持transformer模型 PR3947
- 支持内部处理错误时向应用层抛出异常,防止程序出现 abort PR3947
- 新增
retinanet_detection_output
Op,支持RetinaNet模型 PR4157
NPU 增强
- 增加NPU模型缓存机制(支持内存和文件两种缓存方式),支持 dynamic shape,避免每次进行NPU模型的在线生成,缩短第一次推理耗时,同时降低内存的消耗 PR3947
- 支持NPU内存共享,增加 zero copy 优化,大幅提高 CPU+NPU hybrid的推理性能 PR3947
OpenCL 增强
- 增加 OpenCL 预判API
IsOpenclBackendValid
,对于优先选择执行GPU的用户,可基于该API预判手机是否支持OPENCL,否则加载CPU模型,PR3951 PR4003 - 优化OPENCL Conv和depthwise Conv执行流程,去除冗余计算,PR3924
- 增加OPENCL auto tuning API,应用场景是对于长时跑的GPU模型,首次执行先做kernel tuning,对执行性能有一定提升,在mali gpu如kirin990/980/970上,针对mobilenetv1/v2有20~50%左右的GPU性能提升,PR4016