news 2026/10/9 1:54:42

Paddle-Lite ARM CPU C++ 推理功能测试(TIPC):基于 MobileNetV3 的端到端实操指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Paddle-Lite ARM CPU C++ 推理功能测试(TIPC):基于 MobileNetV3 的端到端实操指南
  • 人工智能
  • 深度学习
  • 计算机视觉
  • NLP
  • 语音

【免费下载链接】models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.

项目地址:https://gitcode.com/gh_mirrors/mo/models
点击查看免费下载

引言:什么是 Lite cpp arm cpu 推理功能测试

在 PaddlePaddle 模型套件(models 仓库)的 TIPC(Test Infrastructure and Production Compatibility,训练与推理链路兼容性测试)体系中,Lite cpp arm cpu 推理功能测试用于验证基于 ARM CPU 的 C++ 模型推理功能是否可用、可复现、可回归。它把「模型转换 → 交叉编译 → adb 推送 → 真机/模拟器推理 → 日志输出 → 结果校验」这条完整的端到端链路固化为一组可重复执行的 Shell 脚本,从而在每次代码变更后都能以最小成本确认 Paddle Lite 在移动端 CPU 上的推理能力没有退化。

本文以 MobileNetV3(mobilenet_v3_small)为例,完整讲解该测试的测试结论基线、环境准备、模型/数据/预测库准备、功能测试执行、日志解析与失败定位,并深入prepare_lite_arm_cpu_cpp.sh、test_lite_arm_cpu_cpp.sh、mobilenet_v3.cc等源码,说明每一步命令背后的底层逻辑。读者读完可掌握:如何为任意分类模型接入 Lite ARM CPU 推理测试、如何读懂 TIPC 配置与输出日志、以及如何在失败时快速定位原因。

1. 测试结论基线:一次测试对应一个明确的参数组合

Lite cpp arm cpu 推理功能测试采用「一配置一结论」的矩阵化管理方式。每个算法/模型对应一个 TIPC 配置文件,文件中明确写出本次测试覆盖的线程数、精度与 batchsize 组合。以 MobileNetV3 为例,测试结论汇总如下:

算法名称模型名称num_threadsprecisionbatchsize
MobileNetV3mobilenet_v3_small1FP321

该表对应的配置实体为 lite_arm_cpu_cpp.txt,其完整内容为:

runtime_device:arm_cpu lite_arm_work_path:/data/local/tmp/arm_cpu/ lite_arm_so_path:inference_lite_lib.android.armv8/cxx/lib/libpaddle_light_api_shared.so clas_model_file:mobilenet_v3_small.nb inference_cmd:mobilenet_v3 config.txt demo.jpg --num_threads_list:1 --batch_size_list:1 --precision_list:FP32

各字段含义如下:

  • runtime_device:推理运行设备,ARM CPU 场景固定为arm_cpu;
  • lite_arm_work_path:设备端工作目录,所有二进制、预测库、模型与数据都会被 adb 推送到该目录;
  • lite_arm_so_path:Paddle Lite 动态库在宿主机上的相对路径(相对deploy/lite_infer_cpp_arm_cpu/mobilenet_v3/),运行时要把它一并推到设备端并加入LD_LIBRARY_PATH;
  • clas_model_file:经 opt 工具转换后的 Paddle Lite.nb模型文件名;
  • inference_cmd:设备端实际执行的推理命令(可执行文件 + config + 测试图片);
  • --num_threads_list/--batch_size_list/--precision_list:测试覆盖的线程数、batchsize、精度列表,用|分隔可组合出多组测试(本配置各只有 1 个取值,即单组测试)。

从源码看,prepare_lite_arm_cpu_cpp.sh 和 test_lite_arm_cpu_cpp.sh 都会按固定行号用func_parser_value_lite解析上述 8 个字段,因此字段顺序不可随意调整,新增测试维度时需同步修改两个脚本的解析逻辑。

2. 测试流程总览

整个测试分为两个阶段、四条命令:

  1. 环境准备(宿主机编译环境 + 设备端环境);
  2. 准备模型、数据、预测库:prepare_lite_arm_cpu_cpp.sh;
  3. 功能测试执行:test_lite_arm_cpu_cpp.sh;
  4. 结果校验与失败定位(日志文件)。

3. 准备环境:宿主机交叉编译链 + Android 设备

3.1 部署文档先行

