구조 요약 - 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 같은 대형 모델도 효율적으로 운영 가능