LLM,MLLM,LMM 등의 모델등의 발달로 인해 Training을 좀더 편하게 할 수 있는 Trainer, SFTTrainer 방법이 주로 사용된다.
► Trainer와 SFTTrainner 는 Transformers 모듈 내부의 학습하는 class이다.
Feature | Trainer | SFTTrainer (Supervised fine-tuning of pre-trained models) |
Purpose | General –purpose training from scratch | Supervised fine-tuning of pre-trained models |
Customization | Highly customizable | Simpler interface with fewer options |
Training workflow | Handles complex workflow | Streamlined workflow |
Data requirements | Large datasets | Smaller datasets |
Memory Usage | Higher | Lower with PEFT and packing optimizations |
Training speed | Slower | Faster with smalller datasets and shorter times |
( [Ref] https://medium.com/@sujathamudadla1213/difference-between-trainer-class-and-sfttrainer-supervised-fine-tuning-trainer-in-hugging-face-d295344d73f7)
→ Trainer 선택 : 데이터 세트가 크고, 복잡한 학습 workflow 가 필요할 때
→ SFTTrainer 선택 : 사전 학습된 모델과 비교적 작은 데이터 세트가 있고, 효율적인 메모리 사용을 통해 빠른 미세 조정을 수행할 때
► Trainer 주요 파라미터 및 사용법
➢ Trainer 사용법
'''
evalution compute_metrics 선언
'''
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
def compute_metrics(pred):
labels = pred.label_ids
preds = pred.predictions.argmax(-1)
precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='binary')
acc = accuracy_score(labels, preds)
return {
'accuracy': acc,
'f1': f1,
'precision': precision,
'recall': recall
}
'''
모델 선언
'''
from transformers import Trainer, BertForSequenceClassification
from torch import nn
# 사용자 정의 모델 (BertForSequenceClassification 상속)
class CustomModel(BertForSequenceClassification):
def forward(self, input_ids, attention_mask=None, labels=None):
outputs = super().forward(input_ids, attention_mask=attention_mask, labels=labels)
logits = outputs.logits
# 사용자 정의 손실 함수
if labels is not None:
loss_fct = nn.BCEWithLogitsLoss() # 예: 이진 분류를 위한 손실 함수
loss = loss_fct(logits, labels)
outputs = (loss,) + outputs[1:]
return outputs
# 사용자 정의 모델 사용
model = CustomModel.from_pretrained("bert-base-uncased", num_labels=2)
'''
Trainer를 사용하여 모델 학습 및 평가
'''
from transformers import Trainer
#initialize Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset['train']
eval_dataset=dataset['validation']
compute_metrics=compute_metrics,
data_collator=data_collator,
tokenizer=tokenizer
)
# 모델 학습
trainer.train()
# 모델 저장
trainer.save_model()
# 모델 평가
metrics = trainer.evaluate()
✓ 추가적으로 → Training_args, compute_metrics 는 선언해줘야함.
✓Train loss의 위치는? → Train dataset에 대한 loss계산은 model 내부에서 선언이 되어 있음.
➢ Trainer 주요 파라미터
model : 학습시킬 모델
args : training arguments (학습 관련된 세부 파라미터 설정)
train_dataset : train dataset을 사용하여 모델 학습
eval_dataset : 학습중 validation dataset을 사용하여 모델 평가
compute_metrics : evaluation metric을 계산하는 함수 (선언해줘야함.)
data_collator: - data_collator를 사용하여 batch 단위로 데이터를 처리, 선언안하면 default data_collator 사용
- data_collator = DataCollatorWithPadding(tokenizer=tokenizer) 하면 배치 내에서 데이터의 길이를 맞추는 padding을 적용.
tokenizer : 입력 받은 데이터에 대해 전처리 수행(토크나이징), (이미 전처리가 수행되어 있다면 필요없음.)
► SFTTrainer 주요 파라미터 및 사용법
'''
Parameter-Efficient Fine Tuing 선언
'''
from peft import LoraConfig
peft_config = LoraConfig(
r=8, # 로우랭크 행렬의 차원
lora_alpha=32, # LoRA 학습률 제어
lora_dropout=0.1, # Dropout 비율
bias="none", # bias 설정
task_type="CAUSAL_LM" # 태스크 타입 (언어 모델링)
)
'''
Trainer를 사용하여 모델 학습 및 평가
'''
from trl import SFTTrainer
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=dataset['train'],
eval_dataset=dataset['validation'],
compute_metrics=compute_metrics,
data_collator=data_collator,
tokenizer=tokenizer,
peft_config=peft_config
)
# 모델 학습
trainer.train()
# 모델 저장
trainer.save_model()
# 모델 평가
metrics = trainer.evaluate()
✓ 추가적으로 → Training_args, compute_metrics, peft_config(경량화) 는 선언해줘야함.
✓Train loss의 위치는? → Train dataset에 대한 loss계산은 model 내부에서 선언이 되어 있음.
➢ SFTTrainer 주요 파라미터
model : 학습시킬 모델
args : training arguments (학습 관련된 세부 파라미터 설정)
train_dataset : train dataset을 사용하여 모델 학습
eval_dataset : 학습중 validation dataset을 사용하여 모델 평가
compute_metrics : evaluation metric을 계산하는 함수 (선언해줘야함.)
data_collator: - data_collator를 사용하여 batch 단위로 데이터를 처리, 선언안하면 default data_collator 사용
- data_collator = DataCollatorWithPadding(tokenizer=tokenizer) 하면 배치 내에서 데이터의 길이를 맞추는 padding을 적용.
tokenizer : 입력 받은 데이터에 대해 전처리 수행(토크나이징), (이미 전처리가 수행되어 있다면 필요없음.)
peft_config (Parameter-Efficient Fine Tuing) : 모델 전체의 파라미터 학습이 아닌, 일부 파라미터만 학습하는 기법 적용.
► TrainingArguments 사용법
https://huggingface.co/docs/transformers/v4.19.2/en/main_classes/trainer#transformers.TrainingArguments를 클릭하면 자세한 파라미터에 대한 인자들을 확인 할 수 있다.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir='./results', # output directory
num_train_epochs=3, # total number of training epochs
per_device_train_batch_size=16, # batch size per device during training
per_device_eval_batch_size=64, # batch size for evaluation
warmup_steps=500, # number of warmup steps for learning rate scheduler
weight_decay=0.01, # strength of weight decay
logging_dir='./logs', # directory for storing logs
learning_rate=5e-5, # learning rate
)
'인공지능 (기본 딥러닝) > 딥러닝 스크래치 코드' 카테고리의 다른 글
[wandB 사용법] wandb사용으로 파라미터 최적화 (4) | 2024.11.07 |
---|---|
[Pytorch 스크래치 코드] Evaluation 코드 (0) | 2023.12.28 |
[Pytorch 스크래치 코드] 회귀문제 Train, Validation 함수 (1) | 2023.12.17 |
[Pytorch 스크래치 코드] 분류문제 Train, Validation 함수 (0) | 2023.12.16 |
[Pytorch 스크래치 코드] Train Test split (1) | 2023.12.10 |