fix: add PaddlePaddle 2.x/3.x API compatibility layer
PaddlePaddle 3.0.0b2 has "Illegal instruction" error on current CPU. Downgrade to stable 2.6.2 which works but uses different API. Changes: - Auto-detect PaddlePaddle version at runtime - Use 'device' parameter for 3.x (device="gpu:0" or "cpu") - Use 'use_gpu' + 'gpu_mem' parameters for 2.x - Apply to both get_ocr_engine() and get_structure_engine() - Log PaddlePaddle version in initialization messages Current setup: - paddlepaddle-gpu==2.6.2 (stable, CUDA compiled) - paddleocr==3.3.1 - paddlex==3.3.9 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -170,25 +170,48 @@ class OCRService:
|
|||||||
logger.info(f"Initializing PaddleOCR engine for language: {lang} (GPU: {self.use_gpu})")
|
logger.info(f"Initializing PaddleOCR engine for language: {lang} (GPU: {self.use_gpu})")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# PaddleOCR 3.x uses 'device' parameter instead of 'use_gpu' and 'gpu_mem'
|
# Check PaddlePaddle version to use correct API
|
||||||
|
paddle_version = paddle.__version__
|
||||||
|
is_paddle_3x = paddle_version.startswith('3.')
|
||||||
|
|
||||||
|
if is_paddle_3x:
|
||||||
|
# PaddlePaddle 3.x uses 'device' parameter
|
||||||
device = f"gpu:{settings.gpu_device_id}" if self.use_gpu else "cpu"
|
device = f"gpu:{settings.gpu_device_id}" if self.use_gpu else "cpu"
|
||||||
self.ocr_engines[lang] = PaddleOCR(
|
self.ocr_engines[lang] = PaddleOCR(
|
||||||
use_angle_cls=True,
|
use_angle_cls=True,
|
||||||
lang=lang,
|
lang=lang,
|
||||||
device=device,
|
device=device,
|
||||||
)
|
)
|
||||||
logger.info(f"PaddleOCR engine ready for {lang} ({'GPU' if self.use_gpu else 'CPU'} mode)")
|
else:
|
||||||
|
# PaddlePaddle 2.x uses 'use_gpu' and 'gpu_mem' parameters
|
||||||
|
self.ocr_engines[lang] = PaddleOCR(
|
||||||
|
use_angle_cls=True,
|
||||||
|
lang=lang,
|
||||||
|
use_gpu=self.use_gpu,
|
||||||
|
gpu_mem=int(settings.gpu_memory_fraction * 1000) if self.use_gpu else 500,
|
||||||
|
)
|
||||||
|
logger.info(f"PaddleOCR engine ready for {lang} (PaddlePaddle {paddle_version}, {'GPU' if self.use_gpu else 'CPU'} mode)")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# If GPU initialization fails, fall back to CPU
|
# If GPU initialization fails, fall back to CPU
|
||||||
if self.use_gpu:
|
if self.use_gpu:
|
||||||
logger.warning(f"GPU initialization failed, falling back to CPU: {e}")
|
logger.warning(f"GPU initialization failed, falling back to CPU: {e}")
|
||||||
self.use_gpu = False
|
self.use_gpu = False
|
||||||
|
paddle_version = paddle.__version__
|
||||||
|
is_paddle_3x = paddle_version.startswith('3.')
|
||||||
|
|
||||||
|
if is_paddle_3x:
|
||||||
self.ocr_engines[lang] = PaddleOCR(
|
self.ocr_engines[lang] = PaddleOCR(
|
||||||
use_angle_cls=True,
|
use_angle_cls=True,
|
||||||
lang=lang,
|
lang=lang,
|
||||||
device="cpu",
|
device="cpu",
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
self.ocr_engines[lang] = PaddleOCR(
|
||||||
|
use_angle_cls=True,
|
||||||
|
lang=lang,
|
||||||
|
use_gpu=False,
|
||||||
|
)
|
||||||
logger.info(f"PaddleOCR engine ready for {lang} (CPU mode - fallback)")
|
logger.info(f"PaddleOCR engine ready for {lang} (CPU mode - fallback)")
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
@@ -206,7 +229,12 @@ class OCRService:
|
|||||||
logger.info(f"Initializing PP-StructureV3 engine (GPU: {self.use_gpu})")
|
logger.info(f"Initializing PP-StructureV3 engine (GPU: {self.use_gpu})")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# PaddleOCR 3.x uses 'device' parameter instead of 'use_gpu' and 'gpu_mem'
|
# Check PaddlePaddle version to use correct API
|
||||||
|
paddle_version = paddle.__version__
|
||||||
|
is_paddle_3x = paddle_version.startswith('3.')
|
||||||
|
|
||||||
|
if is_paddle_3x:
|
||||||
|
# PaddlePaddle 3.x uses 'device' parameter
|
||||||
device = f"gpu:{settings.gpu_device_id}" if self.use_gpu else "cpu"
|
device = f"gpu:{settings.gpu_device_id}" if self.use_gpu else "cpu"
|
||||||
self.structure_engine = PPStructureV3(
|
self.structure_engine = PPStructureV3(
|
||||||
use_doc_orientation_classify=False,
|
use_doc_orientation_classify=False,
|
||||||
@@ -217,12 +245,28 @@ class OCRService:
|
|||||||
layout_threshold=0.5,
|
layout_threshold=0.5,
|
||||||
device=device,
|
device=device,
|
||||||
)
|
)
|
||||||
logger.info(f"PP-StructureV3 engine ready ({'GPU' if self.use_gpu else 'CPU'} mode)")
|
else:
|
||||||
|
# PaddlePaddle 2.x uses 'use_gpu' and 'gpu_mem' parameters
|
||||||
|
self.structure_engine = PPStructureV3(
|
||||||
|
use_doc_orientation_classify=False,
|
||||||
|
use_doc_unwarping=False,
|
||||||
|
use_textline_orientation=False,
|
||||||
|
use_table_recognition=True,
|
||||||
|
use_formula_recognition=True,
|
||||||
|
layout_threshold=0.5,
|
||||||
|
use_gpu=self.use_gpu,
|
||||||
|
gpu_mem=int(settings.gpu_memory_fraction * 1000) if self.use_gpu else 500,
|
||||||
|
)
|
||||||
|
logger.info(f"PP-StructureV3 engine ready (PaddlePaddle {paddle_version}, {'GPU' if self.use_gpu else 'CPU'} mode)")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# If GPU initialization fails, fall back to CPU
|
# If GPU initialization fails, fall back to CPU
|
||||||
if self.use_gpu:
|
if self.use_gpu:
|
||||||
logger.warning(f"GPU initialization failed for PP-Structure, falling back to CPU: {e}")
|
logger.warning(f"GPU initialization failed for PP-Structure, falling back to CPU: {e}")
|
||||||
|
paddle_version = paddle.__version__
|
||||||
|
is_paddle_3x = paddle_version.startswith('3.')
|
||||||
|
|
||||||
|
if is_paddle_3x:
|
||||||
self.structure_engine = PPStructureV3(
|
self.structure_engine = PPStructureV3(
|
||||||
use_doc_orientation_classify=False,
|
use_doc_orientation_classify=False,
|
||||||
use_doc_unwarping=False,
|
use_doc_unwarping=False,
|
||||||
@@ -232,6 +276,16 @@ class OCRService:
|
|||||||
layout_threshold=0.5,
|
layout_threshold=0.5,
|
||||||
device="cpu",
|
device="cpu",
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
self.structure_engine = PPStructureV3(
|
||||||
|
use_doc_orientation_classify=False,
|
||||||
|
use_doc_unwarping=False,
|
||||||
|
use_textline_orientation=False,
|
||||||
|
use_table_recognition=True,
|
||||||
|
use_formula_recognition=True,
|
||||||
|
layout_threshold=0.5,
|
||||||
|
use_gpu=False,
|
||||||
|
)
|
||||||
logger.info("PP-StructureV3 engine ready (CPU mode - fallback)")
|
logger.info("PP-StructureV3 engine ready (CPU mode - fallback)")
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|||||||
Reference in New Issue
Block a user