:)
[LLM] LLM Fine-tuning: Unsloth 개요 본문
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 제약을 사용
GRPO + RLVR: Unsloth 방식
Unsloth는 PPO 방식의 복잡함을 줄이고 효율성과 메모리 절약을 목표로 GRPO + RLVR 방식 채택
- GRPO (Group Relative Policy Optimization)
- : PPO의 가치 모델과 보상 모델을 제거하고 샘플링 통계를 이용해 상대적 우수 응답을 계산하는 방식
- RLVR (Reinforcement Learning with Verifiable Rewards)
- : 검증 가능한 보상 기능을 사용하는 방식 → 정답이 명확한 태스크(수학, 코드 실행 등)에서 안정적으로 보상을 줄 수 있음
⇒ GRPO는 메모리와 계산 복잡도를 크게 절감하면서도 실용적인 RL 기반 학습을 가능하게 한다.
GRPO 구조와 학습 절차
학습 절차 요약
- 샘플링: 여러 답변 생성
- 보상 평가: 정답 여부·형식 적합성 등으로 점수 부여
- advantage 계산: 평균 대비 얼마나 나은지 → Z-score 활용
- 정책 업데이트: 좋은 답 쪽 확률 ↑, 나쁜 답 쪽 확률 ↓
- 반복: 수백 스텝 후 모델이 점진적으로 개선
(세부 내용)
- 샘플링 (Multiple Generations): 입력 질문 하나에 대해 모델이 여러 개의 서로 다른 응답 생성
- 보상 평가 / 검증 (Reward & Verifier)보상 함수는 검증 결과 + 추가 기준 (형태, 길이 등) 에 기반한 점수 매김. 각 응답에 대해 보상 점수를 계산, verifier는 응답이 정답인지 여부 판단 (참/거짓)
- 평균보상 / 표준편차 계산이 통계치를 기반으로 각 응답의 advantage을 정규화
A(yi) = (R(yi)−μ) / σ 형태로 계산됨.
전체 응답의 보상 평균(µ), 표준편차(σ) 계산. - 정책 업데이트 (Policy Gradient 스타일) ⇒ advantage가 양수면 그 응답 쪽 확률을 높이고, 음수면 낮추는 방향으로 학습. 각 응답에 대해 −A(yi)⋅logπθ(yi∣x) 와 같은 형태의 loss 로 파라미터 업데이트
- 반복 & 수렴
여러 입력-응답 쌍을 반복적으로 학습. 최소 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 |