본문으로 건너뛰기

[Open WebUI] Redis 설정 조회 캐싱으로 /api/models 응답 속도 개선

PR 링크: open-webui/open-webui#21306 상태: Merged | 변경: +28 / -16

들어가며

Open WebUI에서 Redis를 설정 저장소로 사용할 때, request.app.state.config.<KEY>에 접근할 때마다 동기적 Redis GET이 발생합니다. get_all_models_responses()get_merged_models() 함수에서 OPENAI_API_BASE_URLS, OPENAI_API_KEYS, OPENAI_API_CONFIGS매 루프 반복마다 읽어오고 있었습니다. 400개 이상의 모델을 가진 프로덕션 환경에서 이로 인해 /api/models 호출 한 번에 200-400ms의 지연이 발생했습니다.

핵심 코드 분석

기존: 매 반복마다 Redis 조회

Before:

async def get_all_models_responses(request: Request, user: UserModel) -> list:
    num_urls = len(request.app.state.config.OPENAI_API_BASE_URLS)  # Redis GET
    num_keys = len(request.app.state.config.OPENAI_API_KEYS)       # Redis GET

    for idx, url in enumerate(request.app.state.config.OPENAI_API_BASE_URLS):  # Redis GET
        if (str(idx) not in request.app.state.config.OPENAI_API_CONFIGS):       # Redis GET
            send_get_request(f"{url}/models",
                request.app.state.config.OPENAI_API_KEYS[idx])                 # Redis GET

변경: 함수 시작 시 한 번만 조회

After:

async def get_all_models_responses(request: Request, user: UserModel) -> list:
    # 설정값을 로컬 변수에 캐싱하여 Redis 라운드트립 최소화
    api_base_urls = request.app.state.config.OPENAI_API_BASE_URLS
    api_keys = list(request.app.state.config.OPENAI_API_KEYS)
    api_configs = request.app.state.config.OPENAI_API_CONFIGS

    num_urls = len(api_base_urls)
    num_keys = len(api_keys)

    for idx, url in enumerate(api_base_urls):
        if (str(idx) not in api_configs):
            send_get_request(f"{url}/models", api_keys[idx])

왜 이게 좋은가

  • Redis 라운드트립 대폭 감소: 모델 수에 비례하던 200-300회의 Redis GET이 3회로 줄어듭니다.
  • 지연 시간 개선: AWS ElastiCache 기준 1-2ms/요청이므로, 200-400ms의 지연이 사실상 제거됩니다.
  • 로직 변경 없음: 설정값을 로컬 변수에 복사할 뿐, 비즈니스 로직은 동일합니다.
  • 프로덕션 검증 완료: PR 작성자가 본인의 프로덕션 환경에서 이미 배포하여 검증한 변경입니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글