
人工智能大模型低代码计算机视觉深度学习NLP模型推理服务RAG【免费下载链接】PaddleXAll-in-One Development Tool based on PaddlePaddle项目地址https://gitcode.com/paddlepaddle/PaddleX点击查看免费下载本篇技术指南以 PaddleX 开源仓库内置的模型推理 Benchmark 功能为主线讲解如何通过环境变量开启端到端推理耗时统计如何在命令行与 Python 脚本两种方式下对单模型进行预热与迭代测速并结合仓库源码benchmark 实现、flags 环境变量解析、基础预测器逐层拆解耗时数据从采集、聚合到落盘的完整链路帮助读者独立完成模型推理性能评测并对结果做出准确解读。读完本文你将能够配置完整的 benchmark 环境变量、分别用 CLI 与 Python API 跑通测速、看懂四张结果表格Warmup/Operation/Detail/Summary以及 CSV 导出文件并理解各项耗时类型与操作耗时的对应关系。1. Benchmark 功能概述PaddleX 的模型推理 Benchmark 功能会在端到端推理过程中对每个被埋点instrumented的操作进行计时统计每个操作的每次迭代平均执行时间Avg Time Per Iter每个操作的每个实例平均执行时间Avg Time Per Instance汇总后的预处理 / 模型推理 / 后处理 / 核心 / 其他 / 端到端六类耗时。所有耗时数据的单位均为毫秒ms。该功能面向单模型推理场景官方文档明确说明目前不适用于模型产线Pipeline因此应将其用于对create_model创建的单模型或main.py预测模式下单个模型的评测。从源码结构看该功能的核心实现在 paddlex/inference/utils/benchmark.pyBenchmark类负责计时、聚合与表格/CSV 输出benchmark.timeit/benchmark.timeit_with_options装饰器被广泛用于各模型的预处理、推理、后处理操作上模块加载时依据INFER_BENCHMARK环境变量决定benchmark全局实例是否启用见 paddlex/inference/utils/benchmark.py。2. 使用说明环境变量详解Benchmark 功能不通过命令行参数开启而是通过环境变量控制。相关变量统一在 paddlex/utils/flags.py 中解析全部以PADDLE_PDX_INFER_BENCHMARK为前缀汇总如下环境变量含义默认值PADDLE_PDX_INFER_BENCHMARK设置为True时开启 benchmark 功能FalsePADDLE_PDX_INFER_BENCHMARK_WARMUP正式测试前的预热次数0PADDLE_PDX_INFER_BENCHMARK_ITERS正式测试的循环迭代次数0PADDLE_PDX_INFER_BENCHMARK_OUTPUT_DIR保存指标的目录如./benchmark为None默认表示不保存指标NonePADDLE_PDX_INFER_BENCHMARK_USE_CACHE_FOR_READ设置为True时对读取输入数据操作启用缓存机制避免重复 I/O 开销且数据读取及缓存消耗的时间不记录到核心耗时中False几个关键机制说明布尔与整型解析在 flags.py 中get_flag_from_env_var会将True/true/TRUE/1解析为True将False/false/FALSE/0解析为False将None/none/null解析为NoneWARMUP与ITERS额外指定了int格式化函数。数据读取缓存PADDLE_PDX_INFER_BENCHMARK_USE_CACHE_FOR_READTrue时读取类操作如 ReadImage会被套上functools.lru_cache(maxsize128)缓存并限制被包装函数不能是生成器缓存后的输出会做deepcopy返回避免外部修改污染缓存见 benchmark.py。2.1 注意事项PADDLE_PDX_INFER_BENCHMARK_WARMUP与PADDLE_PDX_INFER_BENCHMARK_ITERS至少需要设置一个大于零的值否则无法使用 benchmark 功能。这一约束在预测器运行时会被强校验若两者均不大于 0会直接抛出RuntimeError见 base_predictor.py。Benchmark 模式要求输入数据为单条不能传 list框架内部会把输入重复batch_size次来构造一个批次因此如果batch_size大于 1输入数据将被重复batch_size次以匹配批次大小见 base_predictor.py。Benchmark 目前不适用于模型产线。3. 使用示例可以通过以下两种方式之一使用 benchmark 功能命令行方式或 Python 脚本方式。两种方式本质上是同一套预测链路的两种入口示例均以 PicoDet-XS 目标检测模型为例。3.1 命令行方式命令行方式通过仓库根目录的 main.py 配合模型配置文件执行。PicoDet-XS 的完整配置文件位于 paddlex/configs/modules/object_detection/PicoDet-XS.yaml其中Predict.batch_size默认值为 1、Predict.model_dir默认为output/best_model/inference、Predict.input默认指向一张目标检测演示图。执行命令PADDLE_PDX_INFER_BENCHMARKTrue \ PADDLE_PDX_INFER_BENCHMARK_WARMUP5 \ PADDLE_PDX_INFER_BENCHMARK_ITERS10 \ PADDLE_PDX_INFER_BENCHMARK_OUTPUT_DIR./benchmark \ python main.py \ -c ./paddlex/configs/modules/object_detection/PicoDet-XS.yaml \ -o Global.modepredict \ -o Predict.model_dirNone \ -o Predict.batch_size2 \ -o Predict.input./test.png参数含义-c指定模型配置文件路径-o用于覆盖配置项与 PaddleX 通用模型配置文件参数说明 中描述的-o Global.mode.../-o Predict.xxx...覆盖语法一致Predict.model_dirNone表示使用 PaddleX 官方预训练模型从模型库自动下载而非本地训练产出模型Predict.batch_size2批次大小设为 2输入图片test.png会被重复 2 次构成一个 batchPredict.input指定待推理的输入图片路径。3.2 Python 脚本方式Python 方式直接调用 paddlex/init.py 导出的create_model接口。首先创建test_infer.py脚本from paddlex import create_model model create_model(model_namePicoDet-XS, model_dirNone) output list(model.predict(input./test.png, batch_size2))然后以同样的环境变量执行脚本PADDLE_PDX_INFER_BENCHMARKTrue \ PADDLE_PDX_INFER_BENCHMARK_WARMUP5 \ PADDLE_PDX_INFER_BENCHMARK_ITERS10 \ PADDLE_PDX_INFER_BENCHMARK_OUTPUT_DIR./benchmark \ python test_infer.pycreate_model与model.predict的完整参数说明可参考 PaddleX 单模型 Python 脚本使用说明。3.3 底层执行流程源码视角开启 benchmark 后预测入口的逻辑位于 base_predictor.py大致如下set_predictor(batch_size)将batch_size注入batch_sampler定义_apply并用benchmark.timeit_with_options(nameENTRY_POINT_NAME)装饰——ENTRY_POINT_NAME即_entry_point_它是唯一不被计入“嵌套调用”的顶层操作其耗时被当作端到端耗时基准见 benchmark.py若WARMUP 0先进入 warmup 状态执行WARMUP次_apply调用benchmark.collect(batch_size)打印Warmup Data表格然后stop_warmup()清空计时数据若ITERS 0执行ITERS次_apply再次调用benchmark.collect(batch_size)打印Operation Info / Detail Data / Summary Data三张表最后yield output[0]返回首次推理的结果。collect内部调用gather(batch_size)完成聚合见 benchmark.py其依赖以下前提假设操作按顺序串行执行、每个迭代每个操作只执行一次、操作不互相嵌套除入口操作外、每个操作的输入 batch 大小均为batch_size、预处理/推理/后处理三个阶段的顺序不交叉。这些假设决定了 benchmark 结果只在“单批次、串行、无嵌套”的常规推理路径下严格成立。4. 结果说明开启 benchmark 后会自动打印结果共包含四张表格Warmup Data、Operation Info、Detail Data与Summary Data。4.1 字段含义字段名字段含义Iters迭代次数指执行推理的循环次数Batch Size批次大小指每次迭代中处理的实例数量Instances实例总数计算方式为Iters×Batch SizeOperation操作名称如Resize、Normalize、PaddleModelInfer等Type耗时类型包括六类见下文Avg Time Per Iter (ms)每次迭代的平均执行时间单位为毫秒Avg Time Per Instance (ms)每个实例的平均执行时间单位为毫秒 每次迭代平均耗时 ÷ Batch SizeType耗时类型的六类划分Preprocessing预处理耗时Inference模型推理耗时Postprocessing后处理耗时Core核心耗时即Preprocessing Inference PostprocessingOther其他耗时例如运行用于编排操作的代码所花费的时间以及由基准测试功能本身引入的额外开销End-to-End端到端耗时即Core Other。在 benchmark.py 的gather中六类耗时是这样计算出来的端到端耗时取自入口操作_entry_point_...的耗时均值其余每个操作按“是否属于推理操作集合_inference_operations”被归入Inference或当前阶段Preprocessing/Postprocessing——当遇到第一个推理操作后op_tag会切换为postprocessingCore为前三者之和Other End-to-End − Core。推理操作集合由各推理后端如 static_infer.py 中的set_inference_operations注册。4.2 示例运行结果以下为运行第 3 节示例程序PicoDet-XS、warmup5、iters10、batch_size2得到的完整输出。首先是预热阶段的汇总Warmup Data注意首次加载、显存分配等开销通常体现在预热数据中Warmup Data -------------------------------------------------------------------------------------------------- | Iters | Batch Size | Instances | Type | Avg Time Per Iter (ms) | Avg Time Per Instance (ms) | -------------------------------------------------------------------------------------------------- | 5 | 2 | 10 | Preprocessing | 97.89338876 | 48.94669438 | | 5 | 2 | 10 | Inference | 66.70711380 | 33.35355690 | | 5 | 2 | 10 | Postprocessing | 0.20138482 | 0.10069241 | | 5 | 2 | 10 | Core | 164.80188738 | 82.40094369 | | 5 | 2 | 10 | Other | 3.41097047 | 1.70548523 | | 5 | 2 | 10 | End-to-End | 168.21285784 | 84.10642892 | --------------------------------------------------------------------------------------------------接下来是正式测试的操作信息表Operation Info它给出了每个被计时操作对应的源码位置便于定位耗时瓶颈的代码行Operation Info ------------------------------------------------------------------------------------------ | Operation | Source Code Location | ------------------------------------------------------------------------------------------ | ReadImage | /PaddleX/paddlex/inference/models/object_detection/processors.py:34 | | Resize | /PaddleX/paddlex/inference/models/object_detection/processors.py:99 | | Normalize | /PaddleX/paddlex/inference/models/object_detection/processors.py:145 | | ToCHWImage | /PaddleX/paddlex/inference/models/object_detection/processors.py:158 | | ToBatch | /PaddleX/paddlex/inference/models/object_detection/processors.py:216 | | PaddleCopyToDevice | /PaddleX/paddlex/inference/models/common/static_infer.py:214 | | PaddleModelInfer | /PaddleX/paddlex/inference/models/common/static_infer.py:234 | | PaddleCopyToHost | /PaddleX/paddlex/inference/models/common/static_infer.py:223 | | DetPostProcess | /PaddleX/paddlex/inference/models/object_detection/processors.py:773 | ------------------------------------------------------------------------------------------说明示例输出中的源码位置来自文档撰写时的仓库结构不同版本下各操作的行号可能变化运行时以实际打印的 Operation Info 为准。源码位置的获取逻辑见 benchmark.py其通过inspect.getsourcefile与inspect.getsourcelines取得被装饰函数/类的文件与起始行号。然后是正式测试的逐操作明细表Detail DataDetail Data ------------------------------------------------------------------------------------------------------ | Iters | Batch Size | Instances | Operation | Avg Time Per Iter (ms) | Avg Time Per Instance (ms) | ------------------------------------------------------------------------------------------------------ | 10 | 2 | 20 | ReadImage | 76.22221033 | 38.11110517 | | 10 | 2 | 20 | Resize | 12.02824502 | 6.01412251 | | 10 | 2 | 20 | Normalize | 6.14072606 | 3.07036303 | | 10 | 2 | 20 | ToCHWImage | 0.00533939 | 0.00266969 | | 10 | 2 | 20 | ToBatch | 0.93134162 | 0.46567081 | | 10 | 2 | 20 | PaddleCopyToDevice | 0.92240779 | 0.46120390 | | 10 | 2 | 20 | PaddleModelInfer | 9.66330138 | 4.83165069 | | 10 | 2 | 20 | PaddleCopyToHost | 0.06802108 | 0.03401054 | | 10 | 2 | 20 | DetPostProcess | 0.18665448 | 0.09332724 | ------------------------------------------------------------------------------------------------------以及正式测试的汇总表Summary DataSummary Data -------------------------------------------------------------------------------------------------- | Iters | Batch Size | Instances | Type | Avg Time Per Iter (ms) | Avg Time Per Instance (ms) | -------------------------------------------------------------------------------------------------- | 10 | 2 | 20 | Preprocessing | 95.32786242 | 47.66393121 | | 10 | 2 | 20 | Inference | 10.65373025 | 5.32686512 | | 10 | 2 | 20 | Postprocessing | 0.18665448 | 0.09332724 | | 10 | 2 | 20 | Core | 106.16824715 | 53.08412358 | | 10 | 2 | 20 | Other | 2.74794563 | 1.37397281 | | 10 | 2 | 20 | End-to-End | 108.91619278 | 54.45809639 | --------------------------------------------------------------------------------------------------结果解读要点对比 Warmup 与正式测试的 Summary 可以发现预热后的Inference单次耗时从约 66.7ms 降至约 10.7ms这正是冷启动首轮显存分配、算子编译等与稳定运行之间的典型差异因此正式耗时应以 Iters 阶段的 Summary Data 为准Detail Data 中PaddleModelInfer约 9.66ms占据推理耗时主体ReadImage约 76.2ms是预处理阶段的最大开销若追求端到端性能优化图片读取如开启PADDLE_PDX_INFER_BENCHMARK_USE_CACHE_FOR_READ或预解码是收益点表中的表格由prettytable渲染各数值保留 8 位小数见 benchmark.py。5. 结果保存detail.csv 与 summary.csv由于示例设置了PADDLE_PDX_INFER_BENCHMARK_OUTPUT_DIR./benchmark正式测试结果会被自动保存到本地./benchmark/detail.csv与./benchmark/summary.csv写入逻辑见 benchmark.py目录不存在时会自动创建。detail.csv内容如下每行一个操作Iters,Batch Size,Instances,Operation,Avg Time Per Iter (ms),Avg Time Per Instance (ms) 10,2,20,ReadImage,76.22221033,38.11110517 10,2,20,Resize,12.02824502,6.01412251 10,2,20,Normalize,6.14072606,3.07036303 10,2,20,ToCHWImage,0.00533939,0.00266969 10,2,20,ToBatch,0.93134162,0.46567081 10,2,20,PaddleCopyToDevice,0.92240779,0.46120390 10,2,20,PaddleModelInfer,9.66330138,4.83165069 10,2,20,PaddleCopyToHost,0.06802108,0.03401054 10,2,20,DetPostProcess,0.18665448,0.09332724summary.csv内容如下每行一个耗时类型Iters,Batch Size,Instances,Type,Avg Time Per Iter (ms),Avg Time Per Instance (ms) 10,2,20,Preprocessing,95.32786242,47.66393121 10,2,20,Inference,10.65373025,5.32686512 10,2,20,Postprocessing,0.18665448,0.09332724 10,2,20,Core,106.16824715,53.08412358 10,2,20,Other,2.74794563,1.37397281 10,2,20,End-to-End,108.91619278,54.45809639这两个 CSV 文件可直接用 pandas / Excel 等工具导入便于批量对比不同模型、不同 batch_size、不同设备下的推理性能。注意detail.csv与summary.csv只保存正式测试Iters阶段的数据预热数据仅打印在控制台不落盘。6. 使用建议与常见问题6.1 如何获得稳定可复现的耗时预热次数不宜过小首次推理通常包含显存分配、算子编译、模型加载等一次性开销建议将WARMUP设置为 510 次让结果趋于稳态迭代次数决定可信度ITERS越大均值越稳定但耗时也越长单实例评估可适当增大ITERS固定输入与批次benchmark 模式下输入会被重复batch_size次评估吞吐时可通过调整batch_size观察每实例耗时变化关注 Instances 字段Instances Iters × Batch Size它表示统计覆盖的实例总数是判断统计样本量是否充分的第一指标。6.2 常见问题Q1设置了PADDLE_PDX_INFER_BENCHMARKTrue但没有输出表格A检查WARMUP与ITERS是否至少有一个大于 0。若两者均为 0预测器会抛出RuntimeError明确提示见 base_predictor.py。Q2benchmark 能否用于 Pipeline 产线A不能。官方文档明确说明该功能目前不适用于模型产线应针对单模型create_model使用。Q3为什么 Detail Data 里有些操作没有出现在预处理/推理/后处理汇总中A汇总归类依据“推理操作集合_inference_operations”判定命中集合的操作计入Inference未命中的按顺序计入Preprocessing或Postprocessing。因此只有被正确注册的推理后端操作才会被归入Inference类别。Q4如何减少数据读取对耗时统计的干扰A设置PADDLE_PDX_INFER_BENCHMARK_USE_CACHE_FOR_READTrue读取类操作如ReadImage会被 LRU 缓存且读取与缓存耗时不计入核心耗时适合评估“读取已就绪数据”后的纯推理性能但该模式下被缓存函数不能是生成器且输入数据会做深拷贝返回见 benchmark.py。Q5报错 “Nested calls detected” 如何处理Abenchmark 通过全局标志_is_measuring_time检测嵌套计时若某个被benchmark.timeit装饰的操作内部又调用了另一个同样被装饰的操作会抛出该异常以避免重复计时见 benchmark.py。若你的自定义处理器中出现了嵌套调用需要将被嵌套的内部调用移出计时范围。7. 小结PaddleX 的模型推理 Benchmark 为开发者提供了一套零侵入、可通过环境变量一键启用的端到端测速方案它覆盖从数据读取、预处理、模型推理到后处理的全部环节以毫秒级精度输出逐操作明细与六类汇总耗时并支持 CSV 落盘。结合源码阅读你可以进一步理解耗时数据的聚合逻辑benchmark.py、环境变量解析规则flags.py以及各模型处理器中的埋点位置如 object_detection/processors.py、static_infer.py据此精准定位推理链路中的性能瓶颈为模型选型、部署调优与资源配置提供可靠的数据支撑。赞分享人工智能大模型低代码计算机视觉深度学习NLP模型推理服务RAG【免费下载链接】PaddleXAll-in-One Development Tool based on PaddlePaddle项目地址https://gitcode.com/paddlepaddle/PaddleX点击查看免费下载相关推荐QtScrcpy Android 投屏实用手册从 USB 投屏到键鼠控制的完整路径QtScrcpy Android 投屏实用手册从 USB 投屏到键鼠控制的完整路径 QtScrcpy 是一款 Android 投屏控制工具用 USB 或 W桌面应用音视频如何在 PC 上运行 PS4 游戏shadPS4 PS4 模拟器安装到调优完整指南如何在 PC 上运行 PS4 游戏shadPS4 PS4 模拟器安装到调优完整指南 shadPS4 是一个用 C 编写的早期 PS4 模拟器渲染管线基于虚拟化图形学PaddleX端侧部署实战指南从环境搭建到模型推理全流程PaddleX端侧部署实战指南从环境搭建到模型推理全流程 前言 PaddleX作为飞桨全流程开发工具提供了从数据准备到模型部署的完整解决方案。本文将重点介绍人工智能大模型低代码计算机视觉深度学习模型推理服务上一篇一份硬件报告变成可引导的 EFI:OpCore-Simplify OpenCore EFI 自动生成指南下一篇DLSS Swapper 快速指南免费给游戏升级或回退 DLSS、FSR 与 XeSS 版本创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考