Paddle Lite 程序开发全流程指南:从模型转换到端侧推理
2026/9/17 16:18:43 网站建设 项目流程

Paddle Lite 程序开发全流程指南:从模型转换到端侧推理

【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite

Paddle Lite 是飞桨(PaddlePaddle)的高性能端侧推理引擎,其程序开发工作流可以归结为两大步骤:先用 opt 工具把 Paddle 原生模型转换为 Paddle Lite 模型,再通过统一的 API 在目标设备上加载模型、填充输入并执行预测。本文以 docs/user_guides/development_overview.md 为主线,结合仓库中的 model_optimize_tool 文档、C++ 完整示例 以及 paddle_api.h 源码实现,完整讲解 Paddle Lite 从“模型生成”到“运行推断”的每一步操作细节,帮助读者在 Android / ARM Linux / iOS / x86 等端侧设备上跑通自己的模型。

一、开发工作流总览

Paddle Lite 的程序开发分为两个阶段,二者缺一不可:

  1. 创建 Paddle Lite 模型:Paddle 框架训练出的原生模型不能直接交给 Paddle Lite 运行,必须使用opt 工具进行转换。转换过程中会执行量化、子图融合、混合调度、Kernel 优选等优化,以缩减模型体积、缩短延时,并最大限度降低(或完全避免)精度损失,最终产出一个轻量的、最优的可执行模型。
  2. 运行推断:在目标设备上使用 Paddle Lite API 加载上述模型,完成输入数据的填充、Run()执行和输出结果读取,从而根据输入数据获得预测结果。

整个流程对多种语言(Java、C++、Python)和多种平台(Android、iOS、ARM Linux、x86、OpenCL、XPU、各类 NPU 等)一致适用,只是 API 语法略有差异。

二、第一步:创建 Paddle Lite 模型

Paddle Lite 提供多种策略自动优化原始训练模型,包括量化、子图融合、混合调度、Kernel 优选等。为了让优化过程更方便易用,官方提供了opt 工具自动完成上述优化步骤并输出轻量、最优的可执行模型。opt 的获取和调用有三种方式:pip 安装的paddle_lite_opt命令、独立可执行文件opt、以及从源码编译。

2.1 方式一:pip 安装后使用paddle_lite_opt命令

opt 工具集成在 Paddle Lite 的 Python 包中,安装环境要求:

  • 操作系统:Windows / Mac / Ubuntu
  • Python 版本:2.7 / 3.5 / 3.6 / 3.7(安装 pip 依赖)
# 当前最新版本是 2.12 pip install paddlelite==2.12 # 版本号需高于或等于 1.3.3(仅在使用 X2Paddle 转换第三方模型时需要) pip install x2paddle

安装成功后,直接在终端执行paddle_lite_opt(不带任何参数)即可查看工具的帮助信息。

转化模型:以mobilenet_v1为例,执行:

paddle_lite_opt --model_dir=./mobilenet_v1 \ --valid_targets=arm \ --optimize_out=mobilenet_v1_opt

执行成功后会在当前目录下生成mobilenet_v1_opt.nb文件,这就是可在 arm 平台执行的 Paddle Lite 模型。

2.2 方式二:下载独立可执行文件opt

opt 是 x86 平台上的可执行文件,需要在 PC 端运行,支持 Linux 终端和 Mac 终端。若提示没有执行权限,先执行chmod +x ./opt。运行./opt(不带参数)可输出帮助信息,界面类似下图:

以转化mobilenet_v1为例:

./opt --model_dir=./mobilenet_v1 --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=mobilenet_v1_opt

2.3 方式三:从源码编译 opt

如果希望自己构建 opt 工具,可以在仓库根目录执行:

./lite/tools/build.sh build_optimize_tool

如果提示第三方库获取失败,可将Paddle-Lite/third_party删除后重新执行该指令,Paddle Lite 会从国内镜像重新获取第三方库。编译产物位于Paddle-Lite/build.opt/lite/api/opt

注:若在 arm64 架构的 MacOS 下编译失败,可尝试删除 third-party 目录并git checkout third-party后,改用arch -x86_64 ./lite/tools/build.sh build_optimize_tool编译 x86 格式的 opt;或直接使用./lite/tools/build_macos.sh build_optimize_tool脚本编译。

2.4 opt 工具完整命令行参数

opt 支持完整的转换参数,终端命令格式如下:

