콘텐츠로 이동

OCR on SageMaker

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

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

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


SQS (OCR Queue)
→ Lambda (OCR Orchestrator) ─── 모델에 따라 라우팅
├─ [PP-OCRv5] ── CPU 모델
│ → Lambda (OCR Processor, Python)
│ → Lambda (Rust PaddleOCR, MNN 기반 추론)
│ ├─ 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

PP-OCRv5는 2단계 호출 구조로 Lambda에서 실행됩니다. Python Orchestrator Lambda가 Rust Lambda를 동기 호출하여 MNN 기반 CPU 추론을 수행합니다. SageMaker 경유 없이 직접 결과를 S3에 저장하고 DynamoDB 상태를 업데이트합니다.

항목
함수 이름idp-v2-ocr-lambda-processor
런타임Python 3.14
메모리256 MB
타임아웃10분
역할Rust OCR Lambda 호출, 응답 변환, S3 결과 저장, DynamoDB 상태 업데이트
항목
함수 이름idp-v2-paddle-ocr
런타임Rust (cargo-lambda-cdk)
아키텍처x86_64
메모리2048 MB
타임아웃10분
추론MNN 기반 CPU 추론 (PP-OCRv5)

처리 흐름:

OCR Orchestrator
→ OCR Lambda Processor (Python, 비동기 호출)
→ Rust PaddleOCR Lambda (동기 호출, RequestResponse)
├─ S3에서 파일 다운로드
├─ MNN 기반 OCR 추론 실행
└─ 페이지 결과 반환
← Rust 응답을 표준 포맷으로 변환
├─ 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 같은 경량 모델은 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 Orchestrator가 모델 확인
├─ [PP-OCRv5] → 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.14
메모리256 MB
타임아웃10분
트리거Lambda 비동기 호출 (OCR Invoker)
역할Rust OCR Lambda 호출, 응답 변환, S3 결과 저장, DynamoDB 상태 업데이트
대상 모델PP-OCRv5
항목
이름idp-v2-paddle-ocr
런타임Rust (cargo-lambda-cdk)
아키텍처x86_64
메모리2048 MB
타임아웃10분
트리거OCR Lambda Processor에서 동기 호출
역할MNN 기반 PP-OCRv5 CPU 추론
항목
이름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, Rust)높은 정확도의 범용 텍스트 추출 OCR일반 문서, 다국어 텍스트
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