LoRA와 QLoRA로 VRAM 부담 줄이기 – 미세조정(PEFT) 기술 #1

이번 글부터는 미세조정(Fine-tunning)에 대해 또 이야기를 해 보겠습니다. 최근 여러 가지 이유로 또다시 AI 모델을 다루고 있는데요, 이전에는 그냥 미세조정 모델을 실험해 봤다면 이번에는 조금 장기 기획으로 나만의 목표에 이르는 모델을 만들어 보고 있어요. 이 과정 중 미세조정 방법 중 개발 환경 조건에 실질적으로 영향을 미치는 LoRA(로라)에 대해 간단하게 정리해 보겠습니다.

대표적인 PEFT 방법 중 하나인 로라의 작동 원리를 정리하고, 4비트 양자화 기술을 결합하여 개인용 GPU 환경에서도 LLM 훈련을 할 수 있도록 QLoRA의 사용법까지 살펴보도록 하겠습니다.

LoRA와 QLoRA로 VRAM 부담 줄이기
LoRA와 QLoRA로 VRAM 부담 줄이기

LoRA와 QLoRA로 VRAM 부담 줄이기

대규모 언어 모델(LLM)을 특정 목적에 맞게 성능을 개선하는 가장 일반적인 방법이 미세조정(Fine-Tuning)입니다. 이는 데이터셋을 이용해 모델의 전체 또는 일부 가중치(파라미터)를 업데이트하는 훈련 과정이죠. 하지만 수십억 개의 파라미터를 가진 LLM을 미세조정한다는 것은 현실적으로 매우 어렵습니다.

LLM 미세조정 시 GPU의 VRAM(비디오 메모리)이 막대하게 필요한 이유를 정리하면 다음과 같아요.

  1. 모델 가중치 (Model Weights): 모델 자체를 메모리에 불러오는 데 필요한 공간입니다. 80억(8B) 파라미터 모델을 16비트 정밀도(FP16)로 불러올 경우, 약 16GB의 VRAM이 필요합니다.
  2. 그래디언트 (Gradients): 훈련 과정에서 각 가중치가 어느 방향으로 얼마나 업데이트되어야 하는지를 계산한 값입니다. 이는 모델 가중치와 거의 동일한 크기의 공간을 차지합니다. (16GB 추가)
  3. 옵티마이저 상태 (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 peftbitsandbytes

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 모델은 그대로 둔 채, 내가 원하는 특정 말투나 지식을 학습시킨 아주 작은 ‘커스터마이징 파일’을 만드는 기술입니다. 양자화된 로라 기술은 이 과정을 개인용 컴퓨터에서도 할 수 있도록 더 가볍게 만드는 기술이라고 간단하게 정리할 수 있겠네요.


답글 남기기