2026년 8월 25일 화요일

LoRA 실전 ⑤ — 오프로딩: CPU RAM을 GPU의 확장 메모리로

모델이 VRAM에 안 들어갈 때 남는 카드가 오프로딩 — CPU RAM(심지어 NVMe)을 GPU의 확장 메모리로 쓰는 기술이다. 결론부터: 추론 오프로딩은 잘 작동하고, 학습 오프로딩은 LoRA에는 거의 무의미하다. 그리고 느려짐이 3-5배를 넘는 순간, 답은 오프로딩이 아니라 렌탈이다.

추론 오프로딩 — 잘 되는 쪽

  • llama.cpp -ngl (부분 오프로드) — 공식 실측표(llama-bench): 7B Q4, 35층 중 GPU에 10층 = 13 t/s → 30층 = 40 → 34층 = 72 → 전체 오프로드 = 132 t/s. 비선형이 잔인하다 — 마지막 1-2층만 CPU에 남아도 속도가 반토막. 교훈: 부분 오프로드를 고민하기 전에 전부 들어가는 양자화를 골라라.
  • --cpu-moe / --n-cpu-moe — 2026년의 킬러 트릭. MoE 모델은 토큰당 소수의 전문가만 활성화되므로, 전문가 가중치는 RAM에, attention은 GPU에 두면 8-12GB 카드로 120B급 MoE가 굴러간다. RTX 5090 + --n-cpu-moe 21로 GPT-OSS-120B가 3.4 → 8-9.6 t/s 실측.
  • KV 캐시 오프로드 — 긴 컨텍스트 서빙에서 VRAM을 터뜨리는 건 가중치가 아니라 KV다. vLLM kv_offloading_size(native/LMCache), llama.cpp -nkvo로 KV를 RAM에 — 재계산(수 초의 TTFT)을 PCIe 복사(수 ms)로 바꾼다.
  • HF device_map='auto' — "일단 돌아는 간다"의 최후 수단. 오프로드된 층마다 토큰마다 PCIe 왕복이라 자릿수 단위로 느리다. 일회성 테스트용, 서빙·학습용 아님(공식 문서도 inference only 명시).

학습 오프로딩 — LoRA에는 함정

  • DeepSpeed ZeRO-Offload/Infinity(논문)는 옵티마이저 상태(파라미터당 8B)를 CPU로 보내 32GB V100 한 장에서 13B full FT를 가능케 했다. 그런데 LoRA는 그 옵티마이저 상태가 애초에 거의 없다 — 옮길 게 없고 PCIe 트래픽만 는다. 실제로 PEFT 공식 문서가 경고한다: "ZeRO-3 + QLoRA + CPU 오프로드는 오히려 GPU 메모리를 쓸 수 있다."
  • LoRA에 실제로 필요한 오프로딩은 하나: bitsandbytes의 paged_adamw_8bit — 평소엔 오버헤드 0, OOM 스파이크 순간에만 옵티마이저 상태를 페이지 단위로 RAM에 대피시킨다. QLoRA가 65B를 48GB에서 학습한 비결. 소비자 GPU에서는 그냥 항상 켜라.
  • 진짜 큰 모델은 오프로딩보다 샤딩: FSDP+QLoRA로 70B를 24GB×2에 — ⑤편의 결론과 같은 답이다.

정리 — 결정 규칙

① QLoRA가 VRAM에 들어가면(7B=5GB, 14B=8.5GB...) 오프로딩 불필요. ② 안 들어가면: 추론은 --cpu-moe/-ngl, 학습은 paged optimizer + GPU 추가(샤딩). ③ 느려짐이 3-5배를 넘으면 렌탈 — 4090이 $0.34/hr, 70B QLoRA가 되는 A40 48GB가 $0.35/hr다. 하룻밤 작업을 일주일로 만드는 것보다 점심값이 싸다. 다음 글: 실제로 돌려보는 레시피 — 무료 Colab부터 24GB까지.

— LoRA 실전 시리즈 ⑤ / 다음 글: 실습 레시피와 Windows 함정

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

sLM 평가 방법론 ⑪ (완결) — 평가 챕터 쓰기: 심사위원이 재실행할 수 있게

마지막 편의 기준은 하나다: 적대적인 심사위원이 논문만 보고 모든 숫자를 재실행할 수 있는가. 2026년의 평가 보고는 체크리스트 주도·버전 고정이 표준이다. 체크리스트를 뼈대로 쓰라 ACL Responsible NLP 체크리스트 의 A~D절(한...