:)

[LLM] LLM Fine-tuning: Unsloth 개요 본문

AI

[LLM] LLM Fine-tuning: Unsloth 개요

andre99 2025. 10. 4. 12:37

LLM Fine-tuning 기본 개념

  • 목적: 사전 학습된 LLM을 특정 도메인/태스크에 맞게 조정
  • 방식
    • SFT (Supervised Fine-Tuning): (입력, 정답) 쌍 학습 → 기본 성능 확보
    • LoRA / QLoRA: 전체 파라미터 대신 소수의 랭크 행렬만 학습 → 메모리&시간 절약

⇒ QLoRA: 4bit 양자화 + LoRA → 5~15GB VRAM으로도 대형 모델 튜닝 가능


강화학습(RL) 기반 Fine-tuning 필요성

  • 단순 SFT는 “좋은 답 vs 덜 좋은 답” 구분이 어려움
  • RLHF 계열은 reward 기반으로 모델을 더 정밀하게 조정
  • 전통 PPO 기반 RLHF는 보상 모델, 가치 모델이 따로 필요해 복잡&비용 큼

RL 기반 Fine-tuning 접근 방식

RL 기본 개념

  • RL의 목적: 좋은 결과를 더 자주 발생시키도록 학습하고 나쁜 결과를 덜 발생시키도록 조정
  • environment, state, action, reward 등의 개념이 존재

RLHF / PPO 방식

  • RLHF (Reinforcement Learning from Human Feedback): 사용자 피드백(좋아요/싫어요)을 바탕으로 보상 모델을 만들고 그 보상 모델을 학습의 기준으로 삼는 방식
  • PPO (Proximal Policy Optimization)
    • RLHF에서 자주 쓰이는 알고리즘
    • policy, reference, value function 등이 필요
    • 모델이 크게 변하지 않도록 클리핑 및 KL 제약을 사용
    → 하지만 PPO 방식은 보상 모델, 가치 모델, 참조 모델 등 여러 구성 요소가 필요하고 이들이 메모리/계산 비용을 크게 늘린다.

GRPO + RLVR: Unsloth 방식

Unsloth는 PPO 방식의 복잡함을 줄이고 효율성과 메모리 절약을 목표로 GRPO + RLVR 방식 채택

  • GRPO (Group Relative Policy Optimization)
  • : PPO의 가치 모델과 보상 모델을 제거하고 샘플링 통계를 이용해 상대적 우수 응답을 계산하는 방식
  • RLVR (Reinforcement Learning with Verifiable Rewards)
  • : 검증 가능한 보상 기능을 사용하는 방식 → 정답이 명확한 태스크(수학, 코드 실행 등)에서 안정적으로 보상을 줄 수 있음

⇒ GRPO는 메모리와 계산 복잡도를 크게 절감하면서도 실용적인 RL 기반 학습을 가능하게 한다.


GRPO 구조와 학습 절차

학습 절차 요약

  1. 샘플링: 여러 답변 생성
  2. 보상 평가: 정답 여부·형식 적합성 등으로 점수 부여
  3. advantage 계산: 평균 대비 얼마나 나은지 → Z-score 활용
  4. 정책 업데이트: 좋은 답 쪽 확률 ↑, 나쁜 답 쪽 확률 ↓
  5. 반복: 수백 스텝 후 모델이 점진적으로 개선

(세부 내용)

  1. 샘플링 (Multiple Generations): 입력 질문 하나에 대해 모델이 여러 개의 서로 다른 응답 생성
  2. 보상 평가 / 검증 (Reward & Verifier)보상 함수는 검증 결과 + 추가 기준 (형태, 길이 등) 에 기반한 점수 매김. 각 응답에 대해 보상 점수를 계산, verifier는 응답이 정답인지 여부 판단 (참/거짓)
  3. 평균보상 / 표준편차 계산이 통계치를 기반으로 각 응답의 advantage을 정규화
    A(yi) = (R(yi)−μ) / σ 형태로 계산됨.
    전체 응답의 보상 평균(µ), 표준편차(σ) 계산.
  4. 정책 업데이트 (Policy Gradient 스타일) ⇒ advantage가 양수면 그 응답 쪽 확률을 높이고, 음수면 낮추는 방향으로 학습. 각 응답에 대해 −A(yi)⋅log⁡πθ(yi∣x) 와 같은 형태의 loss 로 파라미터 업데이트
  5. 반복 & 수렴
    여러 입력-응답 쌍을 반복적으로 학습. 최소 300 스텝 정도 기다려야 보상 증가가 눈에 보인다고 제안. 더 많은 데이터나 더 많은 스텝이 필요할 수 있고 학습 결과는 초기 조건, 보상 함수 설계 등에 크게 좌우됨

