08 / 11
배포 & 운영
Tesseract/LayoutLM 배치, 한글 문서 적용, S3 권한, 백업
배포 & 운영 개요
운영 목표
PoC 단계에서 검증된 Document AI 파이프라인을 안정적으로 운영하기 위한 배포 전략. Tesseract/PaddleOCR 배치 추론, 한글 문서 지원, S3 권한 관리, 백업 체계를 포함.
운영 아키텍처
Tesseract / PaddleOCR 배치 추론
대량 문서 처리를 위한 배치 추론 파이프라인. 단건 처리 대비 처리량을 극대화하고, OCR 엔진별 특성에 맞는 배치 전략을 적용.
Tesseract 배치
PDF → PNG 변환 (PyMuPDF, 300 DPI)
이미지별 순차 OCR 처리
텍스트 + bbox JSON 저장
Label Studio Task 자동 생성
PaddleOCR 배치
언어별 모델 자동 분기 (latin/korean)
Detection → Recognition 2단계 처리
배치 단위 GPU 추론 (batch_size=8)
결과 → LayoutLM 입력 포맷 변환
배치 처리 성능
6~9초/문서
단건 처리
~60초
배치 처리 (10건)
~40%↑
처리량 향상
batch_predict.py 핵심 로직
import glob
from pathlib import Path
def batch_predict(input_dir: str, output_dir: str):
pdf_files = glob.glob(f"{input_dir}/*.pdf")
for pdf_path in pdf_files:
# 1. PDF → PNG 변환
images = convert_pdf_to_images(pdf_path, dpi=300)
# 2. OCR 처리 (PaddleOCR)
ocr_results = []
for img in images:
lang = detect_language(img)
result = paddle_ocr.ocr(img, lang=lang)
ocr_results.append(result)
# 3. LayoutLM 추론
predictions = layoutlm_predict(ocr_results, images)
# 4. 후처리 & JSON 저장
structured = post_process(predictions)
save_json(structured, output_dir / Path(pdf_path).stem)LayoutLM 배치 추론
OCR 결과를 LayoutLM 모델에 입력하여 각 토큰에 라벨을 예측. CPU 서버에서도 안정적으로 동작하며, GPU 대비 약 2~3배 느리지만 운영 비용 절감.
CPU 추론 (운영)
인스턴스: t3a.xlarge (4 vCPU, 16GB)
추론 속도: ~3초/문서
월 비용: ~$120 (상시 운영)
GPU 추론 (학습 겸용)
인스턴스: ml.g4dn.xlarge (T4 GPU)
추론 속도: ~1초/문서
월 비용: ~$9 (25분/일 기준)
운영 전략: CPU 서버에서 상시 추론 + GPU 서버는 학습/재학습 시에만 가동하여 비용 최적화. 대량 배치 처리가 필요한 경우에만 GPU 서버를 추론에 활용.
한글 문서 적용
기존 영문 Invoice 중심 파이프라인을 한글 문서로 확장. OCR 엔진, 토크나이저, 후처리 로직 각각에 한글 지원을 추가.
OCR 엔진 한글 지원
| 엔진 | 한글 지원 | 비고 |
|---|---|---|
| Tesseract | kor 언어팩 | tessdata에서 kor.traineddata 설치 |
| PaddleOCR | korean 모델 | rec_model 한글 전용 모델 분기 |
| EasyOCR | ko 언어 코드 | Reader(['ko', 'en']) 멀티 언어 |
LayoutLM 토크나이저 한글 처리
LayoutLM는 RoBERTa 기반 토크나이저(BPE)를 사용. 한글은 자모 단위로 분리되어 sub-token이 많아지는 특성이 있음. max_length 512 제한에 더 빨리 도달할 수 있어 주의 필요.
# 한글 토큰화 예시 "인보이스" → ["▁", "인", "보", "이", "스"] # 5 tokens "Invoice" → ["▁Invoice"] # 1 token # → 한글 문서는 토큰 소비가 3~5배 많음
한글 후처리 규칙
• 자모 분리 복원: ㅎㅏㄴㄱㅜㄱ → 한국 (NFC 정규화)
• 조사 처리: '주식회사의' → '주식회사' (조사 제거)
• 숫자+한글 혼합: '1,234원' → amount: 1234, currency: KRW
• 주소 정규화: '서울특별시 강남구' → 표준 주소 포맷
한글 문서 적용 시 고려사항
한글 전용 학습 데이터 최소 50~100개 문서 필요. 영문 모델과 별도 checkpoint로 관리하여 영문 성능 저하(catastrophic forgetting) 방지. 언어 감지 → 모델 분기 로직 필수.
S3 권한 설정
Document AI 파이프라인에서 S3는 학습 데이터, 모델 checkpoint, 추론 결과, 원본 PDF 등 모든 데이터의 중앙 저장소 역할. 최소 권한 원칙(Least Privilege)에 따라 버킷별 IAM 정책을 분리.
S3 버킷 구조
s3://document-ai-{env}/
├── raw-documents/ # 원본 PDF 업로드
│ └── {project_id}/{date}/
├── preprocessed/ # 전처리된 PNG 이미지
│ └── {project_id}/{doc_id}/
├── ocr-results/ # OCR 추출 결과 (JSON)
│ └── {project_id}/{doc_id}/
├── train-data/ # Label Studio export 학습 데이터
│ └── {version}/
├── models/ # 학습된 모델 checkpoint
│ └── {model_name}/{checkpoint}/
├── predictions/ # LayoutLM 추론 결과
│ └── {project_id}/{doc_id}/
└── backups/ # 정기 백업
└── {date}/역할별 IAM 정책
| 역할 | 허용 경로 | 권한 |
|---|---|---|
| PDF Uploader (Lambda) | raw-documents/, preprocessed/ | PutObject, GetObject |
| OCR Worker | preprocessed/, ocr-results/ | GetObject, PutObject |
| LayoutLM 추론 | ocr-results/, models/, predictions/ | GetObject, PutObject |
| 학습 서버 (GPU) | train-data/, models/ | GetObject, PutObject, DeleteObject |
| Label Studio | raw-documents/, preprocessed/, train-data/ | GetObject, PutObject, ListBucket |
| 백업 스케줄러 | backups/ | PutObject, ListBucket |
암호화
• SSE-S3 기본 암호화 활성화
• 모델 checkpoint: SSE-KMS 적용
• 전송 중 암호화: HTTPS 강제
접근 제어
• 퍼블릭 액세스 전면 차단
• VPC Endpoint 통한 프라이빗 접근
• S3 Access Logging 활성화
백업 전략
학습 데이터와 모델 checkpoint는 재생산이 어려운 핵심 자산. 데이터 유실 방지를 위한 다층 백업 전략을 적용.
모델 Checkpoint 백업
• 학습 완료 시 자동으로 S3 models/ 경로에 업로드
• 최근 5개 checkpoint 유지, 이전 버전은 S3 Glacier로 이동
• checkpoint 메타데이터 (epoch, f1, accuracy) JSON으로 함께 저장
• 모델 레지스트리: MLflow에 등록하여 버전 관리
학습 데이터 백업
• Label Studio export 데이터: 주 1회 자동 백업
• S3 버전 관리(Versioning) 활성화로 실수 삭제 방지
• Cross-Region Replication: Seoul → Oregon 복제 (DR 연계)
• 보존 기간: 학습 데이터 1년, 원본 PDF 6개월
운영 데이터 백업
• Label Studio PostgreSQL DB: 일 1회 pg_dump
• 설정 파일 (label_config, ML backend 설정): Git 관리
• Docker 이미지: ECR에 태그별 보관
• 로그: CloudWatch Logs → S3 아카이브 (30일 보존)
백업 스케줄
| 대상 | 주기 | 방식 | 보존 |
|---|---|---|---|
| 모델 checkpoint | 학습 완료 시 | S3 자동 업로드 | 최근 5개 + Glacier |
| 학습 데이터 | 주 1회 (일요일) | S3 Sync + Versioning | 1년 |
| Label Studio DB | 일 1회 (03:00) | pg_dump → S3 | 30일 |
| 원본 PDF | 업로드 즉시 | S3 Versioning | 6개월 |
| 추론 결과 | 실시간 | S3 저장 | 90일 |
MLflow 운영 연동 (진행 중)
성능 측정 체계에서 구축한 MLflow Tracking Server를 운영 환경에 연동. 모델 배포 시 MLflow Model Registry를 통해 버전 관리 및 스테이징/프로덕션 전환을 자동화.
MLflow 운영 연동 흐름
None
학습 직후 자동 등록
Staging
테스트 데이터 검증 통과
Production
운영 배포 승인 완료
자동 배포 조건 (예정)
• F1 Score ≥ 0.95 (기존 Production 모델 대비)
• eval_accuracy ≥ 0.98
• 테스트 데이터셋 전체 통과 (regression test)
도메인별 학습 데이터 분기 (진행 예정)
고객사/문서 유형별로 특화된 모델을 운영하기 위한 학습 데이터 분기 전략. Base 모델에서 도메인별 Fine-tuning을 수행하여 각 도메인에 최적화된 모델을 생성.
모델 분기 전략
해운 Invoice
BL_NUMBER, POL, POD, VESSEL
일반 Invoice
TOTAL_AMOUNT, TAX, DUE_DATE
기간 Invoice
DURATION, START/END_DATE
분기 기준
| 도메인 | 특화 라벨 | 최소 학습 데이터 | 상태 |
|---|---|---|---|
| 해운/물류 Invoice | BL_NUMBER, POL, POD, VESSEL_VOYAGE | 150+ 문서 | 운영 중 |
| 일반 비용 Invoice | TOTAL_AMOUNT, TAX_AMOUNT, CURRENCY | 100+ 문서 | 데이터 수집 중 |
| 기간/구독 Invoice | DURATION_VALUE, START_DATE, END_DATE | 50+ 문서 | 계획 |
| 한글 문서 | 전체 라벨 (한글 토크나이저) | 50~100 문서 | 계획 |
운영 모니터링
파이프라인 각 단계의 상태를 모니터링하여 장애를 조기에 감지하고 대응.
파이프라인 모니터링
• OCR 처리 성공/실패율
• LayoutLM 추론 latency (p50, p95, p99)
• 배치 처리 큐 대기 시간
• 일일 처리 문서 수
모델 성능 모니터링
• 추론 confidence score 분포
• low-confidence 문서 비율 추적
• 주간 성능 리포트 (F1, Precision, Recall)
• 데이터 드리프트 감지 (예정)
인프라 모니터링
• CPU/메모리 사용률 (CloudWatch)
• S3 스토리지 사용량
• GPU 사용률 (학습 서버)
• 디스크 I/O 및 네트워크 트래픽
알람 설정
• OCR 실패율 > 5% → Slack 알림
• 추론 latency p95 > 10초 → 경고
• 디스크 사용률 > 80% → 긴급 알림
• 배치 큐 적체 > 100건 → 경고
Summary
Tesseract/PaddleOCR 배치 추론으로 대량 문서 처리 (10건 ~60초)
CPU 상시 추론 + GPU 학습 전용 운영으로 비용 최적화
한글 문서 지원: OCR 엔진 + 토크나이저 + 후처리 한글 확장
S3 최소 권한 원칙 기반 역할별 IAM 정책 분리
다층 백업: checkpoint 자동 업로드, 학습 데이터 주간 백업, DB 일간 백업
MLflow Model Registry 기반 모델 버전 관리 및 자동 배포 (진행 중)
도메인별 특화 모델 분기 전략으로 정확도 극대화 (예정)