5

하이퍼파라미터 완전 해부: 열 개만 알면 된다

QLoRA 학습 실행

학습 목표
  • 학습에 영향을 주는 핵심 하이퍼파라미터 열 개를 이해한다 (r과 lora_alpha 포함)
  • 제조 도메인에 적합한 기본값을 알고 있다
  • 각 파라미터 변경이 학습에 미치는 영향을 예측할 수 있다

핵심 하이퍼파라미터 열 개

비유: 요리사의 레시피

"파인튜닝은 요리와 같아. 재료(데이터)도 중요하지만, 불 세기(학습률), 조리 시간(에포크), 냄비 크기(배치)도 중요해."

1. 학습률 (Learning Rate)

학습률 = 한 번에 얼마나 많이 수정할 것인가?

너무 크면: 최적점을 지나쳐 발산 (Loss가 폭발)
너무 작으면: 학습이 너무 느리거나 안 됨
적절하면: 안정적으로 Loss 감소

제조 QLoRA 권장: 2e-4 (0.0002)
범위: 1e-4 ~ 5e-4

비유: 목표 지점을 찾아가는 보폭
  큰 보폭(높은 LR) -> 빨리 가지만 지나칠 수 있음
  작은 보폭(낮은 LR) -> 정확하지만 느림

2. 에포크 수 (num_train_epochs)

에포크 = 전체 데이터를 몇 번 반복 학습할 것인가?

제조 데이터 규모별 권장:
  500건 이하:  3~5 에포크
  500~2000건: 2~3 에포크
  2000건 이상: 1~2 에포크

주의: 에포크가 너무 많으면 과적합!
  과적합 징후: Train Loss는 내려가는데 Val Loss가 올라감

3. 배치 크기 (per_device_train_batch_size)

배치 크기 = 한 번에 몇 개의 샘플을 학습할 것인가?

GPU별 권장:
  8GB (RTX 4060):  batch_size = 2
  16GB (RTX 4090): batch_size = 4
  24GB (A10G):     batch_size = 8
  40GB (A100):     batch_size = 16

효과적 배치 크기:
  effective_batch = batch_size x gradient_accumulation_steps

예: batch_size=2, accumulation=8 -> effective_batch=16

4. Gradient Accumulation Steps

메모리 부족 시 해결책!

원리: 작은 배치로 여러 번 계산한 그래디언트를 축적하여
      큰 배치와 동일한 효과를 냄

예: batch=2, accumulation=8
   -> 2 x 8 = 16 샘플의 그래디언트를 모아서 1번 업데이트
   -> 메모리는 batch=2만큼만 사용!

제조 QLoRA 권장: 4~8

5. 최대 시퀀스 길이 (SFTConfig의 max_length)

데이터의 최대 토큰 수

설정 기준: Day 2에서 분석한 p95 + 64

예:
  데이터 p95 = 450 토큰
  max_length = 512 (가장 가까운 2의 거듭제곱)

시퀀스를 늘리면 활성화 메모리가 함께 늘어난다. 몇 GB가 되는지는 배치·모델·
gradient checkpointing 여부에 달렸으므로 표로 외우지 않고 본인 환경에서 잰다.
  torch.cuda.reset_peak_memory_stats() 후 몇 스텝 돌리고
  torch.cuda.max_memory_allocated() / 1024**3

주의: 너무 길면 메모리 낭비, 너무 짧으면 데이터 잘림!
토큰 수는 어절 수로 추정하지 말고 tokenizer로 직접 센다.

6. 학습률 스케줄러 (lr_scheduler_type)

학습률을 시간에 따라 어떻게 변화시킬 것인가?

cosine (권장):
  시작: 높은 LR -> 점점 감소 -> 끝: 거의 0
  장점: 안정적 수렴

linear:
  시작: 높은 LR -> 일정하게 감소 -> 끝: 0
  장점: 단순하고 예측 가능

constant:
  처음부터 끝까지 동일한 LR
  주의: 과적합 위험 높음

제조 QLoRA 권장: cosine

7. Warmup (warmup_steps)

학습 초기에 LR을 천천히 올리는 구간

warmup_steps = 0.03
  transformers 5.x 에는 warmup_ratio 가 없다. warmup_steps 하나가
  정수(스텝 수)와 0~1 사이 실수(전체 스텝 대비 비율)를 둘 다 받는다.
  0.03 을 넣으면 전체 2000 스텝 중 처음 60 스텝 동안 LR 이 0에서 목표까지 오른다.

이유: 초기에 랜덤한 그래디언트로 급격한 업데이트를 방지

제조 QLoRA 권장: 0.03~0.05

8. Weight Decay

과적합 방지를 위한 정규화

weight_decay = 0.01
  매 스텝마다 가중치를 약간 줄여서 과적합 방지

제조 QLoRA 권장: 0.01~0.1

9. r (랭크)

