본문으로 건너뛰기

[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 의 다른글