十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Paddle-Lite Python 推理完整示例:从安装预测库到运行 mobilenetv1 实战指南

Paddle-Lite Python 推理完整示例:从安装预测库到运行 mobilenetv1 实战指南 Paddle-Lite Python 推理完整示例从安装预测库到运行 mobilenetv1 实战指南【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite导读本指南以 Paddle-Lite 官方 Python 示例mobilenetv1_light_api.py与mobilenetv1_full_api.py为主线系统讲解 Python API 执行模型推理的完整流程从pip安装预测库、用opt工具完成模型转换到创建 predictor、填充输入、执行推理、解析输出。读完本文你将掌握 Paddle-Lite Python API 的核心用法MobileConfig/CxxConfig、create_paddle_predictor、Tensor数据交互并能把该流程直接迁移到自己的模型中。Paddle-Lite Python 推理的基本流程Paddle-Lite 的 Python 预测库封装了底层 C 推理引擎使用它执行一次推理主要包括以下六个步骤创建 config 对象创建paddlelite.lite.MobileConfig对象用于配置模型路径、运行设备环境等相关信息模型加载通过config.set_model_from_file接口配置模型路径naive_buffer 格式的.nb文件创建 predictor 对象通过create_paddle_predictor接口创建paddlelite.lite.LightPredictor对象完成模型解析和环境初始化输入数据通过predictor.get_input(num)获取第num个输入 tensor类型为paddlelite.lite.Tensor再调用 tensor 的from_numpy方法填充数据执行推理调用 predictor 对象的run方法进行模型推理输出数据推理结束后通过predictor.get_output(num)获取第num个输出 tensor。整体流程如下图所示从源码实现看create_paddle_predictor会根据传入的 config 类型决定返回的预测器类型——传入CxxConfig返回CxxPredictor传入MobileConfig返回LightPredictor见 create_paddle_predictor 文档并在创建过程中完成模型解析、算子选型kernel 挑选与执行环境初始化。Python 应用开发五步法Python 代码调用 Paddle-Lite 执行预测只需五个步骤下面以输入全一数据np.ones为例给出最小可运行代码。(1) 引入必要的库from paddlelite.lite import * import numpy as np(2) 指定模型文件创建 predictor# 1. Set config information config MobileConfig() # 2. Set the path to the model generated by opt tools config.set_model_from_file(args.model_dir) # 3. Create predictor by config predictor create_paddle_predictor(config)(3) 设置模型输入下面以全一输入为例input_tensor predictor.get_input(0) input_tensor.from_numpy(np.ones((1, 3, 224, 224)).astype(float32))如果模型有多个输入每一个模型输入都需要准确设置 shape 和 data。(4) 执行预测predictor.run()(5) 获得预测结果并将预测结果转化为 numpy 数组output_tensor predictor.get_output(0) output_data output_tensor.numpy() print(output_data)详细的 Python API 说明文档位于 Python API 文件夹内其中 MobileConfig、CxxConfig、Tensor 等页面逐接口列出了参数、返回值与使用注意事项。mobilenetv1_light_api.py 与 mobilenetv1_full_api.py 示例程序Paddle-Lite Python 版本支持的平台包括Windows X86_CPU / macOS X86_CPU / Linux X86_CPU / Linux ARM_CPU (ARM Linux)。两个示例程序源码均位于仓库 lite/demo/python 目录下mobilenetv1_light_api.py基于MobileConfigLightPredictor的轻量 API输入为经opt工具优化后的 naive_buffer 格式模型.nb文件推理流程更精简mobilenetv1_full_api.py基于CxxConfigCxxPredictor的完整 API可直接加载未经优化转换的原生 Paddle 模型combined / 非 combined 均可并支持通过predictor.save_optimized_model在运行期导出优化后模型。1. 环境准备如果是Windows X86_CPU / macOS X86_CPU / Linux X86_CPU平台不需要进行特定环境准备如果是ARM Linux平台需要先编译 Paddle-Lite环境配置参考 源码编译推荐使用 docker 环境。2. 安装 Python 预测库PyPI 源目前仅提供 Windows X86_CPU / macOS X86_CPU / Linux X86_CPU 平台的 pip 安装包执行如下命令# 当前最新版本是 2.12 python -m pip install paddlelite2.12如果需要使用 ARMLinux 平台的 Python 预测功能请参考 ARM Linux 环境下编译适用于 ARM Linux 的库编译并安装 Paddle-Lite 的 Python 包。安装完成后通过from paddlelite.lite import *即可引入全部 API在 Windows 平台上__init__.py会自动将包内libs目录下的动态库路径加入 DLL 搜索路径保证paddlelite.lite模块可以正确加载底层 C 推理库。3. 准备预测部署模型(1) 模型下载下载 mobilenet_v1 模型后解压得到 Paddle 非 combined 形式的模型位于文件夹mobilenet_v1下。可通过模型可视化工具 Netron 打开文件夹下的__model__文件查看模型结构。wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz tar zxf mobilenet_v1.tar.gz(2) 模型转换Paddle 原生模型需经 opt 工具 转化为 Paddle-Lite 可以支持的 naive_buffer 格式转换成功后在同级目录生成名为mobilenet_v1_opt.nb的优化后模型文件。各平台转换方式如下Linux X86_CPU 平台通过 pip 安装 Paddle-Lite 的同时就已获得paddle_lite_opt可执行文件。paddle_lite_opt --model_dir./mobilenet_v1 \ --optimize_outmobilenet_v1_opt \ --optimize_out_typenaive_buffer \ --valid_targetsx86MAC X86_CPU 平台paddle_lite_opt工具使用方式同 Linux。Windows X86_CPU 平台暂不支持命令行方式直接运行模型转换器需编写 Python 脚本import paddlelite.lite as lite a lite.Opt() # 非 combined 形式 a.set_model_dir(D:\\YOU_MODEL_PATH\\mobilenet_v1) # combined 形式具体模型和参数名称请根据实际修改 # a.set_model_file(D:\\YOU_MODEL_PATH\\mobilenet_v1\\__model__) # a.set_param_file(D:\\YOU_MODEL_PATH\\mobilenet_v1\\__params__) a.set_optimize_out(mobilenet_v1_opt) a.set_valid_places(x86) a.run()ARMLinux 平台编写 Python 脚本转换模型import paddlelite.lite as lite a lite.Opt() # 非 combined 形式 a.set_model_dir(D:\\YOU_MODEL_PATH\\mobilenet_v1) # combined 形式具体模型和参数名称请根据实际修改 # a.set_model_file(D:\\YOU_MODEL_PATH\\mobilenet_v1\\__model__) # a.set_param_file(D:\\YOU_MODEL_PATH\\mobilenet_v1\\__params__) a.set_optimize_out(mobilenet_v1_opt) a.set_valid_places(x86) # 设置为 x86 a.run()set_valid_places指定了优化时允许的 target 类型如x86、arm、opencl等列表顺序即优先级顺序。除了命令行与 Python 脚本opt 工具还有 命令行使用手册 与 Python 接口使用手册 两份细化文档可供查阅。4. 下载和运行预测示例程序从仓库 lite/demo/python 获取预测示例文件mobilenetv1_light_api.py和mobilenetv1_full_api.py该目录下还附带 ImageNet 1000 类标签文件 labels.txt 与测试图片 tabby_cat.jpg可用于真实图片分类演示然后运行# light api 的输入为优化后模型文件 mobilenet_v1_opt.nb python mobilenetv1_light_api.py --model_dirmobilenet_v1_opt.nb # 运行成功后将在控制台输出类似如下内容 [[1.91309489e-04 5.92054741e-04 1.12302143e-04 6.27333211e-05 1.27506457e-04 1.32147770e-03 3.13812016e-05 6.52206727e-05 4.78084912e-05 2.58819520e-04 1.53155532e-03 1.12548303e-04 ... ... ]]# full api 的输入为未使用 paddle_lite_opt 工具优化前的模型文件夹 mobilenet_v1 python mobilenetv1_full_api.py --model_dir./mobilenet_v1 # 运行成功后将在控制台输出类似如下内容 Loading topology data from ./mobilenet_v1/__model__ Loading non-combined params data from ./mobilenet_v1 1. Model is successfully loaded! [[1.91309489e-04 5.92054741e-04 1.12302143e-04 6.27333211e-05 1.27506457e-04 1.32147770e-03 3.13812016e-05 6.52206727e-05 ... ... ]]深入解读示例程序源码两个示例程序都基于argparse提供命令行参数核心参数包括--model_dir模型路径、--input_shape默认1 3 224 224对应 MobileNet 的标准输入、--backend执行后端、--image_path/--label_path真实图片与标签路径、--print_results是否打印完整输出。其中--backend在 light api 中支持arm|opencl|x86|x86_opencl|metal在 full api 中额外支持nnadapter|XPU便于在多种硬件后端上切换验证。Light API 与 Full API 的差异要点模型加载方式不同light api 通过config.set_model_from_file(args.model_dir)直接加载.nb优化模型full api 通过CxxConfig加载原生 Paddle 模型——当同时指定--model_file与--param_file时加载 combined 形式模型config.set_model_fileconfig.set_param_file否则通过config.set_model_dir加载非 combined 模型目录valid_places 配置不同full api 需要显式调用config.set_valid_places(places)声明可用的 Place 列表。以 x86 为例为[Place(TargetType.X86, PrecisionType.FP32)]以 OpenCL 为例则给出了一组覆盖 FP16/FP32、ImageDefault/ImageFolder/NCHW布局的完整候选列表见 mobilenetv1_full_api.py 中OPENCL分支。列表顺序即偏好顺序排在越前面优先级越高——这也是文档中“把Place(TargetType.ARM, PrecisionType.INT8)放在首位可优先使用 INT8 kernel”这一约定的实际体现可导出优化模型full api 在创建 predictor 后调用predictor.save_optimized_model(opt_ args.backend)把运行期完成优化的模型保存为opt_backend/目录之后即可改用 light api 加载省去单独运行 opt 工具的步骤。输入数据填充与图像预处理两个示例在数据填充部分完全一致通过predictor.get_input(0)拿到第一个输入 tensor默认使用np.ones((1, c, h, w)).astype(float32)填充全一数据若同时传入--image_path与--label_path则进入真实图像分类分支其预处理逻辑与标准 ImageNet 分类一致image_mean [0.485, 0.456, 0.406] image_std [0.229, 0.224, 0.225] image_data cv2.imread(args.image_path) image_data cv2.resize(image_data, (h, w)) image_data cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB) image_data image_data.transpose((2, 0, 1)) / 255.0 image_data (image_data - np.array(image_mean).reshape( (3, 1, 1))) / np.array(image_std).reshape((3, 1, 1)) image_data image_data.reshape([1, c, h, w]).astype(float32) input_tensor.from_numpy(image_data)即 resize 到224×224→ BGR 转 RGB → 由HWC转CHW→ 除以 255 归一化 → 按 mean/std 标准化 → 增加 batch 维后写入 tensor。底层的Tensor数据交互接口定义在 tensor_py.h经 pybind.cc 绑定到 Python。常用方法包括resize(shape)设置维度、shape()获取维度、from_numpy(np.array)写入 numpy 数据、numpy()取回 numpy 数组、set_lod/lod读写 LoD 序列信息以及float_data()/set_float_data()等面向 float 数据的替代接口详见 Tensor 文档。输出解析与结果验证推理完成后output_tensor predictor.get_output(0) output_data output_tensor.numpy() if args.print_results True: print(result data:\n{}.format(output_data)) print(mean:{:.6e}, std:{:.6e}, min:{:.6e}, max:{:.6e}.format( np.mean(output_data), np.std(output_data), np.min(output_data), np.max(output_data)))输出为[1, 1000]形状的得分向量对应 ImageNet 1000 类。在图片分类模式下程序会对输出做flatten()后取np.argmax得到类别下标并与labels.txt中的类别名对应打印class_name: ... score: ...默认全一输入模式下则会打印输出的均值、标准差、最小值与最大值四项统计量便于快速核对推理是否正常。OpenCL 后端的配置示例当--backend指定为 OpenCL 相关取值时light api 示例额外配置了 kernel 二进制缓存与调优参数full api 中同时给出了对应的 places 列表以缩短首次运行时的算法选择与 kernel 编译耗时config.set_opencl_binary_path_name(./, lite_opencl_kernel.bin) config.set_opencl_tune(CLTuneMode.CL_TUNE_NORMAL, ./, lite_opencl_tuned.bin, 4) config.set_opencl_precision(CLPrecisionType.CL_PRECISION_AUTO)其中set_opencl_precision的取值有CL_PRECISION_AUTO优先使用 FP16默认、CL_PRECISION_FP32强制 FP32、CL_PRECISION_FP16强制 FP16。更完整的 OpenCL 平台使用说明可参考 opencl.md。常见注意事项模型格式匹配light api 只能加载opt优化后的 naive_buffer 格式.nb模型接口set_model_from_filefull api 则直接读取原生 Paddle 模型旧版set_model_dir接口加载老格式模型已在release/v3.0.0计划废弃建议统一使用set_model_from_file线程与功耗配置set_threads与set_power_mode仅对 ARM Linux 平台生效且只在开启 OpenMP 时生效对应LITE_WITH_ARM编译选项不设置时默认单线程、LITE_POWER_HIGH功耗模式多输入模型每个输入 tensor 都需按模型要求准确设置 shape 与数据依次通过get_input(0)、get_input(1)…… 获取平台差异PyPI 的 pip 包仅覆盖三大桌面 CPU 平台ARM Linux 的 Python 预测能力需按 ARM Linux 编译文档 自行编译安装。至此你已经完整掌握了 Paddle-Lite Python API 的部署链路模型转换 → 环境准备 → 安装预测库 → 编写/运行推理脚本 → 解析结果。将该流程中的模型路径、输入 shape 与预处理逻辑替换为你自己的模型即可快速复用到实际项目中。【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表