LoRA가 학습할 저랭크 행렬의 폭. 이 주의 주제 그 자체다.

  r=8:  간단한 스타일 변경 (어조, 형식)
  r=16: 도메인 지식 + 전문 용어 (제조 AI 표준)
  r=32: 복잡한 추론 능력 변경

r을 두 배로 하면 학습 파라미터도 두 배가 된다.
Phi-4-mini에 네 모듈 r=16이면 23,068,672개다.

10. lora_alpha (스케일링)

실제 적용: W' = W + (alpha / r) * B * A

이 과정의 표준: alpha = 2 * r  (r=16이면 alpha=32, 스케일 2.0)

주의: r과 alpha는 함께 움직여야 한다. r만 32로 올리고 alpha를 32로 두면
      스케일이 2.0에서 1.0으로 떨어져 학습 강도가 오히려 약해진다.

제조 QLoRA 표준 레시피

# === 제조 도메인 QLoRA 표준 설정 ===

# trl 1.12 / transformers 5.16 기준.
# 학습 인자는 전부 SFTConfig에 넣는다. SFTConfig는 TrainingArguments를 상속한다.
import torch
from trl import SFTConfig

USE_BF16 = torch.cuda.is_available() and torch.cuda.is_bf16_supported()

training_args = SFTConfig(
    # 학습 기본
    num_train_epochs=3,           # 500건 이하: 3-5
    learning_rate=2e-4,           # 이 과정 표준
    lr_scheduler_type="cosine",   # 안정적 수렴

    # 배치 설정 (GPU 8GB 기준)
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,  # 효과적 배치 = 16
    gradient_checkpointing=True,    # 활성화 메모리를 줄인다

    # 정규화
    weight_decay=0.01,
    warmup_steps=0.03,            # transformers 5.x에 warmup_ratio는 없다.
                                  # 0~1 실수를 넣으면 전체 스텝 대비 비율로 해석된다

    # 시퀀스 길이 (예전 SFTTrainer(max_seq_length=...) 자리)
    max_length=512,               # 데이터 p95 기준
    packing=False,

    # 정밀도 (T4는 bf16을 지원하지 않는다)
    fp16=not USE_BF16,
    bf16=USE_BF16,

    # 로깅
    logging_steps=10,
    eval_strategy="steps",
    eval_steps=100,
    save_strategy="steps",
    save_steps=100,
    save_total_limit=3,

    # 출력
    output_dir="./mfg-qlora-output",
    report_to="wandb",            # W&B 모니터링
)

이 설정을 그대로 TrainingArguments에 넣으면 max_length·packing에서 오류가 난다. 반대로 SFTTrainer(max_seq_length=..., packing=..., tokenizer=...)도 더 이상 받지 않는다. 학습 설정은 SFTConfig 한 곳에 모으고, 토크나이저는 processing_class=로 넘긴다.

AI로 학습하기 — 꿀팁
제조 sLLM용 하이퍼파라미터 설정표AI 학습 팁

QLoRA 핵심 하이퍼파라미터 8개를 제조 도메인 기본값·권장 범위와 함께 표로 정리해 두면 실습 때 즉시 참조할 수 있습니다.

제조 설비 Q&A 파인튜닝(학습 데이터 500건, Llama-3-8B, 16GB GPU)에 최적화된 QLoRA 하이퍼파라미터 8개를 설정 가이드 표로 만들어줘. 항목: 파라미터명 / 권장 기본값 / 허용 범위 / 제조 도메인에서의 튜닝 팁 / 잘못 설정 시 증상. 포함 파라미터: learning_rate, num_train_epochs, per_device_train_batch_size, gradient_accumulation_steps, lora_r, lora_alpha, max_length, warmup_steps. (transformers 5.x 기준으로 답해줘. warmup_ratio 는 없어졌고 학습 인자는 SFTConfig 로 모인다.)
이 팁이 도움이 됐나요?
실습 — 직접 해보기
QLoRA 파인튜닝 랩
rank와 데이터 규모를 바꾸며 학습 파라미터 수와 VRAM 계산을 확인해보세요. 이 시뮬레이터의 손실 곡선은 실제 학습이 아니라 rank와 데이터 규모로 계산한 식이고 train/val 구분도 없습니다. alpha를 움직여도 곡선은 변하지 않습니다. 과적합 판정(Val Loss 반등)은 시뮬레이터가 아니라 실제 학습 로그로 합니다.
핵심 포인트
  • learning_rate=2e-4, lora_alpha=2r: 이 과정의 표준값. 한 프로젝트 안에서 섞지 않는다
  • epochs=3: 500건 이하 데이터에 적합
  • batch=2, accumulation=8: 8GB GPU에서 효과적 배치 16
  • cosine 스케줄러: 안정적 수렴에 최적
  • max_length=512: 토크나이저로 실측한 p95 + 64 기준
  • 학습 설정은 SFTConfig 한 곳에 모은다 (TrainingArguments를 상속한다)
용어