Skip to content

v2.12

Compare
Choose a tag to compare
@liyancas liyancas released this 18 Nov 12:18
· 36 commits to release/v2.12 since this release
f294964

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 后端的覆盖度。

图片

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
  • OpenCL GPU 性能优化

    • 修改 conv 3x3 5x5 7x7 通用实现,conv5x5 op 在 Mali-G72 MP3 平台性能提升一倍。 #9421
    • 添加 matmul xdim2, ydim1 image 实现。#9418
    • 添加 scale,pow,transpose buffer 的实现,支持 FP16,FP32。 #9354
    • 添加 activation(relu, relu6, tanh_act, gelu, sigmoid) buffer 实现支持 FP16。#9351
    • 添加 reshape 算子 buffer 实现。 #9193

硬件支持

  • 高通 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
    • 特性
      • 支持 FP16 数据类型,部分算子支持 FP16 精度计算。 #9080#9228#9254#9259
      • 新增 set_xpu_l3_cache_autotune api 接口。#9259
      • 新增支持 per-channel 量化方式。#9323
      • 新增 INT8 数据类型支持。 #9376
    • 算子、模型
      • 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
    • 文档
  • 昇腾
    • 特性
      • Dynamic Shape 功能增强。#9615
      • 增加 matmul+dequant+add 融合 Pass,以修复混合精度模型运行失败问题。#9414
  • 寒武纪
  • 芯原 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