[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_id가 None인 모델에서는 배치 처리가 불가능했다.
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}")
왜 이게 좋은가
- 일반적인 폴백 전략:
eos_token_id(End of Sequence)를pad_token_id로 사용하는 것은 Hugging Face 생태계에서 널리 알려진 해결책이다. 패딩 토큰은 모델이 무시하도록 학습된 토큰이어야 하는데, EOS 토큰은 대부분의 모델에서 이 역할을 수행할 수 있다. - 방어적 코딩:
getattr와try-except로 모든 접근을 감싸서, 모델 구조가 예상과 다르더라도 기존 동작을 깨뜨리지 않는다. - 디버깅 용이성: 폴백 적용 시
debug, 불가능할 때warning로그를 남겨 문제 추적이 쉽다.
리랭킹은 RAG 파이프라인의 검색 품질을 크게 향상시키는 핵심 단계인데, 모델 호환성 문제로 아예 사용이 불가능했던 상황을 16줄의 안전한 폴백으로 해결한 실용적인 수정이다.
참고 자료
관련 포스트
- [Open WebUI] FileMetadataResponse의 meta 필드를 Optional로 변경하여 배치 추가 오류 수정
- [Open WebUI] 채팅 제목 업데이트 시 DB 컨텍스트를 단일 세션으로 통합하여 역직렬화 2회 제거
- [Open WebUI] 공유 채팅 삭제 시 전체 행 대신 ID만 조회하여 메모리 절약
- [Open WebUI] 매 인증 요청마다 실행되는 last_active 업데이트를 단일 UPDATE 쿼리로 최적화
- [CPython] 64-bit ARM 커널에서 32-bit ARM Android의 sysconfig ABI 감지 수정
PR Analysis 의 다른글
- 이전글 [Triton] swizzling=0 matrix descriptor 지원과 WGMMA lowering 일반화
- 현재글 : [Open WebUI] 리랭킹 모델의 pad_token_id 미설정 시 배치 처리 실패 수정
- 다음글 [Triton] gfx950에서 PaddedLayout + AsyncCopy 파이프라이닝 지원
댓글