본문 바로가기
C.W.K.
Stream
Lesson 04 of 06 · published

Hugging Face Trainer로 미세 조정

~14 min · trainer, fine-tune, training-args

Level 0텐서 탐구자
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

Trainer: 반복문을 직접 쓰지 않아도 될 때

Hugging Face Trainer는 표준 PyTorch 학습 반복문에 필요한 기능을 한꺼번에 제공해. 분산 학습, 혼합 정밀도, 기울기 누적, 평가, 체크포인팅, 기록과 충분히 검증된 기본값이 포함돼. 전형적인 미세 조정 작업에서는 반복문을 직접 작성하는 것보다 Trainer를 쓰는 편이 빠를 때가 많아.

세 가지 구성 요소

  1. 모델: 보통 AutoModelFor[Task].from_pretrained(...)로 불러와.
  2. 데이터셋: 보통 Hugging Face Datasets를 쓰고 .map(tokenizer, batched=True)로 토큰화해.
  3. 학습 인자: TrainingArguments 객체에 에포크, 배치 크기, 학습률, 평가·저장 전략, FP16/BF16, 로그 디렉터리 같은 설정을 담아.

순수 PyTorch보다 잃는 것

Trainer에는 정해진 관례가 많아. 두 손실을 번갈아 쓰거나, 기울기를 특별히 조작하거나, 여러 단계의 교육 과정을 적용하는 등 반복문 구조가 특수하다면 오히려 도구와 싸우게 돼. '데이터셋 Y에서 모델 X를 미세 조정한다'면 좋은 선택이지만, '새 구조를 새 목표 함수로 학습한다'면 반복문을 직접 작성해.

Trainer, Lightning, 순수 PyTorch 중 무엇을 쓸까?

  • HF Trainer: Hugging Face 모델을 Hugging Face 데이터셋에 미세 조정할 때 가장 잘 맞아. 관련 도구와 촘촘하게 통합돼 있어.
  • PyTorch Lightning: 반복문의 반복 코드는 줄이고 싶지만 모델이 Hugging Face 계열이 아니거나 Trainer보다 더 큰 유연성이 필요할 때 좋아.
  • 순수 PyTorch: 새로운 구조, 연구, 최대한의 제어가 필요할 때 써. 트랙 4에서 만든 반복문만으로도 운영 환경에 충분해.

Code

DistilBERT IMDB 미세 조정: 최소 예·python
from datasets import load_dataset
from transformers import (
    AutoTokenizer, AutoModelForSequenceClassification,
    Trainer, TrainingArguments,
)

model_name = "distilbert-base-uncased"
ds = load_dataset("imdb")
tok = AutoTokenizer.from_pretrained(model_name)

def tokenize(batch):
    return tok(batch["text"], padding="max_length", truncation=True, max_length=512)

ds_tok = ds.map(tokenize, batched=True)

model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

args = TrainingArguments(
    output_dir="./out",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    learning_rate=2e-5,
    warmup_steps=500,
    weight_decay=0.01,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    bf16=True,                                 # bf16 mixed precision
    logging_dir="./logs",
    logging_steps=100,
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=ds_tok["train"],
    eval_dataset=ds_tok["test"],
    tokenizer=tok,                             # for proper save/load
)
trainer.train()
compute_metrics의 사용자 정의 평가지표·python
import numpy as np
from transformers import Trainer
from sklearn.metrics import accuracy_score, precision_recall_fscore_support

def compute_metrics(pred):
    labels = pred.label_ids
    preds = pred.predictions.argmax(-1)
    p, r, f1, _ = precision_recall_fscore_support(labels, preds, average='macro')
    return {
        'accuracy': accuracy_score(labels, preds),
        'precision': p,
        'recall': r,
        'f1': f1,
    }

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=ds_tok['train'],
    eval_dataset=ds_tok['test'],
    tokenizer=tok,
    compute_metrics=compute_metrics,
)

# Now eval prints these metrics each epoch
trainer.evaluate()
체크포인트에서 학습 재개·python
from transformers import Trainer

# Trainer automatically saves checkpoints to output_dir/checkpoint-N/
# Resume from a specific one:
trainer.train(resume_from_checkpoint="./out/checkpoint-1500")

# Or resume from the latest:
trainer.train(resume_from_checkpoint=True)

# Push the trained model to the HF Hub (requires `huggingface-cli login`)
# trainer.push_to_hub("my-fine-tuned-distilbert")

External links

Exercise

작은 NLP 데이터셋을 하나 골라 봐. 약 1만 개 샘플인 rotten_tomatoes는 빠르게 시험하기 좋아. distilbert-base-uncased를 Trainer로 1에포크 미세 조정하고 compute_metrics로 정확도를 추가해. 학습이 끝난 뒤 평가 수치를 출력해 확인하고, 마지막 모델을 저장한 다음 AutoModelForSequenceClassification.from_pretrained('./out')로 다시 불러와.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.