피드로 돌아가기
함께 구매하면 좋은 상품이에요! - 장바구니 추천 개발기 2부
컬리 기술블로그컬리 기술블로그
Backend

함께 구매하면 좋은 상품이에요! - 장바구니 추천 개발기 2부

Kurly가 장바구니 추천 모델을 TorchServe + EKS + ArgoCD 스택으로 실시간 서빙하며 GracefulShutdown 적용으로 무중단 배포 달성

2024년 5월 27일12intermediate

Context

ML 추천 모델의 부가가치를 실제 사용자에게 전달하기 위해 실시간 서빙 아키텍처가 필요했다. 일반적인 Kubernetes Rolling Update, Blue/Green, Canary 배포 전략만으로는 ALB와 Pod 간 연결 전환 과정에서 다운타임이 발생했다.

Technical Solution

  • 서빙 프레임워크 선정: BentoML과 TorchServe를 Locust로 성능 테스트한 결과 응답 시간이 우수한 TorchServe 채택
  • TorchServe 성능 최적화: CPU Clock Speed가 높은 인스턴스로 교체하여 낮은 지연시간 달성 (async_logging, disable_system_metrics 등의 부차 옵션은 영향 미미)
  • GracefulShutdown 구현: PreStop Hook + terminationGracePeriodSeconds + ALB idle timeout 조정으로 Pod 종료 시 진행 중인 요청을 완료한 후 종료하도록 설정
  • 로깅 인프라: 서비스 API에서 발생한 로그를 파일 → Kafka 토픽 → Nifi → BigQuery로 실시간 적재
  • 배포 자동화 파이프라인: 모델 레포(train.py, Dockerfile) / 서빙 레포(Kubernetes manifest) 분리 → GitHub Action + Kubeflow Pipeline → MLflow에서 아티팩트 다운로드 → Docker 이미지 빌드 및 ECR 푸시 → ArgoCD Image Updater가 새 이미지 감지하여 서빙 레포에 커밋 → ArgoCD가 매니페스트 동기화하여 EKS 배포
  • 서비스 API 계층: 모델 API 앞단에 fallback 응답, A/B 테스트 라우팅, 필터링·부스팅 등의 후처리 비즈니스 로직 구현

Impact

GracefulShutdown 적용 전후 비교에서 502 에러가 제거되고 200 응답만 반환되는 안정적 배포 달성. 정량적 수치(지연시간 감소율, 에러율 개선도 등)는 아티클에 명시되지 않음.

Key Takeaway

ML 모델 API 운영 환경에서는 서빙 프레임워크 선정 시 실제 워크로드로 성능 테스트하여 결정해야 하며, 무중단 배포는 Kubernetes 배포 전략만으로는 부족하고 GracefulShutdown(PreStop Hook + terminationGracePeriodSeconds)과 외부 로드밸런서(ALB) 타임아웃 조정을 통합해야 한다.


PyTorch 기반 추천 모델을 실시간 서빙하는 팀에서 TorchServe 도입 시 CPU Clock Speed가 높은 인스턴스를 우선 선택한 후 세부 튜닝을 수행하면 지연시간을 최소화할 수 있다. 또한 EKS + ALB 환경에서 무중단 배포를 구현하려면 terminationGracePeriodSeconds를 ALB idle timeout(기본값 60초)보다 높게 설정(예: 70초)하고 PreStop Hook을 함께 적용해야 배포 중 트래픽 손실을 방지할 수 있다.

원문 읽기