본문으로 건너뛰기

[axolotl] SchedulerMixin.create_scheduler() optimizer 누락 버그 수정

PR 링크: axolotl-ai-cloud/axolotl#3435 상태: Merged | 변경: +8 / -1

들어가며

SchedulerMixin.create_scheduler()는 학습률 스케줄러를 생성하는 메서드입니다. transformers의 기본 구현은 optimizer 파라미터가 None일 때 self.optimizer를 사용하지만, axolotl의 오버라이드에서는 이 fallback 로직이 빠져있어, 특정 호출 패턴에서 None optimizer로 스케줄러를 생성하려는 에러가 발생했습니다.

핵심 코드 분석

Before:

def create_scheduler(
    self, num_training_steps: int, optimizer: torch.optim.Optimizer = None
) -> LRScheduler:
    # optimizer가 None이어도 그대로 사용
    ...

After:

def create_scheduler(
    self, num_training_steps: int, optimizer: None | torch.optim.Optimizer = None
) -> LRScheduler:
    if optimizer is None:
        if self.optimizer is None:
            raise ValueError(
                "Optimizer must be set before calling create_scheduler "
                "or passed as an argument."
            )
        optimizer = self.optimizer
    ...

변경점은 세 가지입니다:

  1. optimizerNone이면 self.optimizer로 fallback
  2. self.optimizerNone이면 명확한 에러 메시지 출력
  3. 타입 힌트를 torch.optim.Optimizer = None에서 None | torch.optim.Optimizer = None으로 수정하여 Optional 의미를 명확히 표현

왜 이게 좋은가

이 버그는 axolotl의 커스텀 스케줄러(cosine with min LR 등)를 사용할 때만 발생하는 조건부 버그입니다. transformers 기본 스케줄러를 사용하면 super().create_scheduler()로 위임되어 자체 fallback이 동작하지만, 커스텀 경로에서는 fallback이 없었습니다. 8줄의 작은 수정이지만, 디버깅하기 어려운 NoneType has no attribute 유형의 런타임 에러를 방지하며, 명확한 에러 메시지가 문제 해결 시간을 크게 줄여줍니다.

정리

항목 내용
문제 create_scheduler에 optimizer=None 전달 시 에러
해결 self.optimizer fallback + 명시적 ValueError
영향 커스텀 LR 스케줄러 사용 시 안정성 확보

참고 자료

알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글