Lite cpp arm cpu 推理测试的环境准备完全复用移动端部署流程,详见仓库内的 Mobilenet_v3 基于 ARM CPU 部署文档。它涵盖 inference model 获取、Paddle Lite 模型转换(opt)、预测库获取、交叉编译与 Android 真机部署的完整步骤,是本测试的前置基础。

3.2 宿主机编译环境清单

以 arm v8、Android 系统为部署目标,需要以下工具:

  • gcc、g++(推荐 8.2.0);
  • git、make、wget、python、adb;
  • Java Environment(编译 Android NDK 工具链需要);
  • CMake 3.10 版本(其他版本可能存在兼容性问题导致编译不通过);
  • Android NDK(支持 ndk-r17c 及之后所有版本;注意从 ndk-r18 起 NDK 交叉编译工具仅支持 Clang、不支持 GCC)。

以 Ubuntu 为例的安装命令(需 root 权限):

# 1. 基础软件 apt update apt-get install -y --no-install-recommends \ gcc g++ git make wget python unzip adb curl # 2. JDK apt-get install -y default-jdk # 3. CMake 3.10.3 wget -c https://mms-res.cdn.bcebos.com/cmake-3.10.3-Linux-x86_64.tar.gz && \ tar xzf cmake-3.10.3-Linux-x86_64.tar.gz && \ mv cmake-3.10.3-Linux-x86_64 /opt/cmake-3.10 && ln -s /opt/cmake-3.10/bin/cmake /usr/bin/cmake && \ ln -s /opt/cmake-3.10/bin/ccmake /usr/bin/ccmake # 4. Android NDK r17c(其他版本步骤类似) cd /tmp && curl -O https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip cd /opt && unzip /tmp/android-ndk-r17c-linux-x86_64.zip # 5. 设置 NDK_ROOT 环境变量 echo "export NDK_ROOT=/opt/android-ndk-r17c" >> ~/.bashrc source ~/.bashrc

mac 环境下编译 Android 库可参考 Paddle-Lite 的 Android 源码编译文档,Windows 下暂不支持编译 Android 版本库。

3.3 获取 Paddle Lite 预测库(二选一)

方式一:使用预编译包(推荐)。下载inference_lite_lib.android.armv8.clang.c++_static.with_extra.with_cv.tar.gz(本教程需使用 static 库,with_extra与with_cv提供算子扩展与 OpenCV 支持):

tar -xvzf inference_lite_lib.android.armv8.clang.c++_static.with_extra.with_cv.tar.gz mv inference_lite_lib.android.armv8.clang.c++_static.with_extra.with_cv inference_lite_lib.android.armv8

注意:即使使用预编译包,上面 3.2 的环境安装步骤依然要执行,因为编译 demo 可执行文件时仍会用到交叉工具链。

方式二:源码编译。先确认NDK_ROOT指向正确的 NDK 路径,再克隆 Paddle-Lite 源码并切换发布分支(如release/v2.10),执行:

echo $NDK_ROOT git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite && git checkout release/v2.10 ./lite/tools/build_android.sh

默认参数编译成功后,在Paddle-Lite/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8下生成编译包,其目录结构包含:

  • cxx/include:paddle_api.h、paddle_image_preprocess.h、paddle_place.h、paddle_use_kernels.h、paddle_use_ops.h、paddle_use_passes.h等 C++ 头文件;
  • cxx/lib:libpaddle_api_light_bundled.a(静态库)与libpaddle_light_api_shared.so(动态库);
  • java:PaddlePredictor.jar与libpaddle_lite_jni.so;
  • demo:C++ 与 Java 示例代码。

4. 准备模型、数据、预测库:prepare 脚本做了什么

环境就绪后,运行以下命令准备测试所需的一切产物:

bash test_tipc/prepare_lite_arm_cpu_cpp.sh ${your_config_file}

以mobilenet_v3_small为例:

bash test_tipc/prepare_lite_arm_cpu_cpp.sh test_tipc/configs/mobilenet_v3_small/lite_arm_cpu_cpp.txt

4.1 prepare 脚本的源码拆解

