PaddleX icon indicating copy to clipboard operation
PaddleX copied to clipboard

[Feat][Experimental] Support parallel computing (embarassingly parallel)

Open Bobholamovic opened this issue 8 months ago • 3 comments

本PR主要为PaddleX增加一个实验性质的并行加速功能,旨在优化代码库中广泛存在的类似:[func(item) for item in data]这样的过易并行的逻辑。

PR内容

  1. 新增基于joblib的并行加速功能。
    • 新增maybe_parallelize函数,可用于标记代码库中的过易并行逻辑,并在配置满足要求时将其并行化。
    • 支持设置一个全局执行器以复用线程池/进程池,提升效率;也支持通过joblib.parallel_config从库的外部定制PaddleX的默认并行计算行为。
    • 通过环境变量控制该功能是否开启,默认关闭。
  2. 基于新增的并行加速功能,优化了数据读取操作、大部分模块的前后处理操作以及部分产线的操作。目前的实现,在我的机器上,batch size为32时,启动并行计算功能后,默认配置可以将PP-DocLayout-L的端到端推理时间缩短一半,将PP-OCRv4_mobile_det的预处理时间缩短为原本的1/10
  3. 定位到目前OCR类产线推理的一大性能瓶颈在于scipy.ndimage.rotate的速度太慢了。使用OpenCV编写了替代的高效实现,初步测量对1024*2048的大图加速可以达到近百倍,但与原实现不是完全对齐(看起来可能主要是输出尺寸和align-corner方面有差别),需确认这个替代实现是否可接受。在我的机器上实验,使用新的实现,可以让OCR产线处理一个6页示例PDF的时间从13s降低到6s。 => 2025.3.26,替代实现的精度被相关同学评估为可以接受,为了让这个PR的内容更专一,这一点涉及的修改被移动到更相关的 #3714 。

缺陷与待办

  1. 新增的并行加速功能对OCR类产线的优化不明显,这主要是因为当前OCR类产线的许多模块接受的batch size都是1。
  2. 需要对改造的前后处理等操作进行正确性验证和benchmark,评估是否适合并行化。目前只对OCR类模块做了评估。

Bobholamovic avatar Mar 20 '25 15:03 Bobholamovic