[Open WebUI] 모델 캐시 활용으로 TTFT(첫 토큰 도달 시간) 대폭 단축
PR 링크: open-webui/open-webui#20886 상태: Merged | 변경: +23 / -9
들어가며
Open WebUI에서 채팅 완성(chat completion) 요청이 들어올 때마다 get_all_models()를 호출하여 모든 설정된 백엔드에서 모델 목록을 가져오고 있었습니다. 이 함수는 네트워크 요청을 포함하므로 상당한 지연을 유발하며, 이는 사용자가 첫 번째 토큰을 받기까지의 시간(TTFT)에 직접적으로 영향을 미칩니다. 이 PR은 앱 상태 캐시를 먼저 확인하고 캐시 미스일 때만 전체 조회를 수행하도록 변경합니다.
핵심 코드 분석
OpenAI 채팅 완성 엔드포인트
Before:
async def generate_chat_completion(...):
await get_all_models(request, user=user)
model = request.app.state.OPENAI_MODELS.get(model_id)
After:
async def generate_chat_completion(...):
# 캐시에서 먼저 조회하여 비용이 큰 get_all_models() 호출을 회피
model = request.app.state.OPENAI_MODELS.get(model_id) if request.app.state.OPENAI_MODELS else None
if not model:
await get_all_models(request, user=user)
model = request.app.state.OPENAI_MODELS.get(model_id)
Ollama 임베딩 엔드포인트
Before:
async def embed(...):
await get_all_models(request, user=user)
models = request.app.state.OLLAMA_MODELS
if model in models:
url_idx = random.choice(models[model]["urls"])
After:
async def embed(...):
models = request.app.state.OLLAMA_MODELS
if not models or model not in models:
await get_all_models(request, user=user)
models = request.app.state.OLLAMA_MODELS
if model in models:
url_idx = random.choice(models[model]["urls"])
왜 이게 좋은가
- TTFT 대폭 단축:
get_all_models()는 모든 백엔드에 네트워크 요청을 보내므로, 캐시 히트 시 이 비용이 완전히 제거됩니다. - 영향 범위 넓음: OpenAI chat completion, OpenAI embeddings, Ollama embed, Ollama embeddings 등 4개 엔드포인트에 적용됩니다.
- 캐시 미스 안전성: 캐시에 모델이 없으면 기존과 동일하게 전체 조회를 수행하므로 기능 누락이 없습니다.
- 체감 성능 개선: 사용자가 메시지를 보낸 후 첫 응답까지의 대기 시간이 줄어들어 체감 성능이 크게 향상됩니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [pydantic-ai] 자동 리뷰 봇 개선: Gateway 활용과 diff 라인 번호 주석
- 현재글 : [Open WebUI] 모델 캐시 활용으로 TTFT(첫 토큰 도달 시간) 대폭 단축
- 다음글 [CPython] PEP 810 -- CPython에 명시적 Lazy Import 구현
댓글