prepare_lite_arm_cpu_cpp.sh 按固定顺序完成以下 6 个步骤(注意:脚本默认在tutorials/mobilenetv3_prod/Step6目录下执行):

  1. 工作目录准备:进入./deploy/lite_infer_cpp_arm_cpu/mobilenet_v3/,把 TIPC 配置文件与测试脚本拷贝进去;
  2. 安装 Paddle Lite 转换工具:pip3 install paddlelite==2.10(适用于 python 3.5/3.6/3.7),后续的export_lite_model.py依赖paddlelite.lite模块;
  3. 下载并转换 inference model:wget下载mobilenet_v3_small_infer.tar,解压后调用python export_lite_model.py --model-file=... --param-file=... --optimize-out=...生成mobilenet_v3_small.nb,随后清理中间文件;
  4. 下载 Paddle Lite 预测库:wget下载预编译的inference_lite_lib.android.armv8.clang.c++_static.with_extra.with_cv.tar.gz并解压、重命名为inference_lite_lib.android.armv8;
  5. 克隆 AutoLog 并编译可执行文件:git clone https://github.com/LDOUBLEV/AutoLog.git && make(编译过程会下载 OpenCV 第三方库,需要联网;Makefile 第 4 行的LITE_ROOT=./inference_lite_lib.android.armv8需与预测库文件夹名一致);
  6. 推送产物到设备:解析 TIPC 配置后,用adb shell mkdir -p、adb push、adb shell chmod +x把可执行文件、libpaddle_light_api_shared.so、.nb模型、config、label、测试图片依次推送到/data/local/tmp/arm_cpu/。

4.2 两种模型转换方式(部署文档补充)

除脚本内置的 python 方式外,部署文档还提供了终端命令方式——直接使用 Paddle-Lite 官方发布的opt_linux/opt_mac模型转换工具:

./opt --model_file=./mobilenet_v3_small_infer/inference.pdmodel \ --param_file=./mobilenet_v3_small_infer/inference.pdiparams \ --optimize_out=./mobilenet_v3_small

两种方式殊途同归,都会在当前目录生成mobilenet_v3_small.nb。转换工具的核心逻辑对应 export_lite_model.py:通过paddlelite.lite.Opt依次set_model_file、set_param_file、set_valid_places('arm')、set_model_type('naive_buffer')、set_optimize_out(...)后执行run()。其中--target=arm对应set_valid_places,即只保留 ARM 端可用的算子与 kernel,这正是.nb模型能瘦身并适配移动端的原因。

提示:在 mac 上运行opt_mac可能触发系统安全拦截,需在「安全性与隐私 → 通用」中允许运行。

5. 执行功能测试:test 脚本与日志输出

准备完成后,执行功能测试:

bash test_tipc/test_lite_arm_cpu_cpp.sh ${your_config_file}

以mobilenet_v3_small为例:

bash test_tipc/test_lite_arm_cpu_cpp.sh test_tipc/configs/mobilenet_v3_small/lite_arm_cpu_cpp.txt

5.1 test 脚本执行逻辑

test_lite_arm_cpu_cpp.sh 的流程如下:

  1. 解析两层配置:先从config.txt解析label_path、resize_short_size、crop_size、visualize、enable_benchmark、tipc_benchmark等推理参数;再从 TIPC 配置解析设备、路径、命令与测试维度;
  2. 改写设备端 config:用sed把runtime_device固定为arm_cpu,并把clas_model_file改写为设备端绝对路径/data/local/tmp/arm_cpu/mobilenet_v3_small.nb;
  3. 维度循环:对num_threads_list × batch_size_list × precision_list做三重循环,每轮先用sed更新config.txt中的num_threads/batch_size/precision,再拼出lite_{model}_runtime_device_{device}_precision_{precision}_batchsize_{batch}_threads_{threads}.log日志文件名;
  4. 执行与状态登记:adb push更新后的 config 到设备端,再通过adb shell运行export LD_LIBRARY_PATH=...; /data/local/tmp/arm_cpu/mobilenet_v3 /data/local/tmp/arm_cpu/config.txt /data/local/tmp/arm_cpu/demo.jpg,输出重定向到日志文件;最后调用common_func.sh中的status_check依据退出码登记 pass/fail。

5.2 成功输出的标志

运行成功后,终端会输出类似下面的命令回显:

Run successfully with command - adb shell 'export LD_LIBRARY_PATH=/data/local/tmp/arm_cpu/; /data/local/tmp/arm_cpu/mobilenet_v3 /data/local/tmp/arm_cpu/config.txt /data/local/tmp/arm_cpu/demo.jpg' > ./output/lite_mobilenet_v3_small.nb_runtime_device_arm_cpu_precision_FP32_batchsize_1_threads_1.log 2>&1!

