콘텐츠로 이동

PaddleOCR on SageMaker

OCR 모델 특성에 따라 두 가지 백엔드로 라우팅하는 처리 파이프라인입니다.

백엔드모델이유
Lambda (CPU)PP-OCRv5, PP-StructureV3경량 모델, GPU 불필요, 빠른 시작
SageMaker (GPU)PaddleOCR-VLVision-Language 모델, GPU 필수

PP-OCRv5/PP-StructureV3는 CPU만으로 충분히 빠르게 동작하므로 SageMaker 콜드 스타트 없이 Lambda에서 직접 처리합니다. PaddleOCR-VL은 텍스트 영역별 VLM 추론에 GPU가 필수적이므로 SageMaker에서 실행합니다.


SQS (OCR Queue)
→ Lambda (OCR Invoker) ─── 모델에 따라 라우팅
├─ [PP-OCRv5 / PP-StructureV3] ── CPU 모델
│ → Lambda (OCR Processor) ── 컨테이너 이미지 Lambda
│ ├─ S3 (result.json 저장)
│ └─ DynamoDB (전처리 상태 업데이트)
└─ [PaddleOCR-VL] ── GPU 모델
├─ Scale-out: DesiredInstanceCount → 1
└─ InvokeEndpointAsync → SageMaker Endpoint
→ PaddleOCR-VL 추론
├─ 성공 → SNS (Success) → OCR Complete Handler → DynamoDB + S3
└─ 실패 → SNS (Error) → OCR Complete Handler → DynamoDB
SageMaker Scale-in:
CloudWatch Alarm (10분 유휴)
→ SNS (Scale-in) → Scale-in Handler Lambda
→ DesiredInstanceCount → 0

컨테이너 이미지 Lambda에서 CPU 기반 OCR을 실행합니다. SageMaker 경유 없이 직접 결과를 S3에 저장하고 DynamoDB 상태를 업데이트합니다.

항목
함수 이름idp-v2-ocr-lambda-processor
런타임Python 3.12 (Container Image)
메모리4096 MB
타임아웃15분
베이스 이미지public.ecr.aws/lambda/python:3.12
의존성paddleocr>=3.3.0, paddlepaddle>=3.2.2, boto3
모델 캐시S3에 모델 아카이브 캐싱 (초기 다운로드 후 재사용)

처리 흐름:

OCR Invoker (Invoke async, Event 타입)
→ OCR Lambda Processor
├─ S3에서 파일 다운로드 → /tmp
├─ 모델 로드 (S3 캐시 → HuggingFace 폴백)
├─ OCR 추론 실행
├─ result.json S3 저장
└─ DynamoDB 상태 업데이트 (COMPLETED/FAILED)

SNS 콜백 불필요: SageMaker 비동기 추론과 달리 Lambda가 직접 결과를 처리하므로 SNS 토픽을 경유하지 않습니다.

PaddleOCR-VL은 Vision-Language 모델로, 검출된 텍스트 영역마다 VLM 추론을 수행하므로 GPU가 필수입니다. Auto-scaling 0→1 구성으로 비용을 최적화합니다.

항목
인스턴스 타입ml.g5.xlarge (NVIDIA A10G 24GB)
최소 인스턴스0 (Scale-to-zero)
최대 인스턴스1
최대 동시 호출4 / 인스턴스
호출 타임아웃3,600초 (1시간)
응답 최대 크기100MB
베이스 이미지PyTorch 2.2.0 GPU (CUDA 11.8, Ubuntu 20.04)

VL 모델은 내부적으로 다음과 같이 동작합니다:

이미지 입력
→ [1단계] 레이아웃 검출 (CPU/GPU) ── 텍스트 영역 N개 검출
→ [2단계] 영역별 VLM 추론 (GPU) ── N번 순차 호출
→ 결과 병합

텍스트 영역이 N개 검출되면 VLM을 N번 순차 호출하며, 이 구조적 특성으로 인해:

  • 페이지당 약 14초 소요 (이미지 크기와 무관, 영역 수에 비례)
  • GPU 사용률 약 25% (VLM 추론 간 CPU 전후처리 대기)
  • 단일 GPU에서 멀티프로세스 불가 (VLM 모델 ~12GB, 2개 로드 시 OOM)

이러한 제약으로 PP-OCRv5/PP-StructureV3 같은 경량 모델은 Lambda에서 처리하여 SageMaker 콜드 스타트를 회피하고, VL만 SageMaker에서 실행합니다.


SageMaker (PaddleOCR-VL) 전용 정책입니다. Lambda 백엔드는 AWS Lambda의 자동 스케일링을 따릅니다.

항목
트리거OCR Invoker Lambda
시점SageMaker 비동기 추론 호출 직전
방식update_endpoint_weights_and_capacities API 직접 호출
동작DesiredInstanceCount: 0 → 1
응답 시간즉시 (API 호출)
멱등성이미 1인 경우 무시

OCR Invoker Lambda가 VL 모델로 처리해야 할 때, SageMaker 추론 호출 전에 엔드포인트를 활성화합니다. 인스턴스가 0인 상태에서 실제 추론이 가능해질 때까지 콜드 스타트 시간이 소요됩니다.

