미세조정

미세조정 (Fine-tuning)

미세조정(fine-tuning)은 크고 사전 학습된 모델을 특정 작업이나 도메인에 맞는 작은 데이터셋으로 훈련을 계속하는 거예요. 예를 들어 코딩 예시 데이터셋으로 미세조정하면 모델이 코딩을 더 잘하게 돼요. 미세조정은 랜덤 가중치에서 시작한다는 점만 빼면 사전 학습과 동일해요. 그래서 계산·데이터·시간이 훨씬 덜 필요해요.

아래 튜토리얼은 [Trainer]로 대형 언어 모델을 미세조정하는 과정을 안내해요.

미세조정한 모델을 Hub에 올리려면 사용자 토큰으로 Hugging Face 계정에 로그인해요.

from huggingface_hub import login

login()

토큰화 (Tokenization)

데이터셋을 로드하고, 모델이 훈련할 텍스트 컬럼(아래 데이터셋에서는 horoscope)을 토큰화해요.

토크나이저는 모델 입력인 input_idsattention_mask를 만들어요. 모델의 forward 메서드는 input_idsattention_mask만 받으므로, 토큰화 후 horoscope 같은 컬럼을 없애려면 remove_columns를 설정해요.

  • truncation=Truemax_length를 설정하면 더 긴 시퀀스를 지정된 최대 길이로 잘라요.
  • [~datasets.train_test_split] 메서드로 모델을 평가할 테스트 분할을 만들어요.
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(
        batch["horoscope"],
        truncation=True,
        max_length=512,
    )

dataset = dataset.map(tokenize, batched=True, remove_columns=dataset.column_names)
dataset = dataset.train_test_split(test_size=0.1)

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

  • mlm=False로 설정하면 토큰을 무작위로 마스킹하지 않아요.
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)

모델 로드 (Loading a model)

미세조정할 사전 학습 체크포인트를 로드해요(모델 로드에 대한 자세한 내용은 Loading models 가이드 참조).

  • 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")

훈련 설정 (Training configuration)

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

훈련 기간: num_train_epochsper_device_train_batch_size는 훈련 기간과 배치 크기를 제어해요. learning_rate는 옵티마이저의 초기 학습률을 설정해요.

훈련 최적화:

  • 하드웨어가 지원하면(Ampere+ GPU) 빠른 혼합 정밀도 훈련을 위해 bf16=True를 설정해요. 그렇지 않으면 구형 하드웨어에서 fp16=True로 폴백해요.
  • gradient_accumulation_steps는 가중치를 업데이트하기 전에 여러 forward pass에 걸쳐 그래디언트를 누적해 더 큰 유효 배치 크기를 시뮬레이션해요.
  • gradient_checkpointing은 중간 활성화를 저장하는 대신 backward pass 중에 재계산해 계산과 메모리를 맞바꿔요. 메모리와 속도 사이의 절충안은 partial checkpointing을 참조해요.
  • gradient_checkpointing=True일 때 gradient_checkpointing_kwargs={"offload": True}를 설정하면 저장된 활성화를 핀된 호스트 메모리에 유지해 긴 시퀀스에서 GPU 메모리 사용을 줄여요. 절충안은 offloading the saved activations를 참조해요.
  • train_sampling_strategy="group_by_length"로 설정하면 비슷한 길이의 예시를 묶어 패딩을 줄여요. 프로세서 기반 멀티모달 데이터셋과 사전 계산된 길이는 group samples 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,
)

훈련 (Training)

필요한 모든 구성 요소로 [Trainer] 인스턴스를 만든 다음, [~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()

[~Trainer.push_to_hub]은 미세조정된 가중치, 생성 설정, 토크나이저, 모델 설정을 Hub에 업로드해요.

다음 단계

  • Trainer features 가이드에서 커스텀 손실 함수, 메모리 효율 평가, 체크포인트 등 일반적인 Trainer 기능의 최소 동작 예시를 읽어요.
  • Subclassing Trainer methods 가이드에서 새롭고 커스텀한 기능을 지원하기 위해 [Trainer] 메서드를 서브클래스화하는 방법을 읽어요.
  • Callbacks 가이드에서 로깅, 조기 중단, 기타 커스텀 동작을 위해 훈련 이벤트에 후킹하는 방법을 읽어요.
  • Data collators 가이드에서 샘플이 배치로 조립되는 방식을 커스터마이즈하는 방법을 읽어요.
  • transformers/examples/pytorch, notebooks, 또는 Resources > Task Recipes 섹션에서 텍스트·오디오·비전·멀티모달의 다양한 작업에 대한 추가 훈련 예시를 살펴봐요.

출처: Hugging Face Transformers — Fine-tuning

더 알아보기 (Learn more)

  • [Trainer] API 문서 — 훈련·평가 루프 전체 옵션
  • [TrainingArguments] API 문서 — 훈련 인자 전체 목록
  • Task Recipes — 작업별 훈련 예시