人工智能计算机视觉OCR深度学习大模型RAG【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址https://gitcode.com/paddlepaddle/PaddleOCR点击查看免费下载PaddleOCR基于 PaddlePaddle 的多语言 OCR 工具包在 CLI 与 Python API 中为部分流水线Pipeline提供了指定多个推理设备的并行推理能力只要在--device/device参数中传入多个设备编号底层就会在每个设备上各创建一份流水线实例并并行处理输入。本文以文档图像预处理流水线doc_preprocessor/DocPreprocessor为主要示例系统讲解多设备并行推理的用法、底层实现原理并给出一个基于 Pythonmultiprocessing的多进程、多 GPU、多实例并行处理示例infer_mp.py帮助你在大批量文档解析、版面分析等场景中充分利用多卡算力。一、多设备并行推理如何同时指定多个推理设备PaddleOCR 的流水线在初始化时会为每个指定的设备创建一个底层流水线实例输入请求会被分发到这些实例上并行推理。判断一个流水线是否支持多设备可以查看其 CLI 子命令的帮助信息中--device参数的说明。从源码看流水线 CLI 子命令统一通过add_common_cli_opts(..., allow_multiple_devicesTrue)注册--device参数其帮助文本明确写道Device(s) to use for inference, e.g.,cpu,gpu,npu,gpu:0,gpu:0,1. If multiple devices are specified, inference will be performed in parallel. Note that parallel inference is not always supported.即device支持cpu、gpu、npu、gpu:0、gpu:0,1等取值当指定多个设备如gpu:0,1,2,3时并行推理但并非所有流水线都支持多设备并行具体请参阅对应流水线的使用教程确认。1.1 CLI 用法示例4 卡并行处理文档图像预处理以文档图像预处理流水线为例下述命令同时使用编号为 0、1、2、3 的四张 GPU 对input_images/目录中的图片执行并行推理含文档方向分类与文档矫正paddleocr doc_preprocessor \ --input input_images/ \ --device gpu:0,1,2,3 \ --use_doc_orientation_classify True \ --use_doc_unwarping True \ --save_path ./output其中--input输入图片路径可以是单张图片、图片目录或文件列表--device gpu:0,1,2,3指定 4 张 GPU 并行推理核心参数--use_doc_orientation_classify True开启文档方向分类--use_doc_unwarping True开启文档图像矫正去畸变--save_path ./output结果保存目录。1.2 Python API 用法示例DocPreprocessor 多卡并行Python API 的用法与单设备完全一致只需在构造流水线时把多设备字符串传给device参数from paddleocr import DocPreprocessor pipeline DocPreprocessor(devicegpu:0,1,2,3) output pipeline.predict( inputinput_images/, use_doc_orientation_classifyTrue, use_doc_unwarpingTrue)以上 CLI 与 Python 两个示例均使用 4 张 GPU编号 0、1、2、3对输入图片执行并行推理。需要说明的是指定多个设备时推理接口与单设备用法保持一致不需要对预测代码做任何改动因此可以非常平滑地从单卡迁移到多卡。1.3 底层实现视角device 参数如何生效从源码结构看PaddleOCR 的流水线类都继承自PaddleXPipelineWrapperpaddleocr/_pipelines/base.py。在构造时公共参数会经由parse_common_args统一解析paddleocr/_common_args.py其中device的默认值来自DEFAULT_DEVICEprepare_common_init_args中会通过paddlex.utils.device.parse_device解析出(device_type, device_ids)并把device原样传给底层的paddlex.create_pipeline。因此多设备并行实际上由底层 PaddleX 流水线框架完成框架会按设备 ID 列表在每个设备上各初始化一份子模块实例再对输入做并行分发。这也是为什么device传入gpu:0,1,2,3时无需改动任何预测代码的原因。以文档图像预处理流水线为例其实现位于 paddleocr/_pipelines/doc_preprocessor.pyDocPreprocessor类通过_paddlex_pipeline_name返回doc_preprocessor对应底层 PaddleX 流水线_get_paddlex_config_overrides把方向分类、矫正的模型名/模型目录以及use_doc_orientation_classify、use_doc_unwarping等参数透传给底层配置predict/predict_iter只是对底层paddlex_pipeline.predict的封装predict会以列表形式一次性返回全部结果。二、多进程并行推理示例infer_mp.py 完整实现除了内置的多设备并行推理你还可以根据自己的场景自行包装 PaddleOCR 流水线 API 来实现并行化以获得更理想的加速比。下面给出一个完整的示例使用 Pythonmultiprocessing对输入目录中的文件做“多 GPU × 每卡多实例”的并行处理。import argparse import sys from multiprocessing import Manager, Process from pathlib import Path from queue import Empty import paddleocr def load_pipeline(class_name: str, device: str): if not hasattr(paddleocr, class_name): raise ValueError(fClass {class_name} not found in paddleocr module.) cls getattr(paddleocr, class_name) return cls(devicedevice) def worker(pipeline_class_path, device, task_queue, batch_size, output_dir): pipeline load_pipeline(pipeline_class_path, device) should_end False batch [] while not should_end: try: input_path task_queue.get_nowait() except Empty: should_end True else: batch.append(input_path) if batch and (len(batch) batch_size or should_end): try: for result in pipeline.predict(batch): input_path Path(result[input_path]) if result.get(page_index) is not None: output_path f{input_path.stem}_{result[page_index]}.json else: output_path f{input_path.stem}.json output_path str(Path(output_dir, output_path)) result.save_to_json(output_path) print(fProcessed {repr(str(input_path))}) except Exception as e: print( fError processing {batch} on {repr(device)}: {e}, filesys.stderr ) batch.clear() def main(): parser argparse.ArgumentParser() parser.add_argument( --pipeline, typestr, requiredTrue, helpPaddleOCR pipeline, e.g. DocPreprocessor., ) parser.add_argument( --input_dir, typestr, requiredTrue, helpInput directory. ) parser.add_argument( --device, typestr, requiredTrue, helpSpecifies the devices for performing parallel inference., ) parser.add_argument( --output_dir, typestr, defaultoutput, helpOutput directory. ) parser.add_argument( --instances_per_device, typeint, default1, helpNumber of pipeline instances per device., ) parser.add_argument( --batch_size, typeint, default1, helpInference batch size for each pipeline instance., ) parser.add_argument( --input_glob_pattern, typestr, default*, helpPattern to find the input files., ) args parser.parse_args() input_dir Path(args.input_dir) if not input_dir.exists(): print(fThe input directory does not exist: {input_dir}, filesys.stderr) return 2 if not input_dir.is_dir(): print(f{repr(str(input_dir))} is not a directory., filesys.stderr) return 2 output_dir Path(args.output_dir) if output_dir.exists() and not output_dir.is_dir(): print(f{repr(str(output_dir))} is not a directory., filesys.stderr) return 2 output_dir.mkdir(parentsTrue, exist_okTrue) from paddlex.utils.device import constr_device, parse_device device_type, device_ids parse_device(args.device) if device_ids is None or len(device_ids) 1: print( Please specify at least two devices for performing parallel inference., filesys.stderr, ) return 2 if args.batch_size 0: print(Batch size must be greater than 0., filesys.stderr) return 2 with Manager() as manager: task_queue manager.Queue() for img_path in input_dir.glob(args.input_glob_pattern): task_queue.put(str(img_path)) processes [] for device_id in device_ids: for _ in range(args.instances_per_device): device constr_device(device_type, [device_id]) p Process( targetworker, args( args.pipeline, device, task_queue, args.batch_size, str(output_dir), ), ) p.start() processes.append(p) for p in processes: p.join() print(All done) return 0 if __name__ __main__: sys.exit(main())2.1 脚本逻辑拆解load_pipeline(class_name, device)通过getattr(paddleocr, class_name)动态加载流水线类如DocPreprocessor、PPStructureV3并传入device构造实例。这要求传入的类名必须是paddleocr顶层可导入的流水线类。worker(pipeline_class_path, device, task_queue, batch_size, output_dir)每个子进程的入口。它先加载流水线实例然后循环从任务队列取文件路径并累积成批次当批次达到batch_size或队列取空should_end时调用pipeline.predict(batch)做批量推理对每个结果按input_path以及可选的page_index用于多页文档/PDF 场景命名通过result.save_to_json(output_path)保存为 JSON 文件单个批次异常被捕获并打印到stderr不会中断整个流程。main()负责参数解析、输入/输出目录校验、设备解析与进程编排。其中通过paddlex.utils.device.parse_device(args.device)把gpu:0,1,2,3解析为(device_type, device_ids)再用constr_device(device_type, [device_id])为每个进程构造“单设备”字符串如gpu:0从而在每张卡上启动指定数量的流水线实例。若只指定了单个设备device_ids为None或长度为 1脚本会直接报错并返回退出码 2因为多进程并行至少要两个设备。2.2 运行示例假设上述脚本保存为infer_mp.py运行示例如下# 说明--pipeline 参数的具体取值请参考对应流水线的脚本导入名 # 下面以通用版面分析 V3 流水线为例其对应类为 PPStructureV3 # 处理 input_images 目录下的全部文件 # 使用 GPU 0、1、2、3每张 GPU 1 个流水线实例每个实例每次处理 1 个输入文件 python infer_mp.py \ --pipeline PPStructureV3 \ --input_dir input_images/ \ --device gpu:0,1,2,3 \ --output_dir output # 通用版面分析 V3 流水线 # 只处理 input_images 目录下 .jpg 后缀的文件 # 使用 GPU 0 和 2每张 GPU 2 个流水线实例每个实例每次处理 4 个输入文件 python infer_mp.py \ --pipeline PPStructureV3 \ --input_dir input_images/ \ --device gpu:0,2 \ --output_dir output \ --instances_per_device 2 \ --batch_size 4 \ --input_glob_pattern *.jpg参数含义速查表参数默认值说明--pipeline必填PaddleOCR 流水线类的导入名例如DocPreprocessor、PPStructureV3--input_dir必填输入图片/文档所在目录--device必填参与并行推理的设备列表如gpu:0,1,2,3至少指定两个设备--output_diroutput结果 JSON 输出目录不存在时自动创建--instances_per_device1每张设备上启动的流水线实例数--batch_size1每个流水线实例的推理批大小必须大于 0--input_glob_pattern*匹配输入文件的 glob 模式如*.jpg2.3 关键设计点与注意事项动态加载流水线类--pipeline的取值是paddleocr模块下的类名。例如通用版面分析 V3 对应PPStructureV3源码位于 paddleocr/_pipelines/pp_structurev3.py其_paddlex_pipeline_name为PP-StructureV3文档图像预处理对应DocPreprocessor两者都已在 paddleocr/_pipelines/init.py 中导出。进程与设备绑定constr_device(device_type, [device_id])会把每个子进程绑定到唯一设备避免多个进程抢占同一张卡--instances_per_device则控制同一张卡上的流水线实例数当单个实例无法打满显存/算力时可适当增大。结果命名与保存多页文档场景下结果中的page_index会被拼进文件名如doc_3.json保证每个页面结果独立落盘不会相互覆盖result.save_to_json是 PaddleOCR 结果对象提供的导出方法可直接把结构化结果写入 JSON 文件。队列驱动的任务分发所有子进程从同一个manager.Queue()中竞争取任务天然实现负载均衡任务取空后进程自动退出主进程join所有子进程后打印All done。与内置多设备并行推理的关系本示例属于用户层面的“进程级”并行而第一节介绍的是流水线框架内置的“设备级”并行二者可以组合使用例如在worker内部再给device传多设备字符串以获得更灵活的并行粒度。三、适用场景与延伸建议大批量文档解析/版面分析当输入是成百上千张图片或 PDF 时infer_mp.py的队列 批量推理模式能显著压缩整体耗时且天然支持断点续跑已处理的文件已有 JSON 结果重新运行时按结果文件过滤即可。多卡资源利用通过--device与--instances_per_device的组合可以在“卡数 × 每卡实例数”的二维空间中调节并行度--batch_size则控制单次前向的计算粒度实际最优取值与模型尺寸、显存容量相关建议结合nvidia-smi观察显存占用后调整。扩展其他流水线只需把--pipeline换成其他在paddleocr顶层导出的流水线类如PPStructureV3、DocPreprocessor等即可复用同一套多进程并行框架无需修改脚本主体。四、总结本文围绕 PaddleOCR 的并行推理能力展开了三层讲解首先介绍了 CLI 与 Python API 中通过--device gpu:0,1,2,3指定多设备、由底层框架自动并行分发的用法并追溯了 paddleocr/_common_args.py 与 paddleocr/_pipelines/base.py 中的参数传递链路其次给出了一个可直接落地的infer_mp.py多进程并行示例覆盖设备解析、进程编排、队列分发、批量推理与结果落盘全流程最后总结了并行度调优与场景适配建议。需要注意的是多设备并行推理并非所有流水线都支持使用前请务必查阅对应流水线的使用教程确认其支持后再投入使用。赞分享人工智能计算机视觉OCR深度学习大模型RAG【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址https://gitcode.com/paddlepaddle/PaddleOCR点击查看免费下载相关推荐PaddleOCR 产线并行推理实战多设备并行与多进程多卡加速PaddleOCR 产线并行推理实战多设备并行与多进程多卡加速 本篇技术指南聚焦 PaddleOCR 3.x 的 产线并行推理 能力一方面介绍 CLI 与人工智能计算机视觉深度学习PaddleOCR 产线并行推理实战多设备自动并行与 Python 多进程多卡加速PaddleOCR 产线并行推理实战多设备自动并行与 Python 多进程多卡加速 本篇技术指南围绕 PaddleOCR 的产线Pipeline并行推理能人工智能计算机视觉OCR深度学习大模型RAGPaddleOCR 产线多设备并行推理实战从 device 多卡配置到多进程加速PaddleOCR 产线多设备并行推理实战从 device 多卡配置到多进程加速 PaddleOCR 3.x 的产线Pipeline体系为文档图像处理提供人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考