Paddle-Lite - 华为 NPU - softmax

Paddle-Lite - 华为 NPU - softmax

Welcome to Paddle-Lite’s documentation!
https://paddlelite.paddlepaddle.org.cn/

PaddleLite 使用华为麒麟 NPU 预测部署
https://paddlelite.paddlepaddle.org.cn/demo_guides/huawei_kirin_npu.html

Paddle-Lite
https://github.com/PaddlePaddle/Paddle-Lite

1. PaddleLite 支持华为 Kirin NPU

在这里插入图片描述

  • Paddle 模型的读取和执行,经历了 Paddle 推理模型文件的加载和解析、计算图的转化、图分析和优化、运行时程序的生成和执行等步骤。
  • Paddle 推理模型文件的加载和解析:基于 ProtoBuf 协议对 Paddle 推理模型文件进行反序列化,解析生成网络结构 (描述算子和张量的关系) 和参数信息 (包括算子属性和权重张量)。
  • 计算图的转化:为了更好的描述网络拓扑结构和方便后续的优化,依据算子的输入、出张量关系,构建一个由算子节点、张量节点组成的有向无环图。
  • 图分析和优化:由一系列 pass (优化器) 组成,pass 是用于描述一个计算图优化生成另一个计算图的过程。例如 conv2d_bn_fuse_pass,它用于将模型中每一个 conv2d、batch_norm 相连的算子对融合成一个 conv2d 算子以便获得性能上的提升。
  • 运行时程序的生成和执行:按照拓扑顺序遍历最终优化后的计算图,生成算子 kernel 列表,依次执行每一个算子 kernel 后即完成一次模型的推理。

1.1 Subgraph detection pass、NPU subgraph op kernel 和 Paddle2HiAI op/tensor bridges

Subgraph detection pass 是后续自定义子图划分涉及的关键步骤。

Subgraph detection pass:该 pass 的作用是遍历计算图中所有的算子节点,标记能够转成 HiAI IR 的算子节点,然后通过图分割算法,将那些支持转为 HiAI IR 的、相邻的算子节点融合成一个 subgraph (子图) 算子节点(需要注意的是,这个阶段算子节点并没有真正转为 HiAI IR,更没有生成 HiAI 模型)。

NPU subgraph op kernel:根据 Subgraph detection pass 的分割结果,在生成的算子 kernel 列表中,可能存在多个 subgraph 算子 kernel。每个 subgraph 算子 kernel,都会将它所包裹的、能够转成 HiAI IR 的、所有 Paddle 算子,如上图右半部所示,依次调用对应的 op bridge,组网生成一个 HiAI Graph,最终,调用 HiAI Runtime APIs 生成并执行华为 Kirin NPU 模型。

Paddle2HiAI op/tensor bridges:Paddle 算子/张量转 HiAI IR/tensor 的桥接器,其目的是将 Paddle 算子、输入、输出张量转为 HiAI 组网 IR和常量张量。

1.2 华为 Kirin NPU 与 ARM CPU 的异构模型

如果模型中存在不支持转 HiAI IR 的算子,Subgraph detection pass 会在没有人工干预的情况下,可能将计算图分割为许多小的子图,而出现如下问题:

  • 过多的子图会产生频繁的 CPU<->NPU 数据传输和 NPU 任务调度,影响整体性能。
  • 华为 Kirin NPU 模型暂时不支持 dynamic shape。如果模型中存在输入和输出不定长的算子 (例如一些检测类算子,NLP 类算子),在模型推理过程中,可能会因输入、输出 shape 变化而不断生成 HiAI 模型,从而导致性能变差,更有可能使得 HiAI 模型生成失败。

1.3 lite/kernels/npu/bridges/paddle_use_bridges.h

https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/kernels/npu/bridges/paddle_use_bridges.h

访问 https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/kernels/npu/bridges/paddle_use_bridges.h 查看已支持的算子列表,发现华为 Kirin NPU 不支持 yolo_box、multiclass_nms 这两个算子,其中支持 softmax,layer_norm 等算子。

lite/kernels/npu/bridges/paddle_use_bridges.h

......
USE_SUBGRAPH_BRIDGE(matmul, kNPU);
USE_SUBGRAPH_BRIDGE(softmax, kNPU);
USE_SUBGRAPH_BRIDGE(layer_norm, kNPU);
......

References

https://paddlelite.paddlepaddle.org.cn/demo_guides/huawei_kirin_npu.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yongqiang Cheng

梦想不是浮躁,而是沉淀和积累。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值