ML,DL,LangChain/01_MathForAi

PEFT와 LoRA

  • -

이번 포스트에서는 PEFT와 Unsloth에 대해서 살펴보자.

가볍게 파인튜닝을 할 것인가 프롬프팅을 개선할 것인가 살펴보는 것도 좋을것 같다.

 

LLM Fine Tuning

 

PEFT(Parameter Efficient Fine Tunning: 매개변수 효율적인 미세조정)

PEFT란 사전 학습된 대규모 언어 모델(LLM)과 신경망의 성능을 특정 작업 또는 데이터 세트에 대해 개선시키는 방법이다. 거대한 LLM을 fine tuning 한다는 것은 쉬운 일이 아니다.

PEFT는 작은 매개변수 세트를 학습시키고 대규모 사전 학습된 모델의 구조를 대부분 유지함으로써 시간과 컴퓨터 리소스를 절약한다.

전체 파인 튜닝 vs PEET 

구분 전체 파인튜닝 PEFT
메모리 사용량 매우 높음 낮음 (1/10)
학습 속도 느림 빠름 (2-3배)
저장 공간 ~50GB ~10MB
다중 태스크 어려움 쉬움 (어댑터 교체)

 

주요 PEFT 기법

1. LoRA(Low-Rank Adaption)

  • 원본의 가중치를 고정하고 저 차원 행렬을 학습시킴
  • 메모리 사용량: 전체 파인튜닝 대비 1/10 수준
  • 학습 파라미터: 전체의 0.1 ~ 1%

2. QLoRa(Quantized LoRA)

  • 4bit 양자화 -> LoRA : 이미 양자화한 모델(ex: unsloth/gemma-3n-E2B-it-unsloth-bnb-4bit)에 LoRA 적용
  • 더욱 적은 메모리로 대형 모델 학습 가능
  • 64B 모델도 단일 GPU에서 파인 튜닝 가능

 

Low-Rank 란?

연구 결과, 사전학습된 대규모 모델(LLM)을 파인튜닝할 때 가중치 변화는 "낮은 내재 차원(low intrinsic dimension)"을 가진다는 것이 밝혀졌다. 쉽게 말하면, 실제로 중요한 변화는 전체 차원보다 훨씬 작은 부분공간에서만 일어난다는 뜻이다. 따라서 전체보다는 일부의 차원만 최적화 하는 것이 LoRA의 목적이다. 그럼 어떤 차원을 대상으로 할 것인가?

Rank(계수)는 행렬의 독립적인 차원 수를 의미한다. 8×8 행렬의 full rank는 8이지만, 파인튜닝 시 가중치 변화는 실제로 rank=2 정도의 낮은 차원만 사용해도 충분하다는 이야기가 된다.

LoRA는 이 원리를 활용해서 큰 가중치 변화 ΔW(8×8)를 두 개의 작은 행렬(A: 8×2, B: 2×8)의 곱으로 표현한다. 파라미터 수가 64개에서 32개로 줄어들면서도 중요한 정보는 거의 그대로 유지됩니다!

예시: 8×8 = 64개 파라미터 → (8×2) × (2×8) = 16 + 16 = 32개 파라미터 (50% 절약)
실제 대형 모델에서는 파라미터가 엄청나게 많고 rank를 작게 설정해서 99% 이상의 파라미터를 절약할 수 있다.

🎯 LoRA 동작 방식 이해하기

 
고정된 가중치 (학습 안 함)
 
학습 가능한 가중치 (학습 함)

❌ 전체 파인튜닝 (Full Fine-tuning)

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
W (모든 파라미터 학습)

특징

  • ✖️ 모든 파라미터를 업데이트 - 수십억 개의 파라미터를 모두 학습
  • ✖️ 막대한 메모리 필요 - 수백 GB의 VRAM 요구
  • ✖️ 학습 시간 오래 걸림 - 며칠에서 몇 주 소요
  • ✖️ GPU 여러 개 필요 - 고가의 분산 학습 환경 필수
  • ✖️ 저장 공간 많이 차지 - 모델당 ~50GB 이상

✅ LoRA (Low-Rank Adaptation)

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
W₀ (고정)
+
 
 
 
 
 
 
 
 
A (rank=2)
×
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
B (rank=2)

특징

  • ✔️ 원본 가중치는 고정 - 사전학습된 지식 보존
  • ✔️ 저차원 행렬만 학습 - A와 B 두 개의 작은 행렬만 업데이트
  • ✔️ 메모리 1/10 수준 - 일반 GPU로도 대형 모델 학습 가능
  • ✔️ 단일 GPU로 가능 - RTX 3090, 4090 등으로 충분
  • ✔️ 어댑터만 저장 - 모델당 ~10MB로 여러 태스크 관리

 

 

Full Fine Tuning vs LoRA

 

LoRA 동작 방식

 

LoRA 적용 위치(예시)

LoRA는 트랜스포머 구조의 다양한 영역에 부착된다. 이 층들은 "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"로 정의 되어있다.