./opt \ --model_dir=<model_param_dir> \ --model_file=<model_path> \ --param_file=<param_path> \ --optimize_out_type=(protobuf|naive_buffer) \ --optimize_out=<output_optimize_model_dir> \ --valid_targets=(arm|opencl|x86|x86_opencl|npu) \ --record_tailoring_info=(true|false) \ --quant_model=(true|false) \ --quant_type=(QUANT_INT8|QUANT_INT16)

各参数含义如下表:

选项说明
--model_dir待优化的 PaddlePaddle 模型(非 combined 形式)的路径
--model_file待优化的 PaddlePaddle 模型(combined 形式)的网络结构文件路径
--param_file待优化的 PaddlePaddle 模型(combined 形式)的权重文件路径
--optimize_out_type输出模型类型,支持protobufnaive_buffer两种,默认为protobuf;在 mobile 端执行预测需设置为naive_buffer(一种更轻量级的序列化/反序列化实现)
--optimize_out优化模型的输出路径
--valid_targets指定模型可执行的 backend,默认为arm。目前可支持 arm、opencl、x86、metal、xpu、bm、mlu、intel_fpga、huawei_ascend_npu、imagination_nna、rockchip_npu、mediatek_apu、huawei_kirin_npu、amlogic_npu,可同时指定多个(以逗号分隔,优先级高的在前),opt 将自动选择最佳方式。如需支持华为麒麟 NPU,应设置为huawei_kirin_npu,arm
--record_tailoring_info使用根据模型裁剪库文件功能时设为true,记录优化后模型含有的 kernel 和 OP 信息,默认为false
--enable_fp16是否启用 Float16 训练后量化;会提升速度、降低内存占用,但预测精度会有降低
--quant_model是否使用 opt 中的动态离线量化功能
--quant_type动态离线量化的类型,支持QUANT_INT8QUANT_INT16。量化为 int8 对精度有一点影响、模型体积约减小 4 倍;量化为 int16 对精度基本无影响、模型体积约减小 2 倍

使用规则要点

  • 待优化模型若为非 combined 形式(如__model__ + var1 + var2 + ...model + params等 5 种标准目录结构),只设置--model_dir,忽略--model_file--param_file
  • 待优化模型若为combined 形式(如model + parammodel.pdmodel + model.pdiparams),需同时设置--model_file--param_file,忽略--model_dir
  • naive_buffer优化产物是以.nb结尾的单个文件;protobuf优化产物为文件夹下的modelparams两个文件,将model重命名为__model__后可用 Netron 打开查看优化后的模型结构;
  • 已删除prefer_int8_kernel输入参数,opt 会自动判别是否为量化模型并执行相应优化;
  • opt 中的动态离线量化功能与 PaddleSlim 中的动态离线量化功能相同,opt 提供该功能是为了方便用户使用。

2.5 使用 Python 脚本调用 opt API

除了命令行,还可以在 Python 脚本中直接调用Opt类完成转换(支持 Windows / Mac / Ubuntu)。完整 API 说明见 python_api/opt,示例如下:

from paddlelite.lite import * # 1. 创建 opt 实例 opt = Opt() # 2. 指定输入模型地址 opt.set_model_dir("./mobilenet_v1") # 3. 指定可用 place(可多个,逗号分隔),如 arm、x86、opencl、npu opt.set_valid_places("arm") # 4. 指定模型转化类型:naive_buffer、protobuf opt.set_model_type("naive_buffer") # 5. 输出模型地址 opt.set_optimize_out("mobilenetv1_opt") # 6. 执行模型优化 opt.run()

Opt类还提供了run_optimize()一站式接口,无需逐步设置即可完成转换:

from paddlelite.lite import * opt = Opt() opt.run_optimize("./mobilenet_v1", "", "", "arm", "mobilenetv1_opt")

此外还支持以下进阶选项:

  • set_model_file/set_param_file:加载 combined 形式模型时使用;
  • set_quant_model(bool):启用动态离线量化;
  • set_quant_type("QUANT_INT16" | "QUANT_INT8"):指定量化位宽;
  • enable_fp16():启用 Float16 训练后量化,运行耗时和内存占用几乎降低一半;
  • set_sparse_model(bool)set_sparse_threshold(float):启用模型稀疏化功能(目前只能在 ARM 平台编译模型时开启),阈值表示某层参数中 0 元素比例低于该值时(如 0.6)不走 sparse pass,参数区间为[0, 1]

2.6 使用 X2Paddle 导出 Paddle Lite 支持格式

