Fine-tuning

Fine-tuning

파인튜닝은 대규모 프리트레인된 모델을 특정 작업이나 도메인에 맞는 더 작은 데이터셋으로 학습을 이어가는 과정이에요. 예컨대 코딩 예제 데이터셋으로 파인튜닝하면 모델이 코딩을 더 잘하게 되죠. 파인튜닝은 랜덤 가중치로 시작하지 않는다는 점만 빼면 프리트레이닝과 동일해요. 그래서 컴퓨팅·데이터·시간이 훨씬 덜 든다는 장점이 있어요. 아래 튜토리얼에서는 Trainer로 대규모 언어 모델을 파인튜닝하는 과정을 살펴볼게요.

출처: Fine-tuning · Hugging Face Transformers

로그인

파인튜닝한 모델을 허브에 올리려면 사용자 토큰으로 허깅페이스 계정에 로그인해요.

from huggingface_hub import login

login()

토크나이제이션

데이터셋을 불러오고, 모델이 학습할 텍스트 컬럼(아래 데이터셋에서는 horoscope)을 토크나이즈해요.

from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorForLanguageModeling

model_name = "Qwen/Qwen3-0.6B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
dataset = load_dataset("karthiksagarn/astro_horoscope", split="train")

def tokenize(batch):
    return tokenizer(

데이터 콜레이터는 데이터셋 샘플을 모델이 처리할 배치로 조립해요. DataCollatorForLanguageModeling은 데이터셋의 모든 시퀀스를 같은 길이로 패딩하는 대신, 각 배치를 그 배치에서 가장 긴 시퀀스 길이로 동적으로 패딩해요. 불필요한 패딩 토큰을 계산하지 않아서 컴퓨팅과 메모리를 아껴요.

  • 토큰을 랜덤 마스킹하지 않으려면 mlm=False를 설정해요.
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)

모델 불러오기

파인튜닝할 프리트레인 체크포인트를 불러와요.

  • dtype="auto"로 설정하면 가중치를 저장된 dtype 그대로 불러와요. 이게 없으면 PyTorch가 torch.float32로 가중치를 불러와서, 원래 가중치가 torch.bfloat16이라면 메모리 사용량이 두 배로 늘어나요.
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer

model_name = "Qwen/Qwen3-0.6B"
model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto")

학습 구성

TrainingArguments는 학습 실행을 커스터마이즈하는 모든 옵션을 제공해요. 여기서는 가장 흔한 인자만 다룰게요. 나머지는 합리적인 기본값이 있거나 분산 학습 같은 특정 시나리오에서만 관련이 있어요. 전체 인자 목록은 TrainingArguments API 문서를 참고해요.

  • num_train_epochsper_device_train_batch_size는 학습 기간과 배치 크기를, learning_rate는 옵티마이저의 초기 학습률을 정해요.
  • 하드웨어가 지원한다면(Ampere+ GPU) 빠른 혼합 정밀도 학습을 위해 bf16=True를 써요. 오래된 하드웨어라면 fp16=True로 대체해요.
  • gradient_accumulation_steps는 여러 포워드 패스에 걸쳐 그라디언트를 누적한 뒤 가중치를 갱신해서 더 큰 유효 배치 크기를 흉내 내요.
  • gradient_checkpointing은 backward 패스 도중 중간 활성화를 저장하지 않고 재계산해서 컴퓨팅을 메모리와 맞바꿔요. 저장된 활성화를 오프로딩하는 선택지도 있어요.
  • train_sampling_strategy="group_by_length"로 비슷한 길이의 예시를 함께 묶어 패딩을 줄일 수 있어요.
  • eval_strategysave_strategy는 학습 중 언제 모델을 평가하고 언제 체크포인트를 저장할지 정해요.
  • load_best_model_at_end는 학습이 끝났을 때 최고 체크포인트를 불러와요. eval_strategy가 설정돼 있어야 해요.
  • logging_steps는 학습 중 손실을 갱신·반환하는 빈도를 조절해요.
training_args = TrainingArguments(
    output_dir="qwen3-finetuned",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"every_n_layers": 4},
    bf16=True,
    learning_rate=2e-5,
    logging_steps=10,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
)

학습 실행

필요한 모든 구성 요소를 넣어 Trainer 인스턴스를 만들고 train()을 호출하면 학습이 시작돼요.

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    processing_class=tokenizer,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
)

trainer.train()
trainer.push_to_hub()

push_to_hub()는 파인튜닝된 가중치·생성 구성·토크나이저·모델 구성을 허브에 업로드해요.

다음 단계

  • Trainer 메서드를 서브클래싱해 새로운 기능을 지원하려면 Subclassing Trainer methods 가이드를 읽어요.
  • 로깅·조기 종료 같은 커스텀 동작은 Callbacks 가이드를, 샘플을 배치로 조립하는 방식은 Data collators 가이드를 참고해요.
  • 텍스트·오디오·비전·멀티모달 작업의 추가 예시는 transformers/examples/pytorch, notebook, Resources > Task Recipes에서 찾을 수 있어요.

더 알아보기