飞桨 Paddle-Lite ARM GPU OpenCL C++ 推理接入 TIPC 自动化测试的开发规范与实战 人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载训推一体全流程TIPC面向飞桨框架代码更新可能引起的模型训练、预测报错与性能波动本文以其在 ARM_GPU_OPENCL 设备上的 Lite C 预测测试为切入点系统讲解从数据与环境准备、预测日志规范化到自动化测试脚本编写的完整接入流程。读完本文你将掌握 Paddle-Lite 在 ARM GPUOpenCL设备上的.nb模型转换、交叉编译、AutoLog 日志规范接入以及test_lite_arm_cpp.sh自动化测试的完整实现细节可直接用于自己模型仓库的 TIPC 测试接入。1. 背景TIPC 与 Lite ARM_GPU_OPENCL 测试的定位TIPCTraining and Inference Pipeline Certification旨在监控飞桨框架代码更新可能导致的模型训练、预测报错、性能下降等问题。本文档是 TIPC 在基础测试之上针对 Lite 测试的补充说明聚焦基于ARM_GPU_OPENCL 设备的 Lite 预测 C 测试即使用 OpenCL 作为后端、在 ARM 设备的 GPU 上运行 Paddle-Lite 推理。该链条主要监控两类内容可运行性飞桨框架更新后代码仓库模型基于 ARM_GPU_OPENCL 的 Lite 预测 C 测试是否能正常走通例如 API 的不兼容升级性能合理性飞桨框架更新后代码仓库模型基于 ARM_GPU_OPENCL 的 Lite 预测 C 测试速度是否合理。为了持续监控上述问题需要把代码仓库的 Lite 预测测试接入飞桨框架的CI 和 CE中提升 PR 合入的质量。做法是在代码仓库中加入运行脚本不影响套件正常运行的独立脚本完成模型的自动化测试。可以建立的 CI/CE 机制为全量数据走通开源模型 Lite 预测并验证模型预测速度和精度是否符合设定预期单模型 30 分钟内a. 保证预测结果正确预测速度符合预期QA 添加中注由于 CI 有时间限制测试时需要限制运行时间因此需要构建一个很小的数据集完成测试——这也是规范中要求准备少量预测数据的根本原因。2. 测试链条总览与样板间结构2.1 Lite 端训推一体自动化测试链条本规范最终的测试链条如下可以根据模型开发规范和代码仓库需要适当删减上图所示即为 Lite 端的链条共288 条。其中本文档主要介绍其中基于ARM_GPU_OPENCL 的 C 测试链条与 ARM CPU 链条的差异集中在运行设备、Paddle-Lite 预测库的编译选项与模型转换参数上ARM CPU 侧的对应规范可参见 ARM CPU 部署测试开发文档。2.2 文本检测样板间概览在 PaddleOCR 中以文本检测为例提供了本规范的样板间可完成概述部分提到的 CI/CE 机制。Lite 预测测试工具位于其test_tipc目录下与 ARM_GPU_OPENCL 样板间相关的主要文件如下test_tipc/ ├── common_func.sh ├── configs # 配置文件目录 │ ├── ch_PP-OCRv2_det │ │ ├── model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt │ │ ├── ... │ ├── ... │ ├── ch_PP-OCRv2 │ │ ├── model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt │ │ └── ... ├── prepare_lite_cpp.sh # 完成test_lite_**.sh运行所需要的数据和模型下载 ├── test_lite_arm_cpp.sh # lite测试主程序不同代码仓库的configs目录下内容可根据实际情况调整但配置文件model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt必须满足 TIPC 配置文件命名规范。该命名规范在仓库的 TIPC 模板中有明确说明见 community/repo_template/test_tipc/README.md 第 3.3 节仅预测的配置如 serving、lite 等命名格式为model_训练硬件环境_是否多机_是否混合精度_(infer/lite/serving/js)_语言(cpp/python/java)_预测硬件环境(...).txt。因此model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt的含义是模型在 Linux GPU 环境下训练得到不涉及多机与混合精度预测方式为 Lite、语言为 C、预测硬件环境为opencl_arm_gpuARM GPU OpenCL。按照该规范可直接从子目录名称和配置文件名定位需要测试的场景与功能。3. 接入流程第一步准备数据与运行环境Lite 端 ARM_GPU_OPENCL 预测接入 TIPC 包含三个步骤准备数据和环境、规范化输出预测日志、编写自动化测试代码。本节先讲第一步。与标准 TIPC 测试流程一致在prepare_lite_arm_cpp.sh中准备好所需数据和环境包括少量预测数据inference 模型运行 Lite 所需要的可执行文件。以 PaddleOCR 文本检测模型为例prepare_lite_arm_cpp.sh支持两种获取 Paddle-Lite 预测库的方式# 方式一下载 Paddle-Lite 预测库 bash test_tipc/prepare_lite_arm_cpp.sh test_tipc/configs/ch_PP-OCRv2_det/model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt download # 方式二编译 Paddle-Lite 预测库 bash test_tipc/prepare_lite_arm_cpp.sh test_tipc/configs/ch_PP-OCRv2_det/model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt compileprepare_lite_arm_cpp.sh的具体逻辑可拆解为以下 7 步。3.1 解析预测参数字段脚本首先source通用函数库common_func.sh解析配置文件中用于预测的参数字段方便后续预测使用source ./test_tipc/common_func.sh FILENAME$1 dataline$(cat ${FILENAME}) # parser params IFS$\n lines(${dataline}) IFS$\n paddlelite_library_source$2 inference_cmd$(func_parser_value ${lines[1]}) DEVICE$(func_parser_value ${lines[2]}) det_lite_model_list$(func_parser_value ${lines[3]}) rec_lite_model_list$(func_parser_value ${lines[4]}) cls_lite_model_list$(func_parser_value ${lines[5]})其中func_parser_value来自common_func.sh作用是从params.txt中解析:之后的值。这种配置驱动的设计与 TIPC 其他链条训练、C 预测等保持了一致的风格便于统一维护。3.2 填写不同硬件设备需要的信息脚本根据DEVICE字段区分 ARM_CPU 与 ARM_GPU_OPENCL 两套参数这是本规范区别于 ARM CPU 版本的核心差异点if [ ${DEVICE} ARM_CPU ];then valid_targetsarm paddlelite_library_urlhttps://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10-rc/inference_lite_lib.android.armv8.gcc.c_shared.with_extra.with_cv.tar.gz end_index66 compile_with_openclOFF elif [ ${DEVICE} ARM_GPU_OPENCL ];then valid_targetsopencl paddlelite_library_urlhttps://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10-rc/inference_lite_lib.armv8.clang.with_exception.with_extra.with_cv.opencl.tar.gz end_index71 compile_with_openclON else echo DEVICE only support ARM_CPU, ARM_GPU_OPENCL. exit 2 fi对比可见ARM_GPU_OPENCL 分支的关键差异valid_targetsopencl后续paddle_lite_opt转换模型时以 OpenCL 为有效目标预测库 URL 为带.opencl标识的 armv8 clang 版本带with_exception、with_extra、with_cv选项compile_with_openclON源码编译 Paddle-Lite 时显式开启 OpenCL 后端。3.3 转换 inference 模型到 Lite 预测的.nb模型Paddle-Lite 的优化器paddle_lite_opt负责把飞桨 inference 模型inference.pdmodelinference.pdiparams转换为端侧可运行的.nb模型。脚本按任务类型选择需要转换的模型列表并完成下载与转换# prepare paddlelite model if [[ $inference_cmd ~ det ]];then lite_model_list${det_lite_model_list} elif [[ $inference_cmd ~ rec ]];then lite_model_list(${rec_lite_model_list[*]} ${cls_lite_model_list[*]}) elif [[ $inference_cmd ~ system ]];then lite_model_list(${det_lite_model_list[*]} ${rec_lite_model_list[*]} ${cls_lite_model_list[*]}) else echo inference_cmd is wrong, please check. exit 1 fi pip install paddlelite2.10-rc current_dir${PWD} IFS| model_path./inference_models for model in ${lite_model_list[*]}; do if [[ $model ~ PP-OCRv2 ]];then inference_model_urlhttps://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/${model}.tar elif [[ $model ~ v2.0 ]];then inference_model_urlhttps://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/${model}.tar else echo Model is wrong, please check. exit 3 fi inference_model${inference_model_url##*/} wget -nc -P ${model_path} ${inference_model_url} cd ${model_path} tar -xf ${inference_model} cd ../ model_dir${model_path}/${inference_model%.*} model_file${model_dir}/inference.pdmodel param_file${model_dir}/inference.pdiparams paddle_lite_opt --model_dir${model_dir} --model_file${model_file} --param_file${param_file} --valid_targets${valid_targets} --optimize_out${model_dir}_opt done要点说明脚本先pip install paddlelite2.10-rc安装带有paddle_lite_opt工具的 Python 包与后续下载/编译的 v2.10-rc 预测库版本保持一致lite_model_list中各模型名之间用|分隔读取时通过IFS|切分转换命令中的--valid_targets${valid_targets}即为第 3.2 步设置的值对 ARM_GPU_OPENCL 而言是opencl转换产物形如ch_ppocr_mobile_v2.0_det_opt.nb会在第 3.6 步被复制进测试目录。3.4 准备测试数据测试使用极小的数据集以适配 CI 时间限制data_urlhttps://paddleocr.bj.bcebos.com/dygraph_v2.0/test/icdar2015_lite.tar data_file${data_url##*/} wget -nc -P ./test_data ${data_url} cd ./test_data tar -xf ${data_file} rm ${data_file} cd ../这里下载的是icdar2015_lite精简版数据每类只保留 4 张图片与完整数据集相比大幅压缩了预测耗时。3.5 准备 Lite 预测环境根据paddlelite_library_source选择下载或编译 Paddle-Lite 预测库# prepare lite env if [[ ${paddlelite_library_source} download ]]; then paddlelite_library_zipfile$(echo $paddlelite_library_url | awk -F / {print $NF}) paddlelite_library_file${paddlelite_library_zipfile:0:${end_index}} wget ${paddlelite_library_url} tar -xf ${paddlelite_library_zipfile} cd ${paddlelite_library_zipfile} elif [[ ${paddlelite_library_source} compile ]]; then git clone -b release/v2.10 https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite ./lite/tools/build_android.sh --archarmv8 --with_cvON --with_extraON --toolchainclang --with_opencl${compile_with_opencl} cd ../ cp -r Paddle-Lite/build.lite.android.armv8.clang/inference_lite_lib.android.armv8/ . paddlelite_library_fileinference_lite_lib.android.armv8 else echo paddlelite_library_source only support download and compile exit 3 fi值得注意下载模式下end_index用于从压缩包文件名中截取解压后的目录名ARM_CPU 为 66、ARM_GPU_OPENCL 为 71对应各自压缩包名长度编译模式下build_android.sh的--with_opencl${compile_with_opencl}即第 3.2 步的开关ARM_GPU_OPENCL 时为ON编译产物目录为build.lite.android.armv8.clang与--toolchainclang对应。3.6 准备编译及后续在 Lite 设备上测试需要的文件将模型、数据、配置、动态库与测试脚本统一拷贝到预测库的 demo 目录下并克隆 AutoLog 日志工具mkdir -p ${paddlelite_library_file}/demo/cxx/ocr/test_lite cp -r ${model_path}/*_opt.nb test_data ${paddlelite_library_file}/demo/cxx/ocr/test_lite cp ppocr/utils/ppocr_keys_v1.txt deploy/lite/config.txt ${paddlelite_library_file}/demo/cxx/ocr/test_lite cp -r ./deploy/lite/* ${paddlelite_library_file}/demo/cxx/ocr/ cp ${paddlelite_library_file}/cxx/lib/libpaddle_light_api_shared.so ${paddlelite_library_file}/demo/cxx/ocr/test_lite cp ${FILENAME} test_tipc/test_lite_arm_cpp.sh test_tipc/common_func.sh ${paddlelite_library_file}/demo/cxx/ocr/test_lite cd ${paddlelite_library_file}/demo/cxx/ocr/ git clone https://github.com/cuicheng01/AutoLog.git这一步完成了三件事把.nb模型、精简测试数据、字典文件ppocr_keys_v1.txt、Lite 端 OCR 部署代码deploy/lite/、共享库libpaddle_light_api_shared.so以及配置文件、测试脚本、通用函数库全部汇入test_lite目录并拉取 AutoLog 供第 4 节日志规范化使用。3.7 交叉编译获得可在手机上运行的可执行文件make -j sleep 1 make -j cp ocr_db_crnn test_lite cp test_lite/libpaddle_light_api_shared.so test_lite/libc_shared.so tar -cf test_lite.tar ./test_lite cp test_lite.tar ${current_dir} cd ${current_dir} rm -rf ${paddlelite_library_file}* rm -rf ${model_path}make -j连续执行两次确保依赖如 AutoLog 头文件就绪后完成ocr_db_crnn可执行文件的交叉编译将可执行文件、libpaddle_light_api_shared.so、libc_shared.so一并放入test_lite目录并打包为test_lite.tar复制回当前目录最后清理中间产物预测库目录、模型目录保持工作区整洁。运行结束后当前目录生成的test_lite.tar内容大致如下├── common_func.sh # 通用函数如解析参数等 ├── config.txt # 文本检测、识别的配置文件 ├── libc_shared.so ├── libpaddle_light_api_shared.so ├── models # 模型 │ ├── ch_ppocr_mobile_v2.0_det_opt.nb │ └── ch_ppocr_mobile_v2.0_det_slim_opt.nb ├── ocr_db_crnn //可执行文件 ├── model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt # 参数配置 ├── ppocr_keys_v1.txt # 文本识别对应的字典文件 ├── test_data # 测试数据 │ └── icdar2015_lite │ └── text_localization │ ├── ch4_test_images │ │ ├── img_233.jpg │ │ ├── img_603.jpg │ │ ├── img_612.jpg │ │ └── img_61.jpg │ ├── icdar_c4_train_imgs │ │ ├── img_233.jpg │ │ ├── img_603.jpg │ │ ├── img_612.jpg │ │ └── img_61.jpg │ ├── test_icdar2015_label.txt │ └── train_icdar2015_label.txt └── test_lite_arm_cpp.sh # 测试脚本这个压缩包就是后续上传到手机端执行测试的完整交付物。4. 接入流程第二步规范化输出预测日志4.1 日志规范类似于 Python、C 预测等基础测试链条Lite 预测链条也需要规范不同套件中预测输出的格式方便 QA 统一自动化测试。针对 Lite 的预测 log 规范输出工具已集成到AutoLog工具包。Lite 测试要求规范输出预测结果及以下信息运行的硬件如 ARM_CPU、ARM_GPU_OPENCL运行的模型名称如ch_PP-OCRv2_det_infer进程数量如 1 或者 4batch_size如 1 或者 4性能信息基于 Lite 预测的各阶段平均预测时间包括前处理时间、inference 时间、后处理时间模型类型FP32 或者 INT8。4.2 接入步骤代码修改主要有两步预测耗时打点和打印输出信息。1添加预测耗时打点在模型预测中统计前处理、预测、后处理时间。以 PaddleOCR 的deploy/lite/ocr_db_crnn.cc为例在预测主流程中分别记录preprocess、predict、postprocess三个阶段的时间汇总为time_info供后续 AutoLog 使用。2使用 AutoLog 工具打印日志主要包括三个动作在样板间克隆 AutoLog 代码库已在第 3.6 步完成引入头文件#include AutoLog/auto_log/autolog.h调用AutoLogger类打印日志if (strcmp(argv[9], True) 0) { AutoLogger autolog(det_model_file, runtime_device, std::stoi(num_threads), std::stoi(batchsize), dynamic, precision, time_info, cv_all_img_names.size()); autolog.report(); }AutoLogger的构造参数与第 4.1 节日志规范一一对应模型名称、运行设备如ARM_GPU_OPENCL、线程数、batch_size、输入形状dynamic、精度FP32/INT8、各阶段耗时信息与图片数量autolog.report()负责按统一格式输出日志。输出日志格式如下QA 侧可以基于这份规范化的 log 统一解析硬件、模型、batch_size、耗时与精度信息实现跨仓库的自动化断言。5. 接入流程第三步编写自动化测试代码自动化测试脚本包括三个部分运行脚本test_lite_arm_cpp.sh参数文件params.txt在 OCR 文本检测的 Lite 测试 ARM_GPU_OPENCL 样板间中为model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt数据模型准备脚本prepare_lite_cpp.sh即第 3 节介绍的prepare_lite_arm_cpp.sh。理论上接入方只需修改配置文件和prepare_lite_cpp.sh即可完成自动化测试。按如下方式在参数文件model_linux_gpu_normal_normal_lite_cpp_arm_gpu_opencl.txt中添加 Lite 预测部分参数参数说明如下参数参数介绍inference: ./ocr_db_crnn detLite 预测命令det_infer_model:ch_PP-OCRv2_det_infer|ch_PP-OCRv2_det_slim_quant_infer模型名称runtime_device:ARM_GPU_OPENCL运行设备名称–cpu_threads:14设置 ARM 线程数如果要测试 ARM 上不同线程下的预测速度和精度可以设置多个值不同值用隔开–det_batch_size: 1设置 batch_size 的参数暂时只支持 1–image_dir:./test_data/icdar2015_lite/text_localization/ch4_test_images/设置预测的数据路径–config_dir:./config.txt设置预测的数据路径–benchmark:True设置是否开启 AutoLog 的参数参数解析的关键机制说明多个取值用|分隔test_lite_arm_cpp.sh会按取值组合依次展开测试例如--cpu_threads:14会分别以 1 和 4 个线程运行预测runtime_device:ARM_GPU_OPENCL与第 3.2 步prepare_lite_arm_cpp.sh中的DEVICE字段对应二者必须保持一致才能保证准备的预测库OpenCL 版与运行参数匹配inference行的ocr_db_crnn det是设备端可执行文件及其子命令与第 3.7 步交叉编译产物对应--benchmark:True开启后可执行文件内部才会执行AutoLogger::report()输出规范日志对应第 4.2 节argv[9]为True的判断。6. 附录测试脚本函数说明与注意事项6.1 自动化测试脚本 test_lite_arm_cpp.sh 函数介绍Lite 预测核心函数包括func_lite_rec()执行文本识别模型的 Lite 预测函数根据不同的输入配置完成相应配置的预测func_lite_det()执行文本检测模型的 Lite 预测函数根据不同的输入配置完成相应配置的预测func_lite_system()执行端到端文本识别检测识别分类串联的 Lite 预测函数根据不同的输入配置完成相应配置的预测func_parser_value()解析params.txt中:后的部分来自common_func.sh在准备阶段同样被复用status_check()状态检查函数获取上条指令的运行状态如果是 0 则运行成功否则运行失败失败和成功的指令都会存放在results.log文件中。三个func_lite_*函数与第 3.3 步中inference_cmd的匹配逻辑det/rec/system一一对应配置文件中inference字段决定调用哪个预测函数而prepare_lite_arm_cpp.sh依据同样的关键字决定转换哪组模型det 模型、reccls 模型或全量模型两个脚本通过配置文件保持行为一致。6.2 注意事项所有 Lite 环境和模型数据等都在docker 中生成之后将相关的可执行文件、测试图片、模型等上传到手机ARM 设备通过test_lite_arm_cpp.sh来完成多种链条的测试。这意味着交叉编译、.nb模型转换、数据准备等重活全部在 docker 内完成手机端只负责运行ocr_db_crnn可执行文件与收集日志多链条展开不同模型、不同线程数、不同 batch_size通过params.txt中的|取值组合驱动无需在手机端重复部署环境由于 CI 时间有限数据必须使用精简版如icdar2015_lite每类仅 4 张图保证单模型测试在 30 分钟内完成。7. 总结将 Lite ARM_GPU_OPENCL C 预测接入 TIPC 的核心路径可以归纳为一条主线用prepare_lite_arm_cpp.sh完成解析配置 → 按设备选择 OpenCL 预测库 → 转换.nb模型 → 准备精简数据 → 下载/编译 Lite 环境 → 汇齐文件 → 交叉编译并打包→ 在ocr_db_crnn.cc中接入 AutoLog 输出规范日志 → 编写test_lite_arm_cpp.sh与参数文件实现多配置自动化展开。与 ARM CPU 链条相比其差异集中在valid_targetsopencl、compile_with_openclON与对应的 OpenCL 版预测库选择上其余流程完全一致因此同一套脚本体系可以低成本扩展到其他 ARM 端预测链条。对于需要在自己模型仓库接入该测试的开发者建议对照仓库中的 TIPC 模板community/repo_template/test_tipc/README.md与通用函数实现community/repo_template/test_tipc/common_func.sh先行理解配置命名规范与参数解析机制再按本文 35 节的三步流程完成接入即可将模型纳入飞桨框架 CI/CE 的持续监控范围。赞分享人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载相关推荐如何向GTFOBins贡献新提权技巧从编写YAML到通过Linter的完整流程如何向GTFOBins贡献新提权技巧从编写YAML到通过Linter的完整流程 你是否掌握了一个尚未收录在 GTFOBins 中的本地提权技巧GTFOBin人工智能深度学习计算机视觉NLP语音Linux GPU 多机多卡Fleet训练推理测试接入规范飞桨 TIPC 自动化测试开发实战指南Linux GPU 多机多卡Fleet训练推理测试接入规范飞桨 TIPC 自动化测试开发实战指南 多机多卡分布式训练是飞桨模型仓库从学术研究走向产业落地的人工智能深度学习计算机视觉NLP语音TiXL 节点详解PlaneSDF——用有符号距离场生成无限平面并接入 Raymarching 渲染管线TiXL 节点详解PlaneSDF——用有符号距离场生成无限平面并接入 Raymarching 渲染管线 PlaneSDF 是 TiXL开源实时动态图形工具人工智能深度学习计算机视觉NLP语音上一篇MidScene实战指南用自然语言实现全平台UI自动化测试下一篇如何让Windows电脑也能轻松安装Android应用APK Installer完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考