실습: QLoRA 환경 설정 & 첫 테스트
파인튜닝 개요 & LoRA/QLoRA
실습: QLoRA 환경 설정 & 첫 테스트
QLoRA 파인튜닝 > 파인튜닝 개요 & LoRA/QLoRA
- GPU 환경(무료 Colab T4 기준)에서 버전을 고정해 QLoRA 라이브러리를 설치한다
- 4비트 양자화 모델을 로드하고 추론을 테스트한다
- 베이스 모델의 선형 모듈 이름을 직접 확인하고, LoRA 어댑터가 몇 개에 붙었는지 검증한다
환경 설정 & 첫 번째 QLoRA 테스트
실습 환경 선택
| 환경 | GPU | 쓸 수 있는 VRAM | 비용 | 이 주에서 되는 것 |
|---|---|---|---|---|
| Google Colab 무료 | T4 | 약 15GB | 무료 | Day 1 |
| Google Colab Pro | T4/L4/A100 | 15~40GB | 월 $10 | 배치를 키우거나 시퀀스를 늘릴 때 |
| 로컬 (RTX 4060 이상) | RTX 4060+ | 8~24GB | 전기 요금 | Day 1~5 전부 |
| GPU 없음 (애플 실리콘 포함) | - | - | 무료 | 아래 「GPU 없는 학습자의 경로」 |
무료 T4가 이 주의 기준선이다. 실습은 전부 무료 T4에서 도는 크기로 맞춰 두었으므로
결제하지 않아도 Day 1부터 Day 5까지 갈 수 있다. 다만 무료 티어는 세션이 12시간에서 끊기고
유휴 상태가 길면 그 전에도 끊기므로, output_dir을 Google Drive로 잡고 체크포인트를 자주
저장한다(Day 3 Pitfall 5).
검증된 버전 조합 (2026-09 기준)
| 패키지 | 버전 |
|---|---|
| transformers | 5.16.1 |
| trl | 1.12.0 |
| peft | 0.20.0 |
| bitsandbytes | 0.50.2 |
| accelerate | 1.14.0 |
| datasets | 5.0.1 |
이 주의 코드는 위 조합의 API에 맞춰 적혀 있다. 라이브러리는 자주 바뀌므로 버전이 다르면 코드가 아니라 인자 이름부터 의심한다. 실제로 최근에 바뀐 것 셋을 적어 둔다.
SFTTrainer(max_seq_length=..., packing=..., tokenizer=...)는 더 이상 없다.max_seq_length는SFTConfig(max_length=...)로,tokenizer는processing_class로 옮겨졌다.TrainingArguments에서warmup_ratio가 없어졌다.warmup_steps가 정수(스텝 수)와 0~1 사이 실수(전체 스텝 대비 비율)를 둘 다 받는다.TrainingArguments에use_cache가 생겼고 기본값이 False다.
베이스 모델과 VRAM 계산
이 주의 표준 베이스 모델은 microsoft/Phi-4-mini-instruct 하나다.
HuggingFace 저장소의 가중치 인덱스로 확인한 실제 크기는 **3,836,021,760개(약 3.8B)**이고
아키텍처는 Phi3ForCausalLM, hidden 3072, 32층이다.
Phi-4는 14B이지만 Phi-4-mini는 3.8B다. 둘을 섞으면 아래 계산이 전부 어긋난다.
4비트로 올렸을 때 필요한 VRAM을 항목별로 세어 본다.
1) 4비트로 압축되는 것 = 트랜스포머 블록 안의 선형층
층당 qkv_proj 3072 x 5120 = 15,728,640
o_proj 3072 x 3072 = 9,437,184
gate_up 3072 x 16384 = 50,331,648
down 8192 x 3072 = 25,165,824
합 = 100,663,296
x 32층 = 3,221,225,472개
NF4 4비트 + 이중 양자화 상수 0.127비트 = 4.127비트/개
3,221,225,472 x 4.127 / 8 = 약 1.55 GiB
2) 4비트로 압축되지 않는 것 = 임베딩(출력층과 공유) + 레이어놈
200,064 x 3,072 = 614,596,608개 x 2바이트 = 약 1.14 GiB
3) LoRA 어댑터(r=16, 네 모듈) 23,068,672개
어댑터 88MB + 그래디언트 88MB + AdamW 상태 176MB = 약 0.34 GiB
1 + 2 + 3 = 약 3.0 GiB여기까지가 계산으로 확정되는 부분이다. 실제 학습에는 여기에 **활성화(activation)**가
더해지는데, 활성화는 배치 크기와 시퀀스 길이에 비례하고 gradient checkpointing을 켜면 크게
줄기 때문에 하나의 숫자로 못 박을 수 없다. 그래서 측정한다. 학습을 몇 스텝 돌린 뒤
torch.cuda.max_memory_allocated()를 찍어 본인 환경의 실제 최대치를 기록하라.
이 주에서 「약 몇 GB」라고 적힌 값은 전부 활성화를 뺀 값이다.
T4에서 쓸 수 있는 것이 약 15GB이므로 3.0 GiB에 활성화를 얹어도 여유가 크게 남는다. 반대로 말하면, 이 주의 실습에서 OOM이 났다면 모델이 큰 것이 아니라 배치나 시퀀스가 큰 것이다.
GPU 없는 학습자의 경로
bitsandbytes는 CUDA 전용이라 애플 실리콘 맥에서는 4비트 로딩이 되지 않는다.
결제를 하지 않겠다면 다음 순서로 간다.
- 먼저 무료 Colab T4를 시도한다. 브라우저만 있으면 되고 이 주의 실습은 전부 여기에 맞춰져 있다. 맥에서 못 하는 것이지 맥을 쓰는 사람이 못 하는 것이 아니다.
- Colab도 쓸 수 없다면 학습을 뺀 경로로 간다. 다음 넷은 GPU 없이 그대로 돌아간다.
- Day 2 데이터 준비 실습 세 개는 외부 의존성이 없어 노트북에서 전부 실행된다.
- Day 3은 코드를 읽고, 본인 데이터 건수로 총 스텝 수·유효 배치·예상 시간을 손으로 계산해 제출한다. 하이퍼파라미터를 왜 그 값으로 잡았는지 적는 것이 이 대체 과제의 채점 대상이다.
- Day 4 평가 실습은 텍스트 비교라 GPU가 필요 없다. 파인튜닝 모델의 답변 대신 기본 모델이나 프롬프트만 적용한 모델의 답변을 넣어도 지표는 계산된다.
- Day 4 배포는 Ollama로 한다. Ollama는 CPU 추론을 지원하므로 맥에서도 된다. 학습한 어댑터가 없으면 공개 GGUF 모델을 내려받아 Modelfile의 SYSTEM 프롬프트만 제조용으로 바꿔 등록하고, 「시스템 프롬프트만으로 어디까지 되는가」를 파인튜닝의 비교군으로 삼는다.
- Day 5 제출은 이 경우 학습 없는 트랙으로 낸다. 데이터셋·평가·배포·문서화가 채점 대상이고, 학습 항목은 「왜 하지 못했는지와 대신 무엇을 했는지」로 대체한다. 시작 전에 담당 강사에게 알린다.
Step 1: 라이브러리 설치 (버전 고정)
Step 2: GPU 환경 확인
Step 3: 4비트 모델 로드 및 추론 테스트
Step 4: 이 모델의 선형 모듈 이름 확인
이 단계를 건너뛰면 다음 단계에서 조용히 틀린다. 자세한 이유는 Day 1 Pitfall 4에 있다.
Step 5: LoRA 적용 및 어댑터가 붙은 모듈 수 검증
힌트 보기
- • bnb_4bit_quant_type은 "nf4" (NormalFloat 4-bit)
- • bnb_4bit_use_double_quant은 True (이중 양자화)
- • r=16, lora_alpha=32 (alpha = 2 * r)
- • target_modules는 Step 5 출력에 실제로 나온 이름만 쓴다. Phi-4-mini는 qkv_proj·o_proj·gate_up_proj·down_proj
- • T4는 bf16을 지원하지 않으므로 compute_dtype을 float16으로 잡아야 한다
정답 보기
AI에게 pip install 에러 로그를 붙여넣으면 CUDA 버전 불일치·bitsandbytes 호환성 문제를 진단하고 수정 명령어를 제안해줍니다.
Colab에서 QLoRA 환경 설치 중 다음 에러가 발생했어: 'bitsandbytes CUDA version mismatch'. 아래 에러 로그를 보고 원인을 진단하고, 올바른 설치 순서(torch→bitsandbytes→transformers→peft→trl)와 CUDA 12.x 기준 호환 버전 조합을 알려줘.