독립적인 Embedding 처리를 위한 서버의 성능 개선
· 5 min read
이 문서는 FastAPI + sentence-transformers 기반의 embedding 처리 API 서버에서, 멀티 프로세스와 비동기 워커 구조의 병렬성을 활용하여 성능을 개선하는 방법을 정리한 문서입니다.
🔧 시스템 구성 개요
uvicorn기반 FastAPI ASGI 서버/embed요청을 받으면:- 데이터를
asyncio.Queue에 넣고 - 백그라운드
EmbeddingWorker가 소비 sentence-transformers모델을 통해 embedding vector 생성- 생성된 벡터를 Qdrant에 저장
- 데이터를
⚙️ 현재 구조의 주요 컴포넌트
1. uvicorn --workers=N
N개의 OS-level 프로세스가 생성됨- 각 프로세스는 FastAPI 앱 + 자체 queue + embedding_worker instance 포함
- 요청 분산은 커널이 소켓을 fork한 워커에 라운드로빈 방식으로 전달
2. EmbeddingWorker(worker_count=M)
- 각 프로세스 내부에 존재
M개의asyncio.create_task()를 통해 event loop 기반 비동기 워커를 생성asyncio.Queue(maxsize=K)를 공유하며, 큐의 작업을 병렬 소비
3. sentence-transformers 모델
- PyTorch 기반 embedding 모델
- 디바이스 설정은
cpu,cuda, 또는mps - 현재는 Apple Silicon의 GPU 가속(MPS) 를 사용하는 구조
🧠 병렬성 구조 요약
| 계층 | 단위 | 역할 |
|---|---|---|
| 프로세스 | uvicorn worker (N) | OS-level 멀티코어 활용 |
| 비동기 태스크 | embedding_worker (M) | event loop 내부의 경량 태스크 |
| 큐 | asyncio.Queue | 프로세스 내부에 존재. 공유되지 않음 |
예를 들어:
uvicorn --workers=4,worker_count=10이면 → 총 40개의 병렬 embedding 태스크 실행- 단, 이들은 모두 각자의 프로세스와 큐에 속하며 서로 공유되지 않음
