ARTICLE DETAIL

资讯详情

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

PaddleOCR 产线并行推理实战:多设备并行与多进程多卡加速

PaddleOCR 产线并行推理实战:多设备并行与多进程多卡加速 PaddleOCR 产线并行推理实战多设备并行与多进程多卡加速【免费下载链接】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 3.x 的产线并行推理能力一方面介绍 CLI 与 Python API 内置的多设备指定机制另一方面给出可独立落地的Python 多进程 多 GPU 多实例并行推理示例脚本。读完本文你将掌握--device gpu:0,1,2,3的完整语义、产线级并行推理的底层初始化方式以及如何针对大批量文档图像自行设计多进程任务分发与结果落盘方案。一、并行推理的两条路径内置多设备与自定义多进程在 PaddleOCR 3.x 中产线并行推理有两种实现方式二者定位不同内置多设备并行产线的 CLI 与 Python API 支持同时指定多个推理设备如 4 块 GPU。产线初始化时会在每个设备上各创建一个底层产线类实例接收到的输入会被分发到这些实例上进行并行推理调用接口与单设备完全一致。自定义多进程并行用户基于产线 Python API 自行封装multiprocessing逻辑把输入目录中的文件切分到多卡 × 每卡多实例的进程池中处理从而获得更细粒度的调度控制如批量大小、每卡实例数、输入文件过滤规则。两种方式的适用边界不同内置方式胜在零改造一行--device即可生效自定义方式则适合吞吐量敏感、需要精细控制资源配比的生产场景。下文先讲内置方式再给出完整的自定义多进程示例。二、指定多个推理设备CLI 与 Python API 用法2.1 CLI 方式以文档图像预处理产线doc_preprocessor为例下面的命令同时指定 GPU 0、1、2、3 四块显卡执行并行推理paddleocr doc_preprocessor \ --input input_images/ \ --device gpu:0,1,2,3 \ --use_doc_orientation_classify True \ --use_doc_unwarping True \ --save_path ./output--device的取值格式为设备类型:编号列表例如gpu:0,1,2,3表示 GPU 03 四块设备。设备字符串由 PaddleX 的paddlex.utils.device模块解析见下文多进程示例中的parse_device/constr_device。2.2 Python API 方式等价地在 Python 中通过构造函数传入device参数from paddleocr import DocPreprocessor pipeline DocPreprocessor(devicegpu:0,1,2,3) output pipeline.predict( inputinput_images/, use_doc_orientation_classifyTrue, use_doc_unwarpingTrue)两个示例均使用 4 块 GPU编号 0、1、2、3对输入图片执行并行推理。需要说明的是use_doc_orientation_classify、use_doc_unwarping是DocPreprocessor产线的专用参数分别控制是否启用文档方向分类与文档图像拉直unwarping它们会被封装进产线配置中传递给底层 PaddleX 产线对应实现见 paddleocr/_pipelines/doc_preprocessor.py。2.3 多设备支持的源码依据与接口一致性从源码可以确认多设备并行是 CLI 参数体系中的一等公民paddleocr/_pipelines/base.py 中PipelineCLISubcommandExecutor.add_subparser调用add_common_cli_opts(..., allow_multiple_devicesTrue)为所有产线子命令统一注入--device等公共参数paddleocr/_common_args.py 中--device的帮助文本明确说明如果指定了多个设备将执行并行推理注意并行推理并非所有产线都支持。默认情况下可用时优先使用 GPU 0否则回退到 CPU产线初始化时prepare_common_init_args 会将解析后的device原样传入create_pipeline由底层 PaddleX 在每个设备上创建产线实例。因此指定多个设备后推理接口predict/predict_iter与单设备完全一致用户无需感知设备数量。但需要注意并非所有产线都支持多设备并行具体是否支持请查阅对应产线的使用教程。三、多进程并行推理完整示例与逐段拆解当内置多设备并行无法满足吞吐需求时可以基于产线 Python API 自行封装多进程并行。下面是文档给出的完整参考实现保存为infer_mp.py即可使用。3.1 完整脚本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())3.2 命令行参数一览参数必填默认值说明--pipeline是—PaddleOCR 产线的脚本方式导入类名如DocPreprocessor、PPStructureV3--input_dir是—待处理输入目录--device是—参与并行推理的设备列表如gpu:0,1,2,3--output_dir否output结果输出目录自动创建--instances_per_device否1每块设备上启动的产线实例数--batch_size否1每个产线实例单次推理处理的输入文件数--input_glob_pattern否*在输入目录中匹配输入文件的 glob 模式3.3 核心逻辑拆解动态加载产线类load_pipeline通过getattr(paddleocr, class_name)按名字从paddleocr模块动态获取产线类并实例化。--pipeline的取值必须与产线脚本方式导入的类名一致——例如通用版面解析 v3 产线对应PPStructureV3其类定义位于 paddleocr/_pipelines/pp_structurev3.py文档图像预处理产线对应DocPreprocessor见 paddleocr/_pipelines/doc_preprocessor.py。Worker 循环worker每个 worker 进程内独立创建一个产线实例模型随之独立加载然后循环从共享任务队列task_queue.get_nowait()拉取输入路径按batch_size攒批。凑满一批或队列取空Empty异常触发should_end时调用pipeline.predict(batch)批量推理逐条处理结果从结果中读取result[input_path]还原原始文件路径若结果带page_index字段多页文档场景如 PDF输出文件命名为{stem}_{page_index}.json否则为{stem}.json通过result.save_to_json(output_path)将结构化结果落盘为 JSON。主进程调度main先做参数与目录校验输入目录必须存在且为目录输出目录不存在时自动递归创建batch_size必须大于 0然后使用from paddlex.utils.device import constr_device, parse_device解析设备字符串——parse_device把gpu:0,1,2,3拆成设备类型gpu与编号列表[0,1,2,3]constr_device再将类型 单个编号组合回单个设备的字符串如gpu:0。脚本要求至少指定两个设备否则直接退出并提示。随后用Manager()创建进程间共享队列通过input_dir.glob(pattern)把符合过滤条件的文件全部入队再按每个设备 ID × 每设备实例数启动对应数量的Process每个进程绑定各自的单设备字符串互不争抢显存。最后join等待所有进程结束后打印All done。3.4 运行示例假设脚本已保存为infer_mp.py典型用法如下# 通用版面解析 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两个示例分别演示了单实例、单文件与每卡双实例、批量 4、按扩展名过滤两种调度形态。需要特别留意--pipeline的参数值必须与产线脚本导入类名严格一致写错会导致load_pipeline抛出ValueError。四、使用建议与注意事项资源占用线性增长多进程方案中每个进程都会独立加载产线与模型内存/显存占用随设备数 × 每设备实例数近似线性增长。实例数并非越大越好应根据单卡显存与模型规模权衡避免 OOM。任务切分粒度batch_size控制单次推理的输入数量batch 过小无法充分发挥 GPU 算力过大则单批次错误的影响面更大input_glob_pattern可精确圈定待处理文件如*.jpg、*.png避免无关文件入队。多页文档输出当输入为多页文档如 PDF时结果会携带page_index脚本会为每一页单独生成{stem}_{page_index}.json方便下游按页消费结构化数据。先确认产线支持性内置多设备并行并非对所有产线开放使用前请查阅对应产线的使用教程确认自定义多进程方案则不依赖产线的多设备支持只要产线可实例化即可套用。与高性能推理的搭配在资源允许的情况下多设备/多进程并行可以与 高性能推理指南 中介绍的技术配合使用进一步压榨硬件吞吐。五、小结PaddleOCR 3.x 从两个层面提供了产线级并行推理能力一是--device gpu:0,1,2,3这种开箱即用的多设备指定初始化时逐设备创建产线实例、推理接口与单设备一致二是本文给出的多进程参考脚本通过Manager.Queue任务分发、constr_device/parse_device设备解析、按batch_size攒批推理与save_to_json结构化落盘实现了多卡 × 多实例的灵活调度。无论是文档图像预处理、通用版面解析还是其他产线都可以依据这两条路径结合自身的数据规模与硬件资源设计出匹配的并行推理方案。【免费下载链接】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),仅供参考
返回列表