
人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载Paddle Inference 是飞桨PaddlePaddle的原生推理库面向服务器端与云端场景提供高性能推理能力。本指南以tutorials/tipc/infer_cpp/test_infer_cpp.md为核心系统讲解如何在 Linux GPU/CPU 环境下基于 Paddle Inference C 预测引擎完成推理功能的开发与 TIPC 自动化测试落地涵盖配置文件逐行解析、推理代码四步流程、编译运行、核验点验证与文档撰写规范。读者学完本文后将能够独立为自己的模型搭建一套可自动运行的 Linux GPU/CPU C 推理功能测试。1. 简介C 推理与 TIPC 测试Paddle Inference 是飞桨的原生推理库作用于服务器端和云端提供高性能的推理能力。与直接基于预训练模型做预测不同Paddle Inference 可以利用 MKLDNN、CUDNN、TensorRT 进行预测加速从而获得更优的推理性能。更多关于 Paddle Inference 推理引擎的介绍可以参考官方 Paddle Inference 教程。在 models 仓库 的 TIPCTest Infrastructure of PaddleC测试体系中C 推理功能被拆分为两个层次推理功能开发讲解如何从零编写基于 Paddle Inference 的 C 推理代码见 tutorials/tipc/infer_cpp/infer_cpp.md推理功能测试开发本文主题讲解如何将已有推理程序纳入自动化测试框架见 tutorials/tipc/infer_cpp/test_infer_cpp.md。两者共同构成 TIPC 中 C 推理开发与规范总览 的内容。本文以 mobilenet_v3_small 分类模型为完整示例贯穿从环境准备、模型导出、代码编译、配置编写到测试验证的全流程。2. 命令与配置文件解析2.1 推理命令解析基于 Paddle Inference 的 C 预测命令格式如下run_scripts configs_path img_path其中run_scripts最终编译好的可执行命令例如./deploy/inference_cpp/build/clas_systemconfigs_path设置模型路径、是否使用 GPU 等参数的配置文件路径img_path待预测的图像路径。2.2 配置文件解析完整的inference_cpp.txt配置文件共 12 行包含两个方面的内容运行环境参数配置第 1~5 行实际对应模型名、GPU 开关、GPU 卡号、显存、CPU 线程数模型参数配置第 7~11 行模型结构文件、参数文件、预处理尺寸。以 mobilenet_v3_small 的真实配置为例见 tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/inference_cpp.txt# model load config model_name mobilenet_v3_small use_gpu 0 gpu_id 0 gpu_mem 4000 cpu_math_library_num_threads 10 # cls config cls_model_path ./deploy/inference_cpp/mobilenet_v3_small_infer/inference.pdmodel cls_params_path ./deploy/inference_cpp/mobilenet_v3_small_infer/inference.pdiparams resize_short_size 256 crop_size 224配置文件中主要有 2 种类型的字段一行内容以空格为分隔符该行可以被解析为key value的格式需要根据实际含义修改 value一行内容为# xxxxx该行为注释信息无需修改。各参数的详细含义与修改要求如下行号参考内容含义key 是否需要修改value 是否需要修改修改内容2model_name模型名称否是value 根据模型名称修改3use_gpu是否使用 GPU否是value 根据是否使用 GPU 进行修改4gpu_id使用的 GPU 卡号否是value 修改为自己的 GPU ID5gpu_mem显存否是value 修改为自己的 GPU 显存6cpu_math_library_num_threads底层科学计算库所用线程的数量否是value 修改为合适的线程数9cls_model_path预测模型结构文件路径否是value 修改为预测模型结构文件路径10cls_params_path预测模型参数文件路径否是value 修改为预测模型参数文件路径11resize_short_size预处理时图像缩放大小否是value 修改为预处理时图像缩放大小12crop_size预处理时图像裁剪后的大小否是value 修改为预处理时图像裁剪后的大小注意TIPC 配置模板上述inference_cpp.txt与部署程序自带配置 deploy/inference_cpp/tools/config.txt 并不完全相同部署配置还包含use_mkldnn、use_tensorrt、use_fp16等开关且模型路径直接指向./mobilenet_v3_small_infer/inference.pdmodel而 TIPC 测试配置精简为上述 12 行字段模型路径前需要带./deploy/inference_cpp/前缀。编写测试配置时请以 TIPC 模板字段为准并保持cls_model_path、cls_params_path与模型实际存放位置一致。3. 基本 C 推理功能测试开发基于 Paddle Inference 的推理过程可以分为 5 个步骤准备系统环境准备输入数据和推理模型准备推理所需代码编译得到可执行代码运行得到结果。整个过程设置了 2 个核验点checkpoint准备输入数据和推理模型编译得到可执行代码。后续小节按步骤展开并在每步末尾给出核验方式。3.1 准备系统环境环境准备分为三部分详细步骤可参考 tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_inference_cpp.md 的 2.2 章节配置编译与运行环境包括编译器、CUDA 等基础库。建议使用 Docker 环境以保证编译与运行环境的一致性配置 Paddle 预测库有下载与源码编译两种方式详见 2.2.3 小节配置第三方库例如 OpenCV 等图像处理库。3.1.1 编译 OpenCV 库以 OpenCV 3.4.7 为例先下载并解压源码cd deploy/inference_cpp wget https://github.com/opencv/opencv/archive/3.4.7.tar.gz tar -xvf 3.4.7.tar.gz设置源码路径root_path与安装路径install_pathcd ./opencv-3.4.7 export root_path$PWD export install_path${root_path}/opencv3在源码路径下执行编译与安装rm -rf build mkdir build cd build cmake .. \ -DCMAKE_INSTALL_PREFIX${install_path} \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_SHARED_LIBSOFF \ -DWITH_IPPOFF \ -DBUILD_IPP_IWOFF \ -DWITH_LAPACKOFF \ -DWITH_EIGENOFF \ -DCMAKE_INSTALL_LIBDIRlib64 \ -DWITH_ZLIBON \ -DBUILD_ZLIBON \ -DWITH_JPEGON \ -DBUILD_JPEGON \ -DWITH_PNGON \ -DBUILD_PNGON \ -DWITH_TIFFON \ -DBUILD_TIFFON make -j make installmake install完成后会在安装路径下生成 OpenCV 头文件与库文件供后续 C 代码编译使用。以 OpenCV 3.4.7 为例安装目录结构如下不同版本可能略有差异opencv3/ |-- bin :可执行文件 |-- include :头文件 |-- lib64 :库文件 |-- share :部分第三方库3.1.2 获取 Paddle 预测库二选一方式一源码编译预测库如需获取最新预测库特性可克隆 Paddle 源码自行编译git clone https://github.com/PaddlePaddle/Paddle.git进入 Paddle 目录后执行rm -rf build mkdir build cd build cmake .. \ -DWITH_CONTRIBOFF \ -DWITH_MKLON \ -DWITH_MKLDNNON \ -DWITH_TESTINGOFF \ -DCMAKE_BUILD_TYPERelease \ -DWITH_INFERENCE_API_TESTOFF \ -DON_INFERON \ -DWITH_PYTHONON make -j make inference_lib_dist编译完成后在build/paddle_inference_install_dir/下会生成build/paddle_inference_install_dir/ |-- CMakeCache.txt |-- paddle |-- third_party |-- version.txt其中paddle即后续 C 预测所需的 Paddle 库version.txt中记录了预测库的版本信息。方式二直接下载安装Paddle 预测库官网提供了不同 CUDA 版本的 Linux 预测库。以manylinux_cuda11.1_cudnn8.1_avx_mkl_trt7_gcc8.2版本为例wget https://paddle-inference-lib.bj.bcebos.com/2.2.2/cxx_c/Linux/GPU/x86-64_gcc8.2_avx_mkl_cuda11.1_cudnn8.1.1_trt7.2.3.4/paddle_inference.tgz tar -xvf paddle_inference.tgz解压后会在当前目录生成paddle_inference/子文件夹内容与源码编译得到的paddle_inference_install_dir一致。3.2 准备输入数据和推理模型数据准备从验证集或测试集中抽出至少一张图像用于后续推理过程验证例如仓库示例图 images/demo.jpg。推理模型准备对于训练好的动态图模型需要先导出为用于推理的静态图模型导出方式可参考 infer_python.md 中的准备推理模型章节以及 mobilenet_v3_small 的 export_model.py。导出完成后模型保存路径下会生成 3 个文件inference.pdiparams : 模型参数文件 inference.pdmodel : 模型结构文件 inference.pdiparams.info: 模型参数信息文件其中 Paddle Inference 推理实际用到的是inference.pdmodel模型结构与inference.pdiparams模型参数。以 mobilenet_v3_small 为例导出的模型目录结构如下mobilenet_v3_small_infer/ |--inference.pdmodel |--inference.pdiparams |--inference.pdiparams.info注意inference.pdmodel与inference.pdiparams两个文件的路径必须与测试配置文件inference_cpp.txt中的cls_model_path与cls_params_path参数一一对应。核验点 1输入图像与推理模型已就绪模型文件路径与配置一致。3.3 准备推理所需代码基于 Paddle Inference 的推理过程包含 4 个步骤初始化预测引擎、预处理、推理、后处理。完整参考实现见 tutorials/mobilenetv3_prod/Step6/deploy/inference_cpp其中头文件位于 include源码位于 src。3.3.1 初始化预测引擎以 mobilenet_v3_small 为例推理引擎初始化函数如下其中模型结构与参数文件路径、是否使用 GPU、是否开启 MKLDNN 等内容都是可配置的主要实现在 cls.cppvoid Classifier::LoadModel(const std::string model_path, const std::string params_path) { paddle_infer::Config config; config.SetModel(model_path, params_path); if (this-use_gpu_) { config.EnableUseGpu(this-gpu_mem_, this-gpu_id_); } else { config.DisableGpu(); config.SetCpuMathLibraryNumThreads(this-cpu_math_library_num_threads_); } config.SwitchUseFeedFetchOps(false); // true for multiple input config.SwitchSpecifyInputNames(true); config.SwitchIrOptim(true); config.EnableMemoryOptim(); config.DisableGlogInfo(); this-predictor_ CreatePredictor(config); }关键配置项与测试配置参数的对应关系如下Config 接口作用对应配置项SetModel(model_path, params_path)加载模型结构与参数文件cls_model_path、cls_params_pathEnableUseGpu(gpu_mem_, gpu_id_)启用 GPU 推理use_gpu、gpu_id、gpu_memSetCpuMathLibraryNumThreads(...)设置 CPU 底层科学计算库线程数cpu_math_library_num_threadsEnableMemoryOptim()开启内存优化减少推理峰值内存固定开启SwitchIrOptim(true)开启 IR 图优化固定开启3.3.2 预处理读取指定图像对其进行数据变换转化为符合模型推理所需的输入格式。样例中使用的数据预处理如下resize缩放crop裁剪normalize归一化RGB - CHW通道顺序调整主要实现在 preprocess_op.cpp 中//Resize class ResizeImg { public: virtual void Run(const cv::Mat img, cv::Mat resize_img, int max_size_len); }; //Crop class CenterCropImg { public: virtual void Run(cv::Mat im, const int crop_size 224); }; //Norm class Normalize { public: virtual void Run(cv::Mat *im, const std::vectorfloat mean, const std::vectorfloat scale, const bool is_scale true); }; // RGB - CHW class Permute { public: virtual void Run(const cv::Mat *im, float *data); };其中 Resize 的缩放尺寸与 CenterCrop 的裁剪尺寸分别对应配置中的resize_short_size示例值 256与crop_size示例值 224两者需要与模型训练时的预处理保持一致否则会影响推理精度。3.3.3 推理前向推理主要实现在 cls.cppauto input_names this-predictor_-GetInputNames(); auto input_t this-predictor_-GetInputHandle(input_names[0]); input_t-Reshape({1, 3, resize_img.rows, resize_img.cols}); auto start std::chrono::system_clock::now(); input_t-CopyFromCpu(input.data()); this-predictor_-Run(); std::vectorfloat out_data; auto output_names this-predictor_-GetOutputNames(); auto output_t this-predictor_-GetOutputHandle(output_names[0]); std::vectorint output_shape output_t-shape(); int out_num std::accumulate(output_shape.begin(), output_shape.end(), 1, std::multipliesint()); out_data.resize(out_num); output_t-CopyToCpu(out_data.data());推理流程可归纳为获取输入名 → 获取输入 Tensor → Reshape 为{1, 3, H, W}→ 从 CPU 拷贝输入数据 →predictor_-Run()执行前向 → 获取输出名与输出 Tensor → 计算输出元素总数 → 拷贝输出到 CPU。3.3.4 后处理模型输出的是一个一维数组代表输入图片分类到每个类别的概率。为得到有实际含义的输出需要获取该数组中最大值的位置和大小mobilenet_v3_small 的后处理代码如下int maxPosition max_element(out_data.begin(), out_data.end()) - out_data.begin(); int score out_data[maxPosition];3.4 编译得到可执行代码准备好代码后利用 CMake 进行编译示例见 CMakeLists.txtset(DEPS ${DEPS} ${OpenCV_LIBS}) AUX_SOURCE_DIRECTORY(./src SRCS) add_executable(${DEMO_NAME} ${SRCS}) target_link_libraries(${DEMO_NAME} ${DEPS})编译脚本对应仓库中的 tools/build.sh 同类脚本的核心内容如下OPENCV_DIR../opencv-3.4.7/opencv3/ LIB_DIR../paddle_inference/ CUDA_LIB_DIR/usr/local/cuda/lib64 CUDNN_LIB_DIR/usr/lib64 TENSORRT_DIR/usr/local/TensorRT-7.2.3.4 BUILD_DIRbuild rm -rf ${BUILD_DIR} mkdir ${BUILD_DIR} cd ${BUILD_DIR} cmake .. \ -DPADDLE_LIB${LIB_DIR} \ -DWITH_MKLON \ -DWITH_GPUOFF \ -DWITH_STATIC_LIBOFF \ -DUSE_TENSORRTOFF \ -DOPENCV_DIR${OPENCV_DIR} \ -DCUDNN_LIB${CUDNN_LIB_DIR} \ -DCUDA_LIB${CUDA_LIB_DIR} \ make -j各关键编译选项说明OPENCV_DIROpenCV 编译安装地址本例为opencv-3.4.7/opencv3目录LIB_DIRPaddle 预测库路径可以是下载的paddle_inference目录或源码编译生成的build/paddle_inference_install_dir目录CUDA_LIB_DIRCUDA 库文件地址Docker 中一般为/usr/local/cuda/lib64CUDNN_LIB_DIRcuDNN 库文件地址Docker 中一般为/usr/lib64TENSORRT_DIRTensorRT 库文件地址Docker 中一般为/usr/local/TensorRT-7.2.3.4/TensorRT 需结合 GPU 使用。编译完成后会在当前路径下生成build文件夹其中包含名为clas_system的可执行文件。核验点 2clas_system可执行文件已成功生成。3.5 运行得到结果运行脚本位于 run.sh运行命令如下./build/clas_system ./tools/config.txt ../../images/demo.jpg即可执行文件 部署配置文件tools/config.txt 待预测图像。3.6 填写配置文件【基本内容】在 repo 的test_tipc/目录中新建configs/model_name目录model_name替换为自己的模型名称将模板文件 inference_cpp.txt 拷贝到该目录中。例如mobilenet_v3_small 的配置位于test_tipc/configs/mobilenet_v3_small/inference_cpp.txt。【实战】配置文件各字段的完整含义解析可参考 2.2 节配置文件解析。mobilenet_v3_small 的测试开发配置文件可直接参考 inference_cpp.txt。3.7 验证配置正确性【基本内容】基于修改完的配置运行方法如下bash test_tipc/prepare.sh ${your_params_file} cpp_infer bash test_tipc/test_inference_cpp.sh ${your_params_file}prepare.sh 负责数据与推理模型准备当传入cpp_infer模式时脚本会下载推理模型压缩包并解压到./deploy/inference_cpp/下、下载并解压 Paddle 预测库与 OpenCV 源码随后自动完成 OpenCV 的 CMake 编译对应cpp_infer分支的完整流程见 prepare.shtest_inference_cpp.sh 负责解析配置文件并执行推理脚本按行读取配置用空格切分key value取出model_name与use_gpu随后拼接完整推理命令./deploy/inference_cpp/build/clas_system ${FILENAME} ./images/demo.jpg将日志写入./test_tipc/output/${model_name}/cpp_infer/目录并通过 common_func.sh 中的status_check函数按退出码判定成功/失败并记录到results_infer_cpp.log。当use_gpu大于 0 时日志名为cpp_infer_use_gpu.log否则为cpp_infer_cpu.log。【注意事项】如果运行失败会输出具体的报错命令可以根据报错命令排查配置文件的问题并修改示例报错如下Run failed with command - ./deploy/inference_cpp/build/clas_system test_tipc/configs/mobilenet_v3_small/inference_cpp.txt ./images/demo.jpg ./log/infer_cpp/infer_cpp_use_cpu.log 21 !【实战】以 mobilenet_v3_small 的Linux GPU/CPU C 推理功能测试为例命令如下bash test_tipc/prepare.sh test_tipc/configs/mobilenet_v3_small/inference_cpp.txt cpp_infer bash test_tipc/test_inference_cpp.sh test_tipc/configs/mobilenet_v3_small/inference_cpp.txt输出结果如下表示命令运行成功Run successfully with command - mobilenet_v3_small - ./deploy/inference_cpp/build/clas_system test_tipc/configs/mobilenet_v3_small/inference_cpp.txt ./images/demo.jpg ./log/infer_cpp/infer_cpp_use_cpu.log 21 !也可以在./log/infer_cpp/infer_cpp_use_cpu.log中查看详细的推理输出结果例如img_file_list length: 1 result: class id: 8 score: 0.9014719725 Current image path: ./images/demo.jpg Current time cost: 0.1409450000 s, average time cost in all: 0.1409450000 s.其中class id为预测类别 IDscore为对应概率Current time cost为单张图像推理耗时秒。【核验】基于修改后的配置文件测试通过全部命令成功。3.8 撰写说明文档【基本内容】撰写 TIPC 功能总览与测试流程说明文档分别为TIPC 功能总览文档test_tipc/README.mdLinux GPU/CPU C 推理功能测试说明文档test_tipc/docs/test_inference_cpp.md。2 个文档模板分别位于下述位置可以直接拷贝到自己的 repo 中根据自己的模型进行修改README.mdtest_inference_cpp.md。【实战】mobilenet_v3_small 中test_tipc文档如下TIPC 功能总览文档README.mdC 推理测试说明文档test_inference_cpp.md。说明文档中的测试结论汇总表模板如下需根据自己模型的测试结果如实填写算法名称模型名称device_CPUdevice_GPUtensorrtmkldnnMobileNetV3mobilenet_v3_small支持支持支持支持【核验】repo 中最终目录结构如下test_tipc |--configs # 配置目录 | |--model_name # 您的模型名称 | |--inference_cpp.txt # inference_cpp测试配置文件 |--docs # 文档目录 | |--test_inference_cpp.md # inference_cpp测试说明文档 |----README.md # TIPC说明文档 |----test_inference_cpp.sh # TIPC inference_cpp解析脚本无需改动 |----common_func.sh # TIPC基础训练推理测试常用函数无需改动其中test_inference_cpp.sh与common_func.sh为 TIPC 框架自带脚本无需改动。基于test_inference_cpp.md文档即可跑通inference_cpp 功能测试流程。4. FAQ在环境配置与运行过程中如果遇到相关问题可以参考 Paddle Inference 官方文档中的 x86 Linux 部署示例与 FAQ 章节并重点检查以下几类常见问题模型路径不匹配cls_model_path、cls_params_path必须与模型实际存放路径一致prepare.sh会将模型解压到./deploy/inference_cpp/mobilenet_v3_small_infer/下依赖库路径错误编译时OPENCV_DIR、LIB_DIR、CUDA_LIB_DIR、CUDNN_LIB_DIR必须替换为机器上的实际路径GPU/CPU 配置不符use_gpu的取值要与实际可执行文件编译时-DWITH_GPU的设置匹配预处理参数不一致resize_short_size、crop_size必须与模型训练阶段的预处理一致否则会导致推理精度下降。5. 小结本文以 mobilenet_v3_small 为完整样例系统梳理了 Linux GPU/CPU 环境下 Paddle Inference C 推理功能测试的完整开发链路从环境与依赖库准备、推理模型导出、四步推理代码编写、CMake 编译到 TIPC 测试配置填写、自动化脚本验证与说明文档撰写。核心要点可概括为两个核验点输入数据与推理模型就绪、可执行代码编译成功是流程能否继续的前提一份配置inference_cpp.txt中 9 个可修改参数GPU 开关、卡号、显存、线程数、模型路径、预处理尺寸驱动整个测试两条命令prepare.sh负责环境与模型准备test_inference_cpp.sh负责解析配置并执行推理日志与结果均自动落盘。按照上述流程即可为自己的模型快速搭建一套标准化、可回归的 Linux GPU/CPU C 推理功能测试。赞分享人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载相关推荐Paddle Serving 服务化部署测试开发实战指南Linux GPU/CPU 环境下的 TIPC 测试体系搭建Paddle Serving 服务化部署测试开发实战指南Linux GPU/CPU 环境下的 TIPC 测试体系搭建 本文是 PaddlePaddle 模型仓人工智能深度学习计算机视觉NLP语音Paddle Inference 模型 Linux GPU/CPU C 推理开发与 TIPC 测试规范全指南Paddle Inference 模型 Linux GPU/CPU C 推理开发与 TIPC 测试规范全指南 本文以飞桨PaddlePaddle官方 m人工智能深度学习计算机视觉NLP语音Linux GPU/CPU 下基于 Paddle Inference 的 C 模型推理开发指南Linux GPU/CPU 下基于 Paddle Inference 的 C 模型推理开发指南 Paddle Inference 是飞桨的原生推理引擎面向人工智能深度学习计算机视觉NLP语音上一篇5分钟快速掌握国家中小学智慧教育平台电子课本免费下载技巧下一篇如何快速掌握res-downloader跨平台资源下载终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考