Я пытаюсь реализовать параллельную обработку с помощью Paddle OCR.
Обратитесь к методу Predictx_parallel
predictx_parallel(input_images, ocr_params, num_threads=1) - установка num_threads=1 работает всегда
predictx_parallel(input_images, ocr_params, num_threads=2) — установка num_threads>1 завершается неудачей с различными ошибками.
def predictx_parallel(input_images: List[Image], ocr_params: OcrParams, num_threads: int) -> Tuple[List[Dict], List[Image]]:
def ocr_image(image):
image_array = np.array(image) # type(image) :
# type(image_array) :
results = ocr.ocr(image_array) # [[[[[381.0, 285.0], [537.0, 285.0], [537.0, 333.0], [381.0, 333.0]], ('PAGE1A', 0.9997838139533997)], [[[388.0, 371.0], [530.0, 371.0], [530.0, 419.0], [388.0, 419.0]], ('PAGE1B', 0.998117983341217)]]]
return results
ocr = get_ocr_obj(params=ocr_params) #
with ThreadPoolExecutor(max_workers=num_threads) as executor:
results = list(executor.map(ocr_image, input_images))
UnimplementedError: Currently, only can set dims from DenseTensor or SelectedRows. (at /paddle/paddle/fluid/framework/infershape_utils.cc:314)
[operator < fused_conv2d > error]
NotFoundError: Variable Id 29797 is not registered.
[Hint: Expected it != Instance().id_to_type_map_.end(), but received it == Instance().id_to_type_map_.end().] (at /paddle/paddle/fluid/framework/var_type_traits.cc:103)
[operator < fused_conv2d > error]
paddlepaddle==2.6.0
paddleocr==2.7.0.3
python==3.9.12
Пожалуйста, любые предложения.
--- РЕДАКТИРОВАТЬ ---
Я смог заставить его работать.
Насколько я понимаю, хитрость заключается в использовании новых объектов OCR-лопатки.
ПРИЧИНА: я создал один объект ocr и использовал тот же объект ocr в нескольких потоках.
ИСПРАВЛЕНИЕ: я попробовал многопроцессорную обработку и в каждом процессе создавал новый экземпляр ocr. Это сработало.
# pipeline.py
def predictx_parallel_processes(input_images, num_processes):
with Pool(processes=num_processes) as pool:
pool.map(ocr_image_x, input_images)
# ocr_processing.py
def ocr_image_x(image):
process_pid = os.getpid()
logger.info(f"Process PID: {process_pid}")
ocr = PaddleOCR() # Create new ocr object each time
image_array = np.array(image)
results = ocr.ocr(image_array)
logger.info(results)
Подробнее здесь: https://stackoverflow.com/questions/777 ... paddle-ocr