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、Wide&Deep
- 图像分割: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 API(CxxConfig)在线转换路径;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++ Demo
PaddleLite-generic-demo的推理核心与仓库内的 x86 demo 源码逻辑一致。仓库提供了 x86_mobilenetv1_full_demo 与 x86_mobilenetv1_light_demo 两套完整示例,可对照阅读:
full API 示例(mobilenet_full_api.cc)的关键流程是:
- 创建 CxxConfig:
config.set_model_dir(model_dir)指定 non-combined 模型目录; - 设置可用 Place:当设备不支持 OpenCL 时回退到 CPU,仅保留
Place{TARGET(kX86), PRECISION(kFloat)}与Place{TARGET(kHost), PRECISION(kFloat)}(见 L160-L169)。注释中也明确说明“大多数 x86 设备只支持 fp32”; - 创建预测器并落盘优化模型:
CreatePaddlePredictor<CxxConfig>(config)之后调用SaveOptimizedModel(optimized_model_dir, LiteModelType::kNaiveBuffer)将在线优化结果保存为 naive buffer 模型(L217-L221); - 基准测试循环:默认
repeats=10, warmup=10,支持通过命令行传入<paddle_uncombined_model_dir> <raw_input_shapes> <repeats> <warmup> <print_output>(L315-L351),输出 1st/max/min/avg 耗时统计。
对应的 CMakeLists.txt.in 中,Linux 下链接关系为:-lpaddle_full_api_shared(light 示例则为-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-tag>3.2 编译生成 x86 部署库
编译入口是 lite/tools/build_linux.sh,x86 相关命令如下:
# tiny_publish 编译 $ ./lite/tools/build_linux.sh --arch=x86 # full_publish 编译 $ ./lite/tools/build_linux.sh --arch=x86 full_publish从脚本实现来看,有几个值得注意的细节:
--arch=x86的处理:脚本在 L149-L158 检测到ARCH == x86时,会设置with_x86=ON并强制WITH_TINY_PUBLISH=OFF,即 x86 构建走完整发布路径,full_publish参数(L811-L814)同样通过WITH_TINY_PUBLISH=OFF控制产物范围;- 构建目录约定:
make_publish_so将构建输出放到build.lite.linux.$ARCH.$TOOLCHAIN(L336),因此 x86 + gcc 的产物目录即build.lite.linux.x86.gcc,后文替换库文件的路径正来源于此; - x86 专属编译选项(帮助信息见 L427-L430):
--with_static_mkl=ON/OFF:是否编译静态 MKL 库,默认OFF;--with_avx=ON/OFF:是否启用 AVX 指令集,默认ON(L29)。
- 第三方依赖:当开启 x86 后端时,cmake/backends/x86.cmake 会自动下载并集成
xbyak(JIT)、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.cc:x86 TargetWrapper,其中MemcpySync直接退化为std::copy_n(L23-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 的定义:
CxxConfig(full API):可加载 non-combined / combined 两种模型格式,在运行时执行 IR 优化,还支持set_quant_model、set_sparse_model等优化配置;首次运行耗时较长,可通过SaveOptimizedModel落盘优化结果供后续使用;MobileConfig(light 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_avx=OFF/--with_static_mkl=ON重新编译 |
至此,从模型支持范围确认、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),仅供参考