- 人工智能
- 深度学习
- 计算机视觉
- NLP
- 语音
【免费下载链接】models
Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.
训推一体全流程(TIPC)面向飞桨框架代码更新可能引起的模型训练、预测报错与性能波动,本文以其在 ARM_GPU_OPENCL 设备上的 Lite C++ 预测测试为切入点,系统讲解从数据与环境准备、预测日志规范化到自动化测试脚本编写的完整接入流程。读完本文,你将掌握 Paddle-Lite 在 ARM GPU(OpenCL)设备上的.nb模型转换、交叉编译、AutoLog 日志规范接入以及test_lite_arm_cpp.sh自动化测试的完整实现细节,可直接用于自己模型仓库的 TIPC 测试接入。
1. 背景:TIPC 与 Lite ARM_GPU_OPENCL 测试的定位
TIPC(Training 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_gpu(ARM 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_targets="arm" paddlelite_library_url="https://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_index="66" compile_with_opencl="OFF" elif [ ${DEVICE} = "ARM_GPU_OPENCL" ];then valid_targets="opencl" paddlelite_library_url="https://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_index="71" compile_with_opencl="ON" else echo "DEVICE only support ARM_CPU, ARM_GPU_OPENCL." exit 2 fi对比可见,ARM_GPU_OPENCL 分支的关键差异:
valid_targets="opencl":后续paddle_lite_opt转换模型时以 OpenCL 为有效目标;- 预测库 URL 为带
.opencl标识的 armv8 clang 版本(带with_exception、with_extra、with_cv选项); compile_with_opencl="ON":源码编译 Paddle-Lite 时显式开启 OpenCL 后端。
3.3 转换 inference 模型到 Lite 预测的.nb模型
Paddle-Lite 的优化器paddle_lite_opt负责把飞桨 inference 模型(inference.pdmodel+inference.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 paddlelite==2.10-rc current_dir=${PWD} IFS="|" model_path=./inference_models for model in ${lite_model_list[*]}; do if [[ $model =~ "PP-OCRv2" ]];then inference_model_url=https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/${model}.tar elif [[ $model =~ "v2.0" ]];then inference_model_url=https://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 paddlelite==2.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_url=https://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 --arch=armv8 --with_cv=ON --with_extra=ON --toolchain=clang --with_opencl=${compile_with_opencl} cd ../ cp -r Paddle-Lite/build.lite.android.armv8.clang/inference_lite_lib.android.armv8/ . paddlelite_library_file=inference_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,与--toolchain=clang对应。
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 或者 4;
- batch_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 det | Lite 预测命令 |
| det_infer_model:ch_PP-OCRv2_det_infer|ch_PP-OCRv2_det_slim_quant_infer | 模型名称 |
| runtime_device:ARM_GPU_OPENCL | 运行设备名称 |
| –cpu_threads:1|4 | 设置 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:1|4会分别以 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 模型、rec+cls 模型或全量模型),两个脚本通过配置文件保持行为一致。
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_targets="opencl"、compile_with_opencl="ON"与对应的 OpenCL 版预测库选择上,其余流程完全一致,因此同一套脚本体系可以低成本扩展到其他 ARM 端预测链条。
对于需要在自己模型仓库接入该测试的开发者,建议对照仓库中的 TIPC 模板(community/repo_template/test_tipc/README.md)与通用函数实现(community/repo_template/test_tipc/common_func.sh)先行理解配置命名规范与参数解析机制,再按本文 3~5 节的三步流程完成接入,即可将模型纳入飞桨框架 CI/CE 的持续监控范围。
- 人工智能
- 深度学习
- 计算机视觉
- NLP
- 语音
【免费下载链接】models
Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.
相关推荐
如何向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语音
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考