목차
이번 글부터는 미세조정(Fine-tunning)에 대해 또 이야기를 해 보겠습니다. 최근 여러 가지 이유로 또다시 AI 모델을 다루고 있는데요, 이전에는 그냥 미세조정 모델을 실험해 봤다면 이번에는 조금 장기 기획으로 나만의 목표에 이르는 모델을 만들어 보고 있어요. 이 과정 중 미세조정 방법 중 개발 환경 조건에 실질적으로 영향을 미치는 LoRA(로라)에 대해 간단하게 정리해 보겠습니다.
대표적인 PEFT 방법 중 하나인 로라의 작동 원리를 정리하고, 4비트 양자화 기술을 결합하여 개인용 GPU 환경에서도 LLM 훈련을 할 수 있도록 QLoRA의 사용법까지 살펴보도록 하겠습니다.

LoRA와 QLoRA로 VRAM 부담 줄이기
대규모 언어 모델(LLM)을 특정 목적에 맞게 성능을 개선하는 가장 일반적인 방법이 미세조정(Fine-Tuning)입니다. 이는 데이터셋을 이용해 모델의 전체 또는 일부 가중치(파라미터)를 업데이트하는 훈련 과정이죠. 하지만 수십억 개의 파라미터를 가진 LLM을 미세조정한다는 것은 현실적으로 매우 어렵습니다.
LLM 미세조정 시 GPU의 VRAM(비디오 메모리)이 막대하게 필요한 이유를 정리하면 다음과 같아요.
- 모델 가중치 (Model Weights): 모델 자체를 메모리에 불러오는 데 필요한 공간입니다. 80억(8B) 파라미터 모델을 16비트 정밀도(FP16)로 불러올 경우, 약 16GB의 VRAM이 필요합니다.
- 그래디언트 (Gradients): 훈련 과정에서 각 가중치가 어느 방향으로 얼마나 업데이트되어야 하는지를 계산한 값입니다. 이는 모델 가중치와 거의 동일한 크기의 공간을 차지합니다. (16GB 추가)
- 옵티마이저 상태 (Optimizer States): 훈련을 안정적이고 효율적으로 진행하기 위한 도구(예: AdamW 옵티마이저)가 사용하는 값입니다. 이는 가중치의 2배에 달하는 공간을 사용할 수 있습니다. (32GB 추가)
위 세 가지 요소를 종합하면, 8B 모델 하나를 본격적으로 미세조정하는 데 단순하게 계산해도 64GB 이상의 VRAM이 필요할 수 있습니다. 이는 일반적인 개인용 GPU(8GB~16GB)로는 시도조차 할 수 없는 수준이며, 고가의 전문가용 또는 서버용 GPU가 여러 장 필요한 영역이었습니다.
사실 다나와 같은 곳에서 그래픽카드의 VRAM이 12Gb 이상을 찾아보면 깝짝 놀라실 거예요. 컴퓨터 세트도 아니고 그래픽 카드하나가 상당한 가격임을 확인할 수 있을 테니까요. 그 만큼 개인이 인공지능 모델을 다룬다는 것은 큰 어려움이 있어요.
파라미터 효율적 미세조정(PEFT)
이러한 하드웨어의 한계를 극복하기 위한 방법 중 하나가 바로 PEFT(Parameter-Efficient Fine-Tuning), 즉 ‘파라미터 효율적 미세조정’입니다.
PEFT의 기본 개념은 간단합니다. 수십억 개의 파라미터를 모두 수정하는 대신, 기존 모델의 가중치는 그대로 두고(동결, Freeze), 아주 적은 수의 학습 가능한 파라미터만 추가하여 이 새로운 부분만 훈련하는 방식이죠.
- PEFT의 주요 장점
- VRAM 사용량 대폭 감소: 전체가 아닌 극히 일부(전체의 0.1% 미만)의 파라미터만 훈련하므로 그래디언트와 옵티마이저 상태에 필요한 VRAM이 크게 줄어듭니다.
- 원본 모델 보존: 원본 모델의 가중치를 변경하지 않으므로, 여러 작업을 위한 미세조정을 진행해도 ‘치명적 망각(Catastrophic Forgetting, 새로운 것을 배우며 기존 지식을 잊는 현상)’ 문제가 발생하지 않습니다.
- 빠른 작업 전환: 훈련 결과물이 매우 작아 저장과 관리가 용이하며, 여러 작업에 맞게 훈련된 결과물을 쉽게 교체하며 사용할 수 있습니다.
로라 (Low-Rank Adaptation)
수많은 PEFT 방법 중 현재 가장 널리 쓰이는 것이 로라(Low-Rank Adaptation)입니다.
로라의 작동 원리를 설명하자면, 조금 어려운 얘기지만 그냥 이런 게 있다 정도로 넘어갈게요.
LLM의 가중치는 거대한 숫자 행렬로 표현됩니다. 미세조정은 기존 가중치 행렬(W)에 변화량 행렬(ΔW)을 더하는 과정(W + ΔW)입니다. LoRA는 이 거대한 변화량 행렬(ΔW)을 직접 계산하는 대신, 이와 근사한 결과를 내는 두 개의 훨씬 작은 행렬(A와 B)로 분해하여 학습합니다. 즉,
ΔW ≈ B * A
와 같이 만드는 것
예를 들어, 1000×1000 크기의 행렬(파라미터 100만 개)을 업데이트하는 대신, 1000×8 크기의 행렬 A와 8×1000 크기의 행렬 B(총 파라미터 1만 6천 개)를 학습시키는 방식입니다. 이 작은 두 행렬(A, B)을 로라 ‘어댑터(Adapter)’라고 부릅니다.
로라의 장점과 한계
항목 | 장점 | 한계 |
메모리 | 파라미터 수를 대폭 줄여 VRAM 요구량 감소 | 가중치 자체는 16-bit 그대로여서 “아주” 큰 모델은 여전히 부담 |
학습 속도 | 경사 계산 대상이 적어 빠름 | 레이어 노멀라이제이션(LayerNorm)도 그대로 유지해야 하므로 코드 수정이 필요 |
성능 | 다수의 자연어·시각 과제에서 full fine-tuning과 거의 동등 | Rank가 낮으면 복잡한 과제에서 성능 열화 가능 |
QLoRA (Quantized 로라)
로라는 VRAM 요구량을 크게 줄였지만, 여전히 원본 모델(e.g., 16GB)을 VRAM에 올려야 한다는 부담이 있었습니다. 이 문제를 해결하며 개인용 GPU에서의 미세조정을 할 수 있도록 만든 기술이 바로 Quantized 로라입니다.
7B 모델 기준 | LoRA (16-bit) | QLoRA (4-bit) |
GPU 메모리(최대) | 약 12 GB | 약 5 GB |
추가 파라미터 | 0.5 % | 0.5 % |
공개 벤치마크(Vicuna) | 92.1 점 | 92.0 점 |
실험마다 수치는 다를 수 있지만, QLoRA는 동등한 성능을 유지하며 메모리 요구량을 절반 이하로 낮춰줍니다.
Hugging Face peft
와 bitsandbytes
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype="float16")
model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B", quantization_config=bnb_config)
lora_cfg = LoraConfig(r=8, target_modules=["q_proj","v_proj"], lora_alpha=16, lora_dropout=0.05)
model = get_peft_model(model, lora_cfg)
load_in_4bit=True
한 줄로 QLoRA 세팅을 활성화할 수 있습니다.- 최신
peft-0.9+
는 Paged AdamW와 NF4를 기본 지원합니다.
Quantized 로라의 등장으로 RTX 3090/4090과 같이 VRAM 24GB를 갖춘 개인용 고급 그래픽 카드에서 7B, 8B 모델, 심지어 더 큰 모델의 미세조정까지 가능해졌습니다. 다시 말하지만, 개인용이라고 했지만, 가격은 개인용이기엔 아직 까지 너무 먼 곳에 있어요. 그럼에도 이러한 기술의 등장은 더 이상 소수의 기업이나 연구소만이 아닌, 개인 개발자나 소규모 팀도 LLM을 자신들의 목적에 맞게 튜닝할 수 있는 기회를 만들어 주었다 할 수 있어요.
정리하자면, 로라는 거대한 원본 AI 모델은 그대로 둔 채, 내가 원하는 특정 말투나 지식을 학습시킨 아주 작은 ‘커스터마이징 파일’을 만드는 기술입니다. 양자화된 로라 기술은 이 과정을 개인용 컴퓨터에서도 할 수 있도록 더 가볍게 만드는 기술이라고 간단하게 정리할 수 있겠네요.
- 지식 증류(Knowledge Distillation) – AI 모델 경량화를 위한 방법 #1
- llama fine tuning 방법 #1 – gguf 파일 변환과 Ollama 모델 생성