21

실습: QLoRA 환경 설정 & 첫 테스트

파인튜닝 개요 & LoRA/QLoRA

학습 목표
  • GPU 환경(무료 Colab T4 기준)에서 버전을 고정해 QLoRA 라이브러리를 설치한다
  • 4비트 양자화 모델을 로드하고 추론을 테스트한다
  • 베이스 모델의 선형 모듈 이름을 직접 확인하고, LoRA 어댑터가 몇 개에 붙었는지 검증한다

환경 설정 & 첫 번째 QLoRA 테스트

실습 환경 선택

환경GPU쓸 수 있는 VRAM비용이 주에서 되는 것
Google Colab 무료T4약 15GB무료Day 15 전부 (배치 12, 시퀀스 512)
Google Colab ProT4/L4/A10015~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 기준)

패키지버전
transformers5.16.1
trl1.12.0
peft0.20.0
bitsandbytes0.50.2
accelerate1.14.0
datasets5.0.1

이 주의 코드는 위 조합의 API에 맞춰 적혀 있다. 라이브러리는 자주 바뀌므로 버전이 다르면 코드가 아니라 인자 이름부터 의심한다. 실제로 최근에 바뀐 것 셋을 적어 둔다.

  • SFTTrainer(max_seq_length=..., packing=..., tokenizer=...)는 더 이상 없다. max_seq_lengthSFTConfig(max_length=...)로, tokenizerprocessing_class로 옮겨졌다.
  • TrainingArguments에서 warmup_ratio가 없어졌다. warmup_steps가 정수(스텝 수)와 0~1 사이 실수(전체 스텝 대비 비율)를 둘 다 받는다.
  • TrainingArgumentsuse_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비트 로딩이 되지 않는다. 결제를 하지 않겠다면 다음 순서로 간다.

  1. 먼저 무료 Colab T4를 시도한다. 브라우저만 있으면 되고 이 주의 실습은 전부 여기에 맞춰져 있다. 맥에서 못 하는 것이지 맥을 쓰는 사람이 못 하는 것이 아니다.
  2. Colab도 쓸 수 없다면 학습을 뺀 경로로 간다. 다음 넷은 GPU 없이 그대로 돌아간다.
    • Day 2 데이터 준비 실습 세 개는 외부 의존성이 없어 노트북에서 전부 실행된다.
    • Day 3은 코드를 읽고, 본인 데이터 건수로 총 스텝 수·유효 배치·예상 시간을 손으로 계산해 제출한다. 하이퍼파라미터를 왜 그 값으로 잡았는지 적는 것이 이 대체 과제의 채점 대상이다.
    • Day 4 평가 실습은 텍스트 비교라 GPU가 필요 없다. 파인튜닝 모델의 답변 대신 기본 모델이나 프롬프트만 적용한 모델의 답변을 넣어도 지표는 계산된다.
    • Day 4 배포는 Ollama로 한다. Ollama는 CPU 추론을 지원하므로 맥에서도 된다. 학습한 어댑터가 없으면 공개 GGUF 모델을 내려받아 Modelfile의 SYSTEM 프롬프트만 제조용으로 바꿔 등록하고, 「시스템 프롬프트만으로 어디까지 되는가」를 파인튜닝의 비교군으로 삼는다.
  3. 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로 학습하기 — 꿀팁
QLoRA 환경 설치 오류 진단AI 학습 팁

AI에게 pip install 에러 로그를 붙여넣으면 CUDA 버전 불일치·bitsandbytes 호환성 문제를 진단하고 수정 명령어를 제안해줍니다.

Colab에서 QLoRA 환경 설치 중 다음 에러가 발생했어: 'bitsandbytes CUDA version mismatch'. 아래 에러 로그를 보고 원인을 진단하고, 올바른 설치 순서(torch→bitsandbytes→transformers→peft→trl)와 CUDA 12.x 기준 호환 버전 조합을 알려줘.
이 팁이 도움이 됐나요?
용어