8장. PEFT와 LoRA 학습
PEFT 기법 한눈에 보기
사진을 고치는 방법에도 여러 가지가 있습니다. 원본 위에 투명 필름을 덮어 그리기, 사진 사이에 작은 쪽지 끼우기, 사진 앞에 설명 카드 붙이기처럼요. PEFT 에도 "어디에 무엇을 붙여 학습하느냐"에 따라 여러 갈래가 있습니다. 이 과정에서 쓰는 것은 LoRA 와 QLoRA 입니다.
그림의 왼쪽 두 칸(LoRA, QLoRA)이 오늘 실습에서 쓰는 방법입니다. QLoRA 는 기반 모델 가중치를 4비트로 줄여(양자화) 얼려 두고, 그 위에 붙인 LoRA 어댑터만 학습합니다. 어댑터는 4비트로 줄이지 않습니다. 오른쪽 두 칸은 다른 갈래의 예입니다.
기법 비교
| 기법 | 학습하는 위치 | 핵심 생각 | PEFT 설정 클래스 |
|---|---|---|---|
| LoRA | 고른 선형층 옆 | 가중치의 변화량을 작은 행렬 두 개의 곱으로 나타낸다 | LoraConfig |
| QLoRA | 4비트 기반 모델 위의 LoRA | 기반 모델은 4비트로 저장·고정, LoRA 어댑터만 학습 | BitsAndBytesConfig + LoraConfig |
| Adapter | 블록 사이 | 작은 모듈을 끼워 넣는다 | 이 과정에서 쓰지 않음 |
| Prompt Tuning, P-Tuning | 입력 앞 | 학습 가능한 가상 토큰을 붙인다 | 이 과정에서 쓰지 않음 |
| Prefix Tuning | 층마다 앞쪽 | 층마다 prefix(머리말)를 붙인다 | 이 과정에서 쓰지 않음 |
| (IA)³ | 활성값 | 활성값의 크기만 조절한다 | 이 과정에서 쓰지 않음 |
| DoRA | LoRA 의 변형 | LoRA 를 크기와 방향으로 나눈다 | 이 과정에서 쓰지 않음 |
LLM 파인튜닝에서는 LoRA 와 QLoRA 가 널리 쓰입니다. 학습할 파라미터와 저장할 결과물이 작고, 필요하면 LoRA 를 기반 모델에 병합해 배포할 수도 있기 때문입니다.
짧은 예시
# 업무 5개를 맡길 때 저장 공간 견주기(실습에서 실제로 찍힌 크기를 쓴다)
base_mb = 1885 # 기반 모델 가중치(FP32) 크기, 실습 4의 출력
adapter_mb = 33.60 # 학습한 LoRA 어댑터 파일 크기, 실습 4의 출력
tasks = 5 # 말투 페르소나, 고객 상담, 요약 ... 같은 업무 수
full_ft = base_mb * tasks # 업무마다 모델 전체를 따로 저장
lora = base_mb + adapter_mb * tasks # 모델 하나 + 어댑터 5개
print(f"Full Fine-tuning: {full_ft:,.0f} MB") # 결과: Full Fine-tuning: 9,425 MB
print(f"LoRA : {lora:,.0f} MB") # 결과: LoRA : 2,053 MB이 코드가 뜻하는 것
사진관에서 손님 다섯 명의 요청을 받았을 때, 원본 사진을 다섯 장 새로 인화하는 경우와 원본 한 장에 필름 다섯 장을 보관하는 경우를 견준 코드입니다. 여기서 원본 사진이 base_mb, 필름 한 장이 adapter_mb 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
base_mb * tasks | 1,885 × 5 = 9,425 | 원본을 다섯 번 인화 |
base_mb + adapter_mb * tasks | 1,885 + 33.60 × 5 = 2,053 | 원본 하나와 필름 다섯 장 |
업무가 늘어날수록 차이는 더 벌어집니다. 업무 하나를 더할 때 Full Fine-tuning 은 1,885 MB, LoRA 는 33.60 MB 씩 늘어납니다.
주의할 점
- 어댑터는 자기가 학습된 기반 모델과 함께 써야 합니다. Qwen2.5-0.5B 로 학습한 어댑터를 다른 모델에 붙이면 층 크기가 맞지 않아 동작하지 않습니다.
- PEFT 기법마다 잘 맞는 과제가 다릅니다. 이 과정은 가장 널리 쓰이는 LoRA 와 QLoRA 만 직접 해 봅니다.