如果想用 Paddle Lite 运行第三方来源(TensorFlow、Caffe、ONNX、PyTorch)的模型,通常需要两次转换:先用 X2Paddle 将第三方模型转为 PaddlePaddle 格式,再用 opt 将 Paddle 模型转为 Paddle Lite 格式。为简化流程,X2Paddle 已集成 opt 工具,提供一键转换 API,以 ONNX 为例:

from x2paddle.convert import onnx2paddle onnx2paddle(model_path, save_dir, convert_to_lite=True, lite_valid_places="arm", lite_model_type="naive_buffer") # model_path(str) ONNX 模型路径 # save_dir(str) 转换后模型保存路径 # convert_to_lite(bool) 是否使用 opt 工具,默认为 False # lite_valid_places(str) 指定转换类型,默认为 arm # lite_model_type(str) 模型转化类型,protobuf / naive_buffer,默认为 naive_buffer

对应的命令行方式为:

x2paddle --framework=onnx --model=onnx_model.onnx --save_dir=pd_model --to_lite=True --lite_valid_places=arm --lite_model_type=naive_buffer

2.7 进阶:算子信息统计与 nb 模型可视化

opt 不只是“格式转换器”,它还提供模型诊断能力:

  • 统计模型算子信息、判断是否支持./opt --print_model_ops=true --model_dir=mobilenet_v1 --valid_targets=arm可打印模型中包含的所有算子,并判断在指定硬件平台下 Paddle Lite 是否支持该模型;
  • 打印当前 Paddle Lite 支持的算子./opt --print_all_ops=true打印所有算子及每个 OP 支持的硬件平台;./opt --print_supported_ops=true --valid_targets=x86则打印指定 backend 下的算子;
  • nb 模型可视化./opt --optimized_nb_model_path=./mobilenet_v1_opt.nb --visualization_file_output_path=.可加载优化后的 naive_buffer 模型并生成Block_0.dot可视化文件,再用dot Block_0.dot -Tpdf -o Block_0.pdf生成 PDF 查看模型结构(需先安装 Graphviz 的 dot 命令)。

从源码结构看,上述“打印模型算子”与“nb 可视化”能力均构建于 Paddle Lite 的模型解析与图优化框架之上,模型优化在 lite/core/optimizer 目录中完成,而 opt 工具的入口实现位于 lite/api/tools 目录。

三、第二步:运行推断

3.1 运行推断的五步通用流程

无论使用哪种语言,Paddle Lite 的推理都遵循以下五步:

  1. 配置 Config 信息:创建MobileConfig,配置模型路径、运行设备环境等信息;
  2. 创建 Predictor:通过CreatePaddlePredictor接口创建Predictor对象,完成模型解析和环境初始化;
  3. 设置模型输入:通过predictor->GetInput(i)获取输入变量,调用Resize指定形状,再通过mutable_data<T>()拿到数据地址并填充数值;
  4. 执行预测:调用predictor->Run()
  5. 获得输出:使用predictor->GetOutput(i)获取输出变量,通过data<T>()取得输出值。

在 lite/api/paddle_api.h 中可以找到这些接口的底层声明:PaddlePredictor类定义了GetInput(int i)GetOutput(int i)Run()Clone()GetVersion()GetInputNames()GetOutputNames()SaveOptimizedModel()等核心方法(见 paddle_api.h);Tensor类则提供了Resize(shape)data<T>()mutable_data<T>()shape()SetLoD()等张量操作(见 paddle_api.h)。

3.2 MobileConfig:配置推理参数

MobileConfig用于配置轻量级LightPredictor的构建参数,包括 NaiveBuffer 格式模型地址、能耗模式、工作线程数等。其类定义与CreatePaddlePredictor接口声明位于 lite/api/paddle_api.h。Python 侧使用示例如下:

from paddlelite.lite import * config = MobileConfig() # 设置 NaiveBuffer 格式模型文件 config.set_model_from_file(<your_model_path>) # 设置工作线程数 config.set_threads(4) # 设置能耗模式 config.set_power_mode(PowerMode.LITE_POWER_NO_BIND) # 根据 MobileConfig 创建 LightPredictor predictor = create_paddle_predictor(config)

主要接口及注意事项(详见 python_api/MobileConfig):

