Python과 Docker를 사용하여 확장 가능한 컴퓨터 비전 (Computer Vision) 서비스 구축하는 방법
요약
Python, FastAPI, Docker를 활용하여 확장 가능한 컴퓨터 비전 서비스를 구축하는 아키텍처 설계 방법을 다룹니다. API 요청과 모델 추론을 분리하고 비동기 작업 처리를 통해 시스템의 응답성과 처리량을 높이는 실질적인 가이드를 제공합니다.
핵심 포인트
- API 게이트웨이와 추론 엔진을 분리하여 시스템 안정성 확보
- FastAPI와 Celery를 이용한 비동기 작업 처리 파이프라인 구축
- Docker를 활용한 서비스 컨테이너화 및 확장성 강화
- 대기열(Queue) 기반 설계를 통한 트래픽 급증 대응
현대적인 AI 애플리케이션은 모델이 병목 현상이 되기 훨씬 전부터 실패하곤 합니다. 프로덕션 환경에서는 이미지 업로드가 폭발적으로 발생하고, 전처리 파이프라인(preprocessing pipelines)에 과부하가 걸리며, 추론(inference) 요청이 대기열에 쌓이고, 응답 시간이 급격히 증가합니다. 이러한 조건에서도 응답성을 유지하는 컴퓨터 비전 (Computer Vision) 서비스를 구축하려면 단순히 정확한 모델을 선택하는 것 이상의 것이 필요합니다.
이 글에서는 Python, FastAPI, Docker, 그리고 비동기 작업 처리(asynchronous task processing)를 사용하여 확장 가능한 컴퓨터 비전 서비스를 설계하는 실질적인 접근 방식을 살펴봅니다.
문맥 및 설정 (Context and Setup)
프로덕션 컴퓨터 비전 파이프라인은 일반적으로 네 가지 계층으로 구성됩니다:
- API 게이트웨이 (API Gateway, FastAPI)
- 이미지 처리 대기열 (Image Processing Queue)
- AI 추론 엔진 (AI Inference Engine)
- 저장 및 결과 전달 (Storage and Result Delivery)
API 요청 내부에서 직접 추론을 수행하는 대신, 프로덕션 시스템은 일반적으로 요청 처리와 모델 실행을 분리합니다. 이는 트래픽 급증 시 요청 타임아웃(request timeouts)을 방지하면서 처리량(throughput)을 향상시킵니다.
NVIDIA의 MLPerf Inference v4.0 벤치마크에 따르면, 현대적인 GPU 인프라에서 실행되는 최적화된 추론 파이프라인은 컴퓨터 비전 워크로드 전반에서 낮은 지연 시간(low latency)을 유지하면서 처리량을 크게 향상시킬 수 있으며, 이는 모델 선택과 더불어 배포 아키텍처(deployment architecture)의 중요성을 강조합니다.
출처: MLCommons MLPerf Inference v4.0 (2024)
전형적인 기술 스택:
- Python
- FastAPI
- Docker
- Redis
- Celery
- OpenCV
- PyTorch
- PostgreSQL
신뢰할 수 있는 컴퓨터 비전 서비스 설계하기
1단계: API 요청과 모델 추론 분리하기
많은 팀이 저지르는 첫 번째 실수는 업로드 직후에 이미지를 처리하는 것입니다.
대신 다음과 같이 수행하십시오:
- 이미지를 수신합니다.
- 요청을 검증(Validate)합니다.
- 이미지를 저장합니다.
- 대기열(queue)에 작업을 푸시(push)합니다.
- 작업 ID(Job ID)를 반환합니다.
이렇게 하면 추론에 몇 초가 걸리더라도 API의 응답성을 유지할 수 있습니다.
아키텍처 흐름:
Client
│
▼
...
이 패턴을 사용하면 여러 개의 추론 워커 (Inference Workers)를 독립적으로 확장할 수 있습니다.
Step 2: 비동기 처리 파이프라인 (Asynchronous Processing Pipeline) 생성
FastAPI는 클라이언트를 차단 (Blocking)하는 대신 작업을 큐 (Enqueue)에 넣을 수 있습니다.
from celery import Celery
# Redis 메시지 브로커 (Message Broker)
...
API 엔드포인트는 가볍게 유지됩니다.
@app.post("/predict")
async def predict(file: UploadFile):
...
클라이언트는 나중에 작업 ID (Job ID)를 사용하여 예측 결과를 조회할 수 있습니다.
이 아키텍처는 요청량이 증가할 때 동기식 추론 (Synchronous Inference)보다 훨씬 더 나은 성능을 발휘합니다.
Step 3: 이미지 처리 (Image Processing) 최적화
원본 이미지는 종종 추론에 필요한 것보다 훨씬 더 큽니다.
모델로 데이터를 보내기 전에:
- 이미지 크기 조정 (Resize)
- 픽셀 값 정규화 (Normalize)
- 메타데이터 제거
- 모델 입력 형식으로 변환
예시:
import cv2
image = cv2.imread("sample.jpg")
...
이미지 크기를 줄이면 처리량 (Throughput)을 높이면서 GPU 메모리 소비를 낮출 수 있습니다.
트레이드오프 (Trade-off):
해상도가 높으면 작은 객체에 대한 탐지 정확도 (Detection Accuracy)가 향상되지만 지연 시간 (Latency)이 증가합니다. 적절한 입력 크기를 선택하는 것은 애플리케이션의 정확도 요구 사항에 따라 달라집니다.
실제 적용 사례 (Real-World Application)
Oodles의 컴퓨터 비전 서비스 구현 사례 중 하나로, 우리는 매일 수천 개의 스캔된 송장과 양식에서 구조화된 정보를 추출하도록 설계된 엔터프라이즈 문서 처리 플랫폼을 개발했습니다.
과제 (The challenge)
기존 워크플로우는 업로드된 모든 문서를 동기식으로 처리했습니다. 업무 피크 시간 동안에는 다음과 같은 문제가 발생했습니다:
- API 요청이 빈번하게 타임아웃 (Timeout) 발생.
- 이미지 전처리 (Preprocessing) 작업이 추론 작업과 경쟁하면서 CPU 사용률이 높게 유지됨.
- 대규모 배치 (Batch) 처리가 사용자에게 긴 대기 시간을 유발함.
우리의 구현 (Our implementation)
우리는 다음과 같은 기술을 사용하여 아키텍처를 재설계했습니다:
- Python
- FastAPI
- Docker
- Redis
- Celery
- OpenCV
- OCR 파이프라인 (Pipeline)
주요 개선 사항은 다음과 같습니다:
- 비동기 작업 스케줄링 (asynchronous job scheduling)
- 워커 오토스케일링 (worker autoscaling)
- OCR 전 이미지 전처리 (image preprocessing before OCR)
- 별도의 추론 컨테이너 (separate inference containers)
- 결과 캐싱 (result caching)
결과 (Outcome)
배포 후:
- 표준 문서에 대한 평균 처리 지연 시간 (latency)이 약 2.6초에서 780밀리초(milliseconds)
**로 감소했습니다. - 피크 처리 시간 동안 워커 활용도 (worker utilization)가 약 45% 개선되었습니다.
- API 서버 리소스를 늘리지 않고도 배치 처리 처리량 (batch processing throughput)이 거의 두 배로 증가했습니다.
이러한 개선은 기본 AI 모델을 교체하기보다는 주로 아키텍처 변경을 통해 이루어졌습니다.
핵심 요약 (Key Takeaways)
- 과도한 워크로드 상황에서 차단 (blocking) 현상을 방지하기 위해 API 요청과 추론 (inference)을 분리하세요.
- 동기식 실행 (synchronous execution)에 의존하는 대신 큐 (queues)와 워커 프로세스 (worker processes)를 사용하여 확장성 (scalability)을 높이세요.
- 메모리 사용량과 처리 시간을 줄이기 위해 추론 전에 이미지를 최적화하세요.
- 배포와 수평 확장 (horizontal scaling)을 용이하게 하기 위해 모든 서비스를 독립적으로 컨테이너화 (containerize) 하세요.
- 인프라가 모델 정확도보다 지연 시간 (latency)에 더 큰 영향을 미치는 경우가 많으므로 엔드 투 엔드 (end-to-end) 파이프라인 성능을 측정하세요.
토론 참여하기
실제 운영 환경에서 컴퓨터 비전 서비스 (Computer Vision Services)를 구축해 보셨거나, 이미지 추론 파이프라인의 확장성 문제에 직면한 적이 있으신가요?
댓글로 경험을 공유해 주세요. 엔터프라이즈 배포를 계획 중이며 구현 방식에 대해 논의하고 싶다면, 저희 연락처 페이지를 통해 문의하실 수 있습니다.
자주 묻는 질문 (FAQ)
1. 컴퓨터 비전 서비스 (Computer Vision Services)란 무엇인가요?
컴퓨터 비전 서비스는 AI 모델을 사용하여 이미지 또는 비디오 분석을 자동화하는 소프트웨어 시스템입니다. 일반적으로 생산 환경 전반에서 객체 탐지 (object detection), OCR, 이미지 분류 (image classification), 세그멘테이션 (segmentation), 얼굴 인식 (facial recognition) 및 시각적 검사 (visual inspection)와 같은 작업을 수행합니다.
2. 왜 추론 (inference)을 비동기적으로 실행해야 하나요?
비동기 처리 (Asynchronous processing)는 오래 걸리는 모델 실행이 들어오는 요청을 차단하는 것을 방지합니다. 큐 (queues)와 워커 프로세스 (worker processes)를 사용하면 확장성 (scalability)을 개선하고, 시스템 가용성 (availability)을 높이며, 트래픽 급증 시에도 일관된 API 응답 시간을 유지하는 데 도움이 됩니다.
3. 컴퓨터 비전 배포에 Docker가 필수적인가요?
Docker가 필수적인 것은 아니지만, 의존성 관리 (dependency management)를 단순화하고, 환경 일관성 (environment consistency)을 보장하며, 추론 워커 (inference workers)가 클라우드 또는 온프레미스 (on-premises) 인프라 전반에서 독립적으로 확장될 수 있도록 해줍니다.
4. 프로덕션 API를 위해 흔히 사용되는 Python 프레임워크는 무엇인가요?
FastAPI는 비동기 요청 처리 (asynchronous request handling), 자동 API 문서화, 강력한 성능을 제공하며, 머신러닝 파이프라인 (machine learning pipelines) 및 백그라운드 작업 큐 (background task queues)와 잘 통합되기 때문에 널리 채택되고 있습니다.
5. 프로덕션 컴퓨터 비전 시스템을 어떻게 모니터링하나요?
팀들은 일반적으로 Prometheus, Grafana 및 중앙 집중식 로깅 플랫폼 (centralized logging platforms)과 같은 관측성 (observability) 도구를 사용하여 요청 지연 시간 (request latency), 큐 길이 (queue length), 워커 활용도 (worker utilization), GPU 메모리 사용량 (GPU memory usage), 추론 시간 (inference time), 모델 정확도 (model accuracy) 및 실패율 (failure rates)을 모니터링합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기