고려 사항 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 구조 변경으로 인한 역할 변화

  • 기존에는 CPU 서버가 직접 CLIP ViT-B/32 모델로 임베딩을 수행
  • 이제는 GPU 서버가 ViT-L/14 모델로 임베딩을 수행하고, CPU 서버는 단순 중계/캐싱 역할

2. 고려 및 의문점

a. CPU 서버에서 SerialTaskQueue나 run_in_executor가 여전히 필요한가?

  • 이전에는 임베딩이 CPU 바운드였기에 run_in_executor + 직렬 큐로 관리
  • 이제는 네트워크 바운드 → 비동기 요청만으로 충분
  • 동시 요청 과부하 방지를 위한 asyncio.Semaphore(max_concurrent) 정도만 고려

b. GPU 서버에서도 SerialTaskQueue나 스레드 분리가 필요한가?

  • PyTorch는 단일 모델 기준으로는 GPU 연산을 병렬로 처리하지 않음
    • 따라서 동시에 요청이 들어와도 내부적으로 순차 처리됨
  • GPU 사용량을 체크한 후, 오히려 병렬화가 필요할수도 있음

c. 임베딩 요청의 부하 관리는 CPU 서버가 할까, GPU 서버가 할까?

  • CPU 서버에서 임베딩 요청을 제한하면 전체 처리량 저하
  • 부하 관리는 GPU 서버가 책임져야 함
    • (예시) GPU 서버에서 요청 큐에 쌓고, 순차 처리
    • 혹은 Celery/Queue로 분산 처리 전략 도입

d. 멀티 프로세스/멀티 컨테이너는 무엇이 다르고, 언제 고려해야 하나?

구분 개념 특징
멀티 프로세스 독립된 프로세스들이 각자 모델 로드 안정적, 적절한 병렬화 가능
멀티 컨테이너 Docker 등으로 환경 완전 분리 가장 확장성 좋지만 설정 복잡
  • T4 GPU 기준으로 단일 인스턴스 VRAM 점유량 측정 필요
  • 실측 기반으로 인스턴스 수 조정 및 확장 전략 수립 가능

e. 기타 실무 고려 사항

  • GPU 서버의 모델 로딩 및 추론 상태는 모니터링 가능해야 함
  • 비정상 요청(잘못된 URL, timeout 등)에 대한 fallback 처리
  • Redis 캐싱 위치: CPU 서버에서 응답 전에 캐시하는 방식 유지
  • 추후 확장을 고려한 API 설계: /embed, /status, /batch_embed