왜 PEFT가 필요한가
대형 언어모델을 그대로 파인튜닝하려면 모든 가중치를 업데이트해야 한다. 문제는 메모리다. 모델 가중치뿐 아니라 그래디언트, 옵티마이저 상태, 중간 활성값까지 GPU에 올라간다. 모델이 커질수록 비용은 빠르게 증가한다.
PEFT(Parameter-Efficient Fine-Tuning)는 이 부담을 줄이는 방법이다. 핵심은 간단하다. 기반 모델은 동결하고, 아주 작은 추가 파라미터만 학습한다. Hugging Face의 PEFT 설명에서도 LoRA는 사전학습 모델의 가중치를 고정한 채 선형 계층에 작은 학습 행렬을 붙여 학습하는 방식으로 소개된다1.
| 구분 | 전체 파라미터 파인튜닝 | LoRA |
|---|---|---|
| 학습 대상 | 모든 가중치 | 추가 어댑터 일부 |
| GPU 메모리 | 매우 큼 | 훨씬 작음 |
| 저장 용량 | 모델 전체 저장 | 어댑터만 저장 가능 |
| 학습 속도 | 느리고 비쌈 | 상대적으로 빠름 |
| 기존 능력 보존 | 손상 위험 큼 | 기반 모델을 보존하기 쉬움 |
실무에서는 처음부터 전체 파인튜닝을 시도하기보다 LoRA로 작은 실험을 반복하는 편이 안전하다.
AI 생성 이미지
LoRA의 작동 방식
LoRA는 모델의 선형 계층에 저랭크 행렬을 추가한다. 쉽게 말해 기존 가중치 전체를 바꾸지 않고, "변화량"만 작은 행렬 두 개로 표현해 학습한다. 주로 어텐션 계층의 q_proj, v_proj에 적용하고, 필요하면 k_proj, o_proj, MLP 계층까지 확장한다.
실습에서 자주 보는 설정은 다음과 같다.
LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"]
)r은 LoRA가 표현할 수 있는 변화량의 크기다. 8이나 16에서 시작하는 경우가 많다. 값이 크면 복잡한 패턴을 더 잘 배울 수 있지만 메모리 사용량과 과적합 위험도 커진다. lora_alpha는 학습된 변화량을 얼마나 강하게 반영할지 정한다. 실무에서는 alpha = 2 * r을 출발점으로 삼기 쉽다2.
lora_dropout은 어댑터 학습 중 일부 연결을 무작위로 끊어 과적합을 줄인다. 데이터가 적으면 0.05~0.1 정도를 검토하고, 데이터가 충분히 크면 0에 가깝게 둘 수 있다. bias="none"은 보통의 출발점이다. bias까지 학습하면 표현력은 조금 늘 수 있지만, 학습 대상이 늘고 재현성이 복잡해진다.
target_modules는 가장 중요한 선택 중 하나다. q_proj, v_proj만 학습하면 가볍고 안정적이다. 지시 수행, 문체, 간단한 분류처럼 변화가 크지 않은 작업에 적합하다. 반대로 도메인 표현이나 복잡한 생성 패턴까지 바꾸고 싶다면 k_proj, o_proj 또는 더 많은 선형 계층을 포함할 수 있다. 단, 범위를 넓힐수록 검증셋 성능과 과적합을 더 자주 확인해야 한다.
QLoRA는 무엇을 더 줄이는가
LoRA도 기반 모델을 GPU에 올려야 한다. 7B 모델은 FP16 기준 가중치만 약 14GB가 필요하고, 70B 모델은 약 140GB가 필요하다. 여기에 학습 중 필요한 메모리가 추가된다. 그래서 "가중치는 동결했으니 충분히 가볍다"라고 보기 어렵다.
QLoRA는 이 병목을 더 줄인다. 기반 모델 가중치를 4비트로 저장하고, 그 위에서 역전파를 수행해 LoRA 어댑터만 학습한다. QLoRA 논문은 4비트로 양자화된 동결 모델을 통해 그래디언트를 흘려 LoRA 어댑터를 학습시키며, 65B 모델도 단일 48GB GPU에서 파인튜닝할 수 있음을 보였다3.
단순 계산으로 보면 FP16은 파라미터당 2바이트다. 7B는 약 14GB, 70B는 약 140GB다. 4비트는 파라미터당 0.5바이트이므로 순수 가중치 기준으로 7B는 약 3.5GB, 70B는 약 35GB까지 줄어든다. 실제로는 양자화 메타데이터, 활성값, LoRA 파라미터, 옵티마이저 상태가 추가되므로 이 숫자 그대로 끝나지는 않는다. 그래도 제한된 GPU에서 대형 모델 실험을 가능하게 만드는 차이다4.
QLoRA의 핵심 장치는 세 가지다. NF4는 모델 가중치가 0 근처에 많이 몰리는 특성을 고려한 4비트 표현 방식이다. double quantization은 양자화에 필요한 부가 정보까지 다시 압축해 메모리를 줄인다. paged optimizer는 학습 중 순간적으로 튀는 메모리 사용량을 완화해 OOM 위험을 낮춘다.
어댑터 저장, 교체, 병합 전략
LoRA와 QLoRA의 결과물은 보통 작은 어댑터 파일이다. 이 어댑터만 저장하면 기반 모델 하나에 여러 업무용 어댑터를 붙일 수 있다. 예를 들어 같은 7B 기반 모델에 고객센터용, 법무 검토용, 개발 문서용 어댑터를 따로 운영할 수 있다.
배포 방식은 두 가지다.
첫째, 어댑터 분리 배포다. 기반 모델은 그대로 두고 요청 목적에 따라 어댑터를 로드하거나 교체한다. 실험과 다중 도메인 운영에 유리하다. 대신 추론 서버가 어댑터 로딩과 버전 관리를 지원해야 한다.
둘째, 병합 배포다. 학습된 LoRA 가중치를 기반 모델에 합쳐 하나의 모델로 만든다. 배포 구조가 단순하고 추론 환경이 깔끔하다. 하지만 병합 후에는 어댑터를 쉽게 바꾸기 어렵고, 도메인별 모델 파일이 늘어날 수 있다.
실무 기준은 명확하다. 실험 단계에서는 어댑터를 분리해 빠르게 비교한다. 운영이 안정되고 하나의 목적만 수행한다면 병합을 검토한다. 어떤 방식을 택하든 기반 모델 버전, 토크나이저 버전, 어댑터 버전, 학습 데이터 버전을 함께 기록해야 한다. LoRA와 QLoRA는 단순한 비용 절감 기법이 아니라, 대형 모델을 현실적인 속도로 실험하고 운영하게 해주는 파인튜닝 전략이다.
참고
1LoRA and PEFT: Efficient Fine-Tuning · Hugging Face
2Fine-Tuning LLMs with LoRA and QLoRA in Python — A Complete Guide
3[2305.14314] QLoRA: Efficient Finetuning of Quantized LLMs
4QLoRA: 4-Bit Quantization for Memory-Efficient LLM Fine-Tuning
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.