拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PaddleOCR Pipeline Benchmark 指南:用 PADDLE_PDX_PIPELINE_BENCHMARK 测量端到端 OCR 推理耗时

PaddleOCR Pipeline Benchmark 指南用 PADDLE_PDX_PIPELINE_BENCHMARK 测量端到端 OCR 推理耗时【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR本篇指南围绕 PaddleOCR 的产线推理 Benchmark 功能展开讲解如何通过环境变量PADDLE_PDX_PIPELINE_BENCHMARK开启该功能并使用benchmark单例对象统计PaddleOCR().predict()端到端推理过程中每一个操作的平均执行时间单位毫秒。读完本文你将掌握完整的 Benchmark 编程接口、预热warmup与正式测速的标准写法、三种控制台报表Operation Info / Detail Data / Summary Data的解读方法以及如何把明细与汇总数据导出为detail.csv/summary.csv用于对比分析与性能回归。本文对应的官方文档位于 benchmark.en.md中文版与 benchmark.en.md文中示例输出与数据均继承自该文档并结合当前仓库源码对实现机理做了进一步说明。1. 功能概述统计什么、怎么开启Pipeline Benchmark 会统计产线在端到端推理过程中所有操作的平均执行时间并给出汇总信息。所谓产线在 PaddleOCR 中即PaddleOCR类所包装的完整 OCR 推理流水线它通常串联文档预处理方向分类、图像矫正、文本检测、文本行方向分类、文本识别等多个子模块因此 Benchmark 报告能够把一条predict调用逐层拆解为几十个可量化的操作帮助定位耗时热点。开启方式是一个环境变量环境变量取值默认值说明PADDLE_PDX_PIPELINE_BENCHMARKTrue/FalseFalse设为True时开启 benchmark 功能关键注意事项该环境变量必须在导入paddleocr之前设置见下文示例脚本第 13 行因为benchmark单例对象在包导入阶段即被创建。从源码层面看benchmark并非 PaddleOCR 仓库内独立实现而是直接复用了底层 PaddleX 的 Benchmark 基础设施paddleocr/init.py 通过from paddlex.inference.utils.benchmark import benchmark导入单例paddleocr/init.py 将其加入__all__因此用户可以from paddleocr import PaddleOCR, benchmark直接使用PaddleOCR类继承自 paddleocr/_pipelines/base.py 中的PaddleXPipelineWrapper其 predict() 最终委托给self.paddlex_pipeline.predict(...)benchmark 计时的正是这条底层 PaddleX 流水线内部的每一层操作。2. Benchmark API 一览开启功能后通过全局benchmark单例对象调用以下方法完成预热、测速、打印与导出方法说明start_warmup()开始 benchmark 的 warmup预热阶段不计入正式统计。stop_warmup()结束 warmup并清除 warmup 期间产生的所有 benchmark 数据。print_detail_data()打印详细的 benchmark 数据包括每个操作的顺序Step、名称Operation、平均耗时Time。print_summary_data()打印汇总的 benchmark 数据包括每个操作的层级Level、名称Operation、总平均耗时TimeLevel 为 1 的 Time 即为整条产线的总平均耗时。print_operation_info()打印每个操作的源代码位置模块文件 行号。print_pipeline_data()将 benchmark 的 detail、summary、operation_info 三部分数据一并打印到控制台。save_pipeline_data(save_path)save_path: string。将 benchmark 数据保存到指定路径产出详细的detail.csv和汇总的summary.csv两个文件。reset()清除已有的 benchmark 数据例如在切换测速场景前调用避免新旧数据混叠。3. 完整使用示例创建一个test_infer.py脚本内容如下与官方文档一致并补充了注释说明import os # 关键必须在 import paddleocr 之前设置环境变量否则 benchmark 不生效 os.environ[PADDLE_PDX_PIPELINE_BENCHMARK] True from paddleocr import PaddleOCR, benchmark # 创建默认的 OCR 产线首次创建时会下载/加载模型 pipeline PaddleOCR() # 使用官方文档示例图片也可替换为本地图片路径 image general_ocr_002.png benchmark.start_warmup() # warmup 开始预热显存/缓存分配、模型编译等不计入统计 for _ in range(50): pipeline.predict(image) benchmark.stop_warmup() # warmup 结束清除预热期间的 benchmark 数据 for _ in range(100): # 正式测速连续推理 100 次统计各操作平均耗时 pipeline.predict(image) benchmark.print_pipeline_data() # 打印 detail / summary / operation_info benchmark.save_pipeline_data(./benchmark) # 保存至 benchmark 文件夹执行脚本python test_infer.py几个工程要点预热轮数与正式轮数示例中预热 50 次、正式测速 100 次。预热可以让 GPU 显存分配、cuDNN 算法选择、算子编译等一次性开销在统计前完成保证平均值反映稳态性能正式轮数越多平均值越稳定也越能摊平偶发抖动。stop_warmup()的语义它并非简单停止计时而是会清除warmup 期间产生的全部 benchmark 数据确保正式统计只包含预热之后的推理。重复测速如需在相同进程内测多个场景例如不同图片、不同predict参数可在每个场景之间调用benchmark.reset()清空数据。示例图片general_ocr_002.png是 PaddleX 官方演示图在 PP-OCRv6 算法文档 中也作为标准示例出现实际使用时可替换为本地图片或图片 URLpredict支持的输入类型与PaddleOCR.predict的完整参数如text_det_limit_side_len、text_rec_score_thresh等可参考 paddleocr/_pipelines/ocr.py。4. 读懂 Benchmark 报表运行示例程序得到的完整输出分为三部分Operation Info、Detail Data、Summary Data。下面逐一解读。4.1 Operation Info每个操作来自哪段源码Operation Info ------------------------------------------------------------------------------------------------------------------------------------ || Operation | Source Code Location | ------------------------------------------------------------------------------------------------------------------------------------ || ReadImage | /PaddleX/paddlex/inference/common/reader/image_reader.py:47 | || DocTrPostProcess | /PaddleX/paddlex/inference/models/image_unwarping/processors.py:51 | || DetResizeForTest | /PaddleX/paddlex/inference/models/text_detection/processors.py:58 | || _DocPreprocessorPipeline.get_model_settings | /PaddleX/paddlex/inference/pipelines/doc_preprocessor/pipeline.py:110 | || Crop | /PaddleX/paddlex/inference/models/image_classification/processors.py:45 | || PaddleInferChainLegacy | /PaddleX/paddlex/inference/models/common/static_infer.py:248 | || _OCRPipeline.rotate_image | /PaddleX/paddlex/inference/pipelines/ocr/pipeline.py:140 | || _DocPreprocessorPipeline.predict | /PaddleX/paddlex/inference/pipelines/doc_preprocessor/pipeline.py:133 | || ClasPredictor.apply | /PaddleX/paddlex/inference/models/base/predictor/base_predictor.py:213 | || WarpPredictor.apply | /PaddleX/paddlex/inference/models/base/predictor/base_predictor.py:213 | || TextDetPredictor.apply | /PaddleX/paddlex/inference/models/base/predictor/base_predictor.py:213 | || ResizeByShort | /PaddleX/paddlex/inference/models/common/vision/processors.py:203 | || Normalize | /PaddleX/paddlex/inference/models/common/vision/processors.py:268 | || DBPostProcess | /PaddleX/paddlex/inference/models/text_detection/processors.py:487 | || TextRecPredictor.apply | /PaddleX/paddlex/inference/models/base/predictor/base_predictor.py:213 | || NormalizeImage | /PaddleX/paddlex/inference/models/text_detection/processors.py:252 | || _DocPreprocessorPipeline.check_model_settings_valid | /PaddleX/paddlex/inference/pipelines/doc_preprocessor/pipeline.py:82 | || _OCRPipeline.get_model_settings | /PaddleX/paddlex/inference/pipelines/ocr/pipeline.py:204 | || _OCRPipeline.get_text_det_params | /PaddleX/paddlex/inference/pipelines/ocr/pipeline.py:236 | || Resize | /PaddleX/paddlex/inference/models/common/vision/processors.py:117 | || CTCLabelDecode | /PaddleX/paddlex/inference/models/text_recognition/processors.py:189 | || Topk | /PaddleX/paddlex/inference/models/image_classification/processors.py:83 | || OCRReisizeNormImg | /PaddleX/paddlex/inference/models/text_recognition/processors.py:65 | || ToBatch | /PaddleX/paddlex/inference/models/text_recognition/processors.py:235 | || ToCHWImage | /PaddleX/paddlex/inference/models/common/vision/processors.py:277 | || _OCRPipeline.predict | /PaddleX/paddlex/inference/pipelines/ocr/pipeline.py:282 | || ToBatch | /PaddleX/paddlex/inference/models/common/vision/processors.py:284 | || _OCRPipeline.check_model_settings_valid | /PaddleX/paddlex/inference/pipelines/ocr/pipeline.py:176 | ------------------------------------------------------------------------------------------------------------------------------------这部分的价值在于可追踪性每个操作都能精确定位到 PaddleX 推理框架中的实现文件与行号。可以看到这些路径均位于/PaddleX/paddlex/inference/下PaddleOCR 的benchmark依赖 PaddleX 运行时从侧面印证了 paddleocr/init.py 中benchmark单例来自paddlex.inference.utils.benchmark这一事实。当一个算子成为性能热点时你可以顺着Source Code Location直接阅读其实现判断耗时来自纯 Python 预处理、数据搬运还是底层推理。4.2 Detail Data逐层展开的操作明细Detail Data --------------------------------------------------------------------------------------------- || Step | Operation | Time | --------------------------------------------------------------------------------------------- || 1 | _OCRPipeline.predict | 375.11244628956774 | || 2 | - _OCRPipeline.get_model_settings | 0.00428391998866573 | || 3 | - _OCRPipeline.check_model_settings_valid | 0.0024828016466926783 | || 4 | - _OCRPipeline.get_text_det_params | 0.005152080120751634 | || 5 | - ReadImage | 3.2029549301660154 | || 6 | - _DocPreprocessorPipeline.predict | 27.310913350374904 | || 7 | - _DocPreprocessorPipeline.get_model_settings | 0.004107539862161502 | || 8 | - _DocPreprocessorPipeline.check_model_settings_valid | 0.0016830896493047476 | || 9 | - ReadImage | 0.0029576495580840856 | || 10 | - ClasPredictor.apply | 4.701614730001893 | || 11 | - ReadImage | 0.13587839042884298 | || 12 | - ResizeByShort | 0.3281894406245556 | || 13 | - Crop | 0.01503000981756486 | || 14 | - Normalize | 0.3884544402535539 | || 15 | - ToCHWImage | 0.006330519245238975 | || 16 | - ToBatch | 0.14169737987685949 | || 17 | - PaddleInferChainLegacy | 3.283889550511958 | || 18 | - Topk | 0.10010718091507442 | || 19 | - WarpPredictor.apply | 21.893062600429403 | || 20 | - ReadImage | 0.004573430051095784 | || 21 | - Normalize | 4.245691860560328 | || 22 | - ToCHWImage | 0.005895959911867976 | || 23 | - ToBatch | 1.7250755491841119 | || 24 | - PaddleInferChainLegacy | 10.887994960212382 | || 25 | - DocTrPostProcess | 1.4253830898087472 | || 26 | - TextDetPredictor.apply | 49.976056129235076 | || 27 | - ReadImage | 0.004843260976485908 | || 28 | - DetResizeForTest | 3.3269549095712136 | || 29 | - NormalizeImage | 2.9576204597833566 | || 30 | - ToCHWImage | 0.005182310123927891 | || 31 | - ToBatch | 1.046062790119322 | || 32 | - PaddleInferChainLegacy | 34.70224040953326 | || 33 | - DBPostProcess | 5.826775671303039 | || 34 | - ClasPredictor.apply | 23.43678753997665 | || 35 | - ReadImage | 0.0633359991479665 | || 36 | - Resize | 0.24419097986537963 | || 37 | - Normalize | 0.480741420033155 | || 38 | - ToCHWImage | 0.0066608507768251 | || 39 | - ToBatch | 0.18536171046434902 | || 40 | - PaddleInferChainLegacy | 3.3766339404974133 | || 41 | - Topk | 0.15909907990135252 | || 42 | - ReadImage | 0.0395357194065582 | || 43 | - Resize | 0.2085290702234488 | || 44 | - Normalize | 0.4068155895220116 | || 45 | - ToCHWImage | 0.005677459557773545 | || 46 | - ToBatch | 0.11155156986205839 | || 47 | - PaddleInferChainLegacy | 2.7268862597702537 | || 48 | - Topk | 0.13428127014776692 | || 49 | - ReadImage | 0.032502070971531793 | || 50 | - Resize | 0.20152631899691187 | || 51 | - Normalize | 0.347195100330282 | || 52 | - ToCHWImage | 0.005517759709618986 | || 53 | - ToBatch | 0.10656953061698005 | || 54 | - PaddleInferChainLegacy | 2.612808299745666 | || 55 | - Topk | 0.13188434022595175 | || 56 | - ReadImage | 0.03589507090509869 | || 57 | - Resize | 0.2076980892161373 | || 58 | - Normalize | 0.3592138692329172 | || 59 | - ToCHWImage | 0.005206359783187509 | || 60 | - ToBatch | 0.1359267797670327 | || 61 | - PaddleInferChainLegacy | 2.619662079960108 | || 62 | - Topk | 0.130717080028262 | || 63 | - ReadImage | 0.038393009890569374 | || 64 | - Resize | 0.19743553988519125 | || 65 | - Normalize | 0.33197281998582184 | || 66 | - ToCHWImage | 0.00512515107402578 | || 67 | - ToBatch | 0.10293568033375777 | || 68 | - PaddleInferChainLegacy | 2.5824282996472903 | || 69 | - Topk | 0.129485729848966 | || 70 | - ReadImage | 0.04028105002362281 | || 71 | - Resize | 0.10972122952807695 | || 72 | - Normalize | 0.1787920702190604 | || 73 | - ToCHWImage | 0.00408922991482541 | || 74 | - ToBatch | 0.05458273953991011 | || 75 | - PaddleInferChainLegacy | 2.262636839877814 | || 76 | - Topk | 0.1055472502775956 | || 77 | - _OCRPipeline.rotate_image | 0.05102259965497069 | || 78 | - TextRecPredictor.apply | 169.44437422047486 | || 79 | - ReadImage | 0.004737989947898313 | || 80 | - OCRReisizeNormImg | 0.46037410967983305 | || 81 | - ToBatch | 0.6405122207070235 | || 82 | - PaddleInferChainLegacy | 15.439773340767715 | || 83 | - CTCLabelDecode | 10.742378439754248 | || 84 | - ReadImage | 0.006349970353767276 | || 85 | - OCRReisizeNormImg | 0.6252558408596087 | || 86 | - ToBatch | 0.7338531101413537 | || 87 | - PaddleInferChainLegacy | 15.204189889482222 | || 88 | - CTCLabelDecode | 6.7516070799320005 | || 89 | - ReadImage | 0.006978959863772616 | || 90 | - OCRReisizeNormImg | 0.7167729703360237 | || 91 | - ToBatch | 0.6568272292497568 | || 92 | - PaddleInferChainLegacy | 14.973864750063512 | || 93 | - CTCLabelDecode | 6.695752280211309 | || 94 | - ReadImage | 0.0070425499870907515 | || 95 | - OCRReisizeNormImg | 0.7757280093210284 | || 96 | - ToBatch | 0.6442721793428063 | || 97 | - PaddleInferChainLegacy | 15.027350780292181 | || 98 | - CTCLabelDecode | 6.661591530573787 | || 99 | - ReadImage | 0.007066540565574542 | || 100 | - OCRReisizeNormImg | 0.9195591000025161 | || 101 | - ToBatch | 0.7951801503077149 | || 102 | - PaddleInferChainLegacy | 15.379044259898365 | || 103 | - CTCLabelDecode | 9.372330370388227 | || 104 | - ReadImage | 0.006225309771252796 | || 105 | - OCRReisizeNormImg | 1.1437026296334807 | || 106 | - ToBatch | 1.091715270158602 | || 107 | - PaddleInferChainLegacy | 23.505835609685164 | || 108 | - CTCLabelDecode | 17.118994210031815 | ---------------------------------------------------------------------------------------------解读要点缩进即层级Step 1的_OCRPipeline.predict是根节点整条 OCR 产线其下一层用-前缀表示再下层缩进更深直观呈现调用树。Step 是执行顺序而非树序遍历序号第 24 步是产线初始化阶段对模型配置与参数的校验/获取get_model_settings、check_model_settings_valid、get_text_det_params属于配置开销从第 5 步开始才是真正的数据流处理。识别出各子模块示例中整条产线依次包含文档预处理_DocPreprocessorPipeline.predict内含方向分类ClasPredictor.apply与矫正WarpPredictor.apply/DocTrPostProcess、文本检测TextDetPredictor.apply含DetResizeForTest/NormalizeImage/DBPostProcess、文本行方向分类第 34 步起的多组ClasPredictor.apply对应多个文本行的分类因此会出现多组重复的 ReadImage/Resize/Normalize/ToCHWImage/ToBatch/PaddleInferChainLegacy/Topk 子操作以及文本识别TextRecPredictor.apply含OCRReisizeNormImg/CTCLabelDecode。PaddleInferChainLegacy是核心算子它代表一次静态图模型推理调用位于 PaddleX 的static_infer.py出现次数最多是量化模型推理本身耗时的关键指标。4.3 Summary Data按层级的聚合汇总Summary Data ----------------------------------------------------------------------------------- || Level | Operation | Time | ----------------------------------------------------------------------------------- || 1 | _OCRPipeline.predict | 375.11244628956774 | || | | | || 2 | Layer | 375.11244628956774 | || | Core | 273.4340275716386 | || | Other | 101.67841871792916 | || | _OCRPipeline.get_model_settings | 0.00428391998866573 | || | _OCRPipeline.check_model_settings_valid | 0.0024828016466926783 | || | _OCRPipeline.get_text_det_params | 0.005152080120751634 | || | ReadImage | 3.2029549301660154 | || | _DocPreprocessorPipeline.predict | 27.310913350374904 | || | TextDetPredictor.apply | 49.976056129235076 | || | ClasPredictor.apply | 23.43678753997665 | || | _OCRPipeline.rotate_image | 0.05102259965497069 | || | TextRecPredictor.apply | 169.44437422047486 | || | | | || 3 | Layer | 270.1681312400615 | || | Core | 261.8130224109336 | || | Other | 8.355108829127857 | || | _DocPreprocessorPipeline.get_model_settings | 0.004107539862161502 | || | _DocPreprocessorPipeline.check_model_settings_valid | 0.0016830896493047476 | || | ReadImage | 0.29614515136927366 | || | ClasPredictor.apply | 4.701614730001893 | || | WarpPredictor.apply | 21.893062600429403 | || | DetResizeForTest | 3.3269549095712136 | || | NormalizeImage | 2.9576204597833566 | || | ToCHWImage | 0.03745912094018422 | || | ToBatch | 6.305350960610667 | || | PaddleInferChainLegacy | 150.41335475922097 | || | DBPostProcess | 5.826775671303039 | || | Resize | 1.1691012277151458 | || | Normalize | 2.104730869323248 | || | Topk | 0.7910147504298948 | || | OCRReisizeNormImg | 4.641392659832491 | || | CTCLabelDecode | 57.342653910891386 | || | | | || 4 | Layer | 26.594677330431296 | || | Core | 22.69419176140218 | || | Other | 3.900485569029115 | || | ReadImage | 0.14045182047993876 | || | ResizeByShort | 0.3281894406245556 | || | Crop | 0.01503000981756486 | || | Normalize | 4.634146300813882 | || | ToCHWImage | 0.012226479157106951 | || | ToBatch | 1.8667729290609714 | || | PaddleInferChainLegacy | 14.17188451072434 | || | Topk | 0.10010718091507442 | || | DocTrPostProcess | 1.4253830898087472 | -----------------------------------------------------------------------------------解读要点Level 语义Level 1 的_OCRPipeline.predict即整条产线其 Time375.11 ms就是端到端单张图的平均推理耗时是衡量整体性能的第一指标。Level 2/3/4 分别聚合调用树第 2/3/4 层上的操作——同一操作名若出现在不同 Level说明它在调用树的不同深度被调用例如PaddleInferChainLegacy在 Level 3 汇总了 150.41 ms在 Level 4 另有 14.17 ms。Layer/Core/Other每个 Level 内Layer是该层全部操作的总和Level 1 的Layer与根节点 Time 相等Core与Other是Layer的两个子类。从示例数据看Core主要对应模型推理与核心计算/编解码算子如PaddleInferChainLegacy、CTCLabelDecode、DBPostProcess等Other则包含配置校验等辅助开销如 Level 3 的Other仅 8.36 ms其中就包含get_model_settings、check_model_settings_valid这类初始化逻辑。具体归类口径由底层 PaddleX 实现决定本文仅依据示例输出做此推断精确归类逻辑可结合 benchmark.en.md 与 PaddleX 运行时源码进一步确认。热点定位示范以上示例数据为例可以快速做一次性能剖析——TextRecPredictor.apply169.44 ms约占整条产线 375.11 ms 的45%是最大热点其中PaddleInferChainLegacy识别模型推理多次调用累计与CTCLabelDecode57.34 ms解码所有文本行是识别阶段的两大主要开销TextDetPredictor.apply49.98 ms次之检测推理PaddleInferChainLegacy占 34.70 ms文档预处理_DocPreprocessorPipeline.predict27.31 ms中矫正模型推理WarpPredictor.apply21.89 ms占比最高。据此可以确定优化方向识别模型推理与 CTC 解码是首要目标其次是检测推理与文档矫正推理而配置校验类开销毫秒级以下无需优化。需要注意这些数字是文档示例环境的实测输出不代表任何通用性能结论你的环境中应以本地实际运行结果为准。5. 导出 CSV把报表落盘做对比调用benchmark.save_pipeline_data(./benchmark)后结果会保存到本地./benchmark/目录生成detail.csv与summary.csv两个文件。detail.csv内容如下Step、Operation、Time 三列与 Detail Data 一一对应缩进用空格保留层级关系Step,Operation,Time 1,_OCRPipeline.predict,375.11244628956774 2, - _OCRPipeline.get_model_settings,0.00428391998866573 3, - _OCRPipeline.check_model_settings_valid,0.0024828016466926783 4, - _OCRPipeline.get_text_det_params,0.005152080120751634 5, - ReadImage,3.2029549301660154 6, - _DocPreprocessorPipeline.predict,27.310913350374904 7, - _DocPreprocessorPipeline.get_model_settings,0.004107539862161502 8, - _DocPreprocessorPipeline.check_model_settings_valid,0.0016830896493047476 9, - ReadImage,0.0029576495580840856 10, - ClasPredictor.apply,4.701614730001893 11, - ReadImage,0.13587839042884298 12, - ResizeByShort,0.3281894406245556 13, - Crop,0.01503000981756486 14, - Normalize,0.3884544402535539 15, - ToCHWImage,0.006330519245238975 16, - ToBatch,0.14169737987685949 17, - PaddleInferChainLegacy,3.283889550511958 18, - Topk,0.10010718091507442 19, - WarpPredictor.apply,21.893062600429403 20, - ReadImage,0.004573430051095784 21, - Normalize,4.245691860560328 22, - ToCHWImage,0.005895959911867976 23, - ToBatch,1.7250755491841119 24, - PaddleInferChainLegacy,10.887994960212382 25, - DocTrPostProcess,1.4253830898087472 26, - TextDetPredictor.apply,49.976056129235076 27, - ReadImage,0.004843260976485908 28, - DetResizeForTest,3.3269549095712136 29, - NormalizeImage,2.9576204597833566 30, - ToCHWImage,0.005182310123927891 31, - ToBatch,1.046062790119322 32, - PaddleInferChainLegacy,34.70224040953326 33, - DBPostProcess,5.826775671303039 34, - ClasPredictor.apply,23.43678753997665 35, - ReadImage,0.0633359991479665 36, - Resize,0.24419097986537963 37, - Normalize,0.480741420033155 38, - ToCHWImage,0.0066608507768251 39, - ToBatch,0.18536171046434902 40, - PaddleInferChainLegacy,3.3766339404974133 41, - Topk,0.15909907990135252 42, - ReadImage,0.0395357194065582 43, - Resize,0.2085290702234488 44, - Normalize,0.4068155895220116 45, - ToCHWImage,0.005677459557773545 46, - ToBatch,0.11155156986205839 47, - PaddleInferChainLegacy,2.7268862597702537 48, - Topk,0.13428127014776692 49, - ReadImage,0.032502070971531793 50, - Resize,0.20152631899691187 51, - Normalize,0.347195100330282 52, - ToCHWImage,0.005517759709618986 53, - ToBatch,0.10656953061698005 54, - PaddleInferChainLegacy,2.612808299745666 55, - Topk,0.13188434022595175 56, - ReadImage,0.03589507090509869 57, - Resize,0.2076980892161373 58, - Normalize,0.3592138692329172 59, - ToCHWImage,0.005206359783187509 60, - ToBatch,0.1359267797670327 61, - PaddleInferChainLegacy,2.619662079960108 62, - Topk,0.130717080028262 63, - ReadImage,0.038393009890569374 64, - Resize,0.19743553988519125 65, - Normalize,0.33197281998582184 66, - ToCHWImage,0.00512515107402578 67, - ToBatch,0.10293568033375777 68, - PaddleInferChainLegacy,2.5824282996472903 69, - Topk,0.129485729848966 70, - ReadImage,0.04028105002362281 71, - Resize,0.10972122952807695 72, - Normalize,0.1787920702190604 73, - ToCHWImage,0.00408922991482541 74, - ToBatch,0.05458273953991011 75, - PaddleInferChainLegacy,2.262636839877814 76, - Topk,0.1055472502775956 77, - _OCRPipeline.rotate_image,0.05102259965497069 78, - TextRecPredictor.apply,169.44437422047486 79, - ReadImage,0.004737989947898313 80, - OCRReisizeNormImg,0.46037410967983305 81, - ToBatch,0.6405122207070235 82, - PaddleInferChainLegacy,15.439773340767715 83, - CTCLabelDecode,10.742378439754248 84, - ReadImage,0.006349970353767276 85, - OCRReisizeNormImg,0.6252558408596087 86, - ToBatch,0.7338531101413537 87, - PaddleInferChainLegacy,15.204189889482222 88, - CTCLabelDecode,6.7516070799320005 89, - ReadImage,0.006978959863772616 90, - OCRReisizeNormImg,0.7167729703360237 91, - ToBatch,0.6568272292497568 92, - PaddleInferChainLegacy,14.973864750063512 93, - CTCLabelDecode,6.695752280211309 94, - ReadImage,0.0070425499870907515 95, - OCRReisizeNormImg,0.7757280093210284 96, - ToBatch,0.6442721793428063 97, - PaddleInferChainLegacy,15.027350780292181 98, - CTCLabelDecode,6.661591530573787 99, - ReadImage,0.007066540565574542 100, - OCRReisizeNormImg,0.9195591000025161 101, - ToBatch,0.7951801503077149 102, - PaddleInferChainLegacy,15.379044259898365 103, - CTCLabelDecode,9.372330370388227 104, - ReadImage,0.006225309771252796 105, - OCRReisizeNormImg,1.1437026296334807 106, - ToBatch,1.091715270158602 107, - PaddleInferChainLegacy,23.505835609685164 108, - CTCLabelDecode,17.118994210031815summary.csv内容如下Level、Operation、Time 三列注意空行与Layer/Core/Other聚合行Level, Operation, Time 1, _OCRPipeline.predict, 375.11244628956774 ,, 2, Layer, 375.11244628956774 , Core, 273.4340275716386 , Other, 101.67841871792916 , _OCRPipeline.get_model_settings, 0.00428391998866573 , _OCRPipeline.check_model_settings_valid, 0.0024828016466926783 , _OCRPipeline.get_text_det_params, 0.005152080120751634 , ReadImage, 3.2029549301660154 , _DocPreprocessorPipeline.predict, 27.310913350374904 , TextDetPredictor.apply, 49.976056129235076 , ClasPredictor.apply, 23.43678753997665 , _OCRPipeline.rotate_image, 0.05102259965497069 , TextRecPredictor.apply, 169.44437422047486 ,, 3, Layer, 270.1681312400615 , Core, 261.8130224109336 , Other, 8.355108829127857 , _DocPreprocessorPipeline.get_model_settings, 0.004107539862161502 , _DocPreprocessorPipeline.check_model_settings_valid, 0.0016830896493047476 , ReadImage, 0.29614515136927366 , ClasPredictor.apply, 4.701614730001893 , WarpPredictor.apply, 21.893062600429403 , DetResizeForTest, 3.3269549095712136 , NormalizeImage, 2.9576204597833566 , ToCHWImage, 0.03745912094018422 , ToBatch, 6.305350960610667 , PaddleInferChainLegacy, 150.41335475922097 , DBPostProcess, 5.826775671303039 , Resize, 1.1691012277151458 , Normalize, 2.104730869323248 , Topk, 0.7910147504298948 , OCRReisizeNormImg, 4.641392659832491 , CTCLabelDecode, 57.342653910891386 ,, 4, Layer, 26.594677330431296 , Core, 22.69419176140218 , Other, 3.900485569029115 , ReadImage, 0.14045182047993876 , ResizeByShort, 0.3281894406245556 , Crop, 0.01503000981756486 , Normalize, 4.634146300813882 , ToCHWImage, 0.012226479157106951 , ToBatch, 1.8667729290609714 , PaddleInferChainLegacy, 14.17188451072434 , Topk, 0.10010718091507442 , DocTrPostProcess, 1.4253830898087472CSV 文件的价值在于结构化可以轻松用 pandas、Excel 或脚本做跨版本、跨硬件、跨参数的性能对比例如对比不同 PaddleOCR 版本如 PP-OCRv3 与 PP-OCRv6参考 PP-OCRv6 算法文档在同机上的逐操作耗时对比开启/关闭文档预处理方向分类、矫正、文本行方向分类等子模块前后的总耗时与热点迁移在 CI 中把 Level 1 的总平均耗时与关键算子耗时PaddleInferChainLegacy、CTCLabelDecode作为回归指标及时发现推理性能劣化。6. 保证测量可靠的实践建议环境变量必须在导入前设置PADDLE_PDX_PIPELINE_BENCHMARK需要在import paddleocr之前写入os.environ否则 benchmark 不会生效建议放在脚本第一行。预热轮数要足够至少几十轮示例为 50 轮以覆盖模型首次加载、显存分配、算子编译等一次性开销stop_warmup()会清空预热数据不必担心污染正式统计。正式测速轮数宁多勿少平均值的稳定性与样本量正相关示例为 100 轮对抖动敏感的场景可增加到数百轮或多轮重复并取平均。场景之间记得reset()同一进程内连续测速多个配置时先调用reset()清空旧数据避免不同场景的耗时混在一起。固定运行环境对比必须保证硬件、驱动、PaddlePaddle/PaddleX 版本、predict参数如text_det_limit_side_len、批大小等参考 paddleocr/_pipelines/ocr.py一致关闭其他占用 CPU/GPU 的进程避免噪声。区分平均与峰值本文档所有 Time 均为平均值反映稳态吞吐视角的耗时如果关心单次推理的抖动或最坏延迟如实时场景建议额外记录逐次耗时并自行计算 P95/P99。结合源码定位热点报表中每个操作都带有Source Code Location热点出现时可直接进入对应 PaddleX 模块源码分析同时注意这些路径位于 PaddleX 运行时内部即 paddleocr/init.py 导入的paddlex.inference.utils.benchmark所计时的范围PaddleOCR 仓库侧主要负责产线配置与参数透传见 paddleocr/_pipelines/base.py 与 paddleocr/_pipelines/ocr.py。最后提醒文中所有示例数字均来自官方文档在特定环境下的实测输出仅用于讲解报表结构与分析方法不应作为任何通用性能结论引用。请在你自己的目标硬件与数据上运行示例脚本获得真实、可复现的 Benchmark 数据。环境搭建可参考 installation.md。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门