요즘 LLM을 내 데이터에 맞게 학습시키고 싶다는 분들이 정말 많아졌습니다. 그런데 GPU 메모리는 한정적이고, 풀 파인튜닝은 비용이 엄청나죠. 그래서 등장한 게 바로 LoRA와 QLoRA입니다. 오늘은 이 두 기법을 실전에서 어떻게 활용하는지, 솔직한 경험을 바탕으로 정리해 보겠습니다.
1. 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년 워싱턴 대학에서 발표한 기법으로, LoRA에 4비트 양자화(quantization)를 결합한 것입니다. 기본 모델을 4비트로 양자화해서 메모리에 올리고, 그 위에 LoRA 어댑터를 16비트(또는 32비트)로 학습합니다. 이 조합 덕분에 13B 모델도 단일 RTX 3090(24GB) 하나에서 파인튜닝할 수 있게 됩니다. 개인 개발자에게는 사실상 게임 체인저입니다.
핵심은 NF4(NormalFloat4)라는 새로운 데이터 타입과 이중 양자화(Double Quantization) 기법인데, 이론적 성능 손실을 최소화하면서 메모리를 극단적으로 줄여줍니다.
1-3. 한눈에 보는 비교
| 항목 | 풀 파인튜닝 | LoRA | QLoRA |
|---|---|---|---|
| 학습 파라미터 수 | 전체 (100%) | 0.1~1% | 0.1~1% |
| 기본 모델 정밀도 | 16비트 | 16비트 | 4비트 |
| 7B 모델 최소 VRAM | ~120GB | ~28GB | ~10GB |
| 학습 속도 | 느림 | 빠름 | 보통 (양자화 오버헤드) |
| 성능 (품질) | 최고 | 매우 우수 | 우수 (소폭 하락 가능) |
| 저장 용량 | 전체 모델 | 어댑터만 (수십 MB) | 어댑터만 (수십 MB) |
| 개인 GPU 사용 가능 여부 | 사실상 불가 | 조건부 가능 | 충분히 가능 |
2. 실전 환경 세팅과 학습 과정
2-1. 필수 라이브러리와 환경 구성
실전에서 가장 많이 쓰이는 조합은 Hugging Face Transformers + PEFT + bitsandbytes입니다. QLoRA를 쓸 거라면 bitsandbytes는 반드시 필요하고, 데이터셋 처리에는 datasets 라이브러리를 씁니다. 최근에는 Unsloth 같은 라이브러리가 등장해서 학습 속도를 2~5배까지 올려주기도 합니다.
환경 구성 시 가장 중요한 건 CUDA 버전과 PyTorch 버전의 호환성입니다. bitsandbytes가 특정 CUDA 버전에서만 작동하는 경우가 많아서, 처음 세팅할 때 여기서 시간을 많이 잡아먹습니다. 솔직히 말하면 Docker 이미지를 쓰는 게 정신 건강에 좋습니다.
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-3. 데이터셋 준비의 현실
솔직히 말하면, 파인튜닝 성패의 80%는 데이터 품질에 달려 있습니다. 모델 크기나 하이퍼파라미터보다 훨씬 중요합니다. 제가 실제로 경험한 바로는, 잘 정제된 데이터 500개가 대충 모은 데이터 5,000개보다 성능이 좋았습니다.
데이터 포맷은 instruction-input-output 형태가 가장 보편적이고, 대화형 모델을 만들 때는 multi-turn conversation 형식을 씁니다. 중요한 건 실제 서비스에서 들어올 질문 패턴과 최대한 비슷한 데이터를 만드는 것입니다.
3. 실전에서 얻은 꿀팁 모음
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 시리즈, A100 등)에서 지원합니다.
- 팁 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, 구분자)이 제대로 들어가 있는지 점검해야 합니다. 학습률이 너무 낮은 것도 원인이 될 수 있습니다.
학습은 잘 됐는데 추론 결과가 이상할 때: 추론 시 프롬프트 템플릿이 학습 시와 동일한지 확인하세요. 이 부분에서 실수하는 경우가 생각보다 정말 많습니다.
4. LoRA vs QLoRA, 장단점 정리
4-1. 각 기법의 장단점
| 구분 | LoRA 장점 | LoRA 단점 |
|---|---|---|
| 메모리 | 풀 파인튜닝 대비 대폭 절감 | QLoRA 대비 2~3배 더 필요 |
| 속도 | 양자화 오버헤드 없이 빠름 | 큰 모델은 여전히 고가 GPU 필요 |
| 품질 | 풀 파인튜닝에 근접한 성능 | 극한 성능에는 한계 |
| 구분 | QLoRA 장점 | QLoRA 단점 |
|---|---|---|
| 메모리 | 소비자 GPU로도 대형 모델 학습 가능 | 양자화로 인한 미세한 정보 손실 |
| 속도 | 접근성이 극적으로 향상됨 | 양자화/역양자화 오버헤드로 약간 느림 |
| 품질 | 비용 대비 매우 우수한 성능 | LoRA 대비 소폭 성능 하락 가능 |
4-2. 상황별 선택 가이드
- 예산이 넉넉하고 최고 성능이 필요하다면: A100 이상 GPU에서 LoRA를 쓰세요.
- 개인 GPU(RTX 3090/4090)로 7B~13B 모델을 돌리고 싶다면: QLoRA가 유일한 선택지입니다.
- 프로토타이핑 단계라면: QLoRA로 빠르게 실험하고, 최종 모델만 LoRA나 풀 파인튜닝으로 전환하세요.
- Colab이나 Kaggle 무료 GPU를 쓴다면: QLoRA + Unsloth 조합이 최선입니다.
5. 마무리: 누구에게 추천하는가
5-1. 이런 분들에게 추천합니다
LoRA 파인튜닝은 다음과 같은 분들에게 추천합니다:
- 회사에서 특정 도메인(의료, 법률, 금융 등)에 특화된 LLM을 만들어야 하는 ML 엔지니어
- 클라우드 GPU를 활용할 수 있고, 최상의 품질을 원하는 팀
- 여러 태스크별 어댑터를 관리하며 유연하게 모델을 운영하고 싶은 경우
QLoRA 파인튜닝은 다음과 같은 분들에게 추천합니다:
- 개인 GPU 한 장으로 LLM 파인튜닝을 시작하고 싶은 개인 개발자
- 학습 비용을 최소화하면서 빠르게 프로토타입을 만들고 싶은 스타트업
- AI 파인튜닝을 처음 배우는 학생이나 입문자
- Colab 무료 티어 환경에서 실습하며 공부하고 싶은 분
5-2. 마지막으로 드리는 말씀
LoRA와 QLoRA 덕분에 LLM 파인튜닝의 진입 장벽이 정말 많이 낮아졌습니다. 불과 2년 전만 해도 수천만 원짜리 GPU 클러스터가 필요했던 작업을 이제는 개인 PC에서 할 수 있게 되었으니까요. 하지만 도구가 아무리 좋아도 결국 좋은 데이터와 명확한 목표가 있어야 의미 있는 결과를 얻을 수 있습니다.
처음이라면 QLoRA로 작은 모델부터 시작해 보세요. 직접 해봐야 감이 옵니다. 완벽한 세팅을 찾으려고 하지 말고, 일단 돌려보고 결과를 보면서 조금씩 개선해 나가는 게 가장 빠른 길입니다. 여러분의 파인튜닝 여정을 응원합니다!