接口说明
set_model_from_file(model_file)设置模型文件路径,必须是 opt 优化后产生的 NaiveBuffer 格式模型
set_model_dir(model_dir)设置模型文件夹路径;Lite 模型格式在 release/v2.3.0 之后修改,此接口用于加载老格式模型,将在 release/v3.0.0 废弃,建议替换为set_model_from_file
set_model_from_buffer(model_buffer)从内存加载模型数据时使用
set_power_mode(mode)设置 CPU 能耗模式,默认LITE_POWER_HIGH;只在开启 OpenMP 且以LITE_WITH_ARM编译时生效
set_threads(threads)设置工作线程数,默认单线程;只在开启 OpenMP 的模式下生效,接口只支持 armlinux 平台

PowerMode枚举定义了完整的能耗档位,可在 python_api/PowerMode 中查看,常见取值包括LITE_POWER_HIGHLITE_POWER_LOWLITE_POWER_NO_BIND等,分别对应高主频绑核、低主频绑核与不绑核策略。

3.3 C++ 推理完整示例

以 C++ 为例,完整推理代码仅需五步:

#include "paddle_api.h" using namespace paddle::lite_api; // (1) 引用头文件和命名空间 // (2) 指定模型文件,创建 Predictor MobileConfig config; config.set_model_from_file(model_file_path); // opt 生成的模型路径 std::shared_ptr<PaddlePredictor> predictor = CreatePaddlePredictor<MobileConfig>(config); // (3) 设置模型输入(以全 1 输入为例) std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0))); input_tensor->Resize({1, 3, 224, 224}); auto* data = input_tensor->mutable_data<float>(); for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) { data[i] = 1; } // 若模型有多个输入,每个输入都需准确设置 shape 和 data // (4) 执行预测 predictor->Run(); // (5) 获得预测结果 std::unique_ptr<const Tensor> output_tensor( std::move(predictor->GetOutput(0))); auto output_data = output_tensor->data<float>();

注:如果输入数据是图片,需先完成缩放、归一化等预处理,再将预处理后的数据填充到输入 Tensor。更完整的 C++ API 说明见 C++ API 文档。

3.4 端侧部署实战:以 Android mobilenet_light 为例

lite/demo/cxx/mobile_light下的轻量级 Demo 为例,完整跑通“模型转换 → 编译 → 部署 → 执行”的全链路:

  1. 环境准备:一台可编译 Paddle Lite 的电脑(推荐 Docker,参考源码编译环境)和一台可通过 adb 连接的 Android 手机。
  2. 获取预测库:下载或自行编译 Paddle Lite 预测库(见预编译库下载)。解压后cxx/include为头文件,cxx/lib下包含静态库libpaddle_api_light_bundled.a与动态库libpaddle_light_api_shared.so
  3. 准备模型:下载mobilenet_v1模型并用 opt 转换为 naive_buffer 格式,得到mobilenet_v1_opt.nb
  4. 编译示例:进入预测库目录inference_lite_lib.android.armv8/demo/cxx/mobile_light执行make,生成mobilenetv1_light_api可执行文件。
  5. 部署执行:通过 adb 将.nb模型、动态库与可执行文件推送到手机/data/local/tmp,然后执行:
adb shell 'cd /data/local/tmp && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp && ./mobile_classify mobilenet_v1_opt.nb'

运行成功后会输出 10 次推理的耗时统计(max/min/avg)以及输出张量的形状、均值、标准差等 benchmark 摘要信息。图像分类、目标检测等更多完整示例位于 lite/demo/cxx 目录,其预测流程可用下图概括:

3.5 Java 与 Python 语言支持

除 C++ 外,Paddle Lite API 还支持:

  • Java:在 Android 工程中引入paddle-lite-android依赖后,同样通过MobileConfig+PaddlePredictor完成推理,接口语义与 C++ 一一对应,参考 Java Demo;
  • Python:适合在 x86 服务器或具备 Python 运行环境的嵌入式设备上快速验证,使用create_paddle_predictor(config)创建预测器,参考 Python Demo 及 python_api/CxxPredictor 与 LightPredictor。

四、总结

Paddle Lite 的开发工作流高度统一:离线阶段用 opt 完成格式转换与图优化(量化、子图融合、Kernel 优选、混合调度),产出轻量的.nb模型;在线阶段通过MobileConfig配置运行参数、CreatePaddlePredictor创建预测器、GetInput/Run/GetOutput完成数据填充、推理与结果读取。这套流程与lite/api/paddle_api.hConfigBasePaddlePredictorTensor等核心接口一一对应,无论目标设备是 ARM CPU、x86、OpenCL GPU 还是各类 NPU,开发模式均保持一致——这也是 Paddle Lite 能够以极低学习成本覆盖多平台、多语言端侧推理部署的关键所在。

【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询