v2.12
Release Notes
重要更新
- 易用性提升: 支持同一 FP32 模型在不同 Arm CPU 架构下运行期间动态支持 FP32 和 FP16 精度的推理,初步完成框架与 Arm CPU 计算库编译解耦。
- 量化推理: 支持 PaddleSlim 量化新格式模型,降低在不同硬件的迁移成本;新增 Armv9 和 SVE 指令支持,MobileNetV1 和 MobileNetV2 模型性能分别提升 21% 和 10% ,在 PP-LCNetV2、PicoDet-S、PPLite-Seg、ResNet50、EfficientNetB0、PP-OCRv2 reg、PP-OCRv3 reg、PP-OCRv2 mobilenet reg、PP-HumanSeg-Lite 模型上均有不同程度的性能提升。
- 新硬件支持: 新增支持高通 QNN 及 SA8295P 芯片,支持 Linux、Android、QNX 操作系统,支持 HTP 后端 INT8、FP16、INT8 和 FP16 混合精度,完成 79 个 Paddle 算子和 37 个 Paddle 模型适配,其中 HTP FP16 或 INT8 在 ResNet50 模型上的耗时分别仅为 CPU 的 1/32 和 1/128。
框架升级
- 清理部分不再维护、或已迁移、或活跃度较低的硬件代码。#9626 #9596
- 多后端和多精度支持。 #9339
- 提升模型部署易用性,即同一个库支持 FP32 模型在 Arm v8.2 架构上 FP32 和 FP16 两种精度。
- 该功能对库体积、首次运行耗时以及内存增幅影响可忽略。
- OpenCL 支持 buffer 和 image 两种 layout 以及 GPU + CPU 异构算子可配置。 #9665,#9630,#9621
- 模型优化阶段可根据算子 info,shape,输入精度等信息,将 OpenCL 不支持的算子自动切换后端为 Arm CPU 或 x86 CPU,具体改动包括以下情况
- elementwise_*,reshape2,unsqueeze2,split,slice 当输入为 persistable
- op 的输入 tensor 或者输出 tensor 维度大于 4
- elementwise_*,scale,输入 tensor 精度不为 FP16 或 float
- reduce_*, arg_max 当 keep_dim 或 keepdims 属性为 false
- split 算子输出 tensor 个数 != 2
- gather 算子输入X的维度的size != 2
- 模型优化阶段可根据用户自行设置的 op 配置文件以及 GPU 平台信息,优化模型结构,提升模型性能,通过自行配置op执行后端,提升模型使用 OpenCL 后端的覆盖度。
- 模型优化阶段可根据算子 info,shape,输入精度等信息,将 OpenCL 不支持的算子自动切换后端为 Arm CPU 或 x86 CPU,具体改动包括以下情况
INT8 量化新格式适配
- 对于携带 weight 的算子如 Conv 、Matmul 等,会在模型中 weight 输入前插入反量化 (dequantize_linear) 算子。在其激活输入前会插入量化 (quantize_linear) 和反量化 (dequantize_linear) 算子。在该算子输出位置插入量化 (quantize_linear) 和反量化 (dequantize_linear) 算子,方便预测库直接获取输出 scale 信息。 #8523
- 在对激活层算子如 max_pool、add、sigmoid 等量化时,如下图右所示,在其输入前会插入量化 (quantize_linear) 和反量化 (dequantize_linear) 算子。在该算子输出位置插入量化 (quantize_linear) 和反量化 (dequantize_linear) 算子,方便预测库直接获取输出 scale 信息。
性能优化
-
Arm CPU 性能优化
- Arm CPU 新增 Armv9 和 SVE 指令支持:conv1x1 利用 INT8 mmla 矩阵乘加速指令后,MobileNetV1 和 MobileNetV2 模型性能分别提升 21% 和 10% (测试机型为:高通 865 和 MTK 天玑 9000)。#9116,#9279,#9045
- 优化 Arm CPU FP16 精度 interpolate 双线性插值计算后端和 avg_pooling 计算后端。 #9447
- 新增 Arm CPU FP16 rnn op 计算 kernel。 #9402
- 优化 Arm CPU FP16 depthwise 卷积,当stride不相等,dilation不为1,kernel size 不为 3x3 5x5 等特殊情况。 #9318
- 优化 Arm CPU FP32 精度 5x5s1p2 max_pooling 计算后端。 #9696
- 优化 Arm CPU 通用 argmax 计算后端。 #9384
- 优化 Arm CPU 词表量化。 #9669
- Arm CPU 新增 Armv9 和 SVE 指令支持:conv1x1 利用 INT8 mmla 矩阵乘加速指令后,MobileNetV1 和 MobileNetV2 模型性能分别提升 21% 和 10% (测试机型为:高通 865 和 MTK 天玑 9000)。#9116,#9279,#9045
-
OpenCL GPU 性能优化
硬件支持
- 高通 QNN(新增)
- 特性
- 算子、模型(新增 79 个算子和 37 个模型)
- 图像分类:AlexNet、EfficientNetB0、DenseNet121、GoogLeNet、InceptionV3、InceptionV4、MobileNetV1、MobileNetV2、MobileNetV3_large_x1_0、MobileNetV3_small_x1_0、ResNet101、ResNet18、ResNet50、ResNeXt50_32x4d、SqueezeNet1_0、VGG16、VGG19、DarkNet53、DPN68、GhostNet_x1_0、HRNet_W18_C、PPLCNet_x0_25、Res2Net50_26w_4s、SE_ResNet50_vd、mobilenet_v1_int8_224_per_layer(INT8 全量化)、resnet50_int8_224_per_layer(INT8 全量化)
- 目标检测:ssd_mobilenet_v1_relu_voc_fp32_300、yolov3_darknet53_270e_coco*、yolov3_mobilenet_v1_270e_coco*、yolov3_mobilenet_v3_large_270e_coco*、yolov3_r50vd_dcn_270e_coco*、ssdlite_mobilenet_v3_small*、ssdlite_mobilenet_v3_large*、ppyolo_tiny_650e_coco*
- 自然语言处理:bert_base_uncased*、ernie_1.0*、ernie_tiny*
- 文档
- 新增用户示例文档。
- 昆仑芯 XPU
- 特性
- 算子、模型
- equal 、transpose 算子支持 int64 数据类型。#9092
- slice 算子支持 tensor array 输入。 #9134
- multi_encoder 算子支持 pre-LN。 #9159
- 新增支持 topk_v2 算子、以及 fc 融合。 #9207
- 新增支持 maskrcnn 模型。 #9261
- 添加 roi_align 算子对 lod 的支持。#9274
- 新增支持 multicalss_nms 算子。#9276、#9317
- 新增支持 generate_proposals_v2 算子。 #9290
- fc 算子支持 per channel 量化。#9323
- 新增支持 seq_softmax, seq_expand, lod_reset 算子。#9453
- 新增支持 roformer relative embedding pass。#9536
- fc 算子新增支持 matmul/matmul_v2's y_trans=true。#9427
- Bug 修复
- 修复 gather 算子 index type 为 INT64 时错误。 #9031
- 修复 slice 算子 output dims 错误。 #9057
- 修复 host 侧 tile 算子在输入shape较大时错误,并增加了 XPU 算子的绑定。 #9012
- 修复了 xpu_memory_optimize_pass 中 reshape2 的输出后接 while 算子 XPU 空间复用出错的问题。#9178
- 修复了 stack 注册 FP32 类型时的代码错误。#9204
- 修复 xpu_fc_pass 、cast、fill_any_like 算子错误。#9366
- 修正了 XPU 上 weight 权重类型推导的 bug、修复了 XPU kernel pick(跨子图以及inplace算子)时的一些 bug。#9406
- 修复 concat 算子 在输入类型为 INT64 时的一些 bug 。#9427
- 修复了 pad3d 算子所有模式都使用 constant 的错误。 #9506
- 修复了打开 XPU 编译开关时,在 Arm 环境上运行失败的问题。#9466
- 修复低版本 gcc 引起编译失败的问题。 #9152
- 昆仑芯 XTCL
- 算子、模型(新增支持 80 个算子和 31 个模型) #9368、#9473、#9593、#9603 、#9625、 #9628 、#9657
- 图像分类:AlexNet、DenseNet121、EfficientNetB0、GoogLeNet、Inception-v3、Inception-v4、MobileNet-v1、MobileNet-v2 、ResNet-18、ResNet-50、ReNet-101、ResNeXt50、SqueezeNet-v1、VGG16、VGG19、DPN63、DarkNet53、GhostNet、Res2Net50、SE_ResNet50
- 目标检测:SSD-MobileNetV1(1.8)、YOLOv3-DarkNet53、YOLOv3-MobileNetV1、YOLOv4
- 人脸检测:FaceBoxes
- 文本检测 & 文本识别 & 端到端检测识别:ch_PP-OCRv2_det、ch_PP-OCRv2_rec、ch_ppocr_server_v2.0_det、CRNN-mv3-CTC
- 推荐系统:支持NCF网络
- 视频分类:支持PP-TSN模型。 #9368、#9473、#9593、#9603 、#9625、 #9628 、#9657
- 文档
- 新增用户示例文档
- 算子、模型(新增支持 80 个算子和 31 个模型) #9368、#9473、#9593、#9603 、#9625、 #9628 、#9657
- 昇腾
- 寒武纪
- 芯原 TIM-VX
- 新增支持 YOLOv5s、PP-YOLOE-s、ShuffleNetV2、MobileNetV2、MobileNetV3 、PP-TinyPose 和 PP-PicoDet-relu6 。
- 融合 elementwise_mul+sigmoid 为 swish,提升 YOLOv5s 和 PP-YOLOEs 性能。 #9623
Bug 修复
-
Arm CPU
- 修复 gather op 对 index 类型不匹配的情况。 #9000
- 修复 matmul_v2 和 rnn 在 Arm CPU 上的 bug 。#9005 #9040
- 新增 FP16 稀疏卷积计算 Arm CPU 后端。 #9032
- 新增 FP16 scale op 在 Armv7 CPU 上的后端。 #9048
- 新增 FP32 softmax 和 gemm 在 Armv9 CPU 架构上的 sve 后端。 #9060 #9083
- 修复 split op 在 cascade_rcnn_r50_fpn_1x_coco 模型运行时报错。 #8934
- 新增 Arm linux 架构的 FP16 精度编译支持及算子修复。 #9098 #9113 #9118
- 修复 Arm CPU FP16 gemv 计算 bug。 #9084
- 新增 matmul_v2 x86 后端。 #9137
- 兼容 squeeze2 op 中的没有 Xshape 输出的情况。#9341
- 新增 INT8 Conv3x3s2 直接卷积计算在 Armv9 CPU 架构上的 sve 后端。 #9279
- 修复 Arm CPU FP16 transpose op bug。 #9272
- 修复 Arm CPU INT8 fc_fuse_pass bug。 #9267
- 修复 Arm CPU FP16 interpolate op 双线性插值 bug。 #9397
- 修复 full api 对 FP16 精度的支持。 #9654
- 修复新量化格式 quant_dequant_pass bug。 #9654
- 新增 matmul_v2 在 Armv9 架构上的 sve 后端 。#9696
- 兼容 flatten op 中的没有 Xshape 输出的情况 。#9696
- 新增 Arm CPU FP32 silu op。 #9280
- 修复 Arm CPU sdot 指令检测接口。 #9312
- 修复 Arm CPU FP16 gemv 传参错误。 #9331
- 修复 Arm CPU fp32_to_int8访存越界。 #9334
-
OpenCL GPU
- 修复 matmul lws 低端机报错。 #9475