
Paddle Lite 芯原 TIM-VX NPU 部署实战瑞芯微/晶晨/恩智浦 SoC 的驱动对齐、量化模型与源码级 NNAdapter 实现解析【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite本篇指南围绕 Paddle Lite 通过 TIM-VX 接入芯原VeriSiliconNPU 的完整部署链路展开先讲清驱动 依赖库版本对齐这一端侧部署的前置关键再给出从 PaddleSlim 后量化、opt 模型转换到交叉编译运行示例程序的全套可复制操作并结合lite/backends/nnadapter下的真实源码深入解析 NNAdapter 如何将 Paddle 算子逐层转换、在线编译成 TIM-VX 图并执行推理的底层机制。读完本文你能够在搭载芯原 NPU IP 的晶晨、瑞芯微、恩智浦 SoC 上完成 Paddle Lite 的 NPU 推理部署与性能复现。1. 支持现状芯片、模型与实测性能芯原VeriSilicon本身是 NPU IP 设计厂商不直接提供实体 SoC而是将 NPU IP 授权给晶晨Amlogic、瑞芯微Rockchip、恩智浦NXP等芯片厂商。因此本文适用于所有被芯原授权了 NPU IP的芯片产品只要芯片厂商没有大幅修改芯原的底层库就可以按本文完成 Paddle Lite 的推理部署。1.1 已验证的芯片型号Amlogic A311DAmlogic S905D3Amlogic C308XRockchip RV1109Rockchip RV1126Rockchip RK1808NXP i.MX 8M Plus理论上支持所有获得芯原 NPU IP 授权的 SoC前提是具备下文要求的匹配版本 NPU 驱动以上为官方实测验证过的型号。1.2 已支持的 Paddle 模型官方提供了一批可直接下载的 int8 量化模型分类、检测两类均放置于 Paddle Lite 官方 demo 资源服务器paddlelite-demo.bj.bcebos.com的 models 目录下mobilenet_v1_int8_224_per_layermobilenet_v2_int8_224_per_layermobilenet_v3_int8_224_per_channelshufflenet_v2_int8_224_per_layerresnet50_int8_224_per_layerssd_mobilenet_v1_relu_voc_int8_300_per_layeryolov5s_int8_640_per_channelpicodet_relu6_int8_416_per_channel官方另提供 Linux 下的 picodet 目标检测可视化 demo 参考1.3 官方性能测试数据测试环境与方法原文档实测口径编译环境Ubuntu 16.04GCC 5.4目标为 ARMLinux armhf 与 aarch64测试方法warmup1、repeats5统计平均时间ms线程数为 1paddle::lite_api::PowerMode CPU_POWER_MODE设置为paddle::lite_api::PowerMode::LITE_POWER_HIGH分类模型输入图像维度为{1, 3, 224, 224}硬件环境SoCCPUNPUAmlogic A311D4 x Cortex-A73 2 x Cortex-A535 TOPs (INT8)Amlogic S905D32 x Cortex-A551.2 TOPs (INT8)Amlogic C308X2 x Cortex-A554 TOPs (INT8)Rockchip RK18082 x Cortex-A353 TOPs (INT8)Rockchip RV11092 x Cortex-A71.2 TOPs (INT8)Rockchip RV11264 x Cortex-A72 TOPs (INT8)NXP i.MX 8M Plus4 x Cortex-A535 TOPs (INT8)CPU 与 NPU 推理耗时对比单位 msCPU(ms) / NPU(ms)模型A311D CPUA311D NPUS905D3 CPUS905D3 NPUC308X CPUC308X NPURK1808 CPURK1808 NPURV1109 CPURV1109 NPURV1126 CPURV1126 NPUi.MX 8M Plus CPUi.MX 8M Plus NPUmobilenet_v1_int8_224_per_layer81.63215.1125280.465912.8081167.6236.9828264.62356.139335.039915.1995281.6310.2766106.6563.21236mobilenet_v2_int8_224_per_layer124.59157.2110350.200317.4572257.22314.9003357.051517.5205335.039921.7522350.89319.5102146.6585.546mobilenet_v3_int8_224_per_channel145.323511.7315408.225625.5506296.60315.5162286.980213.998335.039916.0502401.09014.7521160.114—shufflenet_v2_int8_224_per_layer65.49833.6092221.81259.3139134.25215.835479.63346.60511660.27257.1952402.2256.240059.95912.6551resnet50_int8_224_per_layer390.498317.5832787.532341.3139949.532.3541188.346918.17841660.272524.8895590.885447.792409.32512.6551ssd_mobilenet_v1_relu_voc_int8_300_per_layer134.991515.2167295.489140.1089196.37726.8084542.5616.84512.10122.187261.598620.12287159.336514.2235yolov5s_int8_640_per_channel455.580592.21321619.3089198.3684906.377167.8554542.56179.02281712.101214.1871513.390200.235459.2507—picodet_relu6_int8_416_per_channel246.078535.2960686.205479.1789496.37769.1412542.5674.8410706.560139.6872661.6818122.3293261.9874—从数据上可以直观看到int8 全量化模型在 NPU 上的推理耗时普遍比 CPU 低一个数量级如 A311D 上 mobilenet_v1 的 81.63ms → 5.11ms这也是本文档要求模型必须为量化模型的根本原因——芯原 NPU 主要面向 INT8 算力。1.4 已支持或部分支持的 Paddle 算子各算子在不同新硬件上的支持信息可以在当前仓库中查阅 NNAdapter 芯原后端的算子注册总表 all.h。该文件以REGISTER_CONVERTER宏逐行登记每个 NNAdapter 标准算子到 TIM-VX 转换函数的映射是判断某个网络能否整体落到 NPU 上而不被切到 CPU的最直接依据。2. 接入原理从 Paddle 模型到 TIM-VX 在线编译原文档对原理的概括是与其他新硬件接入 Paddle Lite 的方式类似——加载并分析 Paddle 模型首先将 Paddle 算子转成NNAdapter 标准算子其次再通过TIM-VX 的组网 API进行网络构建在线编译模型并执行模型。结合当前仓库源码lite/backends/nnadapter/nnadapter/src/driver/verisilicon_timvx/可以把这条链路拆解为四个可验证的实现环节1设备 HAL 入口。driver.cc 实现了 NNAdapter 规定的 device 接口并在文件末尾以NNADAPTER_EXPORT导出设备符号表见 driver.cc#L111-L124设备名即verisilicon_timvx、厂商Verisilicon、类型为NNADAPTER_ACCELERATOR。NNAdapter 运行时在加载优化后的模型时按valid_targets找到这个动态库即编译产物libverisilicon_timvx.so调用OpenDevice → CreateContext → CreateProgram → ExecuteProgram完成整次推理。2图构建优化 逐算子转换 在线编译。核心逻辑在 engine.cc 的Program::Buildengine.cc#L75-L195它有两条路径首次构建从模型构建先执行一串图优化 pass——ConvertFillLikeIntoMulAdd、ConstantFoldOperations常量折叠、ConvertMeshgridIntoReshapeExpand、FuseConv2DBatchNormIntoConv2D卷积BN 融合允许通过上下文参数约束量化 scale 偏差、FuseConv2DAddIntoConv2D、FuseConv2DActivationIntoConv2D、FuseMatMulAddIntoFullyConnected、FuseReshapeTransposeReshapeIntoChannelShuffle、FuseSigmoidMulIntoSwish、ConvertAdaptivePool2dIntoPool2d、UnpackOpFusion、ConvertQuantizationSymmToAsymm对称量化转非对称量化因为芯原 NPU 的 int8 通路基于 uint8 非对称表示然后由 Converter 按拓扑序遍历每个 NNAdapter 操作通过all.h注册表分发到具体的 TIM-VX 转换函数converter.cc#L34-L57把每个操作建成tim::vx::ops节点遇到未注册算子会直接打印Unsupported operation日志并终止——这就是子图分割的底层触发点无法转换的部分会被 NNAdapter 框架划回 CPU 执行最后调用graph_-Compile()在线编译如果框架提供了 cache 目录cache-token cache-dir则会调用CompileToBinary把编译产物序列化成NBGNetwork Binary Graph缓存下来。二次及以后构建从缓存构建直接以 NBG 数据创建tim::vx::ops::NBG操作并绑定输入输出跳过全部转换与编译步骤显著缩短首次推理的初始化时间。engine.h 中的Program类成员也印证了这套设计std::mapcore::Operand*, std::vectortim::vx::Tensor tensors_维护 NNAdapter 操作数到 TIM-VX tensor 的映射graph_与ctx_分别持有 TIM-VX 的Graph和Context智能指针。3执行与数据通路。Program::Executeengine.cc#L225-L287的流程是先CheckInputsAndOutputs校验输入维度是否与构建时一致不一致返回NNADAPTER_INVALID_DIMENSIONS再逐个把输入拷入 TIM-VX tensor——对uint8非对称量化类型会先用Symm2AsymmData做 int8→uint8 的零点对齐转换随后graph_-Run()触发 NPU 推理最后拷出输出并做Asymm2SymmData逆变换。4设备端运行时的库结构。一次 TIM-VX 推理实际涉及三层库在通用 demo 包的目录结构中可以看到对应关系NNAdapter device HAL 库libverisilicon_timvx.so即上文 driver/engine/converter 源码的编译产物NNAdapter 运行时库libnnadapter.so负责模型加载、子图调度与多后端协同芯原 SDK 库TIM-VX DDKlibtim-vx.soTIM-VX 组网库以及libGAL.so、libOpenVX.so、libCLC.so、libVSC.so、libNNArchPerf.so、libArchModelSw.so、libNNGPUBinary.so、libNNVXCBinary.so、libOvx12VXCBinary.so等 DDK 库。这些 .so 通过软链接指向viv_sdk_x_x_x版本目录switch_viv_sdk.sh脚本负责按芯片型号 NPU 驱动版本重建这些软链接——这正是后文反复强调的驱动与依赖库必须版本对齐在库结构上的体现。HAL 库的构建入口在 CMakeLists.txt其通过dependencies.cmake拉取 TIM-VX 头文件与库依赖最终产出${DEVICE_NAME}共享库并注册进NNADAPTER_DEVICES。2.1 一个可调参数BN 融合的量化偏差阈值Context构造函数engine.cc#L41-L59支持通过 context properties 或同名环境变量设置VERISILICON_TIMVX_BATCHNORM_FUSION_MAX_ALLOWED_QUANT_SCALE_DEVIATION默认 -1.0。该阈值控制卷积BatchNorm 融合允许的最大量化 scale 偏差对于量化模型BN 参数与 conv 权重量化尺度差异过大时强行融合会损伤精度该参数就是给这类融合一个可放宽/收紧的安全边界。3. 准备设备环境驱动版本对齐是第一步芯原 NPU 部署中开发板侧有两个关键环境因素必须版本对齐缺一不可galcore.koNPU 内核驱动文件NPU 用户态依赖库上文 2 节中 viv SDK 那套 .so。3.1 查询当前 NPU 驱动版本登录开发板执行$ dmesg | grep Galcore推荐的 NPU 驱动版本按 SoC 厂家SoC 厂家推荐驱动版本Amlogic6.4.4.3Rockchip6.4.6.5NXP6.4.3.p1例如晶晨 A311D 上应看到类似输出$ dmesg | grep Galcore [ 24.140820] Galcore version 6.4.4.3.310723AAA若版本已符合上表可跳过本节否则按以下两种方式之一修正。3.2 方法 1手动替换驱动文件与依赖库推荐先下载并解压 Paddle Lite 官方通用示例包PaddleLite-generic-demo.tar.gz位于官方 demo 资源服务器的 devices/generic 目录其中包含针对不同芯片型号、不同 Linux Kernel 版本的galcore.ko与 NPU 依赖库。下表罗列了部分市面常见开发板的情况以及该示例包中提供的现成驱动文件与依赖库刷取 NPU 依赖库软链接命令在 PC 端解压后的 PaddleLite-generic-demo 目录下执行SoC 型号开发板厂家开发板型号OS推荐 Linux Kernel推荐 NPU 驱动版本galcore.ko 路径示例包内刷取 NPU 依赖库软链接命令Amlogic A311D世野科技 KhadasVIM3android4.9.1136.4.4.3libs/PaddleLite/android/armeabi-v7a/lib/verisilicon_timvx/viv_sdk_6_4_4_3/lib/a311d/4.9.113cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_4_3 a311dAmlogic A311D世野科技 KhadasVIM3linux4.9.2416.4.4.3libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/viv_sdk_6_4_4_3/lib/a311d/4.9.241cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_4_3 a311dAmlogic A311D荣品PR-A311Dlinux4.9.1136.4.4.3libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/viv_sdk_6_4_4_3/lib/a311d/4.9.113cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_4_3 a311dAmlogic S905D3世野科技 KhadasVIM3Landroid4.9.1136.4.4.3libs/PaddleLite/android/armeabi-v7a/lib/verisilicon_timvx/viv_sdk_6_4_4_3/lib/s905d3/4.9.113cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_4_3 s905d3Amlogic S905D3世野科技 KhadasVIM3Llinux4.9.2416.4.4.3libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/viv_sdk_6_4_4_3/lib/s905d3/4.9.241cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_4_3 s905d3Amlogic C308X其他—linux4.19.816.4.4.3libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/viv_sdk_6_4_4_3/lib/c308x/4.19.81cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_4_3 c308xRockchip RV1109瑞芯微/荣品/其他RV1109 EVB、RP-RV1109 等linux4.19.1116.4.6.5libs/PaddleLite/linux/armhf/lib/verisilicon_timvx/viv_sdk_6_4_6_5/1109/4.19.111cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_6_5 1109Rockchip RV1126瑞芯微/荣品/其他RV1126 EVB、RP-RV1126 等linux4.19.1116.4.6.5libs/PaddleLite/linux/armhf/lib/verisilicon_timvx/viv_sdk_6_4_6_5/1126/4.19.111cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_6_5 1126Rockchip RK1808瑞芯微/荣品/其他RK1808 EVB、RP-RK1808 等linux4.4.1946.4.6.5libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/viv_sdk_6_4_6_5/lib/rk1808/4.4.194cd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_6_5 rk1808NXP i.MX 8M Plus其他—linux5.4.706.4.3.p1常见开发板系统中驱动为内置buildin无需单独 insmodcd .../verisilicon_timvx ./switch_viv_sdk.sh 6_4_3_p1 imx8mp详细操作步骤在上表中根据自己的芯片型号、开发板厂商找到对应行登录开发板uname -a确认 Linux Kernel 版本与表格一致不一致则跳转方法 2刷机将对应行的galcore.ko上传至开发板在开发板上执行sudo rmmod galcore卸载原驱动再sudo insmod galcore.ko加载新驱动是否需要 sudo 视开发板情况adb 连接的设备请提前adb root。此步失败则跳转方法 2执行dmesg | grep Galcore复核版本晶晨 6.4.4.3、瑞芯微 6.4.6.5、NXP 6.4.3.p1在 PC 端解压后的 PaddleLite-generic-demo 目录中执行上表最后一列的switch_viv_sdk.sh命令将 NPU 依赖库软链接切换到对应版本。最后建议把上传的galcore.ko放入开发板系统默认加载目录一般在XXX/lib/modules/下可在开发板根目录执行find -name galcore.ko定位实现开机自动加载。3.3 方法 2刷机如果手动替换失败则按开发板具体型号向卖家或官网客服索要对应驱动版本晶晨 6.4.4.3、瑞芯微 6.4.6.5、NXP 6.4.3.p1的固件与刷机方法。官方为 Khadas VIM3 / VIM3L 提供了含 NPU 驱动与芯原依赖库的 Android 与 Linux 刷机镜像分别存放于 Khadas 官方服务器与飞桨 demo 服务器的 devices/verisilicon/firmware 目录如VIM3_Pie_V210908、VIM3L_Pie_V210906等 Android 固件与 Ubuntu focal Linux 4.9 arm64 EMMC 镜像并按官方文档流程刷入。4. 准备交叉编译环境示例程序和 Paddle Lite 库建议采用交叉编译通过adb或ssh与设备交互并运行程序为保证编译环境一致建议参考 Docker 统一编译环境搭建 配置 Docker 开发环境由于部分设备只能通过网络访问需要scp/ssh传输产物进入 Docker 容器后还需安装$ apt-get install openssh-client sshpass5. 运行图像分类示例程序解压PaddleLite-generic-demo.tar.gz后目录主体结构如下重点理解verisilicon_timvx目录下的三层库与软链接组织- PaddleLite-generic-demo - image_classification_demo - assets - configs - imagenet_224.txt # 预处理 config 文件 - synset_words.txt # 1000 分类 label 文件 - datasets - test - inputs - tabby_cat.jpg # 输入图片 - outputs - tabby_cat.jpg # 输出图片 - list.txt # 图片清单 - models - mobilenet_v1_int8_224_per_layer - __model__ # Paddle fluid 模型组网文件可用 netron 查看结构 - conv1_weights # 模型参数文件 - batch_norm_0.tmp_2.quant_dequant.scale # 量化参数文件 - subgraph_partition_config_file.txt # 自定义子图分割配置文件 - ... - shell - CMakeLists.txt # 示例程序 CMake 脚本 - build.linux.arm64 / demo # 已编译好的 arm64 示例程序 - build.linux.armhf / demo # armhf - build.android.armeabi-v7a / demo - demo.cc # 示例程序源码 - build.sh # 编译脚本 - run.sh / run_with_ssh.sh / run_with_adb.sh - libs - PaddleLite - linux - arm64 - include # Paddle Lite 头文件 - lib - verisilicon_timvx # 芯原 DDK、NNAdapter 运行时库、device HAL 库 - libGAL.so - ./viv_sdk_6_4_4_3/lib/libGAL.so - libNNVXCBinary.so - ./viv_sdk_6_4_4_3/lib/a311d/libNNVXCBinary.so - libOpenCL.so / libOpenVX.so / libOpenVXU.so / libVSC.so ... - libverisilicon_timvx.so # NNAdapter device HAL 库 - libnnadapter.so # NNAdapter 运行时库 - libtim-vx.so - ./viv_sdk_6_4_4_3/lib/libtim-vx.so # 芯原 TIM-VX 库 - switch_viv_sdk.sh # 按芯片型号 NPU 驱动版本重建依赖库软链接 - viv_sdk_6_4_4_3 / lib / a311d | s905d3 | c308x ... - viv_sdk_6_4_6_5 / lib / 1808 ... - viv_sdk_6_4_3_p1 / lib / imx8mp ... - libpaddle_full_api_shared.so - libpaddle_light_api_shared.so - armhf ... # RV1109 / RV1126 使用 viv_sdk_6_4_6_5/1109、1126 - android/armeabi-v7a ... # Android 32 位viv_sdk_6_4_4_3/a311d、s905d3 - OpenCV # OpenCV 预编译库 - object_detection_demo # 目标检测示例程序注意switch_viv_sdk.sh的作用正是为芯片型号 × 驱动版本的组合创建正确的 .so 软链接例如libNNVXCBinary.so这类带芯片后缀的 DDK 库必须指向对应平台a311d / s905d3 / imx8mp / 1109 / 1126 / rk1808的目录。5.1 在 ARM CPU 与芯原 NPU 上分别运行同一模型脚本参数注意原文档强调run_with_adb.sh不能在 Docker 环境执行可能找不到设备也不能在设备上运行run_with_ssh.sh不能在设备上运行执行前需配置目标设备 IP、SSH 账号密码build.sh根据入参生成不同操作系统/体系结构的二进制需查阅脚本注释配置正确参数下述命令示例中的 IP、账号密码、设备序列号均为示例值请按实际环境修改。在 ARM CPU 上运行mobilenet_v1_int8_224_per_layer$ cd PaddleLite-generic-demo/image_classification_demo/shell # SSH 连接开发板场景 # Linux arm64 $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux arm64 cpu IP地址 22 用户名 密码 # Linux arm32 $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux armhf cpu IP地址 22 用户名 密码 # Android armeabi-v7a $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test android armeabi-v7a cpu IP地址 22 用户名 密码 # ADB 连接开发板场景 $ ./run_with_adb.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux arm64 cpu adb设备号 $ ./run_with_adb.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux armhf cpu adb设备号 $ ./run_with_adb.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test android armeabi-v7a cpu adb设备号A311DLinux 版CPU 运行输出示例Top1 Egyptian cat - 0.503239 Top2 tabby, tabby cat - 0.419854 Top3 tiger cat - 0.065506 Top4 lynx, catamount - 0.007992 Top5 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor - 0.000494 Preprocess time: 8.881000 ms, avg 8.881000 ms, max 8.881000 ms, min 8.881000 ms Prediction time: 62.890000 ms, avg 62.890000 ms, max 62.890000 ms, min 62.890000 ms Postprocess time: 9.080000 ms, avg 9.080000 ms, max 9.080000 ms, min 9.080000 ms在芯原 NPUverisilicon_timvx上运行同一模型$ cd PaddleLite-generic-demo/image_classification_demo/shell # SSH 场景 $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux arm64 verisilicon_timvx IP地址 22 用户名 密码 $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux armhf verisilicon_timvx IP地址 22 用户名 密码 $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test android armeabi-v7a verisilicon_timvx IP地址 22 用户名 密码 # ADB 场景 $ ./run_with_adb.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux arm64 verisilicon_timvx adb设备号 $ ./run_with_adb.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux armhf verisilicon_timvx adb设备号 $ ./run_with_adb.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test android armeabi-v7a verisilicon_timvx adb设备号A311DLinux 版NPU 运行输出示例精度可能有细微差异Top1 Egyptian cat - 0.497230 Top2 tabby, tabby cat - 0.403634 Top3 tiger cat - 0.081897 Top4 lynx, catamount - 0.011700 Top5 tiger shark, Galeocerdo cuvieri - 0.000000 Preprocess time: 13.014000 ms, avg 13.014000 ms, max 13.014000 ms, min 13.014000 ms Prediction time: 5.480000 ms, avg 5.480000 ms, max 5.480000 ms, min 5.480000 ms Postprocess time: 10.099000 ms, avg 10.099000 ms, max 10.099000 ms, min 10.099000 ms两次运行的 Top5 结论一致而 Prediction 时间从 CPU 的 62.89ms 降到 NPU 的 5.48ms与 1.3 节的宏观测试数据互相印证。5.2 更换测试图片与重新编译更换测试图片把图片拷贝到PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/inputs并把文件名追加到同级list.txt在 Docker 环境中重新交叉编译示例程序build.sh参数需按脚本注释配置# For Linux 64 $ ./build.sh linux arm64 # For Linux 32 $ ./build.sh linux armhf # For Android armeabi-v7a $ ./build.sh android armeabi-v7a6. 更新模型后量化 opt 转换要让自定义模型跑上 NPU标准流程是fp32 模型 → PaddleSlim 后量化 → opt 工具转换指定 verisilicon_timvx 后端。6.1 用 PaddleSlim 生成 int8 量化模型准备 fp32 模型Paddle 训练或 X2Paddle 转换得到如 mobilenet_v1_fp32_224下载 PaddleLite 官方工具包PaddleSlim-quant-demo.tar.gz位于官方 demo 服务器 tools 目录解压后结构- PaddleSlim-quant-demo - image_classification_demo - quant_post # 后量化 - quant_post_rockchip_npu.sh # 一键量化脚本Amlogic 与瑞芯微底层同为芯原 NPU故通用 - README.md # PaddlePaddle、PaddleSlim 版本选择、编译和安装说明 - datasets - ILSVRC2012_val_100 # 从 ImageNet2012 验证集挑选的 100 张校准图片 - inputs # 待量化 fp32 模型mobilenet_v1、resnet50 - outputs # 产出的全量化模型 - scripts # 后量化内置脚本按其README.md完成 PaddlePaddle 与 PaddleSlim 安装直接执行一键脚本./quant_post_rockchip_npu.sh在outputs目录生成mobilenet_v1_int8_224_per_layer量化模型。关键配置与日志摘录原文档实测输出----------- Configuration Arguments ----------- activation_bits: 8 activation_quantize_type: moving_average_abs_max algo: KL batch_nums: 10 batch_size: 10 data_dir: ../dataset/ILSVRC2012_val_100 is_full_quantize: 1 model_path: ../models/mobilenet_v1 optimize_model: 1 output_path: ../outputs/mobilenet_v1 quantizable_op_type: conv2d,depthwise_conv2d,mul use_gpu: 0 use_slim: 1 weight_bits: 8 weight_quantize_type: abs_max ------------------------------------------------ ... 2021-08-30 05:54:29,194-INFO: The quantized model is saved in ../outputs/mobilenet_v1 post training quantization finish, and it takes 139.42292165756226. ... Testbatch 0, acc1 0.8, acc5 1.0, time 1.63 sec End test: test_acc1 0.76, test_acc5 0.92可以看到量化采用 KL 算法的 per-layer 全量化is_full_quantize: 1量化算子为conv2d, depthwise_conv2d, mul量化后在 100 张 ImageNet 校准图上 acc1 0.76、acc5 0.92。6.2 用 opt 工具生成含 TIM-VX 子图的优化模型参考 模型优化转换工具说明将valid_targets设置为verisilicon_timvx,arm即可$ ./opt --model_dirmobilenet_v1_int8_224_per_layer \ --optimize_out_typenaive_buffer \ --optimize_outopt_model \ --valid_targetsverisilicon_timvx,armarm作为兜底后端的意义在于模型中无法被 TIM-VX 后端转换的算子对照 all.h 的注册列表会被自动划入 CPU 子图执行保证整网可推理模型目录中的subgraph_partition_config_file.txt则用于自定义子图分割策略。7. 从源码编译支持 TIM-VX 的 Paddle Lite 库当需要用新算子或新特性时可从源码编译出完整的部署库。7.1 获取源码$ git clone https://gitcode.com/GitHub_Trending/pa/Paddle-Lite.git $ cd Paddle-Lite $ git checkout release-version-tag编译中依赖的 verisilicon_timvx 相关代码和依赖项会在编译脚本中自动下载无需手动拉取。7.2 各平台编译命令tiny_publish / full_publishA311D / S905D3 / C308XLinux 版arm64SDK 6_4_4_3# tiny_publish $ ./lite/tools/build_linux.sh --with_extraON --with_logON --with_nnadapterON --nnadapter_with_verisilicon_timvxON --nnadapter_verisilicon_timvx_src_git_tagmain --nnadapter_verisilicon_timvx_viv_sdk_urlhttp://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm64_6_4_4_3_generic.tgz # full_publish命令末尾追加 full_publish $ ./lite/tools/build_linux.sh --with_extraON --with_logON --with_nnadapterON --nnadapter_with_verisilicon_timvxON --nnadapter_verisilicon_timvx_src_git_tagmain --nnadapter_verisilicon_timvx_viv_sdk_urlhttp://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm64_6_4_4_3_generic.tgz full_publish编译产物位于build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/替换示例包中的头文件与库# 替换 include 目录 $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/ # 替换 NNAdapter 运行时库 $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libnnadapter.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/ # 替换 NNAdapter device HAL 库 $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libverisilicon_timvx.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/ # 替换 芯原 TIM-VX 库 $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libtim-vx.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/verisilicon_timvx/ # 替换 libpaddle_light_api_shared.so $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/ # 替换 libpaddle_full_api_shared.so仅 full_publish 编译方式下 $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/A311D / S905D3Android 版armv7SDK 6_4_4_3# tiny_publish $ ./lite/tools/build_android.sh --archarmv7 --toolchainclang --android_stlc_shared --with_extraON --with_exceptionON --with_cvON --with_logON --with_nnadapterON --nnadapter_with_verisilicon_timvxON --nnadapter_verisilicon_timvx_src_git_tagmain --nnadapter_verisilicon_timvx_viv_sdk_urlhttp://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_android_9_armeabi_v7a_6_4_4_3_generic.tgz # full_publish同上末尾追加 full_publish产物目录为build.lite.android.armv7.clang/inference_lite_lib.android.armv7.nnadapter/cxx/头文件与libpaddle_light_api_shared.so复制到libs/PaddleLite/android/armeabi-v7a/对应位置原文档 Android 场景下 include 目标目录写作libs/PaddleLite/linux/armhf/include/实际应与 armhf 包一致请以自身示例包结构为准。RV1109 / RV1126armv7hfSDK 6_4_6_5# tiny_publish $ ./lite/tools/build_linux.sh --with_extraON --with_logON --with_cvON --with_exceptionON --archarmv7hf --with_nnadapterON --nnadapter_with_verisilicon_timvxON --nnadapter_verisilicon_timvx_src_git_tagmain --nnadapter_verisilicon_timvx_viv_sdk_urlhttp://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm32_6_4_6_5_generic.tgz # full_publish末尾追加 full_publish产物在build.lite.linux.armv7hf.gcc/inference_lite_lib.armlinux.armv7hf.nnadapter/cxx/替换至libs/PaddleLite/linux/armhf/。RK1808arm64SDK 6_4_6_5与 NXP i.MX 8M Plusarm64SDK 6_4_3_p1与 A311D Linux 版流程一致仅--nnadapter_verisilicon_timvx_viv_sdk_url分别改为# RK1808 $ ./lite/tools/build_linux.sh --with_extraON --with_logON --with_nnadapterON --nnadapter_with_verisilicon_timvxON --nnadapter_verisilicon_timvx_src_git_tagmain --nnadapter_verisilicon_timvx_viv_sdk_urlhttp://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm64_6_4_6_5_generic.tgz # NXP i.MX 8M Plus $ ./lite/tools/build_linux.sh --with_extraON --with_logON --with_nnadapterON --nnadapter_with_verisilicon_timvxON --nnadapter_verisilicon_timvx_src_git_tagmain --nnadapter_verisilicon_timvx_viv_sdk_urlhttp://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm64_6_4_3_p1_generic.tgz各命令中--nnadapter_verisilicon_timvx_viv_sdk_url指定的 SDK 包版本6_4_4_3 / 6_4_6_5 / 6_4_3_p1必须与第 3 节中对齐后的设备端 NPU 驱动版本一致——这是编译侧与设备侧版本对齐的闭环。替换头文件后记得按 5.2 节重新编译示例程序再部署。8. 小结与后续方向部署链路驱动/依赖库版本对齐galcore.ko viv SDK 软链接→ PaddleSlim 后量化 → opt 指定valid_targetsverisilicon_timvx,arm→ 交叉编译部署 →run_with_ssh.sh/run_with_adb.sh一键验证源码心智模型libnnadapter.so运行时调度libverisilicon_timvx.sodriver → engine → converter 三层见 lite/backends/nnadapter/nnadapter/src/driver/verisilicon_timvx/ 芯原 DDK/TIM-VX 库其中Program::Build的优化 pass → 算子转换 → 在线编译/NBG 缓存与Program::Execute的维度校验 → 量化格式转换 →graph_-Run()→ 输出回拷构成一次 NPU 推理的完整代码路径可扩展性Paddle Lite 研发团队正在持续扩展基于 TIM-VX 的算子和模型新增算子时参照 converter 目录 下已有实现如conv2d.cc、pool2d.cc并在all.h中注册即可排障入口NPU 无输出先查dmesg | grep Galcore驱动版本模型部分落到 CPU 时对照all.h算子表确认缺失算子精度偏差可关注 BN 融合阈值参数VERISILICON_TIMVX_BATCHNORM_FUSION_MAX_ALLOWED_QUANT_SCALE_DEVIATION。【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考