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 查看已支持的算子列表,发现华为 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