ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PaddlePaddle Linux GPU/CPU 模型推理开发实战指南:基于 Paddle Inference 的动转静、推理引擎与日志规范全流程

PaddlePaddle Linux GPU/CPU 模型推理开发实战指南:基于 Paddle Inference 的动转静、推理引擎与日志规范全流程 人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载本文档是飞桨PaddlePaddle模型在 Linux GPU/CPU 环境下基于 Paddle Inference 预测引擎完成推理功能开发的完整指南。它以 Linux GPU/CPU 模型推理开发文档 为骨架结合当前仓库中的模板代码、TIPC 测试配置与规范文档展开读者按此流程可将训练好的动态图模型一键转为静态图推理模型完成从推理引擎初始化、数据预处理、推理运行、结果后处理到结果核验、规范日志输出的九步闭环开发。1. 简介为什么需要 Paddle InferencePaddle Inference 是飞桨的原生推理库作用于服务器端和云端提供高性能的推理能力。相比于直接基于预训练模型进行预测Paddle Inference 可通过MKLDNN、CUDNN、TensorRT等底层加速库实现预测加速从而获得更优的推理性能。它面向的是生产部署场景训练阶段使用的动态图Dygraph模型在灵活调试的同时牺牲了部分执行效率而推理阶段需要的是固定结构、可优化的静态图Static Graph模型。本文档主要介绍飞桨模型在 Linux GPU/CPU 下基于预测引擎的推理过程开发整个流程共 9 个步骤其中设置了 3 个核验点准备推理模型、验证推理结果正确性、添加推理日志。在动手之前建议先阅读同一系列文档中的 Linux GPU/CPU 基础训练推理开发文档它明确了本指南在整个模型复现流程中的位置——第二步基于 Paddle Inference 的推理程序开发承接第一步《模型复现指南》中的训练引擎预测并为第三步Linux GPU/CPU 基础训练推理测试开发见 test_train_infer_python.md提供推理功能基础。2. 推理过程开发九步闭环基于 Paddle Inference 的推理过程分为 9 个步骤整体流水线如下图所示其中验证推理结果正确性与添加推理日志为核心核验节点。2.1 准备推理数据与环境【数据】从验证集或者测试集中抽出至少一张图像用于后续推理过程验证。建议同时准备一张示例图片放入lite_data小数据集训练集和验证集各 8~16 张即可压缩后建议 20M 以内这样既可用于推理验证也可服务于后续 TIPC 训练推理一体化测试。【环境】安装好 PaddlePaddle 的 whl 包之后便可以直接体验 Paddle 的 Inference 推理功能。也就是说推理开发不需要额外的第三方推理框架依赖只需要具备包含paddle.inference模块的飞桨环境。2.2 准备推理模型模型动转静模型动转静方法可以将训练得到的动态图模型转化为用于推理的静态图模型。本小节的代码模板位于 template/code/export_model.py您可以基于这段代码进行修改。从模板源码可以看到整个导出流程由三个核心环节组成build_model定义模型、paddle.jit.to_static装饰动转静、paddle.jit.save保存静态图模型。2.2.1 定义模型【基本流程】在模型导出之前首先需要定义好模型结构模型结构与训练时的模型结构相同。模板中build_model(args)即负责构建该模型返回一个nn.Layer类型的网络。【注意事项】图像分类任务中训练组网时在输出层一般不加softmax激活函数训练时通常与交叉熵损失一起计算而在预测推理时为了直接得到模型预测结果的概率值可以在网络后面添加softmax激活函数。【实战】以 AlexNet 为例模型定义与组网如下model paddlevision.models.__dict__args.model model nn.Sequential(model, nn.Softmax()) model.eval()其中nn.Sequential(model, nn.Softmax())将分类网络与softmax层串联成一条前向通路model.eval()将模型切换到评估模式关闭 dropout、BN 的随机行为确保导出与推理行为一致。2.2.2 模型动转静jit.to_static【基本流程】paddle.jit.to_static接口是完成模型动转静的唯一接口需要使用该接口对模型进行装饰。模板源码中的用法如下model paddle.jit.to_static( model, input_spec[ InputSpec( shape[None, 3, args.img_size, args.img_size], dtypefloat32) ])【注意事项】如果有多个输入则在input_spec接口中定义多个InputSpec对象即可batch_size维度建议使用None如上例的shape[None, 3, ...]这样导出的模型在推理时 batch 维度为动态可以按需改变输入 batch 大小若后续希望使用 TensorRT 进行预测需要保证导出时设置的尺度与最终实际预测时的尺度保持一致见 FAQ 3.3。2.2.3 保存模型jit.save【基本流程】对于装饰后的模型可以使用paddle.jit.saveAPI 完成模型保存paddle.jit.save(model, os.path.join(args.save_inference_dir, inference))模板源码将模型保存到args.save_inference_dir目录下并打印inference model is saved in {args.save_inference_dir}提示保存位置。【注意事项】保存过程中遇到的问题可以参考动转静报错调试教程Paddle 官方文档《动转静报错调试教程》。动转静过程中为方便管理输入输出程序会自动指定输入和输出目录因此导出脚本只需要提供可配置的输入输出目录参数即可这一点与 TIPC 配置文件 中save_dir、pretrained_model的配置方式对应见第 6 章。【验收】保存路径下会生成 3 个文件其中在 Inference 推理中用到的为inference.pdiparams与inference.pdmodelinference.pdiparams : 模型参数文件 inference.pdmodel : 模型结构文件 inference.pdiparams.info: 模型参数信息文件pdmodel是静态图网络结构描述pdiparams是参数权重二进制文件两者必须成对提供给 Paddle Inference 加载pdiparams.info是参数元信息名称、形状、dtype 等供调试与二次开发使用。2.3 准备推理所需代码InferenceEngine 模板类基于预测引擎的推理过程包含 4 个步骤初始化预测引擎、预处理、推理、后处理。文件 template/code/infer.py 中提供了一个模板类您可以将这个文件拷贝到自己的项目中修改对应的部分。该模板类的完整骨架如下含源码中的 docstring 说明class InferenceEngine(object): InferenceEngine Inference engina class which contains preprocess, run, postprocess def __init__(self, args): Args: args: Parameters generated using argparser. super().__init__() pass def load_predictor(self, model_file_path, params_file_path): initialize the inference engine Args: model_file_path: inference model path (*.pdmodel) model_file_path: inference parameater path (*.pdiparams) pass def preprocess(self, x): Preprocess to the input. x: Raw input (image path, numpy array...) pass def postprocess(self, x): Postprocess to the inference engine output. pass def run(self, x): Inference process using inference engine. pass模板中同时还给出了infer_main(args)的主流程初始化推理引擎 → 可选初始化 benchmark 日志 → 预处理 → 推理运行 → 后处理 → 可选输出日志。下面 2.4~2.7 小节对每个子模块的操作逐一展开。2.4 初始化推理引擎【基本流程】传入配置如模型参数和结构文件路径、GPU、MKLDNN 等初始化推理引擎。以 AlexNet 为例推理引擎初始化函数实现如下其中模型结构和参数文件路径、是否使用 GPU、是否开启 MKLDNN 等内容都是可配置的def load_predictor(self, model_file_path, params_file_path): args self.args config inference.Config(model_file_path, params_file_path) if args.use_gpu: config.enable_use_gpu(1000, 0) else: config.disable_gpu() if args.use_mkldnn: config.enable_mkldnn() config.set_cpu_math_library_num_threads(args.cpu_threads) # enable memory optim config.enable_memory_optim() config.disable_glog_info() config.switch_use_feed_fetch_ops(False) config.switch_ir_optim(True) # create predictor predictor inference.create_predictor(config) # get input and output tensor property input_names predictor.get_input_names() input_tensor predictor.get_input_handle(input_names[0]) output_names predictor.get_output_names() output_tensor predictor.get_output_handle(output_names[0]) return predictor, config, input_tensor, output_tensor【配置项逐条解读】配置 API作用说明inference.Config(model_file_path, params_file_path)构建配置对象传入*.pdmodel与*.pdiparams两个文件路径config.enable_use_gpu(1000, 0)开启 GPU 推理参数依次为初始显存池大小MB示例为 1000与 GPU 设备 ID示例为 0config.disable_gpu()关闭 GPU回退 CPU与enable_use_gpu互斥分支config.enable_mkldnn()开启 MKLDNN 加速仅 CPU 场景有效可大幅提升 CPU 推理性能config.set_cpu_math_library_num_threads(args.cpu_threads)设置 CPU 数学库线程数与 MKLDNN 搭配使用线程数越大并行度越高config.enable_memory_optim()开启内存优化复用内存缓冲区降低峰值内存占用config.disable_glog_info()关闭日志输出避免推理引擎向终端打印冗余运行日志config.switch_use_feed_fetch_ops(False)关闭 feed/fetch 算子使用新版输入输出 API 时需关闭否则无法使用get_input_handle/get_output_handleconfig.switch_ir_optim(True)开启 IR 图优化推理引擎对计算图进行算子融合等优化初始化完成后通过predictor.get_input_names()/predictor.get_output_names()获取输入输出张量名再用get_input_handle/get_output_handle拿到可读写的数据句柄供推理运行时拷贝数据使用。返回的predictor、config、input_tensor、output_tensor四件套即构成推理引擎的核心。【验证推理引擎配置是否生效】开启--benchmark后AutoLog 输出的 Conf info 段会如实反映ir_optim、enable_memory_optim、enable_tensorrt、enable_mkldnn、cpu_math_library_num_threads等最终生效配置见 2.9 节日志示例可用于核对配置是否按预期加载。2.5 开发数据预处理程序【基本流程】读取指定图像对其进行数据变换转化为符合模型推理所需要的输入格式。【注意事项】在模型评估过程中为了保证数据可以组 batch一般会使用 resize/crop/padding 等方法保持尺度一致性但在预测推理过程中需要注意 crop 是否合适——比如 OCR 识别任务中crop 操作会导致识别结果不全应谨慎设计预处理与后处理流程。【实战】以图像分类模型 AlexNet 为例预处理包含Resize、CenterCrop、Normalize、ToCHW4 个步骤由self.transforms组合完成实现如下def preprocess(self, img_path): with open(img_path, rb) as f: img Image.open(f) img img.convert(RGB) img self.transforms(img) img np.expand_dims(img, axis0) return img要点说明Image.open(f).convert(RGB)统一三通道格式避免灰度图或带 alpha 通道的 PNG 造成维度不一致self.transforms(img)输出形状为[C, H, W]ToCHW 转置后np.expand_dims(img, axis0)在首位增加 batch 维最终输入形状为[1, C, H, W]与 2.2.2 节InputSpec(shape[None, 3, ...])的定义完全对齐。2.6 开发推理程序【基本流程】将数据从 CPU 拷贝到推理引擎中推理引擎自动完成推理过程将结果拷贝回 CPU。【实战】AlexNet 的推理引擎运行代码如下def run(self, x): # inference using inference engine self.input_tensor.copy_from_cpu(x) self.predictor.run() output self.output_tensor.copy_to_cpu() return output三步完成一次推理copy_from_cpu(x)将预处理后的 numpy 数组灌入输入张量 →predictor.run()触发引擎执行计算图期间可能调度 GPU/MKLDNN/TensorRT 加速→copy_to_cpu()将输出张量取回 CPU 侧 numpy 数组。这里self.input_tensor/self.output_tensor正是 2.4 节load_predictor中通过句柄获得的张量对象。2.7 开发推理结果后处理程序【基本流程】对模型的推理输出进行后处理得到最终有实际含义的输出。【实战】AlexNet 的后处理代码如下def postprocess(self, x): x x.flatten() class_id x.argmax() prob x[class_id] return class_id, prob由于导出模型末尾已串联softmax见 2.2.1后处理只需将输出展平、取argmax得到预测类别索引并取出对应位置的置信度概率最终返回(class_id, prob)二元组。对于检测、分割、OCR 等任务后处理需要替换为对应的 NMS、解码或文本拼接逻辑但整体引擎输出 → 业务结果的职责边界保持不变。2.8 验证推理结果正确性核验点【基本流程】与基于训练引擎的预测结果进行对比确保二者结果一致。这是九步流程中的第二个核验点也是保证动转静 推理引擎没有引入数值偏差的关键动作。【实战】仓库中的工具链提供了规范化的对比方案——使用reprod_log复现日志组件分别记录两类引擎的输出基于训练引擎的预测结果保存逻辑if __name__ __main__: args get_args() class_id, prob infer_main(args) reprod_logger ReprodLogger() reprod_logger.add(class_id, np.array([class_id])) reprod_logger.add(prob, np.array([prob])) reprod_logger.save(output_inference_engine.npy)基于预测引擎Paddle Inference的推理结果保存逻辑if __name__ __main__: args get_args() class_id, prob main(args) reprod_logger ReprodLogger() reprod_logger.add(class_id, np.array([class_id])) reprod_logger.add(prob, np.array([prob])) reprod_logger.save(output_training_engine.npy)【核验】对比两个.npy文件中的class_id与prob基于训练引擎和预测引擎的推理结果应完全一致。reprod_log 组件的具体实现与用法可参考仓库中的 tutorials/reprod_log 模块。与本文档配套的规范见 README.md 3.2.1也明确要求模型中需包含模型动转静脚本export_model.py与基于 Paddle Inference 的预测脚本infer.py且推理结果需与基于预训练模型的预测结果完全一致。2.9 添加推理日志核验点【背景】推理过程一般包含预处理、预测引擎运行、后处理三个步骤对这三个步骤的预测耗时进行记录可以帮助我们更好地分析模型推理的耗时瓶颈有助于后续的模型性能优化。AutoLog是一个自动日志记录工具包含自动计时、统计 CPU 内存、GPU 显存等信息、自动生成日志等功能。本文档中主要基于 AutoLog 完成推理日志的规范化更多使用方法可参考 AutoLog 项目文档。【基本流程】基于 AutoLog 工具规范化推理日志的过程包括三步初始化、在每个节点的记录、输出日志。模板源码 template/code/infer.py 中的infer_main已经完整内置了这套逻辑打开benchmark选项即可输出规范化的推理日志# init benchmark if args.benchmark: import auto_log autolog auto_log.AutoLogger( model_nameclassification, batch_sizeargs.batch_size, inference_configinference_engine.config, gpu_idsauto if args.use_gpu else None) # enable benchmark if args.benchmark: autolog.times.start() # preprocess img inference_engine.preprocess(args.img_path) if args.benchmark: autolog.times.stamp() # run output inference_engine.run(img) if args.benchmark: autolog.times.stamp() # postprocess class_id, prob inference_engine.postprocess(output) if args.benchmark: autolog.times.stamp() autolog.times.end(stampTrue) autolog.report()计时语义说明autolog.times.start()启动全局计时在预处理、推理运行、后处理三个环节之间各调用一次stamp()AutoLog 将依据相邻两次 stamp 的间隔分别统计preprocess_time、inference_time、postprocess_timeend(stampTrue)收尾report()输出完整报告。【日志样例】使用 AutoLog 打印出的日志 demo 如下[2021/12/14 10:57:28] root INFO: [2021/12/14 10:57:28] root INFO: ---------------------- Env info ---------------------- [2021/12/14 10:57:28] root INFO: OS_version: Ubuntu 16.04 [2021/12/14 10:57:28] root INFO: CUDA_version: 10.2.89 [2021/12/14 10:57:28] root INFO: CUDNN_version: 7.6.5 [2021/12/14 10:57:28] root INFO: drivier_version: 440.33.01 [2021/12/14 10:57:28] root INFO: ---------------------- Paddle info ---------------------- [2021/12/14 10:57:28] root INFO: paddle_version: 0.0.0 [2021/12/14 10:57:28] root INFO: paddle_commit: aff7397bbf2290c8cdff2e2b2202cbb286d3ae93 [2021/12/14 10:57:28] root INFO: log_api_version: 1.0 [2021/12/14 10:57:28] root INFO: ----------------------- Conf info ----------------------- [2021/12/14 10:57:28] root INFO: runtime_device: cpu [2021/12/14 10:57:28] root INFO: ir_optim: True [2021/12/14 10:57:28] root INFO: enable_memory_optim: True [2021/12/14 10:57:28] root INFO: enable_tensorrt: False [2021/12/14 10:57:28] root INFO: enable_mkldnn: False [2021/12/14 10:57:28] root INFO: cpu_math_library_num_threads: 1 [2021/12/14 10:57:28] root INFO: ----------------------- Model info ---------------------- [2021/12/14 10:57:28] root INFO: model_name: classification [2021/12/14 10:57:28] root INFO: precision: fp32 [2021/12/14 10:57:28] root INFO: ----------------------- Data info ----------------------- [2021/12/14 10:57:28] root INFO: batch_size: 1 [2021/12/14 10:57:28] root INFO: input_shape: dynamic [2021/12/14 10:57:28] root INFO: data_num: 1 [2021/12/14 10:57:28] root INFO: ----------------------- Perf info ----------------------- [2021/12/14 10:57:28] root INFO: cpu_rss(MB): 717.3633, gpu_rss(MB): None, gpu_util: None% [2021/12/14 10:57:28] root INFO: total time spent(s): 0.3135 [2021/12/14 10:57:28] root INFO: preprocess_time(ms): 47.2865, inference_time(ms): 266.1366, postprocess_time(ms): 0.061该日志分六段输出Env info操作系统、CUDA、CUDNN、驱动版本、Paddle info飞桨版本与 commit、Conf info推理引擎配置设备、IR 优化、内存优化、TensorRT、MKLDNN、CPU 线程数、Model info模型名、精度、Data infobatch size、输入形状、数据量以及Perf info内存占用、总耗时、三段拆分耗时。对模型性能优化而言preprocess_time与postprocess_time过大通常意味着数据链路存在瓶颈而inference_time是评估加速方案MKLDNN/TensorRT/IR 优化收益的核心指标。3. 推理脚本的运行入口与参数设计完整可运行的推理脚本以 template/code/infer.py 为骨架建议至少支持以下命令行参数它们与 TIPC 配置文件中的推理字段一一对应参数默认值/候选值含义--model_file/--params_file无动转静产出的*.pdmodel与*.pdiparams路径供load_predictor使用--model_dir推理模型目录部分实现中直接传模型目录由脚本内部拼接两个文件--img_path/--image_dir无单张图片路径或图片目录--image_dir:./inference/rec_inference支持目录批量推理--use_gpuTrue/False是否使用 GPU 推理--use_mkldnnTrue/False是否开启 MKLDNNCPU 加速--cpu_threads1/6开启 MKLDNN 时的 CPU 线程数--batch_size1推理 batch size--use_tensorrtFalse是否使用 TensorRT需导出尺度与预测尺度一致--benchmarkFalse是否开启 AutoLog 规范化推理日志脚本的入口infer_main(args)依次执行初始化推理引擎 → 可选 benchmark 初始化 → 预处理 → 推理 → 后处理 → 可选日志输出最终返回(class_id, prob)。main与infer_main双入口的设计分别用于训练引擎与预测引擎的结果导出正是 2.8 节结果核验的基础。4. 从推理开发到训推一体测试TIPC 配置映射推理开发完成后可以进一步接入仓库提供的TIPCTest Inference and Production Combined训推一体自动化测试工具一键跑通训练 → 动转静 → 推理全流程。该工具由 3 个文件组成见 docs/tipc/train_infer_python/template/testtest_train_inference_python.sh解析配置文件并拼装执行命令的测试脚本无需修改common_func.sh提供配置文件解析等通用函数如func_parser_key、func_parser_value、func_parser_params无需修改train_infer_python.txt51 行配置文件是唯一需要按模型定制的部分。配置文件中三类行格式以冒号分隔的key:value行会被解析为参数对xxx为注释信息##为段落分隔符。完整模板见 train_infer_python.txt它分为训练参数1~14 行、训练脚本配置15~22 行、评估23~26 行、模型导出27~36 行、Inference 推理37~51 行五段其中与本文推理开发直接相关的两段如下模型导出段save_dir动转静输出目录key 需改成代码中设置输出目录的参数、pretrained_model预训练模型路径 key、norm_export导出脚本如tools/export_model.py推理段inference推理脚本入口如deploy/inference_python/infer.py、--use_gpu、--use_mkldnn、--cpu_threads、--batch_size、--use_tensorrt、--model_dir推理模型目录、--image_dir测试图片路径/目录、--save_log_path、--benchmark。配置映射的核心思想是一条完整命令可拆解为python run_script set_configs三部分其中set_configs以分隔 key 与 value。例如推理命令python deploy/inference_python/infer.py --model-dir./alexnet_infer/ --img-path./lite_data/test/demo.jpg对应配置为40 行inference:deploy/inference_python/infer.py、47 行--model-dir:./alexnet_infer/、48 行--img-path:./lite_data/test/demo.jpg。配置完成后运行bash test_tipc/test_train_inference_python.sh ${your_params_file} lite_train_lite_infer若运行失败脚本会输出具体的报错命令可根据报错信息定位配置问题例如导出命令中pretrained参数缺少.pdparams后缀修正配置后重新运行直至全部命令成功。详细的配置项逐行解析与测试开发规范见 Linux GPU/CPU 基础训练推理测试开发文档。5. FAQ5.1 通用问题如果您在使用该文档完成模型推理的过程中遇到问题可以在飞桨官方仓库的 Issues 中提交 Issue官方会高优跟进。5.2 准备推理模型如果希望使用 TensorRT 进行预测需要保证导出时设置的尺度与最终实际预测时的尺度保持一致。5.3 初始化推理引擎如果希望体验基于 Paddle Inference 的 TensorRT 推理可以参考 Paddle Inference TensorRT 推理教程官方文档Paddle Inference TensorRT 推理章节重点关注其精度模式、动态 shape 配置与显存策略。5.4 其他建议动转静报错时可参考飞桨官方动转静报错调试教程常见的报错根源包括模型 forward 中使用了依赖动态信息的 Python 控制流建议改为paddle内置 API 表达、input_spec与真实推理输入形状不匹配等推理阶段若发现结果与训练引擎不一致优先排查预处理链路特别是 2.5 节提到的 crop 差异与是否误在导出模型中重复叠加 softmax。6. 总结至此一条完整的 Paddle Inference 推理开发链路已经打通从准备数据与模型出发通过定义模型 →paddle.jit.to_static动转静 →paddle.jit.save保存静态图产出pdmodel/pdiparams推理模型再基于InferenceEngine模板类完成引擎初始化、预处理、推理、后处理四件套开发随后通过 reprod_log 对比训练引擎与预测引擎输出完成正确性核验最后借助 AutoLog 输出规范化推理日志沉淀出可用于性能分析的 benchmark 数据。更进一步这些推理功能可以直接映射进 TIPC 训推一体测试配置与训练、动转静环节一同纳入自动化回归形成开发 → 核验 → 测试 → 优化的完整生产闭环。相关模板代码、测试脚本与规范文档均可从仓库中的 docs/tipc/train_infer_python 目录获取按需拷贝到自己的项目中修改即可。赞分享人工智能深度学习计算机视觉NLP语音【免费下载链接】modelsOfficially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.项目地址https://gitcode.com/gh_mirrors/mo/models点击查看免费下载相关推荐PaddleSeg Linux C 部署实战基于 Paddle Inference 的分割模型推理全流程指南PaddleSeg Linux C 部署实战基于 Paddle Inference 的分割模型推理全流程指南 本篇技术指南以 PaddleSeg 仓库中的人工智能计算机视觉预训练PaddleSeg 服务端 Python 部署指南基于 Paddle Inference 的 GPU/CPU 分割模型推理实战PaddleSeg 服务端 Python 部署指南基于 Paddle Inference 的 GPU/CPU 分割模型推理实战 PaddleSeg 训练完成的人工智能计算机视觉预训练PaddlePaddle Linux GPU/CPU 基础训练推理全流程开发与 TIPC 一键测试实战指南PaddlePaddle Linux GPU/CPU 基础训练推理全流程开发与 TIPC 一键测试实战指南 本指南以飞桨PaddlePaddle模型仓库的人工智能深度学习计算机视觉NLP语音上一篇如何在Cypress中集成Visual-Regression-Tracker提升前端测试效率的实战教程下一篇终极macOS鼠标优化指南免费开源工具让你的普通鼠标媲美苹果触控板创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表