从中可以拆出三条关键信息:

  • 实际在设备端执行的命令与LD_LIBRARY_PATH设置;
  • 日志文件命名规则:lite_{模型名}_runtime_device_{设备}_precision_{精度}_batchsize_{batchsize}_threads_{线程数}.log;
  • 日志输出目录:./output/(相对test_tipc/运行目录,脚本内部实际写入./test_tipc/output/${model_name}/arm_infer/)。

5.3 Autolog 参数信息:一次推理的完整画像

推理程序内部通过AutoLogger输出结构化参数信息(见 mobilenet_v3.cc 中tipc_benchmark分支),包含:

  • 参数设置信息:运行设备(runtime_device=arm_cpu)、线程数(cpu_num_threads=1);
  • 模型信息:模型名称(mobilenet_v3_small.nb)、精度(precision=FP32);
  • 数据信息:batchsize(batch_size=1);
  • 性能信息:预处理耗时(preprocess_time)、推理耗时(inference_time)、后处理耗时(postprocess_time)及总耗时。

以上信息可在运行日志中查看,mobilenet_v3_small的日志位于./output/lite_mobilenet_v3_small.nb_runtime_device_arm_cpu_precision_FP32_batchsize_1_threads_1.log。

5.4 失败时的日志定位

如果运行失败,终端会输出失败日志信息及对应的完整运行命令。定位思路如下:

  1. 用日志中的命令手动重放:先检查 adb 设备是否在线(adb devices),再逐步验证设备端文件是否齐备;
  2. 重点核查三类问题:LD_LIBRARY_PATH是否正确指向libpaddle_light_api_shared.so所在目录(缺少动态库会直接启动失败)、mobilenet_v3_small.nb是否已推送到设备端、config.txt与demo.jpg路径是否与命令一致;
  3. 若为编译期问题,回到 3.2/4.1 检查 CMake 版本、NDK 版本与LITE_ROOT配置。

6. 从测试到部署:理解 C++ 推理主程序的完整链路

test_lite_arm_cpu_cpp.sh调用的mobilenet_v3可执行文件由 mobilenet_v3.cc 编译而来,其调用链正好对应测试中校验的「预处理 → 推理 → 后处理」三段耗时:

  1. 配置加载:LoadConfigTxt逐行解析config.txt为key-value字典,LoadLabels读取imagenet1k_label_list.txt;
  2. 模型加载:LoadModel通过MobileConfig::set_model_from_file加载.nb模型并创建PaddlePredictor;
  3. 预处理:ResizeImage按resize_short_size(256)短边缩放 →CenterCropImg按crop_size(224)中心裁剪 →convertTo(CV_32FC3, 1/255)归一化 →NeonMeanScale使用 ARM NEON 向量指令完成 NHWC→NCHW 布局转换与 mean/scale(mean=[0.485,0.456,0.406],scale=[1/0.229,1/0.224,1/0.225])计算;
  4. 推理:input_tensor->Resize({1,3,224,224})后predictor->Run();
  5. 后处理:PostProcess取 Top-5 结果,结合 label 文件映射类别名,visualize=1时输出clas_result.png;
  6. 性能统计:enable_benchmark=1时循环 1000 次,前 10 次 warmup 后统计平均耗时;tipc_benchmark=1时输出 AutoLog 结构化信息。

测试使用的config.txt(示例)与 TIPC 配置相互配合:

clas_model_file /data/local/tmp/arm_cpu/mobilenet_v3_small.nb label_path /data/local/tmp/arm_cpu/imagenet1k_label_list.txt resize_short_size 256 crop_size 224 visualize 0 num_threads 1 batch_size 1 precision FP32 runtime_device arm_cpu enable_benchmark 0 tipc_benchmark 1

test 脚本在每轮循环中动态改写num_threads/batch_size/precision三行,从而以同一份可执行文件覆盖不同的测试维度组合。

7. 结果正确性验证:与 Paddle 训练结果对齐

为了确认 ARM CPU 上的 Lite 推理结果正确,可在宿主机用 Paddle 推理脚本做交叉验证(运行前需具备与训练一致的预训练模型):

# 在 models/tutorials/mobilenetv3_prod/Step6 目录下 python tools/predict.py --pretrained=./mobilenet_v3_small_paddle_pretrained.pdparams --img-path=images/demo.jpg

