ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Paddle Lite 华为麒麟(Kirin)NPU 编译与部署实战:NNAdapter HiAI 加速全流程解析

2026/9/17 10:58:07 拓冰建站 浏览量
Paddle Lite 华为麒麟(Kirin)NPU 编译与部署实战:NNAdapter HiAI 加速全流程解析 Paddle Lite 华为麒麟KirinNPU 编译与部署实战NNAdapter HiAI 加速全流程解析【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite导读本文面向希望在华为自研达芬奇Da Vinci架构 NPUKirin 810/820/985/990/990 5G/9000E/9000 等 SoC 内置 NPU上运行 Paddle 模型的开发者系统讲解 Paddle Lite 通过 NNAdapter 统一适配框架接入华为 HiAIHuawei Intelligent Acceleration Interface的完整链路。读完本文你将掌握两个核心编译参数nnadapter_with_huawei_kirin_npu与nnadapter_huawei_kirin_npu_sdk_root的含义与正确配置方式、HiAI DDK 目录的必备结构、基于build_android.sh的 armv8/armv7 交叉编译全流程、示例程序的部署运行方法以及底层 HAL 驱动从算子转换到 HiAI 模型生成与执行的实现原理。本文以 NNAdapter 支持华为麒麟 NPU 编译参数文档 为核心骨架结合仓库内的 华为麒麟 NPU 详细指南 与 NNAdapter 驱动源码 进行纵深展开。一、背景NNAdapter 框架与华为麒麟 NPU 接入方式华为麒麟 NPU 的接入建立在 Paddle Lite 的NNAdapterNeural Network Adapter统一硬件适配框架之上。NNAdapter 是飞桨推理侧的 AI 硬件统一适配框架其设计目标是让同一个 Paddle 模型无需针对每家硬件厂商单独开发而是通过统一的标准算子中间表示 设备 HAL 插件机制便捷地适配多种硬件相关参数说明见 NNAdapter 统一适配框架介绍。华为麒麟 NPU 的接入遵循如下推理链路在线分析 Paddle 模型将 Paddle 算子转成NNAdapter 标准算子NNAdapter 再将标准算子转换为华为HiAI IR调用 HiAI IR/Builder/Runtime APIs 生成并执行 HiAI 模型最终在达芬奇架构 NPU 上完成推理。从源码结构看这条链路在仓库中对应lite/backends/nnadapter/nnadapter/src/driver/huawei_kirin_npu/目录下的完整 HAL 驱动实现下文第四节详述。值得一提的是文档与源码均明确指出Paddle Lite 只支持华为自研达芬奇架构NPUKirin 970/980 搭载的寒武纪CambriconNPU、以及 Hi3559A/Hi3519A 使用的 NNIE 均不属于支持范围。二、核心编译参数详解编译支持华为麒麟 NPU 的 Paddle Lite 部署库本质上是打开 NNAdapter 总开关并开启麒麟 NPU 对应的 HAL 设备。原文档给出的参数定义如下表参数说明可选范围默认值nnadapter_with_huawei_kirin_npu是否编译华为麒麟 NPU 的 NNAdapter HAL 库OFF / ONOFFnnadapter_huawei_kirin_npu_sdk_root设置华为 HiAI DDK 目录需指向包含 HiAI DDK 头文件与动态库的目录空值2.1 参数生效机制这两个参数需要配合 NNAdapter 总开关--with_nnadapterON使用。从 SDK 依赖检测脚本 可以看到参数在 CMake 层面的具体消费逻辑当NNADAPTER_WITH_HUAWEI_KIRIN_NPUON时dependencies.cmake会强制要求设置NNADAPTER_HUAWEI_KIRIN_NPU_SDK_ROOT命令行参数或环境变量均可否则直接抛出FATAL_ERROR对应第 15-20 行它会使用find_path在${SDK_ROOT}/include/下查找头文件HiAiModelManagerService.h缺失即报错对应第 23-28 行根据目标体系结构自动选择动态库子目录aarch64使用lib64armv7-a使用lib其他架构直接报错不支持对应第 32-39 行依次查找并导入四个共享库libhiai.so、libhiai_ir.so、libhiai_ir_build.so、libhcl.so对应第 41-81 行最终链接为hiai_ir hiai_ir_build hiai hcl。这意味着nnadapter_huawei_kirin_npu_sdk_root指向的目录不是任意解压目录即可必须包含sdk_root/ ├── include/ │ └── HiAiModelManagerService.h # 必需的 HiAI 模型管理服务头文件 ├── lib64/ # aarch64 目标 │ ├── libhiai.so │ ├── libhiai_ir.so │ ├── libhiai_ir_build.so │ └── libhcl.so # HiAI DDK 320 及以后版本提供 └── lib/ # armv7-a 目标 └── (同上四个动态库)仓库文档中使用的 HiAI DDK 版本为v510压缩包hiai_ddk_lib_510.tar.gz编译环境为 Ubuntu 16.04 NDK-r17cGCC/Clang for Android arm64-v8a。2.2 一个必须牢记的 ABI 约束仓库文档特别强调HiAI DDK 的 so 库均基于c_shared构建因此编译 Paddle Lite 时必须将 Android STL 设置为c_shared否则部署到设备后可能因 STL 运行时不一致而出现运行时问题。这也是下文所有编译命令中都带--android_stlc_shared的原因。三、完整编译流程3.1 准备源码与 HiAI DDK$ git clone https://github.com/PaddlePaddle/Paddle-Lite.git # 仓库同名源码 $ cd Paddle-Lite $ git checkout release-version-tag # 切换到目标发布版本 $ wget https://paddlelite-demo.bj.bcebos.com/devices/huawei/kirin/hiai_ddk_lib_510.tar.gz $ tar -xvf hiai_ddk_lib_510.tar.gz # 解压得到 hiai_ddk_lib_510 目录本文所述步骤基于当前仓库对应的 Paddle Lite 版本HiAI DDK 下载地址请以 华为麒麟 NPU 详细指南 为准。由于 HiAI DDK 可能依赖特定版本的 ROM建议在真机上更新至最新版 EMUI 系统后再测试。为保证编译环境一致建议参考 Docker 统一编译环境搭建 配置 Docker 开发环境进行编译。3.2 armv8arm64-v8a编译tiny_publish 编译生成轻量级预测库$ ./lite/tools/build_android.sh --toolchainclang --android_stlc_shared --with_extraON --with_logON --with_nnadapterON --nnadapter_with_huawei_kirin_npuON --nnadapter_huawei_kirin_npu_sdk_root$(pwd)/hiai_ddk_lib_510full_publish 编译生成完整 API 预测库$ ./lite/tools/build_android.sh --toolchainclang --android_stlc_shared --with_extraON --with_logON --with_nnadapterON --nnadapter_with_huawei_kirin_npuON --nnadapter_huawei_kirin_npu_sdk_root$(pwd)/hiai_ddk_lib_510 full_publish3.3 armv7armeabi-v7a编译在上一节命令基础上追加--archarmv7即可其余参数保持一致$ ./lite/tools/build_android.sh --archarmv7 --toolchainclang --android_stlc_shared --with_extraON --with_logON --with_nnadapterON --nnadapter_with_huawei_kirin_npuON --nnadapter_huawei_kirin_npu_sdk_root$(pwd)/hiai_ddk_lib_510更多编译选项可通过./lite/tools/build_android.sh help查看。3.4 编译产物说明编译成功后产出位于build.lite.android.armv8.clang/inference_lite_lib.android.armv8.nnadapter/armv7 对应build.lite.android.armv7.clang/inference_lite_lib.android.armv7.nnadapter/其中cxx/目录下包含include/Paddle Lite C 头文件lib/libnnadapter.soNNAdapter 运行时库lib/libhuawei_kirin_npu.so华为麒麟 NPU 的 NNAdapter device HAL 库lib/libpaddle_light_api_shared.solight API 预测库tiny/full 均产出lib/libpaddle_full_api_shared.sofull API 预测库仅 full_publish 产出。产出 HAL 库的编译目标定义见 HAL 库编译脚本其将converter/目录下的算子转换器与optimizer/目录下的图优化 pass 连同engine.cc、driver.cc一起编译为名为huawei_kirin_npu的共享库并注册进NNADAPTER_DEVICES设备列表。四、部署与运行图像分类示例程序4.1 获取通用示例程序下载 Paddle Lite 通用示例程序包PaddleLite-generic-demo.tar.gz并解压其image_classification_demo主体结构如下- PaddleLite-generic-demo - image_classification_demo - assets - configs - imagenet_224.txt # 模型配置文件 - synset_words.txt # 1000 分类 label 文件 - datasets - test - inputs - tabby_cat.jpg # 输入图片 - list.txt # 图片清单 - models - mobilenet_v1_fp32_224 # Paddle non-combined 格式模型 - __model__ # 模型组网文件可用 Netron 查看 - subgraph_partition_config_file.txt # 自定义子图分割配置文件 ... - shell - demo.cc # 示例程序源码 - build.sh # 编译脚本 - run_with_adb.sh # adb 运行脚本 - libs - PaddleLite - android - arm64-v8a - include - lib - huawei_kirin_npu - libnnadapter.so - libhuawei_kirin_npu.so - libhiai.so ... - libpaddle_full_api_shared.so - libpaddle_light_api_shared.so - armeabi-v7a ...4.2 分别运行 CPU 与 NPU 模型进行对比Android shell 端通过run_with_adb.sh运行。运行 ARM CPU 版 mobilenet_v1$ cd PaddleLite-generic-demo/image_classification_demo/shell $ ./run_with_adb.sh mobilenet_v1_fp32_224 imagenet_224.txt test android arm64-v8a预期输出CPU 推理Top5 与耗时Top1 Egyptian cat - 0.482871 Top2 tabby, tabby cat - 0.471594 Top3 tiger cat - 0.039779 Top4 lynx, catamount - 0.002430 Top5 ping-pong ball - 0.000508 Prediction time: 33.408000 ms, avg 33.408000 ms, ...运行华为 Kirin NPU 版 mobilenet_v1在命令末尾追加设备名huawei_kirin_npu$ ./run_with_adb.sh mobilenet_v1_fp32_224 imagenet_224.txt test android arm64-v8a huawei_kirin_npu预期输出NPU 推理Top1 Egyptian cat - 0.479004 Top2 tabby, tabby cat - 0.475342 Top3 tiger cat - 0.039642 Top4 lynx, catamount - 0.002363 Top5 ping-pong ball - 0.000499 Prediction time: 3.154000 ms, avg 3.154000 ms, ...对比可见同一模型在该测试环境下 NPU 推理耗时约为 CPU 的十分之一量级且 Top1 分类结果一致概率略有差异详见下文精度说明。4.3 运行注意事项由于 HiAI 的限制需要 root 权限才能执行 shell 示例程序run_with_adb.sh只能在连接设备的宿主机上运行不能在 Docker 环境可能找不到设备或设备本身上执行build.sh需要在 Docker 环境中执行否则需将脚本中的ANDROID_NDK修改为当前环境的 NDK 路径两个脚本均有较多入参模型名、配置名、数据集、操作系统、体系结构、设备序列号等需按脚本注释配置正确参数需要启用自定义子图分割文件的模型须取消run_with_adb.sh第 12 行行首的#注释更换测试图片时将图片拷贝至assets/datasets/test/inputs/并把文件名追加到list.txt即可重新编译示例程序arm64-v8a 执行./build.sh android arm64-v8aarmeabi-v7a 执行./build.sh android armeabi-v7a。4.4 替换自定义编译的 Paddle Lite 库若需使用自编译库将编译产物替换到示例程序的libs/PaddleLite/android/对应 ABI 目录下armv8 与 armv7 替换逻辑相同以 armv8 为例# 替换 include 目录 $ cp -rf build.lite.android.armv8.clang/inference_lite_lib.android.armv8.nnadapter/cxx/include/ \ PaddleLite-generic-demo/libs/PaddleLite/android/arm64-v8a/include/ # 替换 NNAdapter 运行时库 $ cp -rf .../cxx/lib/libnnadapter.so \ PaddleLite-generic-demo/libs/PaddleLite/android/arm64-v8a/lib/huawei_kirin_npu/ # 替换 NNAdapter device HAL 库 $ cp -rf .../cxx/lib/libhuawei_kirin_npu.so \ PaddleLite-generic-demo/libs/PaddleLite/android/arm64-v8a/lib/huawei_kirin_npu/ # 替换 light API 预测库 $ cp -rf .../cxx/lib/libpaddle_light_api_shared.so \ PaddleLite-generic-demo/libs/PaddleLite/android/arm64-v8a/lib/ # 替换 full API 预测库仅 full_publish 编译方式下 $ cp -rf .../cxx/lib/libpaddle_full_api_shared.so \ PaddleLite-generic-demo/libs/PaddleLite/android/arm64-v8a/lib/替换完成后需重新编译示例程序。五、支持现状5.1 已支持的芯片与设备芯片代表设备Kirin 9000HUAWEI Mate 40 Pro 系列Kirin 9000EHUAWEI Mate 40 系列Kirin 990 5GHUAWEI Mate 30 Pro 系列、P40 Pro 系列Kirin 990HUAWEI Mate 30 系列、荣耀 V20 系列、nova 6 系列、P40 系列、Mate XsKirin 985HUAWEI nova 7 5G、nova 7 Pro 5G、荣耀 30Kirin 820HUAWEI nova 7 SE 5G、荣耀 30SKirin 810HUAWEI nova 5 系列、nova 6 SE、荣耀 9X 系列、荣耀 Play4T Pro5.2 已验证支持的 Paddle 模型按任务类别仓库文档已验证过的模型涵盖图像分类DarkNet53、DenseNet121、MobileNet 系列、ResNet 系列、PP-LCNet、EfficientNetB0 等、目标检测PPYOLO_tiny、YOLOv3 系列、SSD-MobileNetV1、姿态检测PP-TinyPose、关键点检测HRNet、HigherHRNet、OCR 文本检测与识别PaddleOCR mobile/server 系列、CRNN、生成网络ESRGAN与视频分类PP-TSN。完整下载链接见 华为麒麟 NPU 详细指南。5.3 性能参考仓库文档在 Kirin 810 / 990 / 990 5G 三款设备上warmup1、repeats5、单线程、LITE_POWER_HIGH电源模式、输入 {1,3,224,224}测得以下数据单位 ms来自 华为麒麟 NPU 详细指南模型Kirin 810 CPUKirin 810 NPUKirin 990 CPUKirin 990 NPUKirin 990 5G CPUKirin 990 5G NPUmobilenet_v1_fp32_22438.365.9030.233.3531.572.99resnet50_fp32_224224.7218.09176.669.83186.577.65ssd_mobilenet_v1_relu_voc_fp32_30080.0630.1663.0422.9068.4621.40六、源码级实现解析6.1 HAL 设备注册driver.cc华为麒麟 NPU 以 NNAdapter 标准 device HAL 插件形式存在。在 driver.cc 中通过NNADAPTER_EXPORT导出一个nnadapter::driver::Device实例name huawei_kirin_npuvendor Huaweitype NNADAPTER_ACCELERATOR注册OpenDevice/CloseDevice/CreateContext/DestroyContext/CreateProgram/DestroyProgram/ExecuteProgram一组回调构成 NNAdapter 运行时调用该设备的标准入口。其中CreateProgram内部调用Program::Build(model, cache)完成模型构建ExecuteProgram内部调用Program::Execute(...)完成一次推理。6.2 模型构建与执行engine.ccengine.cc 是核心实现Program::Build第 48-178 行包含清晰的四段流程图优化依次执行FuseConv2DBatchNormIntoConv2DConvBN 融合、FuseConv2DAddIntoConv2DConvAdd 融合、FuseConv2DActivationIntoConv2DConv激活融合、FuseReshapeTransposeReshapeIntoChannelShuffleReshape-Transpose-Reshape → ChannelShuffle 融合以及本驱动特有的FixMultipleOutputsOps修复 pass算子转换通过Converter将 NNAdapter 标准模型转换为 HiAI 的 GEGraph Engine图HiAI OM 模型生成调用BuildOMModelToBuffer将 GE 图编译为 HiAI OM 模型并序列化进缓冲区支持缓存复用模型加载与张量初始化调用LoadOMModelFromBuffer创建 HiAI model manager client再通过GetModelIOTensorDim获取输入输出维度并初始化hiai::AiTensor。Program::Execute第 208-259 行完成一次推理先做输入输出维度一致性校验CheckInputsAndOutputs将输入数据memcpy到input_tensors_随后以model_name为 key 构造hiai::AiContext并调用model_client_-Process(...)同步执行 HiAI 模型最后把output_tensors_的结果拷回 NNAdapter 的输出内存。6.3 算子转换器converter/converter/目录下逐算子实现了 NNAdapter 标准算子到 HiAI IR 的转换包含conv2d.cc、pool2d.cc、elementwise.cc、fully_connected.cc、mat_mul.cc、softmax.cc、concat.cc、split.cc、reshape.cc、transpose.cc、slice.cc、batch_normalization.cc、layer_normalization.cc、各类激活unary_activations.cc、leaky_relu.cc、hard_swish.cc、gelu.cc等以及逻辑/比较运算等 40 余个转换器converter 目录清单。仓库文档说明各算子在不同新硬件上的最新支持信息可查阅lite/kernels/nnadapter/converter/all.h。七、常见问题与注意事项算子无法转成 HiAI IR 时的行为opt 工具生成的模型只是标记了麒麟 NPU 支持的 Paddle 算子并不会真正生成 NPU 模型只有执行时才将标记算子转换为 HiAI IR 并组网生成 HiAI OM 模型。若因算子无法完整转换或目标手机 HiAI 版本过低导致模型生成失败Paddle Lite 会自动回退调用 ARM CPU 版算子完成整个预测任务保证结果可用。精度差异达芬奇架构 NPU 内部大量采用float16运算预测结果会与 CPU 浮点结果存在轻微偏差但大部分情况下精度损失不大可对比同图 CPU 与 NPU 的 Top 分类结果验证。必须 rootHiAI 示例程序在 Android shell 端执行需要 root 权限。STL 必须一致HiAI DDK 基于c_shared构建编译参数必须带--android_stlc_shared。架构限制仅支持华为自研达芬奇架构 NPUKirin 810/820/985/990/990 5G/9000E/9000不支持寒武纪 NPUKirin 970/980与 NNIEHi3559A、Hi3519A。ROM 版本HiAI DDK 可能依赖特定版本 ROM建议升级至最新 EMUI 后测试不同型号、不同 ROM 版本的手机在执行阶段的行为可能不一致。八、总结华为麒麟 NPU 的接入是 Paddle Lite NNAdapter 多硬件统一适配体系的典型范例通过nnadapter_with_huawei_kirin_npuON与nnadapter_huawei_kirin_npu_sdk_root两个编译参数即可在标准 Android 交叉编译流程中产出包含libhuawei_kirin_npu.soHAL 的部署库运行时模型经过图优化、NNAdapter→HiAI IR 算子转换、HiAI OM 编译与加载、Process执行四个阶段在达芬奇 NPU 上完成加速推理并在算子不兼容时自动回退 CPU。开发者可据此快速复现 CPU/NPU 对比测试或进一步基于converter/目录扩展算子支持将更多 Paddle 模型迁移到麒麟平台。【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考