Fine-tuning
Fine-tuning
파인튜닝은 대규모 프리트레인된 모델을 특정 작업이나 도메인에 맞는 더 작은 데이터셋으로 학습을 이어가는 과정이에요. 예컨대 코딩 예제 데이터셋으로 파인튜닝하면 모델이 코딩을 더 잘하게 되죠. 파인튜닝은 랜덤 가중치로 시작하지 않는다는 점만 빼면 프리트레이닝과 동일해요. 그래서 컴퓨팅·데이터·시간이 훨씬 덜 든다는 장점이 있어요. 아래 튜토리얼에서는 Trainer로 대규모 언어 모델을 파인튜닝하는 과정을 살펴볼게요.
로그인
파인튜닝한 모델을 허브에 올리려면 사용자 토큰으로 허깅페이스 계정에 로그인해요.
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_epochs와per_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_strategy와save_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에서 찾을 수 있어요.
더 알아보기
- Quickstart — 파이프라인으로 시작하기
- Text generation — generate() API로 텍스트 만들기
- Installation — 환경별 설치 방법