输出class_id: 8, prob: 0.9091238975524902,即预测类别 ID 为 8(hen,母鸡),置信度约 0.909;而设备端 Lite 推理的 Top-1 结果为class_id: 8, class_name: hen, score: 0.901639。二者类别一致、置信度差异极小,差异来源主要是 Paddle Lite 使用的 OpenCV 与训练阶段使用的 PIL 在前处理细节上的微小差别。这一结论说明:TIPC 测试通过 + 数值对齐,即代表 ARM CPU 端 C++ 推理功能链路正确。

8. 测试与部署的完整产物对照

阶段关键产物仓库/生成位置
模型导出inference.pdmodel / inference.pdiparamsStep6/tools/export_model.py
Lite 模型转换mobilenet_v3_small.nbdeploy/lite_infer_cpp_arm_cpu/mobilenet_v3/
预测库inference_lite_lib.android.armv8/宿主机工作目录
可执行文件mobilenet_v3make编译产物
设备端输入config.txt + demo.jpg + label/data/local/tmp/arm_cpu/
测试日志lite_*.logtest_tipc/output/${model_name}/arm_infer/

如需在 Android 真机上手动复现设备端推理(跳过 TIPC 脚本),部署文档给出了逐步adb push+adb shell的完整命令序列,其推理输出示例为:

===clas result for image: /data/local/tmp/arm_cpu/demo.jpg=== Top-1, class_id: 8, class_name: hen, score: 0.901639 Top-2, class_id: 7, class_name: cock, score: 0.0970001 Top-3, class_id: 86, class_name: partridge, score: 0.000225853 Top-4, class_id: 80, class_name: black grouse, score: 0.0001647 Top-5, class_id: 21, class_name: kite, score: 0.000128394

9. 常见问题与排查要点

  • 编译不通过:优先确认 CMake 是否为 3.10 版本、NDK 版本是否在 r17c 及以后、LITE_ROOT是否与预测库实际文件夹名一致;
  • 设备端启动失败:检查LD_LIBRARY_PATH是否指向含libpaddle_light_api_shared.so的目录,以及.so是否已成功推送;
  • 推理结果异常:核对config.txt的resize_short_size(256)与crop_size(224)是否符合模型训练时的前处理约定,检查 mean/scale 是否一致;
  • mac 上 opt 工具被拦截:在系统「安全性与隐私 → 通用」中点击「仍然允许」;
  • 日志缺失/为空:确认adb devices能识别设备且已开启 USB 调试,确认 TIPC 配置的lite_arm_work_path可写。

10. 相关文档与进一步阅读

  • 测试文档:test_lite_infer_cpp_arm_cpu.md
  • 部署文档:Mobilenet_v3 基于 ARM CPU 部署
  • TIPC 通用说明:tutorials/tipc/lite_infer_cpp_arm_cpu/README.md
  • 通用指南:tutorials/tipc/lite_infer_cpp_arm_cpu/lite_infer_cpp_arm_cpu.md
  • 测试配置:lite_arm_cpu_cpp.txt
  • 推理实现:mobilenet_v3.cc

通过本文的完整流程,任何具备 Android 交叉编译环境与 adb 设备的开发者,都可以基于 TIPC 体系为自己的分类模型建立可重复的 ARM CPU C++ 推理回归测试,并借助 AutoLog 输出量化每一段耗时,为移动端性能优化提供数据依据。

  • 人工智能
  • 深度学习
  • 计算机视觉
  • NLP
  • 语音

【免费下载链接】models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.

项目地址:https://gitcode.com/gh_mirrors/mo/models
点击查看免费下载

相关推荐

上一篇:如何用Redpill Recovery拯救你的群晖NAS:终极修复指南
下一篇:如何快速清理Windows网盘图标:Drive Icon Manager终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 1:51:32

C#+Sql Server网上书店管理系统:从数据库设计到事务实现

简介:基于C#与SQL Server开发的网上书店管理系统,是一份面向ASP.NET课程设计的完整项目源码包,适合计算机相关专业学生作为毕业设计或课程设计参考。系统采用浏览器/服务器结构,将前台用户与后台员工分离为两套页面模板&#xff0…

作者头像 李华
网站建设 2026/10/9 1:47:23

Multisim秒表仿真避坑指南:时序精度与物理约束实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 1:46:43

PWM控制从原理到实战:模式1与模式2区别、电机调速及故障保护

1. PWM控制的基本原理与核心价值PWM这三个字母,但凡搞过单片机、玩过电机、调过灯光的,基本都绕不开。全称Pulse Width Modulation,中文叫脉冲宽度调制。说白了,就是用一串方波去“骗”负载,让它以为自己拿到的是模拟量…

作者头像 李华