본문 바로가기
인공지능 (기본 딥러닝)/딥러닝 스크래치 코드

[Huggingface Trainer, SFTTrainer, TrainingArguments 설명 및 코드]

by 애플파ol 2024. 10. 23.

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
)

위 사진과 같이 코드가 TrainingArguments가 적용이 됨