본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 21. 21:29

LoRA: 1.5B 모델의 일부만 학습시켜 전체 파인튜닝 결과와 일치시키기

요약

LoRA(Low-Rank Adaptation)를 사용하여 1.5B 모델의 일부 매개변수만 학습시켜 전체 파인튜닝과 유사한 성능을 내는 방법을 다룹니다. 메모리 부족 문제를 해결하기 위한 그래디언트 누적 및 체크포인팅 기법과 GPU 성능 측정 시 주의사항을 설명합니다.

핵심 포인트

  • LoRA를 통해 전체 파인튜닝 대비 약 1000배 작은 크기의 어댑터 생성 가능
  • 메모리 절약을 위해 그래디언트 누적 및 체크포인팅 활용 권장
  • GPU 성능 비교 시 it/s가 아닌 examples/second를 기준으로 측정해야 함

시리즈 — 파인튜닝, 가장 작은 것부터 큰 순서로:

  1. Full Fine-Tuning (270M)
  2. LoRA (1.5B) ← 현재 위치
  3. QLoRA (7B)
  4. 작은 모델이 작동했다면, 왜 더 큰 모델로 가야 하는가?

Part 1에서는 270M 모델을 완전히 파인튜닝(full fine-tuned)하여 모든 가중치(weight)를 업데이트했습니다. 이는 아주 작은 모델에는 괜찮습니다. 하지만 모델이 커지면 문제가 생기는데, 전체 파인튜닝은 모든 매개변수에 대해 기울기(gradients)와 최적화기 상태(optimizer state)가 필요하기 때문에 (메모리에서 모델 크기의 약 4배에 달함) 어려워집니다.

그래서: 모델이 너무 커서 모든 것을 편안하게 파인튜닝할 수 없을 때는 어떻게 해야 할까요?

LoRA의 아이디어

**LoRA (Low-Rank Adaptation)**는 한 가지 관찰에 기반합니다. 즉, 파인튜닝이 가중치 행렬(weight matrix)에 만드는 _변화_는

# fp32로 가중치를 로드합니다. 학습 중 fp16 처리는 Trainer의 AMP가 수행하도록 합니다.
model = AutoModelForCausalLM.from_pretrained(MODEL_ID, torch_dtype=torch.float32)
# 혼합 정밀도 (mixed-precision) 부분을 위해 TrainingArguments에서 fp16=True로 설정합니다 (CUDA 사용 시)

벽 #2: 배치 사이즈 64에서 CUDA 메모리 부족 (out of memory)

어댑터 (Adapter) 학습 역시 활성화 값 (activations)과 옵티마이저 상태 (optimizer state)를 유지합니다. 해결책: 더 작은 배치 사이즈 + 그래디언트 누적 (gradient accumulation, 이를 통해 유효 (effective) 배치 사이즈 유지) + 그래디언트 체크포인팅 (gradient checkpointing, 역전파 (backward pass) 시 활성화 값을 재계산):

per_device_train_batch_size=16,
gradient_accumulation_steps=2,     # 유효 배치 32, 피크 메모리 감소
gradient_checkpointing=True,       # 연산량 약 30% 증가, 메모리 대폭 절감

벽 #3: 내 노트북과 클라우드 GPU의 속도가 동일하게 나타남

이 문제는 교묘했습니다. 제 Mac (MPS)과 Kaggle T4가 거의 동일한 it/s를 보고했습니다. 어떻게 데이터 센터의 GPU가 노트북보다 빠르지 않을 수 있을까요?

사실은 그렇지 않았습니다. Kaggle 세션은 데이터 병렬 (data-parallel) 방식으로 2개의 GPU를 실행하고 있었습니다. 즉, 각 단계 (step)마다 2배의 데이터를 처리했기 때문에, it/s는 일정하게 유지되는 동안 전체 스텝 수 (total step count)가 절반으로 줄어든 것 (626 vs 1250)이었습니다. 해결책은 코드가 아니라 숫자를 읽는 법에 있었습니다: iterations/second가 아니라 examples/second를 비교하세요. 그렇게 확인해보니 GPU가 확실히 약 3배 더 빨랐습니다.

결과

다시 약 96%의 정확도를 기록했습니다. 동결된 (frozen) 1.5B 모델과 몇 MB 크기의 어댑터가 파트 1의 전체 파인튜닝된 (fully-fine-tuned) 270M 모델과 일치했으며, 저장된 결과물 (artifact)은 대략 1000배 더 작았습니다.

그리고 파트 1에서 발생했던 card_arrivalcard_delivery_estimate 혼동 문제요? 여전히 남아있습니다. 더 큰 모델, 다른 기술을 사용했음에도 동일한 실수를 범했습니다. (이 미스터리는 파트 4에서 해결합니다.)

다음 단계

Part 3: 일반적인 방식으로는 로드조차 할 수 없는 16GB GPU에 70억 (7-billion) 개의 파라미터를 가진 모델을 올리는 방법을 다룹니다. 그것이 바로 QLoRA입니다.

📓 Kaggle에서 실행 가능한 전체 노트북: https://www.kaggle.com/code/sumannath88/02-lora-qwen2-5-1-5b

PyTorch + Hugging Face Transformers + PEFT로 제작되었습니다. 질문이나 수정 사항은 댓글로 환영합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0