Release Notes
重要更新
-
新增非结构化 1x1 稀疏卷积实现,非结构化稀疏卷积 相对于稠密卷积,在 75% 稀疏下,性能有20%-40% 提升(支持int8/fp32精度计算),以下图示竖坐标默认为毫秒。
-
新增半结构化 1x1 稀疏卷积实现,半结构化稀疏卷积相对非结构化稀疏卷积,性能有 5%-30% 提升(支持 int8/fp32 精度计算)
框架升级
- 新增 “全流程/多后端” 稳定性主动验证方法
AutoScanTester
- 算子示例:Conv2d 算子精度验证
- 融合方法示例:ConvBn融合精度验证
- 模型示例:MobilenetV1模型精度验证
- 性能测试工具中新增使用 ImageNet 数据集进行精度评估的功能 #7525
硬件支持
-
ARM CPU
- 算子实现完备度提升:基于 Autoscan 单测框架,全面提升算子和 Pass 实现的完备度,修复/增强 100+ 算子,20+ 个 Pass,e.g. 修复 reduce_max 计算错误、添加 cast, clip, concat, collect_fpn_proposals, conditional_block, conv2d 等 6 个OP单测等
- 算子稳定性增强:利用 valgrind 等第三方工具,完成 CPU 端读写越界/动态shape/栈空间分配不足等不常见场景问题的修复,提高 CPU 端稳定性和易用性,e.g. Android子线程下栈空间分配不足、读越界错误修复等
- V7 FP16 算子补齐,新增Mul、elementwise_add、pooling 等10+ 算子,例如: 添加mul算子、添加matmul 算子、添加V7 GEMM 优化实现、添加DepthWise卷积3x3s2实现、添加Pooling实现等
- 新增非结构化稀疏卷积 和半结构化稀疏卷积支持
-
OpenCL/Metal
-
新增 MacOS 平台 GPU 支持,支持 Apple Silicon 系列、Intel 系列 Mac/MacBook。 #7347 #7348
-
Metal 支持 iOS 9/iOS 10平台。 #7367
-
算子实现完备度提升:基于 Autoscan 单测框架,全面提升算子和 Pass 实现的完备度,修复/增强 33 个 OpenCL算子和 28 个 Metal 算子,14 个 Pass
- [OpenCL] 新增算子:layer_norm #8648,gelu #8636 ,elementwise_pow #8153 ,elementwise_floordiv #8587,tan #8083 ,expand #8078 #8302
- [OpenCL] 更新算子:conv2d支持group>1 #8499 ,conv2d_transpose/depthwise_conv2d_transpose支持group>1 #8494,conv2d_transpose/depthwise_conv2d_transpose支持dilation>1 #8429 , gridsampler #8546,fc #8465,box_coder #8400,concat #8375,split #8322,gather #8145,transpose #8477 #8341
- [OpenCL] 修复算子:grid_sampler #8541,lrn #8529,softmax #8409,pool2d #8397 #8591,matmul #8386 #8701,reshape/reshape2 #8364
- [OpenCL] 新增Pass:elementwise + relu6 融合 Pass #8731,keepdims convert pass #8319 ,conv + sigmoid pass #8490
- [Metal] 新增算子:reduce_max,reduce_min,reduce_mean,reduce_sum #8173,matmul #8062,exp #8082
- [Metal] 更新算子:slice #8470,conv2d #8496 #7689,softmax #8498,reshape #8542,conv2d_transpose #8439,reduce #8366,BatchNorm #8324,arg_max #8384,equal #8347,Hardsigmoid HardSwish #7662,split #7466,elementwise #7467,concat #7465,elementwise #7467 #7737
- [Metal] 修复算子: yolo_box 计算错误 #8575,box_coder 无法运行 #8493,concat #8345,输入维度校验错误 #8352,bilinear_interp #8285,pad2d #8232,scale #8210,relu relu6 #8082
-
-
昆仑芯
- 使用官方正式名称 “昆仑芯”(原名 “百度昆仑” ),且修改脚本中相关描述, #8091
- 新增算子:lod_array_length( #7314),conv3d( #7642),gelu( #7527)
- 更新算子API:concat( #8184),fc_batched_vsl( #7998),search_varconv( #7865),sequence_topk_avg_pooling( #7411),fc_fusion( #7029),sequence_reverse( #6798),sequence_concat( #6847),findmax,match_matrix_tensor,match_matrix_tensor( #7012),l2_norm( #7724),sequence_unpad( #7640)
- 修复bug:内存分配错误( #7498、 #7528),prior_box max_size 为 0 时报错( #8214),算子包含 inlace 属性时内存优化策略可能报错( #8213),conv_transpose 有 output_padding 时计算错误,instance_norm 没有 bias 或者 scale 时计算错误( #7642),有共享内存时内存优化报错( #7966),默认 workspace 可能释放错误( #7422),l2_norm 计算错误( #7983),多线程内存泄露问题( #8010)
-
Host
-
NNAdapter 提供 fake device 的 HAL 和 DDK sample code,支持 HAL 和 DDK 的独立编译,进一步降低厂商适配成本
- 提供 fake device 的 HAL 示例代码,厂商只需做少量的修改,便可快速完成硬件适配并调通整个模型;
- 针对部分厂商缺少类似 TensorRT 的在线组网 DDK 的问题,提供了 fake device 的 DDK 示例代码 帮助硬件厂商快速完成在线组网 DDK的开发;
- HAL 和 DDK 的示例代码同时提供在 PaddleLite-generic-demo 的 libs/PaddleLite/samples/fake_device 目录中,支持独立编译,即厂商无需与 Paddle Lite 联编即可快速产出 HAL 和 DDK。
-
昇腾 NPU
-
芯原 TIM-VX
- 新增支持芯原TIM-VX,已完成晶晨 A311D、S905D3 芯片在 Khadas VIM3/3L 开发板对 MobileNetV1 、ResNet50、SSD-MobileNetV1 fp32/int8 全量化模型的支持,理论上支持所有基于芯原 VIP 系列神经网络 IP 的芯片,包括: #7706、 #7878、 #8177、 #8331
- 晶晨:S905D3,C308X,C305X,A311D,V901D,S905X3,T962E2,T962X3
- 瑞芯微:RK1808,RK1808S0,RV1109/1126
- 恩智浦: i.MX 8M Plus
- JLQ:JA308,JA310,JA312
- 新增支持芯原TIM-VX,已完成晶晨 A311D、S905D3 芯片在 Khadas VIM3/3L 开发板对 MobileNetV1 、ResNet50、SSD-MobileNetV1 fp32/int8 全量化模型的支持,理论上支持所有基于芯原 VIP 系列神经网络 IP 的芯片,包括: #7706、 #7878、 #8177、 #8331
-
Android NNAPI
- 新增支持 Android NNAPI,完成 21 个 Paddle 算子和 MobileNetV1、ResNet50、SSD-MobileNetV1 fp32/int8 全量化模型的适配,支持 Android 8.1(Oreo) 及以上的终端设备,目前已验证部分高通、联发科 和华为麒麟的芯片,由于不同芯片厂商对 Android NNAPI 支持程度不同( 其中联发科和华为麒麟芯片性能较好),可能存在模型回退到 Android NNAPI 默认参考实现 nnapi-reference 执行而导致性能下降的问题。#8390、#8462、#8486
-
OpenVINO
性能优化
- ARM CPU
- 添加matmul/matmul_v2+elementwise_add fusion 支持,对模型性能有20%-40% 提升
- 添加FC+relu6 融合支持,对模型性能有约5%-10% 提升
- 添加conv+hardswish 融合支持,对含有该结构的模型,性能有约12%提升
- FP16 V7 GEMM 优化实现, 模型性能有约20%-30% 提升
- FP16 V7 conv 5×5 depthwise conv 3×3 s2 direct 优化实现、 FP16 V7 conv 3x3 s2 depthwise实现,模型性能有约20%-30% 提升
- ARM V7 FP16 性能数据和竞品性能对比如下图:
- FP32 VS FP16 性能,性能约有 40%~50% 提升
- Mali GPU
- NNAdapter
Bug修复
- 通过 Autoscan 单测测试方案,修复 30+ 算子/PASS 精度diff/运行crash 问题,例如:修复matmul_v2 少数case下计算错误、修复conv_transpose 部分case 下计算diff、修复 box_corder 在 "code_type" 为 "encode_center_size" 下计算diff等
- 修复自动插入 calib 时因为 device 不同找不到合适的 kernel 的问题, #8299
- 优化找不到 kernel 时的报错信息, #8203
- 修复在 arm core 大于 128 个的机器上的运行报错的问题, #7857
- 修复 __xpu__resnet_fuse_pass 匹配错误的问题, #7824
- 修复 while 涉及的 variable 可以推导出错误 place 的问题, #7315
- 修复部分 nnadapter + conv act fuse 错误的问题,#7296
- 修复部分模型 sequence_pool 参数解析错误的问题,#8374
- 修复些许读越界/栈空间分配失败错误,如Android子线程下栈空间分配不足、读越界错误修复等
- 修复matmul/matmul_v2 不支持x_dims=2,y_dims=1 的case,详见#8556
- 修复A35 上conv+leakyRelu 计算diff 错误,详见#8508
- 修复armv7 gemm c8 计算错误,详见 #8628
- 修复mul int8、matmul int8、fc int8计算错误、量化模型转换错误,详见 #7310、 #7964
- 修复由于添加a35 sgemm_c4函数带来的性能下降错误 #7094
- 修复armv8 在A53芯片上gemm错误,详见 #8509
- 修复ARM OPT找不到depthwise_conv_transpose算子的错误 #7270
- 修复ARM CV 相关函数读越界问题 #7671
- 修复ARM Android shell demo NDK23编译失败问题 #8245
- 修复ARM RNN 中间态输出错误问题 #8610
- 修复mask_rcnn和fast_rcnn在opt转换过程中报错的bug #8590
- 修复InferShapeWithCache的bug,使其支持非动态输入时,部分算子运行时只需推导一次算子shape信息 #8282
- 修复pybind中c++ tensor转化为py::array的bug #8057
- 修复cmake config过程中,部分python脚本不兼容python3导致编译失败的问题 #8834
- 修复ARM CPU 读越界错误, #7709
- 修复ARM int8 卷积单测下,多线程计算错误, #7648 #7692
- 修复ARM 动态shape 计算diff, #7585
文档优化
- 更新 OpenCL 部署文档,重点添加各 OS 下的部署示例、关键 API 接口函数说明 #8517 #8502
- 更新算子支持列表 #7139
- 新增 Metal 部署文档 #8510
- 新增 OpenCL/Metal 算子添加说明 #8447 #8451
- 新增 英特尔 OpenVINO 部署示例 文档 #8848
- 新增 Android NN API 部署示例 文档 #8832
- 更新 昇腾 NPU 部署示例文档,重点更新了支持的开源模型列表,支持的昇腾芯片与CANN版本列表 #8728,新增dynamic shape、混合精度和高级参数的功能配置说明 #8786
- 更新FAQ 文档,新增FP16 和多线程使用问题支持 #8733 #8714
- 新增单测书写文档 #8582