[AI] 서비스 구성요소 간 연동 흐름 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 전체 요청 흐름 요약
- 사용자는 여러 장의 이미지를 업로드하고,
- 시스템은 먼저 이 이미지들을 자동으로 분류/필터링/하이라이트 사진 추천 등을 처리한다.
- 이후 사용자는 특정 이미지를 선택해, 원하는 스타일(지브리 등)로 변환을 요청할 수 있다.
2. 구성 요소 간 상세 연동 흐름
a. 사용자 요청 수신
사용자 → Backend → GCS 저장
↓
이미지 URL 목록 전달
↓
Load Balancer → 트래픽 분산 라우팅
↓
FastAPI → 처리 시작
- 사용자가 여러 장의 이미지를 업로드
- 업로드된 이미지는 Backend 서버가 직접 GCS(Cloud Storage)에 저장
- 저장이 완료되면, Backend는 각 이미지의 pre-signed URL 목록을 FastAPI에 전달
- Cloud Load Balancer가 요청을 수신하고, FastAPI 인스턴스들 중 하나로 트래픽을 분산 라우팅
- FastAPI는 전달받은 이미지 URL들을 기반으로 후속 처리(임베딩, 분류 등)를 수행
컴포넌트 |
역할 |
사용자 |
여러 장의 이미지를 업로드 |
Backend |
이미지를 GCS에 저장하고, 각 이미지의 pre-signed URL을 생성 |
Cloud Storage (GCS) |
이미지 파일 저장소 역할 (binary, 고용량 이미지 저장에 최적화) |
Cloud Load Balancer |
Backend에서 FastAPI로 전달되는 요청을 인스턴스에 분산 라우팅 |
FastAPI |
전달받은 이미지 URL들을 기반으로 후속 AI 처리 흐름(임베딩, 중복 판별 등)을 시작 |
b. FastAPI 서버 → 이미지 임베딩 처리
[각 이미지 URL]
↓
Redis → 캐시에서 임베딩 존재 여부 확인
↓ (존재할 경우)
FastAPI → 캐시된 임베딩 재사용
↓ (존재하지 않을 경우)
FastAPI → 이미지 로드 → CLIP 모델로 임베딩 생성
↓
FastAPI → Redis에 임베딩 캐싱
- FastAPI는 각 이미지에 대해:
- Redis 캐시에서 임베딩 존재 여부 확인
- 없으면 CLIP 기반 임베딩 생성
- 생성된 임베딩은 Redis에 캐싱
컴포넌트 |
역할 |
FastAPI |
전달받은 각 이미지 URL에 대해 임베딩 캐시 여부를 조회하고, 처리 흐름을 제어 |
Redis (캐시) |
임베딩 결과가 있는지 확인 |
Cloud Storage (GCS) |
FastAPI가 이미지 URL을 통해 이미지 데이터를 로드하는 대상 (직접 접근) |
CLIP 모델 (CPU 서버) |
임베딩이 없을 경우 FastAPI가 이미지를 입력으로 사용하여 임베딩을 생성 |
FastAPI |
새로 생성된 임베딩 결과를 Redis에 캐싱하여 추후 중복 연산 방지 |
c. FastAPI 서버 → 임베딩 후속 작업 처리
[임베딩 완료]
↓
FastAPI → Backend로 "처리 완료" 통보
↓
Backend → 후속 작업 요청 (중복 필터링 / 분류 등) 도착
↓
FastAPI → Redis 메시지 큐 등록
↓
각 작업 전용 Worker에서 처리
- FastAPI는 모든 이미지에 대한 임베딩이 완료되면, 해당 사실을 Backend에 전달하여 상태를 갱신
- 이후, Backend에서 후속 처리 요청(카테고리 분류, 중복 사진 판별 등)이 비동기적으로 발생
- FastAPI는 이러한 요청을 받아, 아래와 같은 작업별 Redis 메시지 큐에 등록
- 각 큐는 전용 Worker 프로세스가 실시간으로 작업을 소비
컴포넌트 |
역할 |
FastAPI |
모든 이미지의 임베딩이 완료되면, 해당 상태를 Backend로 전달하여 처리 완료를 알림 |
Backend |
처리 완료 상태를 수신하고, 필요한 후속 작업 요청(중복 탐지, 분류 등)을 FastAPI에 전송 |
FastAPI |
후속 작업 요청을 받아, 작업 종류별로 Redis 메시지 큐에 등록 |
Redis (메시지 큐) |
AI 작업 큐를 통해 요청을 비동기 처리 방식으로 전달 |
각 작업 전용 Worker |
각 큐를 실시간으로 polling하여 소비하고, 해당 작업(중복 판별, 카테고리 분류 등)을 수행한 후 결과 저장 또는 응답 구성 |
d. FastAPI → 인물 분류
Backend → 인물 분류 요청 (앨범 단위)
↓
FastAPI → Redis 메시지 큐 등록
↓
Worker (Face Recog)
→ 이미지 URL → 얼굴 Crop
→ ArcFace 모델로 얼굴 임베딩 추출
→ 클러스터링 수행
↓
FastAPI → Backend에결과 전달
- Backend가 앨범 내 사진 속 인물을 자동으로 그룹핑해달라고 요청
- FastAPI는 요청을 받아, 메시지 큐에 작업 등록
- 해당 큐를 소비하는 Face Recognition 전용 Worker가 작업을 처리
컴포넌트 |
역할 |
FastAPI |
사용자 요청 수신 + 메시지 큐 등록 |
Redis |
비동기 인물 분류 요청 큐 |
Face Recog Worker |
얼굴 Crop → ArcFace 임베딩 → 클러스터링 |
ArcFace 모델 (CPU 서버) |
인물 식별을 위한 전용 임베딩 모델 |
FastAPI |
결과를 사용자에게 전달 또는 정리된 뷰로 반환 |
e. FastAPI 서버 → 스타일 변환 요청 처리
Backend → 선택된 이미지 url + 스타일 요청
↓
FastAPI → Gemini API 호출 (via Cloud NAT)
↓
Gemini → 스타일용 프롬프트 응답
↓
FastAPI → Redis GPU 스타일 큐 등록
↓
GPU 서버 → 스타일 변환 수행
↓
FastAPI → 결과 GCS 저장 → 결과 URL 반환
- 사용자가 요청한 사진과 스타일에 따라 Backend에서 스타일 변환 요청
- FastAPI는 요청을 받아:
- Cloud NAT를 통해 Gemini API에 이미지와 스타일 설명을 전달
- Gemini는 해당 이미지에 맞는 스타일 변환용 positive prompt를 생성하여 반환
- 생성된 프롬프트와 이미지 정보를 FastAPI가 Redis 스타일 요청 큐에 등록
- GPU 서버는 큐를 polling하여 요청을 소비하고, Stable Diffusion으로 스타일 변환을 수행
- 결과 이미지는 GCS에 저장되며, FastAPI가 결과 URL을 Backend에게 응답으로 전달
컴포넌트 |
역할 |
Backend |
사용자가 선택한 이미지 URL과 스타일 정보를 FastAPI로 전달 |
FastAPI |
스타일 요청 수신 → 이미지 + 스타일을 기반으로 Gemini API에 프롬프트 생성 요청 |
Cloud NAT |
FastAPI 인스턴스가 GCP 외부로 나가 Gemini API를 호출할 수 있도록 인터넷 게이트웨이 역할 수행 |
Gemini API |
이미지 및 스타일을 바탕으로 positive prompt(텍스트 설명) 생성 |
FastAPI |
Gemini 응답으로 받은 프롬프트와 이미지 정보를 Redis 메시지 큐에 등록 |
Redis (GPU 큐) |
Stable Diffusion용 스타일 요청을 GPU 서버에 비동기 전달 |
GPU 서버 |
큐를 polling하여 요청을 소비하고, Stable Diffusion 모델을 통해 이미지 스타일 변환 연산 수행 |
Cloud Storage (GCS) |
변환된 이미지 결과를 저장 |
FastAPI |
GCS에 저장된 이미지 URL을 조회해 Backend에 최종 결과로 전달 |