항목
트리거CloudWatch Alarm → SNS → Scale-in Handler Lambda
메트릭ApproximateBacklogSizePerInstance
조건< 0.1 (실질적으로 0)
평가 기간10분 연속 (1분 간격, 10회)
누락 데이터BREACHING으로 처리 (알람 발동)
동작DesiredInstanceCount: 1 → 0

10분간 대기열에 처리할 작업이 없으면 CloudWatch 알람이 발동되어 SNS를 통해 Scale-in Handler Lambda를 트리거하고, 인스턴스를 0으로 축소합니다.

문서 도착 ─→ OCR Invoker가 모델 확인
├─ [PP-OCRv5/V3] → Lambda 즉시 처리 (콜드 스타트 없음)
└─ [VL] → SageMaker Scale-out (0 → 1)
추론 처리 (콜드 스타트 포함)
처리 완료 → SNS → OCR Complete Handler
10분간 추가 요청 없음
CloudWatch Alarm 발동 → Scale-in (1 → 0)
과금 중지 (인스턴스 0)

항목
이름idp-v2-ocr-invoker
런타임Python 3.14
메모리256MB
타임아웃1분
트리거SQS (배치 크기: 1)
역할모델별 라우팅: Lambda 비동기 호출 또는 SageMaker Scale-out + 비동기 추론 호출
항목
이름idp-v2-ocr-lambda-processor
런타임Python 3.12 (Container Image)
메모리4096 MB
타임아웃15분
트리거Lambda 비동기 호출 (OCR Invoker)
역할OCR 추론, S3 결과 저장, DynamoDB 상태 업데이트
대상 모델PP-OCRv5, PP-StructureV3
항목
이름idp-v2-ocr-complete-handler
런타임Python 3.14
메모리256MB
타임아웃5분
트리거SNS (Success + Error 토픽)
역할SageMaker 추론 결과 처리, S3 저장, DynamoDB 상태 업데이트
대상 모델PaddleOCR-VL (SageMaker 경유)
항목
이름idp-v2-ocr-scale-in
런타임Python 3.14
메모리128MB
타임아웃30초
트리거SNS (CloudWatch Alarm)
역할DesiredInstanceCount → 0

SageMaker (PaddleOCR-VL) 경로에서만 사용됩니다. Lambda 경로는 SNS를 사용하지 않습니다.

토픽용도구독자
idp-v2-ocr-success추론 성공 알림OCR Complete Handler
idp-v2-ocr-error추론 실패 알림OCR Complete Handler
idp-v2-ocr-scale-inScale-in 알람 알림Scale-in Handler

모델백엔드설명용도
PP-OCRv5Lambda (CPU)높은 정확도의 범용 텍스트 추출 OCR일반 문서, 다국어 텍스트
PP-StructureV3Lambda (CPU)테이블 및 레이아웃 감지 포함 문서 구조 분석표, 양식, 복잡한 레이아웃
PaddleOCR-VLSageMaker (GPU)Vision-Language 모델 기반 문서 이해복잡한 문서, 맥락적 이해

PaddleOCR은 80개 이상의 언어를 지원합니다.

언어약어언어약어
Chinese & EnglishchKoreankorean
EnglishenJapanesejapan
Traditional Chinesechinese_chtFrenchfr
GermandeSpanishes
ItalianitPortuguesept
RussianruArabicar
HindihiThaith
VietnameseviTurkishtr
언어약어언어약어
AfrikaansafAlbaniansq
BasqueeuBosnianbs
CatalancaCroatianhr
CzechcsDanishda
DutchnlEstonianet
FinnishfiGaliciangl
HungarianhuIcelandicis
IndonesianidIrishga
LatvianlvLithuanianlt
LuxembourgishlbMalayms
MaltesemtMaorimi
NorwegiannoOccitanoc
PolishplRomanianro
RomanshrmSerbian (Latin)rs_latin
SlovakskSloveniansl
SwedishsvTagalogtl
WelshcyLatinla
언어약어언어약어
RussianruUkrainianuk
BelarusianbeBulgarianbg
Serbian (Cyrillic)srMacedonianmk
MongolianmnKazakhkk
KyrgyzkyTajiktg
TatarttUzbekuz
AzerbaijaniazMoldovanmo
BashkirbaChuvashcv
MarimhrUdmurtudm
KomikvOssetianos
BuriatbuaKalmykxal
TuviniantyvSakhasah
KarakalpakkaaAbkhazab
AdygheadyKabardiankbd
AvaravDargwadar
IngushinhChechence
LaklkiLezgianlez
Tabasarantab
언어약어언어약어
ArabicarPersianfa
UyghurugUrduur
PashtopsKurdishku
SindhisdBalochibal
언어약어언어약어
HindihiMarathimr
NepalineTamilta
TeluguteBiharibh
MaithilimaiBhojpuribho
MagahimahSadrisck
NewarnewKonkanigom
SanskritsaHaryanvibgc
Palipi
언어약어언어약어
GreekelSwahilisw
QuechuaquOld Englishang

형식확장자
PDF.pdf
이미지.png, .jpg, .jpeg, .tiff, .bmp, .webp