미세조정
미세조정 (Fine-tuning)
미세조정(fine-tuning)은 크고 사전 학습된 모델을 특정 작업이나 도메인에 맞는 작은 데이터셋으로 훈련을 계속하는 거예요. 예를 들어 코딩 예시 데이터셋으로 미세조정하면 모델이 코딩을 더 잘하게 돼요. 미세조정은 랜덤 가중치에서 시작한다는 점만 빼면 사전 학습과 동일해요. 그래서 계산·데이터·시간이 훨씬 덜 필요해요.
아래 튜토리얼은 [Trainer]로 대형 언어 모델을 미세조정하는 과정을 안내해요.
미세조정한 모델을 Hub에 올리려면 사용자 토큰으로 Hugging Face 계정에 로그인해요.
from huggingface_hub import login
login()
토큰화 (Tokenization)
데이터셋을 로드하고, 모델이 훈련할 텍스트 컬럼(아래 데이터셋에서는 horoscope)을 토큰화해요.
토크나이저는 모델 입력인 input_ids와 attention_mask를 만들어요. 모델의 forward 메서드는 input_ids와 attention_mask만 받으므로, 토큰화 후 horoscope 같은 컬럼을 없애려면 remove_columns를 설정해요.
truncation=True와max_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_epochs와 per_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_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,
)
훈련 (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 섹션에서 텍스트·오디오·비전·멀티모달의 다양한 작업에 대한 추가 훈련 예시를 살펴봐요.
더 알아보기 (Learn more)
- [
Trainer] API 문서 — 훈련·평가 루프 전체 옵션 - [
TrainingArguments] API 문서 — 훈련 인자 전체 목록 - Task Recipes — 작업별 훈련 예시