728x90
728x90
이제 학습 코드 !!
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="your-model", # 학습 결과(모델, 체크포인트 등)가 저장될 디렉터리 경로
learning_rate=2e-5, # 옵티마이저에 전달되는 학습률(learning rate)
per_device_train_batch_size=16, # 각 디바이스(예: GPU)별 학습 배치 사이즈
per_device_eval_batch_size=16, # 각 디바이스(예: GPU)별 평가(검증) 배치 사이즈
num_train_epochs=2, # 훈련 데이터셋을 몇 번(에폭) 반복할지 설정
weight_decay=0.01, # 옵티마이저의 weight decay(가중치 감쇠) 계수
eval_strategy="epoch", # 평가(검증) 주기: 'epoch'이면 매 에폭마다 평가함
save_strategy="epoch", # 체크포인트 저장 주기: 'epoch'이면 매 에폭마다 저장
load_best_model_at_end=True, # 훈련이 끝난 후 검증 성능이 가장 좋은 체크포인트를 불러올지 여부
push_to_hub=True, # 모델을 Hugging Face Hub에 자동으로 업로드할지 여부
)
이제 Trainer를 통해 데이터, 모델, 토크나이저, 콜레이터, 메트릭 등 다 연결해주면 된다.
from transformers import Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
tokenizer=tokenizer,
data_collator=data_collator,
compute_metrics=compute_metrics,
)
trainer.train()
특정 체크포인트에서 학습을 시작할 도 있다.
# 최신 체크포인트에서 재개
trainer.train(resume_from_checkpoint=True)
# 출력 디렉토리에 저장된 특정 체크포인트에서 재개
trainer.train(resume_from_checkpoint="your-model/checkpoint-1000")
Trainer에서 다양한 기능을 오버라이드 해서 수정 및 기능 추가가 가능하다.
from torch import nn
from transformers import Trainer
class CustomTrainer(Trainer):
def compute_loss(self, model, inputs, return_outputs=False):
labels = inputs.pop("labels")
# 순방향 전파
outputs = model(**inputs)
logits = outputs.get("logits")
# 서로 다른 가중치로 3개의 레이블에 대한 사용자 정의 손실을 계산
loss_fct = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 2.0, 3.0], device=model.device))
loss = loss_fct(logits.view(-1, self.model.config.num_labels), labels.view(-1))
return (loss, outputs) if return_outputs else loss
여기서 comput loss를 수정한 것을 볼 수 있다.
weight=torch.tensor([1.0, 2.0, 3.0] 은 각 클래스별 패널티를 다르게 줘서 데이터 불균형이 있거나, 특정 클래스 정밀도가 더 중요할 때 사용한다.
fine-tuning하기
데이터부터 받아주기
from datasets import load_dataset
dataset = load_dataset("yelp_review_full")
dataset["train"][100]
{'label': 0,
'text': 'My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\\nThe cashier took my friends\'s order, then promptly ignored me. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\'s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for \\"serving off their orders\\" when they didn\'t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\\nThe manager was rude when giving me my order. She didn\'t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\\nI\'ve eaten at various McDonalds restaurants for over 30 years. I\'ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!'}
이제 데이터 길이를 맞춰준다.
근데 이건 토크나이저 max_length 길이에 맞추기에 효율적으로 보이진 않지만 뭐...
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
이제 데이터 나누기
small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))
모델을 가져온다.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)
체크포인트 저장할 위치를 지정하고, 나머지는 기본 하이퍼파라미터를 사용
from transformers import TrainingArguments
training_args = TrainingArguments(output_dir="test_trainer")
훈련 중간 중간 사용할 평가를 만들어야 한다.
import numpy as np
import evaluate
metric = evaluate.load("accuracy")
metric에서 compute를 호출하여 예측의 정확도를 계산하기에 예측을 compute에 전달하기 전에 예측을 로짓으로 변환해야 함
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
evaluation을 만들었으니 argument에도 추가해준다.
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir="test_trainer", eval_strategy="epoch")
이제 Trainer 객체 만들기!!
trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
compute_metrics=compute_metrics,
)
이러고 학습 돌리면 된다.
728x90
'인공지능 > 자연어 처리' 카테고리의 다른 글
| QA, SFT 데이터 셋 조사 (0) | 2025.11.27 |
|---|---|
| 허깅페이스 3 기초 - Audio Feature Extractors (0) | 2025.11.15 |
| 허깅페이스 1 기초 - 모델 부르기, 모델 공유하기, 모델 구성 요소 변경하기 (0) | 2025.11.12 |
| Embedding 모델 학습하기 - Sentence Transformer Trainer (0) | 2025.09.07 |
| LLM Pruning to Encoder - Large Language Models Are Overparameterized Text Encoders (2) | 2025.07.17 |