최근 OCR 엔진을 Paddle에서 Tesseract로 변경한 후에도 메모리 누수가 발생하는 문제를 겪었습니다. 이 글에서는 메모리 누수의 원인을 추적하고 해결할 수 있는 방법을 정리합니다.
1. 문제 원인 파악
OCR이 문제인지 확인
- Paddle vs. Tesseract 비교
- 두 엔진에서 동일한 패턴으로 누수가 발생하는지 확인합니다.
- OCR 호출 전후로 gc.collect()를 실행하고 메모리 사용량을 기록합니다.
- Tesseract 호출 시 메모리 상태 확인
- extract_text_with_tesseract 함수에 메모리 로깅 추가:
def extract_text_with_tesseract(image, index):log_memory(f"OCR 시작 (index {index})")try:...finally:log_memory(f"OCR 종료 (index {index})")gc.collect()
OCR 외 다른 문제인지 확인
- YOLO 관련 데이터 처리
- YOLO의 바운딩 박스 데이터가 참조 해제되지 않을 수 있습니다.
- run_yolo_directly 함수에서 반환된 데이터를 바로 해제하는지 확인합니다.
- 전체 처리 흐름 점검
- 이미지나 데이터를 불필요하게 복사하거나, 여러 함수에서 참조를 유지하고 있는지 확인합니다.
2. 메모리 로그 추가 및 분석
- 로그로 메모리 사용 추적
주요 함수에 메모리 로깅을 추가: -
def log_memory(context=""):process = psutil.Process(os.getpid())mem_info = process.memory_info()logger.info(f"[{context}] RSS: {mem_info.rss / 1024**2:.2f} MB | VMS: {mem_info.vms / 1024**2:.2f} MB")
- 로그 추가 위치
- upload 함수: 이미지를 로드한 직후.
- handle_yolo_result: YOLO 처리 후.
- handle_ocr_result: OCR 작업 후.
- 메모리 증가 패턴 확인
동일한 이미지로 테스트해, 특정 단계에서 메모리 누수가 발생하는지 비교합니다.
3. Tesseract 관련 개선
- 이미지 크기 줄이기
OCR에 전달하는 이미지를 최소 크기로 변환합니다.- 바운딩 박스로 잘라낸 이미지가 너무 크면, 크기를 조정한 후 OCR을 호출합니다.
- 리소스 정리 명시
- Tesseract 호출 후 메모리 정리:
def extract_text_with_tesseract(image, index):try:...finally:image.close() # PIL 이미지 해제gc.collect()
4. YOLO 및 데이터 처리 최적화
- YOLO 바운딩 박스와 OCR 간 데이터 전달 최적화
- 슬라이싱된 이미지(image[y1:y2, x1:x2])는 메모리를 많이 사용하므로 작은 크기로 복사합니다.
- YOLO에서 반환된 데이터를 바로 OCR에 전달하지 않고 정제합니다.
- YOLO 메모리 해제 확인
YOLO에서 반환된 데이터와 이미지를 즉시 해제합니다.
5. 도구 활용
- Memory Profiler
- @profile 데코레이터로 주요 함수의 메모리 사용량을 분석합니다.
mprof run python your_script.pymprof plot - Tracemalloc
- Python 내 객체의 메모리 사용 추적:
import tracemalloctracemalloc.start()
# 특정 지점에서 스냅샷 찍기snapshot = tracemalloc.take_snapshot()top_stats = snapshot.statistics('lineno')print(top_stats[:10]) # 상위 10개
6. 결론
OCR 엔진 교체 후에도 메모리 누수가 발생한다면, 문제가 OCR 단계 외의 다른 부분에 있을 가능성이 높습니다. YOLO, Flask 요청 처리, 그리고 데이터 전달 방식을 점검하세요. 메모리 사용 로그를 분석하며 누수가 발생하는 특정 구간을 추적하는 것이 핵심입니다.
이 가이드가 문제 해결에 도움이 되길 바랍니다! 😊
'플러팅 AI > Flask Server' 카테고리의 다른 글
| Google Cloud Run에서 딥러닝 기반 서버 최적화: Connect 이벤트 비동기화와 Lazy Import 적용 사례 (2) | 2024.12.11 |
|---|---|
| Google Cloud Run에서 AI 서버 구현기 (0) | 2024.12.08 |
| Docker 이미지 최적화로 12GB-> 3.5GB (0) | 2024.12.06 |
| 다중 워커 간 메모리 공유 문제 해결 (0) | 2024.12.03 |
| 다중 워커 간 메모리 공유 문제 이해 (0) | 2024.11.30 |