인공지능 개발자 수다(유튜브 바로가기) 자세히보기

자연어처리/LLM을 위한 코딩

[LLM] 모델 학습 with Hugging Face (TrainingArguments, Trainer, trl) (5)

Suda_777 2025. 2. 13. 02:34

목차

    반응형

    1. 개요

    이번 포스팅에서는

    HuggingFace에서 제공하는

    프레임워크에 대해 소개하겠다.

    라이브러리 역할 주요 기능
    Transformers 모델, 토크나이저 AutoModel, AutoTokenizer 등
    Trainer 지도학습 (SFT) Trainer, TrainingArguments
    TRL 강화학습 (RLHF) PPOTrainer, SFTTrainer
    DeepSpeed GPU 메모리 최적화 ZeRO Stage, Hugging Face Trainer와 연동
    Accelerate 분산 학습 최적화 여러 GPU/TPU 환경에서 Trainer 가속화
    PEFT (Parameter Efficient Fine-Tuning) 파라미터 효율적 파인튜닝 기법 지원 LoraConfig, get_peft_model
    Evaluate 모델 평가 load_metric("bleu"), compute()

     

    세가지 단계에 걸쳐 학습을 진행한다.

    1. 학습 설정 (TrainingArguments)
    2. Trainer 설정
    3. 학습 실행

    2. TrainingArguments

    2.1. 설명

    TrainingArguments는 학습을 제어하는 핵심 설정을 담당하는 클래스 이다. (출처 : huggingface)

     

    2.1.1. 기본 학습 설정

    옵션 설명 기본값 설정추천
    output_dir 모델 체크포인트 저장 디렉토리 필수 V
    overwrite_output_dir 기존 체크포인트 엎어쓰기 여부 False  
    num_train_epochs 학습 에포크 수 3  
    max_steps 최대 학습 스탭(설정하면 num_train_epochs 무시) -1 (제한없음) V
    per_device_train_batch_size GPU당 학습 배치 크기 8 V
    per_device_eval_batch_size GPU당 평가 배치 크기 8 V
    gradient_accumulation_steps Gradient Accumulation 스탭 수 1  
    gradient_checkpointing Gradient Checkpointing 활성화 False  

     

    2.1.2. 평가(Evalueation) 및 로깅 설정

    옵션 설명 기본값 설정추천
    evaluation_strategy 평가 실행 시점 ("no", "steps", "epoch") "no" V
    eval_steps 평가를 수행할 스탭 간격 (사용시 evaluation_strategy="steps") 500  
    logging_dir TensorBoard 로그 저장 디렉토리 "runs"  
    logging_strategy 로깅 실행 시점 ("no", "steps", "epoch") "steps" V
    logging_steps 로그 출력 간격 (stpep 단위) 500  
    save_strategy 체크포인트 저장 주기 ("no", "steps", "epoch") "steps" V
    save_steps 체크포인트 저장 주기 (step 단위, ) 500  
    save_total_limit 저장할 체크포인트 개수 (최신 N개 유지) None  

     

    2.1.3. 옵티마이저 및 학습 스케줄링

    옵션 설명 기본값 설정추천
    learning_rate 학습률 5e-5  
    weight_decay L2 정규화 계수 0  
    adam_beta1 Adam 옵티마이저의 beta1 값 0.9  
    adam_beta2 Adam 옵티마이저의 beta2 값 0.99  
    adam_epsilon Adam 옵티마이저의 epsilon 값 1e-8  
    max_grad_norm Gradient Clipping 값 1.0  
    lr_scheduler_type 학습 스케줄러 (linear, cosine, constant, polynomial) "linear"  
    warmup_steps Warmup 스텝 수 0  
    warmup_ratio 전체 스탭 대비 Warmup 비율 0.0  

     

    2.1.4. Mixed Precision (FP16, BF16) 및 GPU 최적화

    옵션 설명 기본값 설정추천
    fp16 - True인 경우 가중치(weight), 활성화값(activation), 연산(operation)을 FP16 형식으로 변환
    - False인 경우 fp32 를 사용함

    - GPU가 FP16을 지원하는 경우 (NVIDIA Volta 이상) 사용
    - 16이 32 보다 적은 양의 메모리를 사용한다.
    False  
    bf16 - True인 경우 bf16 사용
    - False인 경우 fp32 를 사용함

    - NVIDIA Ampere (A100, RTX 30XX) 이상에서 학습할 때 bf16이 FP16보다 더 안정적
    - Gradient Scaling 없이도 사용 가능 → 모델 수렴이 더 쉬움
    - Ampere 이전의 GPU (V100, RTX 20XX, GTX 시리즈)에서는 지원되지 않음
    - FP16보다 메모리 절약 효과가 낮을 수도 있음
    False  
    fp16_opt_level - Apex AMP 최적화 레벨 ( "O0" , "O1", "O2", "O3")
    - 일반적으로 "O1"로 하는게 좋음
    "O1"  
    fp16_full_eval - 평가 시에 FP16 사용
    - 평가 속도를 높이고 싶은 경우
    False  
    half_precision_backend - "auto" : 별일 없으면 auto로 하자
    - "apex" : NVIDIA의 apex 라이브러리 사용 (수동 설치 필요)
    - "amp" : PyTorch의 기본 AMP (Automatic Mixed Precision) 사용
    "auto"  

     

    2.1.5. 분산 학습 & FSDP 설정

    기본적으로 GPU가 2개 이상일 때 사용한다.

    • GPU가 2개 이상 : FSDP / DDP
    • GPU가 8개 이상 : FSDP + ZeRO (DeepSpeed) 
    옵션 설명 기본값 설정추천
    ddp_backend - 멀티 GPU 분산 학습용
    - "nccl", "gloo", "mpi"
    "nccl"  
    fsdp - Fully Sharded Data Parallel 활성화
    - "full_shard", "auto_wrap", "offload"
    "None"  
    fsdp_offload_params CPU로 일부 파라미터 오프로딩 False  
    fsdp_transformer_layer_cls_to_wrap FSDP를 적용할 Transformer 레이어 클래스 이름 None  

     

    2.1.6. Checkpoint & Resume 설정

    옵션 설명 기본값 설정추천
    resume_from_checkpoint 체크포인트에서 학습 재개 None  
    save_on_each_node 노드마다 개별적으로 체크포인트 저장 False  

     

    2.1.7. TPU & Multi-GPU 관련 설정

    옵션 설명 기본값 설정추천
    tpu_num_cores TPU 코어 개수 None  
    dataloader_num_workers DataLoader의 병렬 처리 워커 수 0  
    dataloader_pin_memory DataLoader에서 GPU에 데이터를 핀(Pin)할지 여부 True  

     

    2.1.8. WandB, TensorBoard, Comet 로깅 설정

    옵션 설명 기본값 설정추천
    report_to 로깅할 서비스 ("wandb", "tensorboard", "comet_ml", "none") "none"  
    run_name 실험 이름 (WandB, TensorBoard 용) None  
    disable_tqdm True로 설정하면 tqdm 로그 출력 비활성화 False  

     


    2.2. 기본 사용법

    from transformers import TrainingArguments
    
    training_args = TrainingArguments(
        output_dir="./results",          # 모델 저장 경로
        evaluation_strategy="epoch",     # 평가 주기 (매 epoch마다 평가)
        save_strategy="epoch",           # 체크포인트 저장 주기
        per_device_train_batch_size=8,   # 학습 배치 크기
        per_device_eval_batch_size=8,    # 평가 배치 크기
        num_train_epochs=3,              # 학습 epoch 수
        weight_decay=0.01,               # L2 정규화 (Weight Decay)
        logging_dir="./logs",            # 로그 저장 경로
        logging_strategy="epoch",        # 로그 저장 주기
        save_total_limit=2,              # 저장할 체크포인트 개수 제한
        push_to_hub=False,               # 모델을 Hugging Face Hub에 업로드할지 여부
    )

     


    3. Trainer

    3.1. Trainer 설명

    transformers.Trainer는 Hugging Face의 transformers 라이브러리에서 제공하는 학습 도구로, 모델 학습을 편리하게 관리할 수 있다.

    Trainer 설정 (Trainer 설명 출처 링크)

    from transformers import Trainer
    
    trainer = Trainer(
        model=model,                    # 학습할 모델
        args=training_args,              # 학습 설정 (TrainingArguments)
        train_dataset=train_dataset,      # 학습 데이터셋 (Dataset 객체)
        eval_dataset=eval_dataset,        # 평가 데이터셋 (Dataset 객체)
        tokenizer=tokenizer,              # 토크나이저 (필요할 경우)
        data_collator=data_collator,      # 배치 데이터 처리 (옵션)
        compute_metrics=compute_metrics,  # 평가 지표 계산 (옵션)
    )

     

    학습 실행

    trainer.train()

     


    3.2. train() 추가 옵션

    체크포인트에서 다시 학습하기

    trainer.train(resume_from_checkpoint=True)

     

    모델 저장 및 로드

    trainer.save_model("./my_model")  # 모델 저장
    model = AutoModelForSequenceClassification.from_pretrained("./my_model")  # 저장된 모델 로드

     


    4. 커스텀 metric 추가

    • datasets.load_metric 에서 기본 metric 제공
    • compute_metrics 에 평가 함수 추가
    import numpy as np
    import evaluate  # 🤗 evaluate 라이브러리 사용
    
    accuracy = evaluate.load("accuracy")
    
    def compute_metrics(eval_pred):
        logits, labels = eval_pred
        predictions = np.argmax(logits, axis=-1)
        return accuracy.compute(predictions=predictions, references=labels)
    
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=tokenized_datasets["train"],
        eval_dataset=tokenized_datasets["test"],
        compute_metrics=compute_metrics,  # 평가 함수 추가
    )

     

    datasets.load_metric()에서 지원되는 metric 종류

    • accuracy (정확도)
    • f1 (F1-score)
    • precision (정밀도)
    • recall (재현율)
    • roc_auc (ROC AUC)
    • bleu (BLEU - 번역 성능 평가)
    • wer (Word Error Rate - 음성 인식 평가)
    • mse (Mean Squared Error - 회귀 문제)

     


    5. TRL

    TRL (Transformer Reinforcement Learning)은

    Hugging Face가 제공하는 강화학습(Reinforcement Learning) 기반 언어모델 트레이닝 라이브러리이다.

     

    다양한 trainer를 제공하고 있으며, 사용방법은 간단하기 때문에

    불러와서 사용하면 되겠다.

    아래 경로로 가서 확인해 보자

    • 왼쪽 목차 > API > Trainers > 원하는 trainer 클릭

    TRL 링크

     

    TRL - Transformer Reinforcement Learning

     

    huggingface.co

     

    trainer를 선택해 들어가면 아래와 같이

    실행할 수 있는 코드와

    파라미터를 정리해둔 문서가 있다.

     

    deepSpeed 부터는 다음 포스팅에서 설명하겠다.

     

     

    반응형