보상 함수 & 검증자 (Reward / Verifier)

  • Verifier:점수 부여은 하지 않고, 단지 정/오 판별 기능
  • 응답이 정답인지 아닌지 판별 - 숫자 맞는가, 코드 실행 결과 맞는가 같은 검증
  • Reward Function:(정답이면 +3, 틀리면 –3; 답변이 너무 길면 패널티 등)
  • 검증 결과 + 추가 기준 (형식, 길이, 문체, 과잉 설명 여부 등) 조합하여 점수 할당
  • EX) Proximity-based Reward Function: 정답과의 거리/근접성 기반 점수 부여 방식

구현 세부사항, 메모리 절약, 시스템 통합 등

VRAM / 메모리 최적화 기법

GRPO 구현 시 메모리 사용을 절감하도록 여러 기법 사용함.

  • Gradient checkpointing + activation offloading: 중간 activation을 시스템 RAM으로 비동기 전환 → GPU 메모리 절약
  • 더 효율적인 선형 커널 구현: 기본 구현보다 메모리 사용 8배 절감
  • GPU / CUDA 메모리 공간 재활용 / 공유: Unsloth와 vLLM 간 메모리 중복 사용을 줄임
  • EX) 20K 컨텍스트 길이 + 8개 생성 응답의 경우 Unsloth 구현은 약 54.3 GB, 표준 구현은 510.8 GB 사용 → 약 90% 절감 효과

vLLM 통합 & 빠른 추론

  • Unsloth는 vLLM 과 통합하여 학습과 추론을 함께 수행 가능
  • vLLM은 빠른 토큰 처리 속도를 제공하며 Unsloth 내부와 중복되는 메모리 제거
  • 한 대의 A100 GPU에서 4000 tokens/s 수준
  • 중복 메모리 제거 덕분에 VRAM 절약 효과 큼 (Llama 3.1 8B 기준 약 5 GB 절감)

요구사항 / 권장 사양 / 주의사항

  • 최소 모델 크기 권장 → 1.5B 파라미터 이상 모델에 GRPO 적용 권장 (작은 모델은 thinking token 등을 잘 생성 못함)
  • VRAM 요구
    • QLoRA 4-bit 기준: 모델 파라미터 수 ≈ 필요한 VRAM 양
    • 문맥 길이가 길어질수록 VRAM 요구 증가
    • LoRA 16-bit 사용 시 VRAM 요구 최소 4배 증가
  • 학습 스텝 수 / 데이터 양
    • 최소 300 스텝 대기 → 보상이 증가하는 경향 관찰됨
    • 권장되는 데이터 행의 수: 최소 500개 정도
  • 지속 학습 가능: GRPO를 백그라운드에서 계속 돌릴 수 있음
  • 템플릿 / 채팅 형식 주의: 기본 모델이 “chat prompt template” 구조를 갖춰야 좋음
  • 디버깅 & 모니터링: Unsloth는 학습 손실 추적 & 보상 기록 기능 내장 → wandb와 같은 외부 툴 없이도 로그 확인 가능

Tutorial: Train your own Reasoning model with GRPO

  • 빠른 시작 & 설치: 준비된 Colab 노트북(Llama-3.1 8B, Phi-4 14B 등)로 실행하거나 로컬 설치 권장.
  • VRAM 감 잡기: “대략 모델 파라미터 수 ≈ 필요한 VRAM(GB)”으로 생각. Colab 무료 16GB GPU로 ~16B 파라미터까지 학습 예시.
  • 데이터 준비: GSM8K(초등 수학) 예시. 정답만 포함하고, 정답에 reasoning(풀이 과정)을 노출하지 않도록 구성. 모델에게는 <reasoning>…</reasoning><answer>…</answer> XML 포맷으로 사고+답변을 유도.
  • 보상 & 검증자(Reward/Verifier):
    • “각 프롬프트에 대해 여러 생성”을 만들고 다른 생성들의 평균 대비 성능을 평가.
    • 예시(이메일 자동화): 필수 키워드 포함 +1, 정답 일치 +1, 과도한 장문 −1, 수신자 이름 +1, 시그니처 +1 처럼 규칙 기반 점수 설계. 필요하면 외부 LLM을 평가지로 써서 “로봇같이 들리면 −3” 같은 규칙도 가능.
  • Train
    • 핵심 설정은 GRPOConfig로 제어: use_vllm, learning_rate, num_generations(프롬프트당 생성 개수), max_steps 등.
    • 신규 기법 스위치 제공: loss_type에 grpo, dr_grpo, dapo, bnpo 등, 그리고 epsilon, epsilon_high, delta로 GRPO 변형들 튜닝.
    • 최소 300 step 이상 돌리면 보상 상승이 보이기 시작(권장 더 길게).
  • 평가/저장/배포
    • 추론에서 reasoning을 보려면 학습한 LoRA를 로드해 테스트.
    • 저장은 16-bit 병합 저장, Hugging Face Hub 업로드, GGUF(ollama/llama.cpp 호환) 등 지원.

