이미지 처리 컨테이너(임베딩, 태깅, 중복 필터링) - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

이미지 임베딩 / 태깅 / 중복사진 서비스 컨테이너

1. 세 기능을 한 컨테이너로 묶은 이유

  • 현재 온기 서비스는 이미지 업로드 시 실시간으로 전처리 → 임베딩 → 태깅 + 중복 판별까지 순차적으로 처리함
  • 이 기능들은 하나의 요청 흐름에서 긴밀히 연결되어 있어, 초기에 분리된 컨테이너로 운영하는 것은 운영 복잡성에 비해 얻는 이점이 적음
  • 현재는 FastAPI 기반 단일 컨테이너에 함께 배치하여 관리 효율과 개발 민첩성을 확보
    • 다만 컨테이너 내부에서는 모듈 분리를 통해 테스트, 유지보수, 확장성도 고려

각 기능은 코드 레벨에서 명확히 모듈화되어 있으며, 추후 병목 또는 인프라 분리에 따라 마이크로서비스화가 가능하도록 설계할 예정


2. 현재 구조 및 모듈화 방식

  • 하나의 FastAPI 앱 안에 다음과 같은 네 가지 역할을 서비스 단위로 모듈화

    [FastAPI Router]
     ├── Preprocessor # 이미지 URL → Tensor 전처리
     ├── EmbeddingService # Tensor → 임베딩 벡터 추출
     ├── TaggingService # 임베딩 → 태그 추출 및 카테고리 매핑
     └── DuplicateService # 임베딩 간 유사도 분석 및 중복 탐지
    

3. 예상 병목 지점 및 마이크로서비스 분리 계획

모듈 예상 병목 분리 필요성 향후 대응 방안
Preprocessor 이미지 로딩 지연, 오류 이미지 처리 낮음 예외 처리 고도화, 캐싱 고려
EmbeddingService CLIP 기반 추론 부하, 추후 GPU 전환 가능성 높음 CPU 서버 내에서 별도의 서비스로 분리하거나, GPU 인스턴스에서 별도 추론 서버로 분리
TaggingService 벡터 유사도 계산 낮음 대규모 비교 필요 시 병렬 처리 or 분리 고려
DuplicateService 벡터 유사도 계산 낮음 대규모 비교 필요 시 병렬 처리 or 분리 고려

RAM++ vs CLIP: 병목 위치 비교 분석

⚠️ 증분 시간 = 전체 시간 − 임베딩 시간

항목 RAM++ (임베딩만) RAM++ (임베딩+태깅) 증분 시간 CLIP (임베딩만) CLIP (임베딩+태깅) 증분 시간
CPU (batch 32) 149.93s 186.91s +36.98s 4.49s 3.53s -0.96s
GPU (batch 32) 7.59s 12.69s +5.10s 0.96s 1.00s +0.04s

4. GPU 사용 시 마이크로서비스 분리 필요성

  • GPU는 자원 경합에 매우 민감하므로, FastAPI 서버 내 다른 처리와 함께 쓰면 충돌 가능성 ↑
  • GPU 서버는 CPU 서버와 인프라 구성이 다르기 때문에 추론 서버만 분리하는 것이 관리와 비용 면에서 유리
  • 따라서 GPU 사용이 시작되면 EmbeddingService마이크로서비스로 분리하는 것이 사실상 필수에 가까움
[AI 처리 서버 (CPU)]
      └─→ POST /embed → [Embedding Server (GPU)]

5. 결론

  • 현재는 CPU 기반 단일 컨테이너 + 내부 모듈화 구조로 시작
  • 추론 흐름을 명확히 나눠두어 향후 GPU 전환, 부하 분산, 서비스 확장 시 구조 변경이 용이
  • 추후 GPU 서버 도입 시, EmbeddingService만 독립 마이크로서비스화하고 나머지는 기존 구조 유지