요즘 LLM을 내 데이터에 맞게 학습시키고 싶다는 분들이 정말 많아졌다. 그런데 GPU 메모리는 한정적이고, 풀 파인튜닝은 비용이 엄청나죠. 그래서 등장한 게 바로LoRA와QLoRA이다. 오늘은 이 두 기법을 실전에서 어떻게 활용하는지, 솔직한 경험을 바탕으로 정리해 보겠다.
LoRA와 QLoRA, 도대체 뭐가 다른 걸까?
1-1. LoRA(Low-Rank Adaptation)의 핵심 원리
LoRA는 2021년 Microsoft에서 발표한 기법으로, 모델의 전체 가중치를 업데이트하는 대신저랭크(low-rank) 행렬 두 개를 추가로 학습시키는 방식이다. 예를 들어, 원래 가중치 행렬이 4096×4096 크기라면, 이걸 직접 건드리지 않고 4096×16과 16×4096 크기의 작은 행렬 두 개만 학습다. 학습 파라미터 수가 극적으로 줄어들기 때문에 메모리와 시간을 크게 절약할 수 있다.
실제로 7B 모델 기준, 풀 파인튜닝에는 A100 80GB가 최소 2장 필요하지만, LoRA를 적용하면 단일 A100 하나로도 충분다. 학습 결과물도 원본 모델 용량이 아니라 수십 MB 수준의 어댑터 파일만 저장하면 되니까 관리도 편하죠.
1-2. QLoRA는 여기서 한 발 더 나간다
QLoRA는 2023년 워싱턴 대학에서 발표한 기법(NeurIPS Oral)으로, LoRA에4비트 양자화(quantization)를 결합한 것이다. 기본 모델을 4비트로 양자화해서 메모리에 올리고, 그 위에 LoRA 어댑터를 16비트(보통 bfloat16)로 학습다. 2026년 현재 기준으로 보면 이 조합 덕분에 7B 모델은 약 12GB, 13B 모델도 24GB 한 장(RTX 4090/5090)에서 파인튜닝할 수 있다. 개인 개발자에게는 사실상 게임 체인저이다.
핵심은 NF4(NormalFloat4)라는 데이터 타입과 이중 양자화(Double Quantization) 기법인데, 이론적 성능 손실을 최소화하면서 메모리를 극단적으로 줄여준다. bitsandbytes에서 load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.bfloat16 네 가지가 사실상 표준 설정이다.
1-3. 한눈에 보는 비교
| 항목 | 풀 파인튜닝 | LoRA | QLoRA |
|---|---|---|---|
| 학습 파라미터 수 | 전체 (100%) | 0.1~1% | 0.1~1% |
| 기본 모델 정밀도 | 16비트 | 16비트 | 4비트 |
| 7B 모델 최소 VRAM | ~120GB | ~24GB | ~12GB |
| 학습 속도 | 느림 | 빠름 | 보통 (양자화 오버헤드) |
| 성능 (품질) | 최고 | 매우 우수 | 우수 (소폭 하락 가능) |
| 저장 용량 | 전체 모델 | 어댑터만 (수십 MB) | 어댑터만 (수십 MB) |
| 개인 GPU 사용 가능 여부 | 사실상 불가 | 조건부 가능 | 충분히 가능 |
실전 환경 세팅과 학습 과정
2-1. 필수 라이브러리와 환경 구성
실전에서 가장 많이 쓰이는 조합은Hugging Face Transformers + PEFT + TRL + bitsandbytes이다. QLoRA를 쓸 거라면 bitsandbytes는 반드시 필요하고, 데이터셋 처리에는 datasets 라이브러리를 씁니다. 2026년 기준으로는 Unsloth를 같이 쓰는 게 거의 기본인데, 동일 품질로 학습 속도를 약 2배 올리면서 메모리는 70~80%까지 절감해 준다. Llama 3/3.1/3.2, Qwen3(MoE 포함), Gemma 3, Mistral, DeepSeek, Phi-4까지 폭넓게 지원하고, 무료 Colab GPU에서도 잘 돌아간다.
베이스 모델은 2026년 현역 기준으로 고르자. 라이선스가 유연한 Qwen3(Apache 2.0)·DeepSeek(MIT) 계열이 상업 활용과 파인튜닝 생태계가 가장 잘 갖춰져 있고, 한국어·다국어가 중요하면 Qwen3, 로컬 단일 GPU 위주라면 Gemma 3나 Qwen3 소형 모델이 무난하다. 2년 전 기준의 Llama 2 같은 구형 모델로 시작할 이유는 없다.
환경 구성 시 가장 중요한 건 CUDA 버전과 PyTorch 버전의 호환성이다. bitsandbytes가 특정 CUDA 버전에서만 작동하는 경우가 많아서, 처음 세팅할 때 여기서 시간을 많이 잡아먹다. 솔직히 말하면 Docker 이미지나 Unsloth 공식 노트북을 쓰는 게 정신 건강에 좋다.
아래는 PEFT + bitsandbytes로 QLoRA를 구성하는 실제 동작 코드의 핵심 부분이다.
2-2. 핵심 하이퍼파라미터 설정
LoRA 파인튜닝에서 가장 중요한 하이퍼파라미터는 세 가지이다:
- r (rank): 저랭크 행렬의 차원이다. 보통 8~64 사이를 씁니다. r이 클수록 표현력이 좋아지지만 메모리와 학습 시간이 늘어난다. 일반적인 태스크에는 16이면 충분하고, 복잡한 도메인 지식이 필요하면 32~64를 시도해 보자.
- alpha: 스케일링 팩터로, 보통 r의 2배로 설정다. alpha/r이 실제 학습률에 곱해지는 계수가 되기 때문에 이 비율이 중요다.
- target_modules: LoRA를 적용할 레이어를 지정다. Llama 계열이라면 q_proj, v_proj가 기본이고, 성능을 더 끌어올리고 싶으면 k_proj, o_proj, gate_proj, up_proj, down_proj까지 확장할 수 있다.
학습률은 풀 파인튜닝보다 높게 잡아야 다. 보통 1e-4 ~ 2e-4 범위가 잘 동작하고, 에포크는 데이터셋 크기에 따라 1~5 사이를 권장다. 과적합이 생각보다 빨리 오기 때문에 validation loss를 꼭 모니터링하자.
2-2-1. 알아두면 좋은 LoRA 변형들 (DoRA·rsLoRA)
2026년에는 기본 LoRA 외에 변형 기법들이 PEFT에 정식 포함돼 있다. DoRA(Weight-Decomposed Low-Rank Adaptation)는 가중치를 크기(magnitude)와 방향(direction)으로 분해해 LoRA보다 학습 안정성과 표현력을 높이면서도 추론 시 추가 비용이 없다. NVIDIA가 발표해 ICML 2024에 채택됐고, LoraConfig(use_dora=True) 한 줄로 켤 수 있다. rsLoRA(rank-stabilized LoRA)는 use_rslora=True로 활성화하며, rank가 클 때 스케일링을 안정화해 r을 키워도 성능이 무너지지 않게 해준다. 어렵게 생각하지 말고, 기본 LoRA로 먼저 돌려보고 품질이 아쉬울 때 DoRA나 rsLoRA를 옵션으로 켜 비교해 보면 된다.
2-3. 데이터셋 준비의 현실
솔직히 말하면,파인튜닝 성패의 80%는 데이터 품질에 달려 있다. 모델 크기나 하이퍼파라미터보다 훨씬 중요다. 제가 실제로 경험한 바로는, 잘 정제된 데이터 500개가 대충 모은 데이터 5,000개보다 성능이 좋았다.
데이터 포맷은 instruction-input-output 형태가 가장 보편적이고, 대화형 모델을 만들 때는 multi-turn conversation 형식을 씁니다. 중요한 건 실제 서비스에서 들어올 질문 패턴과 최대한 비슷한 데이터를 만드는 것이다.
실전에서 얻은 꿀팁 모음
3-1. 반드시 기억할 실전 팁 5가지
- 팁 1: Gradient Checkpointing을 항상 켜자.메모리를 20~30% 절약할 수 있다. 학습 속도가 약간 느려지지만, OOM(Out of Memory) 에러로 학습이 중단되는 것보다 백배 낫다.
- 팁 2: 처음에는 작은 데이터셋으로 오버피팅 테스트를 하자.데이터 50~100개로 먼저 학습시켜서 loss가 제대로 떨어지는지 확인다. 여기서 loss가 안 떨어지면 데이터 형식이나 토크나이저 설정에 문제가 있는 겁니다.
- 팁 3: QLoRA 사용 시 compute_dtype을 bfloat16으로 설정하자.float16보다 수치 안정성이 높아서 학습 중 NaN이 발생할 확률이 크게 줄어듭니다. Ampere 이상 GPU(RTX 30/40/50 시리즈, A100, H100 등)에서 지원다.
- 팁 4: LoRA 어댑터를 머지하기 전에 반드시 평가하자.머지 후에는 되돌리기 어렵다. 어댑터 상태에서 충분히 테스트하고, 만족스러우면 그때 merge_and_unload()를 호출하자.
- 팁 5: wandb나 tensorboard로 학습 과정을 꼭 기록하자.나중에 하이퍼파라미터를 비교할 때 과거 기록이 없으면 정말 막막다. 특히 여러 실험을 병렬로 돌릴 때 필수이다.
3-2. 자주 만나는 문제와 해결법
OOM 에러가 날 때:batch size를 1로 줄이고 gradient_accumulation_steps를 8~16으로 올리자. 그래도 안 되면 max_seq_length를 줄이거나, r 값을 낮추자. QLoRA로 전환하는 것도 방법이다.
Loss가 안 떨어질 때:데이터 포맷을 먼저 확인하자. 특히 특수 토큰(BOS, EOS, 구분자)이 제대로 들어가 있는지 점검해야 다. 학습률이 너무 낮은 것도 원인이 될 수 있다.
학습은 잘 됐는데 추론 결과가 이상할 때:추론 시 프롬프트 템플릿이 학습 시와 동일한지 확인하자. 이 부분에서 실수하는 경우가 생각보다 정말 많다.
LoRA vs QLoRA, 장단점 정리
4-1. 각 기법의 장단점
| 구분 | LoRA 장점 | LoRA 단점 |
|---|---|---|
| 메모리 | 풀 파인튜닝 대비 대폭 절감 | QLoRA 대비 2~3배 더 필요 |
| 속도 | 양자화 오버헤드 없이 빠름 | 큰 모델은 여전히 고가 GPU 필요 |
| 품질 | 풀 파인튜닝에 근접한 성능 | 극한 성능에는 한계 |
| 구분 | QLoRA 장점 | QLoRA 단점 |
|---|---|---|
| 메모리 | 소비자 GPU로도 대형 모델 학습 가능 | 양자화로 인한 미세한 정보 손실 |
| 속도 | 접근성이 극적으로 향상됨 | 양자화/역양자화 오버헤드로 약간 느림 |
| 품질 | 비용 대비 매우 우수한 성능 | LoRA 대비 소폭 성능 하락 가능 |
4-2. 상황별 선택 가이드
- 예산이 넉넉하고 최고 성능이 필요하다면:A100 이상 GPU에서 LoRA를 쓰자.
- 개인 GPU(RTX 4090 24GB / 5090 32GB)로 7B~13B 모델을 돌리고 싶다면:QLoRA가 사실상 표준 선택지이다. 7B는 약 12GB, 13B는 24GB 안에서 돌아간다.
- 프로토타이핑 단계라면:QLoRA로 빠르게 실험하고, 최종 모델만 LoRA나 풀 파인튜닝으로 전환하자.
- Colab이나 Kaggle 무료 GPU를 쓴다면:QLoRA + Unsloth 조합이 최선이다.
마무리: 누구에게 추천하는가
5-1. 이런 분들에게 추천합니다
LoRA 파인튜닝은 다음과 같은 분들에게 추천한다:
- 회사에서 특정 도메인(의료, 법률, 금융 등)에 특화된 LLM을 만들어야 하는 ML 엔지니어
- 클라우드 GPU를 활용할 수 있고, 최상의 품질을 원하는 팀
- 여러 태스크별 어댑터를 관리하며 유연하게 모델을 운영하고 싶은 경우
QLoRA 파인튜닝은 다음과 같은 분들에게 추천한다:
- 개인 GPU 한 장으로 LLM 파인튜닝을 시작하고 싶은 개인 개발자
- 학습 비용을 최소화하면서 빠르게 프로토타입을 만들고 싶은 스타트업
- AI 파인튜닝을 처음 배우는 학생이나 입문자
- Colab 무료 티어 환경에서 실습하며 공부하고 싶은 분
5-2. 마지막으로 드리는 말씀
LoRA와 QLoRA 덕분에 LLM 파인튜닝의 진입 장벽이 정말 많이 낮아졌다. 불과 2년 전만 해도 수천만 원짜리 GPU 클러스터가 필요했던 작업을 이제는 개인 PC에서 할 수 있게 되었으니까. 하지만 도구가 아무리 좋아도 결국좋은 데이터와명확한 목표가 있어야 의미 있는 결과를 얻을 수 있다.
처음이라면 QLoRA로 작은 모델부터 시작해 보자. 직접 해봐야 감이 온다. 완벽한 세팅을 찾으려고 하지 말고, 일단 돌려보고 결과를 보면서 조금씩 개선해 나가는 게 가장 빠른 길이다. 여러분의 파인튜닝 여정을 응원한다!