[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 의 다른글
- 이전글 [Ray Data/LLM] 폐기된 TRANSFORMERS_CACHE를 HF_HUB_CACHE로 교체하고 AutoConfig 실패를 비치명적으로 처리
- 현재글 : [Open WebUI] Redis 설정 조회 캐싱으로 /api/models 응답 속도 개선
- 다음글 [pydantic-ai] 자동 리뷰 봇 개선: Gateway 활용과 diff 라인 번호 주석
댓글