PaddleDetection 检测模型在晶晨 A311D 上的 NPU 部署FastDeploy Paddle Lite 量化模型实战指南【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection本指南以 PaddleDetection 仓库中的 A311D 部署文档 与 C 部署示例 为主体完整讲解如何在晶晨AmlogicA311D 及其同系芯片上通过 FastDeploy 与 Paddle Lite 将 PP-YOLOE 量化检测模型部署到板端 NPU 并完成加速推理。读者将掌握芯原 NPU 平台的部署前提与模型准备方法、交叉编译与 CMake 构建流程、基于 adb 的上板运行方式以及推理示例 infer.cc 的源码级工作原理。1. 方案背景为什么是 FastDeploy Paddle Lite 芯原 NPU晶晨 A311D 是一款面向边缘 AI 应用的高性能应用处理器其内部集成了芯原Verisilicon授权的高性能 NPU IP。需要特别说明的是芯原本身是 IP 设计厂商并不直接提供实体 SoC 产品而是将 NPU IP 授权给芯片厂商如晶晨、瑞芯微等集成到各自 SoC 中。因此只要是采用了芯原 NPU IP、且没有大幅修改芯原底层库的芯片产品都可以参考本文档完成 Paddle Lite 推理部署。在本指南中晶晨 SoC 中的 NPU 与瑞芯微 SoC 中的 NPU 统一称为“芯原 NPU”。当前 PaddleDetection 通过 FastDeploy 明确支持在以下芯片上部署Amlogic A311DAmlogic C308XAmlogic S905D3FastDeploy 已支持基于 Paddle Lite 将PP-YOLOE 量化模型部署到 A311D 上。值得强调的是在 A311D 上目前只支持 C 部署方式Python 部署不可用这一点与瑞芯微等平台不同请在实际方案选型时注意。2. 部署整体链路与技术要点A311D 上 PP-YOLOE 量化模型的部署链路可以概括为PaddleDetection 训练/导出 FP32 模型 │ (导出时 use_shared_convFalse) ▼ 量化FastDeploy 一键自动化压缩 / 官方量化模型 │ (得到 INT8 量化模型 subgraph.txt 异构计算文件) ▼ 交叉编译 FastDeploytimvx 后端arm64 ▼ CMake 编译部署示例 infer_demo ▼ adb 推送 库 demo 模型 图片 到 A311D ▼ Paddle Lite TIM-VX 运行时在 NPU 上执行推理这条链路包含三个核心技术点后文将逐一展开模型必须量化NPU 上部署的是量化后的 INT8 模型FP32 模型无法直接获得加速需要异构计算文件 subgraph.txt用于指定哪些算子卸载到 NPU 执行哪些留在 CPU 执行Paddle Lite 通过 TIM-VX 运行时访问芯原 NPU这正是 infer.cc 中option.UseTimVX()所做的事情。3. 部署环境准备3.1 软硬件环境要求目标硬件Amlogic A311D或 C308X / S905D3开发板系统为 Linux交叉编译主机x86 Linux 环境需要提前安装好交叉编译工具链工具依赖adb用于将库、模型与 demo 推送到设备并在设备上执行注意 adb 部署流程不应当在 docker 容器内运行编译构建工具cmake要求不低于 3.10、make。3.2 交叉编译 FastDeploy 库A311D 上无法直接编译 FastDeploy需要先在 x86 主机上交叉编译出面向arm64、启用timvx后端即芯原 NPU 的 TIM-VX 运行时的 FastDeploy 库。交叉编译的具体流程请参考 FastDeploy 官方的“晶晨 A311D 编译”文档本仓库不包含该工具链构建代码仅提供接入方式。编译完成后会得到包含toolchain.cmake、头文件与lib/*.so*动态库的 SDK 目录通常命名为fastdeploy-timvx后续 CMake 构建将直接依赖它。4. 部署模型准备三种途径与关键参数A311D 上的模型准备共有三种途径且都围绕 PP-YOLOE 展开4.1 直接使用 FastDeploy 官方提供的量化模型FastDeploy 已经为 PP-YOLOE 提供了可直接下载的量化模型如ppyoloe_noshare_qat即导出时关闭 shared conv 的 QAT 量化模型用户可以直接下载用于部署这也是最快验证通路的方式。量化模型列表与基准数据可参考 模型量化文档。4.2 自行导出 FP32 模型再量化如果使用 PaddleDetection 自行导出 Float32 模型导出时务必设置use_shared_convFalse。该参数在 PP-YOLOE 的检测头源码中有明确的实现依据在 ppyoloe_head.py 中use_shared_conv作为PPYOLOEHead的构造参数默认值为True并在前向推理约第 254、265 行中决定检测头是否复用共享卷积量化部署要求关闭该特性因此需要在导出配置中显式置为False。导出工具为仓库根目录的 tools/export_model.py。4.3 使用一键模型自动化压缩工具自行量化用户还可以使用 FastDeploy 提供的一键模型自动化压缩工具仅通过一个配置文件即可完成对 PP-YOLOE 的量化蒸馏训练得到高精度的 INT8 量化模型。量化完成后需要注意推理量化后的检测模型仍然需要 FP32 模型文件夹下的infer_cfg.yml文件。自行量化产出的模型文件夹内不包含该 yaml需要用户从 FP32 模型文件夹中把infer_cfg.yml复制到量化后的模型文件夹内否则推理无法正确解析检测后处理配置。这一点同样适用于量化文档 deploy/fastdeploy/quantize/README.md 中描述的流程。从该文档的 Benchmark 可以看出量化部署的价值在于例如ppyoloe_crn_l_300e_coco在 TensorRT 后端上 FP32 的 Runtime 时延约 27.90msINT8 可降到约 6.39ms在 ONNX Runtime CPU 上FP32 约 1057.82msINT8 约 449.52ms。这说明量化是边缘端部署加速的核心手段。4.4 异构计算文件 subgraph.txt模型在 A311D 上执行的是异构计算部分算子卸载到 NPU其余算子留在 CPU。这个调度关系由异构计算文件即subgraph.txt描述推理时会通过option.SetLiteSubgraphPartitionPath(subgraph_file)加载见下文源码解析。由于 FastDeploy 提供的模型已自带异构文件可以先直接使用官方异构文件验证精度是否符合要求如需针对自有模型生成异构文件可参考 FastDeploy 关于 TIM-VX NPU 异构计算的说明文档。5. 部署示例源码解析在动手执行部署命令之前先理解 infer.cc 的实现这有助于排查运行时问题。5.1 推理主流程InitAndInfervoid InitAndInfer(const std::string model_dir, const std::string image_file) { auto model_file model_dir sep model.pdmodel; auto params_file model_dir sep model.pdiparams; auto config_file model_dir sep infer_cfg.yml; auto subgraph_file model_dir sep subgraph.txt; fastdeploy::vision::EnableFlyCV(); fastdeploy::RuntimeOption option; option.UseTimVX(); option.SetLiteSubgraphPartitionPath(subgraph_file); ... }关键点解读模型文件约定模型目录下必须同时存在model.pdmodel网络结构、model.pdiparams权重、infer_cfg.ymlFastDeploy 解析 PP-YOLOE 后处理配置所必需、subgraph.txtNPU 异构调度文件。这就是第 4.3 节强调必须补拷infer_cfg.yml的原因EnableFlyCV()启用 FlyCV 加速图像预处理resize 等减少 CPU 侧瓶颈option.UseTimVX()为 Paddle Lite 运行时启用 TIM-VX 后端这是访问芯原 NPU 的关键开关SetLiteSubgraphPartitionPath(subgraph_file)加载异构计算子图划分文件指定 NPU 与 CPU 的算子分配。随后创建 PP-YOLOE 检测模型并校验初始化auto model fastdeploy::vision::detection::PPYOLOE(model_file, params_file, config_file, option); assert(model.Initialized());assert(model.Initialized())用于校验模型是否加载成功——若infer_cfg.yml缺失或后端初始化失败程序会在此中断这是最常见的排错锚点之一。5.2 推理与结果可视化auto im cv::imread(image_file); fastdeploy::vision::DetectionResult res; if (!model.Predict(im, res)) { std::cerr Failed to predict. std::endl; return; } std::cout res.Str() std::endl; auto vis_im fastdeploy::vision::VisDetection(im, res, 0.5); cv::imwrite(vis_result.jpg, vis_im); std::cout Visualized result saved in ./vis_result.jpg std::endl;model.Predict(im, res)完成单图推理DetectionResult承载检测框、类别与置信度res.Str()以文本形式打印检测结果便于在无显示设备的板端验证输出VisDetection(im, res, 0.5)以 0.5 为置信度阈值绘制可视化结果并保存为vis_result.jpg。5.3 命令行入口int main(int argc, char* argv[]) { if (argc 3) { std::cout Usage: infer_demo path/to/quant_model path/to/image e.g ./infer_demo ./PPYOLOE_L_quant ./test.jpeg std::endl; return -1; } std::string model_dir argv[1]; std::string test_image argv[2]; InitAndInfer(model_dir, test_image); return 0; }demo 接受两个位置参数量化模型目录路径与待推理图片路径。5.4 CMake 构建与 adb 部署脚本CMakeLists.txt 通过include(${FASTDEPLOY_INSTALL_DIR}/FastDeploy.cmake)引入 FastDeploy 提供的构建配置编译生成infer_demo可执行文件并将models、images、动态库含 FastDeploy 本体与第三方依赖以及run_with_adb.sh一并安装到build/install目录——这意味着install目录是可直接整体推送到板端的“运行包”。run_with_adb.sh 则完成自动上板执行依次接收 demo 名、模型名、图片名、设备 ID 四个参数将install目录中的lib、demo、models、images通过adb push上传到设备的/data/local/tmp/test并在设备端设置一组关键环境变量后运行 demoexport GLOG_v5; export SUBGRAPH_ONLINE_MODEtrue; export RKNPU_LOGLEVEL5; export RKNN_LOG_LEVEL5; ulimit -c unlimited; export VIV_VX_ENABLE_GRAPH_TRANSFORM-pcq:1; export VIV_VX_SET_PER_CHANNEL_ENTROPY100; export TIMVX_BATCHNORM_FUSION_MAX_ALLOWED_QUANT_SCALE_DEVIATION300000; export VSI_NN_LOG_LEVEL5; export LD_LIBRARY_PATH/data/local/tmp/test/lib:$LD_LIBRARY_PATH其中VIV_VX_*与TIMVX_*系列变量用于调节芯原 NPU 图优化与量化融合策略LD_LIBRARY_PATH指向随包推送的动态库目录启用ulimit -c unlimited便于在崩溃时产生 core dump 定位问题。6. 完整部署实操步骤以下步骤与仓库中的 C 部署示例 保持一致6.1 获取部署示例代码git clone https://gitcode.com/gh_mirrors/pa/PaddleDetection.git cd PaddleDetection/deploy/fastdeploy/amlogic/a311d/cpp # 注意如果当前分支找不到 fastdeploy 测试代码请切换到 develop 分支 # git checkout develop6.2 拷贝交叉编译好的 FastDeploy 库将第 3.2 节交叉编译得到的 SDK 拷贝到示例目录库目录名称以实际编译产物为准下文按fastdeploy-timvx说明cp -r FastDeploy/build/fastdeploy-timvx/ PaddleDetection/deploy/fastdeploy/amlogic/a311d/cpp6.3 下载部署所需模型与示例图片cd PaddleDetection/deploy/fastdeploy/amlogic/a311d/cpp mkdir models mkdir images # 下载 FastDeploy 提供的 PP-YOLOE 量化模型压缩包ppyoloe_noshare_qat.tar.gz并解压 wget ppyoloe_noshare_qat 量化模型下载地址 tar -xvf ppyoloe_noshare_qat.tar.gz cp -r ppyoloe_noshare_qat models # 使用仓库 demo 目录下的 COCO 示例图片作为推理输入 cp PaddleDetection 根目录/demo/000000014439.jpg images仓库根目录 demo 中内置了多张可用于验证的示例图片如000000014439.jpg、000000087038.jpg等无需额外准备测试数据。6.4 交叉编译部署示例cd PaddleDetection/deploy/fastdeploy/amlogic/a311d/cpp mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE${PWD}/../fastdeploy-timvx/toolchain.cmake \ -DFASTDEPLOY_INSTALL_DIR${PWD}/../fastdeploy-timvx \ -DTARGET_ABIarm64 .. make -j8 make install参数说明CMAKE_TOOLCHAIN_FILE交叉编译工具链文件由 FastDeploy 交叉编译产物提供FASTDEPLOY_INSTALL_DIRFastDeploy SDK 安装目录用于引入FastDeploy.cmake与库文件TARGET_ABIarm64目标 ABI 为 64 位 ARMmake install会在build/install下生成可运行 demo 及部署所需全部动态库。6.5 基于 adb 部署到 A311D 并运行cd PaddleDetection/deploy/fastdeploy/amlogic/a311d/cpp/build/install/ # 用法bash run_with_adb.sh 需要运行的demo 模型路径 图片路径 设备的DEVICE_ID bash run_with_adb.sh infer_demo ppyoloe_noshare_qat 000000014439.jpg $DEVICE_ID脚本执行成功后会在设备端完成库、模型、图片的上传并运行infer_demo终端将输出检测结果的文本信息DetectionResult::Str()同时设备端会生成可视化结果图vis_result.jpg可用于核对检测框是否正确。7. 常见问题与排查思路结合 infer.cc 的初始化断言与 run_with_adb.sh 的环境变量可以归纳出以下排查路线程序在assert(model.Initialized())处中断优先检查模型目录四件套是否齐全——model.pdmodel、model.pdiparams、infer_cfg.yml、subgraph.txt。特别地自行量化的模型必须从 FP32 模型文件夹复制infer_cfg.ymlNPU 算子执行异常或精度偏差检查subgraph.txt是否与模型匹配可先用官方异构文件验证精度关注VIV_VX_SET_PER_CHANNEL_ENTROPY等量化相关环境变量是否符合设备端 NPU 驱动要求动态库加载失败确认LD_LIBRARY_PATH指向设备端lib目录且推送的库版本与 demo 交叉编译时的 FastDeploy 版本一致需要切换推理后端引擎PP-YOLOE 在 FastDeploy 中支持多种后端如 Paddle Lite、ONNX Runtime、TensorRT 等换端部署时可参考 FastDeploy 的后端切换说明模型量化相关问题量化蒸馏训练、精度与加速比数据、各硬件平台的量化支持情况统一参考 模型量化文档。该文档中的硬件支持矩阵显示晶晨平台在量化模型部署上仅支持 C 方式而 X86 CPU、NVIDIA GPU、飞腾、ARM CPU、Intel GPU、昆仑、昇腾、瑞芯微、算能等平台均同时支持 Python 与 C。8. 关联资源导航平台总入口deploy/fastdeploy/README.mdFastDeploy 部署 PaddleDetection 模型概览晶晨 A311D 部署主文档deploy/fastdeploy/amlogic/a311d/README.mdC 部署示例与完整命令deploy/fastdeploy/amlogic/a311d/cpp/README.md推理源码infer.cc部署脚本run_with_adb.sh构建配置CMakeLists.txt模型量化与量化模型 Benchmarkdeploy/fastdeploy/quantize/README.mdPP-YOLOE 配置与使用configs/ppyoloe/README.md模型导出工具tools/export_model.py示例测试图片demo/000000014439.jpg9. 总结在晶晨 A311D 上部署 PaddleDetection 检测模型核心路径是“FP32 模型导出use_shared_convFalse→ INT8 量化 → FastDeploytimvx 后端交叉编译 → CMake 构建 → adb 上板”。该方案依托 FastDeploy 将 Paddle Lite 与芯原 NPU 的 TIM-VX 运行时打通并通过subgraph.txt实现 CPU/NPU 异构调度使 PP-YOLOE 检测模型能够在低功耗边缘设备上获得量化加速。理解 infer.cc 的模型四件套加载约定、UseTimVX()后端开关与 run_with_adb.sh 的环境变量设置是快速完成部署与排查问题的关键。【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考