트랜스포머 레이어 구조(q_proj, k_proj, v_proj, o_proj)

🎯 Self-Attention Layer
Wq ✅ LoRA
Wk (선택)
Wv ✅ LoRA
Wo (선택)

 ⚙️ MLP (Feed-Forward) Layer

W_up (선택)
W_down (선택)

💡 일반적으로 Wq와 Wv에만 적용해도 충분한 성능!

학습 과정(Forward & Backward)

⬇️ 순전파 (Forward)

입력 x
W · x
❄️ 동결
+
B·A·x
🔥 학습
출력 → 다음 층

⬆️ 역전파 (Backward)

Loss
∂L/∂B, ∂L/∂A
✅ Gradient 계산 & 업데이트
∂L/∂W
❌ 업데이트 안 함
Gradient는 계산되지만
파라미터는 업데이트 안 됨!
 
 

LoRA 활용 방식

 

Low-Rank Adapter 동작 방식

🔧 LoRA 어댑터 활용 방식

하나의 모델로 여러 전문 태스크 수행하기

1
기본 모델 준비
🤖 Base Model (예: Llama-3 8B)
사전학습된 대규모 언어 모델 - 이 모델은 고정하고 재사용합니다
  • 한 번만 다운로드하면 됩니다
  • 가중치는 절대 수정하지 않음 - 원본 그대로 유지
  • ✅ 모든 어댑터가 이 모델을 공유합니다
2
태스크별 LoRA 어댑터 학습

각 특정 목적에 맞는 작은 어댑터를 따로 학습합니다

📝
회의록 요약
~10MB
회의 내용을 간결하게 정리하는 전문 모델
🧮
수학 문제 풀이
~10MB
수식 계산과 문제 해결에 특화
💻
코드 생성
~10MB
프로그래밍 언어별 코드 작성
🇰🇷
한국어 챗봇
~10MB
자연스러운 한국어 대화
  • ✅ 각 어댑터는 특정 태스크에만 집중하여 학습
  • ✅ 어댑터 크기가 작아서 저장 공간 거의 안 차지 (~10MB)
  • 단일 GPU로 몇 시간 안에 학습 가능
3
사용 시: 모델 + 어댑터 결합

필요한 태스크에 맞는 어댑터를 선택해서 붙입니다

Base Model
(고정)
+
LoRA 어댑터
(선택)
🎯 전문화된 모델 완성!
선택한 태스크에 최적화된 성능 발휘

💡 핵심 장점

  • 메모리 효율적: Base 모델 1개 + 작은 어댑터 여러 개
  • 빠른 전환: 어댑터만 바꾸면 다른 태스크로 즉시 전환
  • 쉬운 관리: 새 태스크가 생기면 어댑터만 추가 학습
  • 원본 보존: Base 모델은 항상 깨끗한 상태 유지
💡
실제 사용 예시

오전: "회의록 요약" 어댑터를 붙여서 회의 내용 정리
오후: "코드 생성" 어댑터로 바꿔서 프로그래밍 작업
저녁: "한국어 챗봇" 어댑터로 고객 상담

→ Base 모델(8GB)은 그대로 두고, 어댑터(10MB)만 교체하면 됩니다!

 

 

추론 방식 비교

🔗 분리 방식 (일반적)

입력 x
W · x
+
B·A·x
출력
✅ 장점
• LoRA 교체 가능
• 원본 보존
• 여러 작업 전환 가능
⚠️ 단점
• 계산 두 번 (약간 느림)

⚡ 병합 방식 (최적화)

사전 병합
W' = W + B×A
입력 x
W' · x
출력
✅ 장점
• 속도 빠름
• 오버헤드 없음
• 원본과 동일 구조
⚠️ 단점
• LoRA 교체 불가
💡 실전 팁:

여러 작업에 사용할 때는 분리 방식으로 LoRA를 바꿔가며 사용하고, 단일 작업에 최적화된 배포가 필요하면 병합 방식을 사용하세요!

 
 

Unsloth 활용

 

Unsloth

Unsloth는 LLM 파인 튜닝을 2~5배 빠르게 만들어주는 최적화 라이브러리이다..

UnSloth의 장점은 속도 최적화, 호환성, 사용 편의성을 들 수 있다.

  • 속도 최적화: Flash Attention 2 통합, 커널 최적화로 메모리 효율 개선, Gradient checkpointing 자동화
  • 호환성: Hugging Face transformers와 완벽하게 호환되며 Llama, Mistral 등 주요 모델을 지원하고 4bit는 물론 8bit 양자화 내장
  • 사용 편의성: 자동 최적화 설정이 가능하며 VRAM 사용량을 대폭 감소시킴. 한줄 코드로 모델을 로드할 수 있음

 

'ML,DL,LangChain > 01_MathForAi' 카테고리의 다른 글

LLM Agent 동작 시나리오  (0) 2025.10.18
CNN 발전사  (0) 2025.10.16
Tokenizer 학습 과정  (0) 2025.10.15
MLP  (0) 2025.10.15
순전파와 역전파  (0) 2025.10.14
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.