Memory Efficient RL

Unsloth는 vLLM과 메모리 공간을 공유하고, Standby 모드로 KV 캐시만 정리&재사용해 RL 중 메모리와 속도 모두 챙긴다. 긴 컨텍스트를 추가 VRAM 없이 1.2~1.7배로 늘리고, 학습도 빨라진다.

왜 메모리가 많이 드나?

RL(GRPO)은 생성(추론) + 학습을 번갈아 수행. 그래서 GPU 안에 추론 엔진(가중치+KV 캐시) + 2) 학습 엔진(가중치+활성/그라드/옵티마 상태)을 동시에 유지하므로 VRAM이 크게 든다. Unsloth는 vLLM 가중치 공간을 학습과 공유해 이중 적재를 피한다.

Standby 모드

  • RL은 Inference → Training → Inference → …로 번갈아 동작 ⇒ 두 모드의 메모리 공간을 재사용 가능.
  • vLLM의 sleep 모드를 활용하되 Unsloth는 가중치는 공유 유지하고 KV 캐시만 날리는 방식으로 조정한 모드를 제공(UNSLOTH_VLLM_STANDBY=1 환경변수).
  • 효과 예시
    • 컨텍스트 길이 1.2~1.7× 증가(추가 VRAM 없이). Qwen3-32B LoRA16-bit: 3,600→6,144; Llama-3.1-8B QLoRA: 42,000→47,500.
    • Colab 4B 실험: Standby 켜면 ~13–14.5GiB로 28–40min 학습이 안정적, 끄면 OOM(배치 1도 안 맞음). 약 2GiB(≈15%) 절감 케이스 보고.
    • H100 80GB 실험: 피크 메모리 9GiB 차이. 기존 TRL+LoRA 구성은 8B 모델 1024 토큰 한계였던 유사 설정에서, Unsloth는 32K 시퀀스까지 가능 예시.
  • GRPO는 샘플 표준편차가 필요해서 최소 2개 생성이 필수(advantage 계산식 이유).

RL Reward Hacking

대표적인 해킹 패턴 & 방어

  • Laziness: NumPy/Torch 등 고성능 라이브러리 불러서 속도 점수 뻥튀기 → 비표준 라이브러리 import 탐지로 차단.
  • Caching & Cheating: 전역 변수·캐시를 이용해 답을 미리 저장/재활용 → 거대 더미 행렬로 캐시 무력화, 여러 루프/라운드로 벤치마크.
  • Timing function 조작: 시간을 0으로 찍히게 타이머 수정 → exec 실행시 빈 dict로 locals/globals 제한, types.FunctionType(f.__code__, {})로 글로벌 접근 차단.

GSPO Reinforcement Learning

(GSPO = Group Sequence Policy Optimization)

Qwen 팀이 제안한 GRPO 변형. 토큰 단위 중요도를 주던 GRPO와 달리 시퀀스 전체의 likelihood 비율에 대해 importance를 부여해 advantage 적용 위치를 바꾼다.

핵심 차이

  • GRPO: (토큰별) log-prob ratio 행마다 advantage로 스케일 → 시퀀스 단위로 계산된 advantage를 토큰에 그대로 나눠 바르는 모양새가 됨.
  • GSPO: 먼저 시퀀스의 log-prob 비율을 합산/지수화해 시퀀스 ratio를 만들고 그 시퀀스 단위에 advantage를 곱해 갱신.

GRPOConfig에서 importance_sampling_level="sequence" 로 GSPO 활성화


RL — DPO, ORPO & KTO

Unsloth는 DPO/ORPO/KTO/PPO/GRPO 모두 호환. VRAM LoRA + gradient checkpointing으로 메모리 효율적으로 학습.

  • DPO: 좋은 답 vs 나쁜 답 확률 비율 학습. (직관적, 널리 쓰임)
  • ORPO: 참조 모델 없이 odds ratio로 선호 최적화. SFT+선호를 동시에.
  • KTO: KL divergence 기반 분포 최적화.

'AI' 카테고리의 다른 글

[Gen AI] Stable Diffusion  (0) 2025.09.07
[MCP] Introduction to Model Context Protocol  (0) 2025.06.30
[BE] ElasticSearch 개념 정리  (0) 2025.02.07
[CV] YOLO v3  (0) 2025.02.07
[Gen AI] Diffusion-based Video Generative Models  (2) 2025.01.09