구조 요약 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 요약 : 임베딩 작업을 GPU 서버로 분리

a. 목적

  • 현재 사용중인 CLIP ViT-B/32 모델은 CPU 환경에서 돌려도 빠르지만, 그럼에도 추론이 병목 지점이 될 수 있음
  • 임베딩만 전담하는 GPU 서버로 분리해서 처리 효율 향상

b. 변경 구조

[CPU 서버] (메인 FastAPI)
  └─ 요청 수신
      └─ 이미지/URL 전달 → [GPU 서버] (CLIP 임베딩 API)
                                └─ ViT-B/32 모델로 임베딩
                                └─ 결과 반환
      └─ 결과 캐싱 후 응답

가. GPU 서버

  • 별도 FastAPI 앱
  • model/clip/embed 엔드포인트 (POST: image_url)
  • 응답: {"data": [...], "status": "ok"}

나. CPU 서버 (중앙 FastAPI 앱)

  • GPU 서버에 HTTP 요청 전송 (httpx 추천)
  • 결과 받아서 캐시 저장
  • 캐싱 완료 후 클라이언트에 상태 전달

2. 보안/인프라 고려사항

항목 설명
인증 GPU 서버에 임의 접근 방지 (API 키, VPN, 내부망 등)
병렬 처리 GPU 서버에 Uvicorn workers, Queue + Semaphore, 또는 Celery
장애 대응 GPU 서버 down 시 fallback or retry 전략 필요
모델 버전 관리 ViT-B/32 vs ViT-L/14 등 모델명 파라미터로 관리 가능

3. 요청/응답 예시 (GPU 서버)

  • Request (JSON)

    {
      "images": [
    	  "https://example.com/photo1.jpg",
    	  "https://example.com/photo2.jpg"
    	]
    }
    
  • Response

    {
      "data": [
        {"https://example.com/photo1.jpg": [0.12, 0.53, ..., 0.02]},
    	  {"https://example.com/photo2.jpg": [0.12, 0.53, ..., 0.02]}
    	],
      "status": "ok"
    }
    

4. 이 구조의 장점

  • 서버 분리로 스케일 아웃 가능
  • CPU 서버는 경량 처리 + 캐싱 전담, GPU 서버는 추론 전담
  • ViT-L/14 같은 대형 모델도 효율적으로 운영 가능