본문으로 건너뛰기

[Open WebUI] 리랭킹 모델의 pad_token_id 미설정 시 배치 처리 실패 수정

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

들어가며

Hugging Face의 CrossEncoder 모델 중 일부(예: Qwen/Qwen3-Reranker-0.6B)는 모델 설정에 pad_token_id가 정의되어 있지 않다. 이 경우 배치 크기가 1을 초과하면 입력 시퀀스 길이를 맞추기 위한 패딩이 불가능하여 "Cannot handle batch sizes > 1 if no padding token is defined" 오류가 발생한다. 단일 입력에서는 패딩이 필요 없으므로 발견되지 않다가 여러 문서를 동시에 리랭킹할 때 실패한다.

핵심 코드 분석

Before: pad_token_id 미설정 시 그대로 사용

리랭킹 모델 로드 후 별도 설정 없이 사용했기 때문에, pad_token_idNone인 모델에서는 배치 처리가 불가능했다.

After: eos_token_id를 폴백으로 설정

# Safely adjust pad_token_id if missing as some models do not have this in config
try:
    model_cfg = getattr(rf, "model", None)
    if model_cfg and hasattr(model_cfg, "config"):
        cfg = model_cfg.config
        if getattr(cfg, "pad_token_id", None) is None:
            # Fallback to eos_token_id when available
            eos = getattr(cfg, "eos_token_id", None)
            if eos is not None:
                cfg.pad_token_id = eos
                log.debug(f"Missing pad_token_id detected; set to eos_token_id={eos}")
            else:
                log.warning("Neither pad_token_id nor eos_token_id present in model config")
except Exception as e2:
    log.warning(f"Failed to adjust pad_token_id on CrossEncoder: {e2}")

왜 이게 좋은가

  1. 일반적인 폴백 전략: eos_token_id(End of Sequence)를 pad_token_id로 사용하는 것은 Hugging Face 생태계에서 널리 알려진 해결책이다. 패딩 토큰은 모델이 무시하도록 학습된 토큰이어야 하는데, EOS 토큰은 대부분의 모델에서 이 역할을 수행할 수 있다.
  2. 방어적 코딩: getattrtry-except로 모든 접근을 감싸서, 모델 구조가 예상과 다르더라도 기존 동작을 깨뜨리지 않는다.
  3. 디버깅 용이성: 폴백 적용 시 debug, 불가능할 때 warning 로그를 남겨 문제 추적이 쉽다.

리랭킹은 RAG 파이프라인의 검색 품질을 크게 향상시키는 핵심 단계인데, 모델 호환성 문제로 아예 사용이 불가능했던 상황을 16줄의 안전한 폴백으로 해결한 실용적인 수정이다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글