본문 바로가기

인공지능

DPO로 더 간편한 LLM 튜닝 – UNSLOTH를 활용한 구현 가이드

728x90
반응형

 

DPO (Direct Preference Optimization)란 무엇인가?

https://dalpo0814.tistory.com/62

DPO(Direct Preference Optimization)는 LLM(대규모 언어 모델)을 보다 간단하고 비용 효율적인 방식으로 사람의 선호에 맞게 조정할 수 있는 최신 튜닝 기법입니다. 전통적으로 사용되는 **RLHF(강화 학습을 통한 사람 피드백)**는 강력하지만 리워드 모델을 학습하고 이를 통해 강화 학습을 수행해야 하므로 리소스가 많이 필요하고 구현이 복잡합니다. 이에 비해 DPO는 리워드 모델 없이도 직접 모델을 최적화할 수 있는 방법을 제시합니다.

DPO는 Binary Cross Entropy Loss를 활용해 선호 응답과 비선호 응답의 확률을 비교하며, 선호 응답의 확률을 높이고 비선호 응답의 확률을 낮추는 방식으로 학습됩니다. 이를 통해 RLHF와 비슷한 결과를 도출하면서도 학습 구성과 자원 소모 측면에서 더 효율적인 접근을 가능하게 합니다.

반응형

UNSLOTH에서 DPO 구현하기

다음은 UNSLOTH에서 DPO를 구현하는 코드 예제입니다:

python
코드 복사
from unsloth import FastLanguageModel, PatchDPOTrainer from unsloth import is_bfloat16_supported PatchDPOTrainer() import torch from transformers import TrainingArguments from trl import DPOTrainer model, tokenizer = FastLanguageModel.from_pretrained( model_name = "unsloth/zephyr-sft-bnb-4bit", max_seq_length = max_seq_length, dtype = None, load_in_4bit = True, ) # 모델 패칭 및 LoRA 가중치 추가 model = FastLanguageModel.get_peft_model( model, r = 64, target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_alpha = 64, lora_dropout = 0, # 0으로 설정시 최적화됨 bias = "none", # 최적화된 설정 use_gradient_checkpointing = "unsloth", # 긴 컨텍스트를 위해 True 또는 "unsloth" random_state = 3407, max_seq_length = max_seq_length, ) # DPO 트레이너 설정 dpo_trainer = DPOTrainer( model = model, ref_model = None, args = TrainingArguments( per_device_train_batch_size = 4, gradient_accumulation_steps = 8, warmup_ratio = 0.1, num_train_epochs = 3, fp16 = not is_bfloat16_supported(), bf16 = is_bfloat16_supported(), logging_steps = 1, optim = "adamw_8bit", seed = 42, output_dir = "outputs", ), beta = 0.1, train_dataset = YOUR_DATASET_HERE, # eval_dataset = YOUR_DATASET_HERE, tokenizer = tokenizer, max_length = 1024, max_prompt_length = 512, ) dpo_trainer.train()

코드 설정에 대한 주요 정보 설명

  1. FastLanguageModel 및 PatchDPOTrainer: FastLanguageModel은 UNSLOTH에서 제공하는 모델 로딩과 최적화 기능을 담당하며, PatchDPOTrainer는 DPO 학습을 위한 패치를 수행합니다.
  2. is_bfloat16_supported(): 시스템에서 bfloat16을 지원하는지 확인하고 fp16과 bf16 설정을 자동으로 조정해줍니다.
  3. 모델 초기화: FastLanguageModel.from_pretrained()를 통해 모델과 토크나이저를 로드합니다. load_in_4bit는 메모리 효율성을 높이기 위한 4비트 양자화 설정입니다.
  4. LoRA 설정: get_peft_model()은 모델의 특정 모듈에 대해 LoRA(Low-Rank Adaptation) 가중치를 추가해 학습을 최적화합니다.
    • r 및 lora_alpha: LoRA의 Rank 및 Alpha 값으로, 모델 학습 성능과 자원 소모 사이의 균형을 조정합니다.
    • lora_dropout: 드롭아웃 비율로 0은 최적화된 성능을 의미합니다.
  5. DPOTrainer: DPOTrainer는 학습에 필요한 인자를 받으며, beta 값은 선호 데이터에 대한 민감도를 조정합니다.
  6. TrainingArguments:
    • per_device_train_batch_size 및 gradient_accumulation_steps: 모델의 배치 크기와 그라디언트 누적 설정으로, 메모리 사용량을 조절합니다.
    • num_train_epochs: 학습 반복 횟수.
    • optim: adamw_8bit은 메모리 효율성을 높이기 위해 8비트 Adam 옵티마이저를 사용합니다.
728x90

결론

DPO는 기존 RLHF의 복잡성과 비용을 크게 줄이면서도 사람의 선호도를 반영한 모델 튜닝을 가능하게 합니다. UNSLOTH에서 제공하는 최적화된 툴셋을 활용하면 DPO 학습을 보다 쉽게 구현할 수 있습니다.

728x90
반응형