Paddle-Lite x86 部署完全指南:支持现状、参考示例与自编译部署库实践
Paddle-Lite x86 部署完全指南支持现状、参考示例与自编译部署库实践【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite本文围绕 Paddle-Lite 在 x86 平台上的预测部署展开覆盖已验证的芯片/设备/模型支持范围、官方 generic demo 的完整运行流程以及从源码自行编译 x86 部署库并替换到示例工程的方法。读完后你可以独立完成在 x86 设备上运行图像分类等参考示例、按需要切换模型与测试图片、并通过build_linux.sh产出可分发的libpaddle_full_api_shared.so/libpaddle_light_api_shared.so部署库。一、x86 支持现状1.1 芯片与设备根据 x86 部署文档Paddle-Lite 已支持在 x86 设备上进行预测部署当前支持范围如下类别已验证支持对象x86 芯片Intel(R) Xeon(R) Gold 6271、ZHAOXIN KaiSheng KH-37800D 等x86 设备搭载 x86 芯片的设备如 GNS-V40 等1.2 已验证支持的 Paddle 模型x86 后端经过验证的模型覆盖面较广横跨图像分类、目标检测、姿态检测、人脸检测、关键点检测、OCR、NLP、生成网络、推荐系统、图像分割与视频分类。完整清单如下原文档为每个模型提供了对应的模型包下载地址可按需获取图像分类AlexNet、DarkNet53、DeiT、DenseNet121、DPN68、EfficientNetB0、GhostNet、GoogLeNet、HRNet-W18、Inception-v3、Inception-v4、MobileNet-v1、MobileNet-v2、MobileNetV3_large、MobileNetV3_small、PP-LCNet、Res2Net50、ResNet-18、ResNet-50、ResNet-101、ResNeXt50、SE_ResNet50、ShuffleNetV2、SqueezeNet-v1、VGG16、VGG19、ViT目标检测Picodet、PP-YOLO_mbv3、PP-YOLO_r50vd_dcn、PPYOLO_tiny、PP-YOLOv2_r50vd_dcn、SSD-MobileNetV1(1.8)、SSD-MobileNetV1(2.0)、SSDLite-MobileNetV3_large、SSDLite-MobileNetV3_small、SSD-VGG16、YOLOv3-DarkNet53、YOLOv3-MobileNetV1、YOLOv3-MobileNetV3、YOLOv3-ResNet50_vd、YOLOv4姿态检测 / 人脸检测 / 关键点检测姿态检测PP-TinyPose人脸检测BlazeFace、FaceBoxes关键点检测HigherHRNet、HRNet文本检测 / 文本识别 / 端到端检测识别ch_ppocr_mobile_v2.0_det、ch_ppocr_mobile_v2.0_rec、ch_ppocr_server_v2.0_det、ch_ppocr_server_v2.0_rec、ch_PP-OCRv2_det、ch_PP-OCRv2_rec、CRNN-mv3-CTC、e2e_server_pgnetA自然语言处理 / 语义理解BERT、ERNIE、ERNIE-TINY、Transformer生成网络 / 推荐系统 / 图像分割 / 视频分类生成网络ESRGAN推荐系统DeepFM、NAML、NCF、WideDeep图像分割BiseNetV2、DeepLabV3(CityScapes)、PP-HumanSeg-Lite、PP-HumanSeg-Server(DeepLabV3)、SegFormer、STDCSeg、U-Net视频分类PP-TSN更多开源模型的支持情况可参考 开源模型支持列表。二、参考示例演示generic demo 的运行流程官方提供PaddleLite-generic-demo.tar.gz通用示例包下载地址见 x86 部署文档 原文解压后即包含图像分类、目标检测等多个可直接运行的示例。2.1 准备本地编译环境为了保证编译环境一致建议使用 Docker 开发环境进行配置环境搭建可以参考 编译环境准备。2.2 示例包目录结构解压后清单如下理解目录结构是后续所有操作的基础- PaddleLite-generic-demo - image_classification_demo - assets - configs - imagenet_224.txt # config 文件 - synset_words.txt # 1000 分类 label 文件 - datasets - test # dataset - inputs - tabby_cat.jpg # 输入图片 - outputs - tabby_cat.jpg # 输出图片 - list.txt # 图片清单 - models - resnet50_fp32_224 # Paddle non-combined 格式的 resnet50 float32 模型 - __model__ # Paddle fluid 模型组网文件可拖入 netron 进行可视化显示网络结构 - bn2a_branch1_mean # Paddle fluid 模型参数文件 - bn2a_branch1_scale ... - shell - CMakeLists.txt # 示例程序 CMake 脚本 - build.linux.amd64 # 已编译好的适用于 amd64 - demo # 已编译好的适用于 amd64 的示例程序 - build.linux.arm64 # 已编译好的适用于 arm64 - demo ... - demo.cc # 示例程序源码 - build.sh # 示例程序编译脚本 - run.sh # 示例程序本地运行脚本 - run_with_ssh.sh # 示例程序 ssh 运行脚本 - run_with_adb.sh # 示例程序 adb 运行脚本 - libs - PaddleLite - android - arm64-v8a - armeabi-v7a - linux - amd64 - include # Paddle Lite 头文件 - lib # Paddle Lite 库文件 - libpaddle_full_api_shared.so # 预编译 Paddle Lite full api 库 - libpaddle_light_api_shared.so # 预编译 Paddle Lite light api 库 - arm64 - include - lib - armhf ... - OpenCV # OpenCV 预编译库 - object_detection_demo # 目标检测示例程序几个关键点assets/models下是Paddle non-combined 格式__model__组网文件 若干参数文件的模型这决定了示例程序走的是full APICxxConfig在线转换路径libs/PaddleLite/linux/amd64/下同时提供了libpaddle_full_api_shared.so全量 API可加载非组合模型并在运行时优化与libpaddle_light_api_shared.so轻量 API只加载 opt 优化后的 .nb 模型两套预编译库shell/目录下按目标平台linux amd64 / arm64分目录存放已编译好的demo可执行文件并附build.sh用于重新编译。2.3 运行图像分类示例进入PaddleLite-generic-demo/image_classification_demo/shell/目录后可以运行 mobilenet_v1_int8_224_per_layer 模型观察性能与结果# 运行 mobilenet_v1_int8_224_per_layer 模型 # For linux amd64 # 本地执行 $ ./run.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux amd64 cpu # 通过 SSH 远程执行 $ ./run_with_ssh.sh mobilenet_v1_int8_224_per_layer imagenet_224.txt test linux amd64 cpu IP地址 22 用户名 密码正常运行后输出 Top5 分类结果与预处理/预测/后处理耗时统计Top1 Egyptian cat - 0.500662 Top2 tabby, tabby cat - 0.407661 Top3 tiger cat - 0.074697 Top4 lynx, catamount - 0.013188 Top5 ping-pong ball - 0.000638 Preprocess time: 27.854000 ms, avg 27.854000 ms, max 27.854000 ms, min 27.854000 ms Prediction time: 55.152000 ms, avg 55.152000 ms, max 55.152000 ms, min 55.152000 ms Postprocess time: 6.212000 ms, avg 6.212000 ms, max 6.212000 ms, min 6.212000 ms参数含义为模型名 config 文件名 数据集名 系统 架构 运行设备。若需要更换测试模型例如切换到 resnet50只需把模型名参数替换# 本地执行 $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 cpu # 通过 SSH 远程执行 $ ./run_with_ssh.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 cpu IP地址 22 用户名 密码2.4 更换测试图片与重新编译示例更换测试图片将图片拷贝到PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/inputs目录下同时将图片文件名添加到PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/list.txt中即可重新编译示例程序在shell/目录下直接运行# For linux amd64 $ ./build.sh linux amd642.5 源码佐证仓库中的 x86 C DemoPaddleLite-generic-demo的推理核心与仓库内的 x86 demo 源码逻辑一致。仓库提供了 x86_mobilenetv1_full_demo 与 x86_mobilenetv1_light_demo 两套完整示例可对照阅读full API 示例mobilenet_full_api.cc的关键流程是创建 CxxConfigconfig.set_model_dir(model_dir)指定 non-combined 模型目录设置可用 Place当设备不支持 OpenCL 时回退到 CPU仅保留Place{TARGET(kX86), PRECISION(kFloat)}与Place{TARGET(kHost), PRECISION(kFloat)}见 L160-L169。注释中也明确说明“大多数 x86 设备只支持 fp32”创建预测器并落盘优化模型CreatePaddlePredictorCxxConfig(config)之后调用SaveOptimizedModel(optimized_model_dir, LiteModelType::kNaiveBuffer)将在线优化结果保存为 naive buffer 模型L217-L221基准测试循环默认repeats10, warmup10支持通过命令行传入paddle_uncombined_model_dir raw_input_shapes repeats warmup print_outputL315-L351输出 1st/max/min/avg 耗时统计。对应的 CMakeLists.txt.in 中Linux 下链接关系为-lpaddle_full_api_sharedlight 示例则为-lpaddle_light_api_shared-liomp5-ldl。这说明 x86 部署运行时除了 Paddle Lite 主库外还依赖 Intel iOMP 线程库这也是为什么编译脚本中会引入 mklml 组件。C Demo 的整体用法说明可参考 lite/demo/cxx/README.md。三、从源码编译 x86 部署库如果官方预编译库版本不匹配需要自己编译一份支持 x86 的 Paddle Lite 库。3.1 下载源码$ git clone https://gitcode.com/GitHub_Trending/pa/Paddle-Lite $ cd Paddle-Lite $ git checkout release-version-tag3.2 编译生成 x86 部署库编译入口是 lite/tools/build_linux.shx86 相关命令如下# tiny_publish 编译 $ ./lite/tools/build_linux.sh --archx86 # full_publish 编译 $ ./lite/tools/build_linux.sh --archx86 full_publish从脚本实现来看有几个值得注意的细节--archx86的处理脚本在 L149-L158 检测到ARCH x86时会设置with_x86ON并强制WITH_TINY_PUBLISHOFF即 x86 构建走完整发布路径full_publish参数L811-L814同样通过WITH_TINY_PUBLISHOFF控制产物范围构建目录约定make_publish_so将构建输出放到build.lite.linux.$ARCH.$TOOLCHAINL336因此 x86 gcc 的产物目录即build.lite.linux.x86.gcc后文替换库文件的路径正来源于此x86 专属编译选项帮助信息见 L427-L430--with_static_mklON/OFF是否编译静态 MKL 库默认OFF--with_avxON/OFF是否启用 AVX 指令集默认ONL29。第三方依赖当开启 x86 后端时cmake/backends/x86.cmake 会自动下载并集成xbyakJIT、xxhash、libxsmm、mklml、mkldnn等第三方组件。3.3 x86 后端的源码结构编译出的 x86 后端位于 lite/backends/x86/核心文件包括cpu_info.cc/cpu_info.h运行时检测 CPU 型号与指令集能力mklml.cc/mklml.h对 mklml 数学库的封装接口jit/、fluid/、math/JIT 生成 kernel、算子实现与数学运算target_wrapper.ccx86 TargetWrapper其中MemcpySync直接退化为std::copy_nL23-L33因为 x86 后端与 Host 共用主存无设备间拷贝开销。3.4 替换头文件和库编译完成后将产物替换到示例包的对应位置# 替换 include 目录 $ cp -rf build.lite.linux.x86.gcc/inference_lite_lib/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/include/ # 替换 libpaddle_full_api_shared.so $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/ # 替换 libpaddle_light_api_shared.so $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/替换头文件后需要重新编译示例程序./build.sh linux amd64否则会出现新旧 ABI 不一致的链接/运行问题。3.5 两套 API 的选用建议结合 lite/api/paddle_api.h 的定义CxxConfigfull API可加载 non-combined / combined 两种模型格式在运行时执行 IR 优化还支持set_quant_model、set_sparse_model等优化配置首次运行耗时较长可通过SaveOptimizedModel落盘优化结果供后续使用MobileConfiglight API跳过 IR 优化等阶段仅加载 opt 工具离线优化后的模型创建预测器更快、库体积更小是生产部署的推荐路径。四、实战注意事项小结事项说明目标平台命令中的linux amd64 cpu参数组合决定使用哪套预编译库与运行设备x86 设备使用amd64 cpu模型格式generic demo 的assets/models为 non-combined 模型走 full API 在线优化生产环境建议用 opt 工具转 .nb 模型 light API远程运行run_with_ssh.sh支持把示例推送到远程 x86 设备执行参数依次为 IP、端口、用户名、密码编译产物路径build.lite.linux.x86.gcc/inference_lite_lib/cxx/{include,lib}注意 gcc 工具链后缀AVX / MKL默认启用 AVX、动态链接 MKL部署到不支持 AVX 的老旧 x86 CPU 或需要免依赖部署时可考虑--with_avxOFF/--with_static_mklON重新编译至此从模型支持范围确认、generic demo 快速验证到源码级编译与库替换的完整闭环即全部覆盖。若在部署过程中需要进一步裁剪库体积可继续阅读 库裁剪 相关文档配合--with_strip参数生成针对指定模型的最小化部署库。【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考