예를 들어, HuggingFace Seq2SeqTrainer를 쓸 때 아래와 같이 설정했다고 하면:
training_args = Seq2SeqTrainingArguments(
output_dir="outputs",
eval_strategy="steps",
eval_steps=5000,
save_strategy="steps",
save_steps=5000,
save_total_limit=3,
load_best_model_at_end=True,
metric_for_best_model="eval_loss",
greater_is_better=False,
logging_steps=200,
predict_with_generate=True,
gradient_accumulation_steps=1,
report_to=[], # wandb, tensorboard 같은 외부 로그 끔
)
각 옵션이 의미하는 바를 훈련 흐름 관점에서 풀어보면:
1-1. 평가 관련 설정: eval_strategy, eval_steps
- eval_strategy="steps"
→ “훈련 step 기준으로 정기적으로 평가(eval) 를 돌리겠다”는 뜻입니다. - eval_steps=5000
→ 5,000 step마다 validation 데이터셋으로 평가를 실행합니다. - 평가 시에는:
- 현재 모델 파라미터를 freeze(학습 X)한 상태로
- validation 셋을 한 바퀴 돌며 eval_loss, BLEU 등 메트릭을 계산합니다.
포인트
→ gradient 자체는 모든 train step마다 계산되지만,
→ “그중 일부 step(5000, 10000, …)”에서만 평가를 추가로 수행하는 구조입니다.
1-2. 체크포인트 저장: save_strategy, save_steps, save_total_limit
- save_strategy="steps"
→ “step 기준으로 정기적으로 체크포인트를 저장하겠다” - save_steps=5000
→ 5,000 step마다 모델 가중치 + 옵티마이저 상태 등을 저장 - save_total_limit=3
→ 최근 체크포인트를 최대 3개까지만 유지, 나머지는 자동 삭제
(디스크가 꽉 차는 것 방지)
보통은 eval_steps와 save_steps를 맞춰 두고,
“평가를 했는데 성능이 좋으면 그 시점의 모델을 저장한다”
라는 패턴으로 씁니다.
1-3. 베스트 모델 자동 로드: load_best_model_at_end, metric_for_best_model, greater_is_better
- load_best_model_at_end=True
→ 훈련이 끝난 뒤, 지금까지 저장된 체크포인트 중에서 가장 성능이 좋았던 모델을 다시 불러옵니다. - metric_for_best_model="eval_loss"
→ “무엇을 기준으로 ‘베스트’를 정할 것인가?”
→ 여기서는 eval_loss가 가장 낮은 시점을 베스트로 선택. - greater_is_better=False
→ loss는 작을수록 좋으니,
→ “값이 작을수록 더 좋은 모델”이라고 명시.
결과적으로
학습 마지막 스텝의 모델이 아니라,
validation loss가 가장 낮았던 시점의 모델이 최종 모델로 남습니다.
(과적합이 많이 된 뒤의 상태를 자동으로 피하는 효과)
1-4. 로깅: logging_steps
- logging_steps=200
→ 200 step마다 로그를 한 번씩 기록합니다. - 이때 보통 함께 찍히는 값들:
- loss (train loss, moving average 등)
- grad_norm
- 학습 속도, 사용 시간 등
즉, 모든 step에서 gradient는 계산되지만,
우리가 콘솔/로그에서 확인하는 grad_norm, loss는
logging_steps 간격으로만 찍히는 스냅샷이라고 보면 됩니다.
1-5. 생성 모델 전용 옵션: predict_with_generate
- predict_with_generate=True
→ 평가할 때 단순히 로짓만 보는 것이 아니라,
model.generate()를 실제로 호출해서 번역/요약 같은 “문장 단위 출력”을 생성합니다. - 그래서:
- eval_loss 외에 BLEU, ROUGE 같은 시퀀스 레벨 메트릭도 함께 계산할 수 있게 됩니다.
번역 모델, 요약 모델 같은 seq2seq 작업에서는 거의 필수로 켜는 옵션입니다.
1-6. 배치/업데이트 관련: gradient_accumulation_steps
- gradient_accumulation_steps=1
→ “배치 1개마다 즉시 backward + optimizer.step을 수행한다”는 뜻입니다.
만약 4로 설정하면:
- 4개 미니배치에 대한 gradient를 쌓아두었다가
- 4번째 배치에서 한 번만 optimizer.step()을 실행
→ 실질적인 배치 크기를 4배로 키운 효과
하지만 지금 설정은 1이므로,
모든 train step마다 바로 gradient 계산 & 파라미터 업데이트가 이루어집니다.
1-7. 로그 전송 끄기: report_to
- report_to=[]
→ wandb, tensorboard, MLflow 같은 외부 로깅 툴로는 아무 것도 보내지 않겠다는 의미. - 콘솔 로그나 trainer.log_history 정도만 사용하고 싶을 때 유용합니다.
'HRDI_AI > 머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트' 카테고리의 다른 글
| AutoModelForSeq2SeqLM (0) | 2025.11.27 |
|---|---|
| AdamW란 무엇인가, 왜 쓰는가, 수식/직관/실전 세팅까지 (0) | 2025.11.27 |
| 3. grad_norm이란 무엇인가? 그리고 LR과 어떤 관계인가? (0) | 2025.11.27 |
| 2. fp32 vs fp16 – 왜 fp32에서 grad_norm이 더 안정적으로 보였을까? (0) | 2025.11.27 |
| Midterm Report (0) | 2025.11.26 |