LoRA: 모델의 1%만 학습하여 거대 모델을 미세 조정하기
요약
LoRA(Low-Rank Adaptation)는 거대 모델의 전체 가중치를 업데이트하는 대신, 저차원 행렬 분해를 통해 파라미터의 1% 미만만을 학습하여 미세 조정하는 기술입니다. 이를 통해 메모리 사용량을 획기적으로 줄여 단일 GPU에서도 대규모 모델 학습을 가능하게 합니다.
핵심 포인트
- 전체 가중치를 동결하고 저차원 행렬(A, B)의 곱으로 변화량(ΔW)을 학습
- 학습 파라미터 수를 대폭 감소시켜 메모리 및 GPU 비용 절감
- Rank(r)와 Alpha(α)를 통해 학습 용량과 스케일링 조절 가능
- 기존 모델의 성능을 유지하면서 효율적인 도메인 특화 학습 지원
대규모 모델을 미세 조정(Fine-tuning)한다는 것은 과거에 한 가지 고통스러운 과정을 의미했습니다. 모델 내의 모든 가중치(weight)를 업데이트하고, 작업마다 전체 복사본을 유지하며, 이를 수행하기 위한 GPU 비용을 지불하는 것이었습니다. 70억 개의 파라미터(parameter)를 가진 모델은 70억 개의 조절 노브(knob)를 가지고 있습니다. Adam 옵티마이저(optimizer)는 노브 하나당 두 개의 추가 숫자를 유지하므로, 갑자기 메모리에 모델 크기의 약 3배에 달하는 양을 담게 됩니다. 게다가 새로운 작업을 미세 조정할 때마다 또 다른 13GB의 체크포인트(checkpoint)를 저장해야 합니다. 작동은 하지만, 예를 들어 새로운 말투를 채택하거나 특정 도메인의 어휘를 학습하기 위해 모델이 실제로 변화해야 하는 정도에 비해 이는 터무니없이 과도한 수준입니다.
LoRA — Low-Rank Adaptation — 는 이 모든 문제를 해결해 주는 기술입니다. 그리고 이는 하나의 명확한 관찰을 바탕으로 구축되었습니다.
업데이트는 저차원(low-rank)입니다
미세 조정을 할 때, 실제로 생성되는 것은 '차이(difference)'입니다. 즉, 새로운 가중치에서 기존 가중치를 뺀 값인 ΔW입니다. LoRA의 핵심 통찰은 이 차이가 낮은 "고유 랭크(intrinsic rank)"를 가진다는 것입니다. 유용한 변화는 행렬의 전체 d×d 공간이 아니라 아주 작은 부분 공간(subspace)에 존재합니다. 숫자로 이루어진 큰 행렬은 종종 두 개의 얇은 행렬의 곱으로부터 거의 완벽하게 재구성될 수 있습니다.
따라서 ΔW를 직접 학습하는 대신, LoRA는 그 곱이 ΔW가 되는 두 개의 작은 인자(factor)를 학습합니다:
ΔW ≈ B · A (A는 r×d, B는 d×r이며, r ≪ d임)
그런นั้น 원래의 가중치 W를 완전히 동결(freeze)하고 그 위에 우회로를 추가합니다. 모델이 사용하는 유효 가중치는 다음과 같습니다:
W + (α / r) · B · A
순전파(forward pass) 과정에서 입력 x는 두 경로를 모두 통과합니다 — Wx(기존의 동작)와 B(Ax)(학습된 교정값)입니다. W는 절대 변하지 않습니다. 모델은 사전 학습된(pretrained) 모델과 동일하게 시작하며, A와 B를 학습함에 따라 서서히 변화합니다.
이것이 왜 큰 승리인가
파라미터 수를 계산해 봅시다. d×d 행렬은 d²개의 가중치를 가집니다. 두 어댑터(adapter) 행렬을 합치면 r·d + d·r = 2·r·d개의 가중치를 가집니다. d = 4096이고 r = 8일 때, 해당 레이어의 1,680만 개 가중치 대신 약 65,000개의 학습 가능한 가중치만 있으면 됩니다. 이는 256배의 감소입니다. 모델 전체에 걸쳐 적용하면 통상적으로 전체 파라미터의 1% 미만만을 학습하게 됩니다.
A와 B에만 그래디언트 (gradient)가 계산되기 때문에, 옵티마이저 (optimizer)는 이들에 대한 상태값만 추적하면 됩니다. 파라미터 수와 함께 메모리 사용량도 급격히 줄어들어, 갑자기 클러스터 대신 단일 소비자용 GPU에서 7B–70B 모델을 미세 조정 (fine-tune)할 수 있게 됩니다.
두 개의 노브 (knob)가 이를 제어합니다. 랭크 (Rank) r은 우회 경로의 용량을 설정합니다. r이 커질수록 더 많은 비용을 들여 더 풍부한 변화를 표현할 수 있습니다. **알파 (Alpha, α)**는 (α/r)·BA로 적용되는 스케일링 인자 (scaling factor)로, r과 독립적으로 어댑터 (adapter)가 얼마나 강하게 밀어붙일지를 조정할 수 있게 해줍니다. 따라서 랭크를 높여도 학습률 (learning rate)을 다시 조정할 필요가 없습니다. 일반적인 공식은 α ≈ 2r입니다.
사람들이 놓치는 세부 사항 하나는 이것입니다: A는 작은 무작위 값으로 시작하지만, B는 정확히 0에서 시작합니다. 이는 0단계에서 B·A를 0으로 만들어, 학습이 깨끗한 베이스 모델 (base model) 상태에서 시작되어 학습을 진행함에 따라 점진적으로 벗어나게 합니다. 첫 단계에서 가중치 (weights)에 무작위 충격이 가해지지 않습니다.
교체하거나, 병합하거나
이 부분이 프로덕션 환경에서 LoRA를 마법처럼 느껴지게 만드는 대목입니다. 학습된 어댑터는 공유된 동결된 (frozen) 베이스를 참조하는 독립적인 파일이며, 종종 기가바이트가 아닌 몇 메가바이트에 불과합니다. 따라서 작업, 어조, 고객 또는 언어당 하나씩 수십 개의 어댑터를 학습할 수 있습니다. 거대한 베이스는 한 번만 저장하면 되고, 요청 시점에 몇 메가바이트만 핫스왑 (hot-swap)하여 동작을 전환할 수 있습니다. 이를 통해 하나의 호스팅된 모델이 저렴하게 많은 특화된 변체들을 서비스할 수 있으며, 커뮤니티가 동일한 베이스에 대해 수천 개의 스타일 어댑터를 공유할 수 있는 것입니다.
런타임 비용을 전혀 들여놓고 싶지 않다면, 대신 병합 (merge)하면 됩니다. W + (α/r)·BA를 한 번 계산하여 W를 덮어쓰면, LoRA 분기나 추가적인 행렬 곱셈, 추가 지연 시간 (latency) 없이 완전히 평범해 보이는 모델을 배포할 수 있습니다. 교체 가능성을 희생하는 대신 순수 속도를 얻는 것입니다.
QLoRA는 여기서 한 발 더 나아갑니다. 동결된 베이스를 4비트 정밀도로 로드하고, 그 위에 더 높은 정밀도로 어댑터를 학습시킵니다. 베이스는 메모리의 4분의 1만 차지하면서도 작은 학습 가능 부분은 정확도를 유지하므로, 단일 48GB 카드에서 65B 모델을 미세 조정하기에 충분합니다. 이는 오늘날 소비자용 하드웨어의 표준 레시피입니다.
주의할 점
LoRA는 필요한 변화가 저차원 (low-rank)이라고 가정합니다. 이는 대부분의 적응 (adaptation) 과정에 해당합니다. 하지만 사전 학습 (pretraining) 단계에서 베이스 모델이 보았던 것과는 완전히 다른, 진정으로 새롭고 복잡한 행동을 가르치려 한다면 아주 작은 $r$ 값으로는 이를 표현할 수 없습니다. 이 경우 아무리 오래 학습하더라도 손실 (loss) 값이 0 위에서 정체됩니다. 해결책은 $r$을 높이거나, 더 많은 모듈을 적응시키거나, 혹은 전체 미세 조정 (full fine-tuning)으로 돌아가는 것입니다. LoRA는 매우 훌륭한 기본 설정 (default)이지만, 모든 것을 대체할 수 있는 만능 도구는 아닙니다.
실제로 사용할 때 $A$와 $B$ 행렬을 직접 작성하는 일은 없습니다. Hugging Face의 peft 라이브러리가 하나의 LoraConfig를 통해 이 모든 과정을 처리합니다. r, lora_alpha, target_modules를 설정하고, get_peft_model로 모델을 감싸기만 하면 나머지 모든 부분은 자동으로 동결 (freeze)됩니다.
저는 랭크 (rank)를 드래그하여 학습 가능한 파라미터 (trainable-parameter) 수가 급격히 줄어드는 것을 관찰하고, 경사 하강법 (gradient descent)을 통해 $A$와 $B$ 행렬을 실제로 학습시켜 볼 수 있는 인터랙티브 버전을 제작했습니다. 여기에는 낮은 랭크가 전체 랭크 (full-rank) 목표를 수용하지 못하는 경우도 포함되어 있습니다. 여기서 직접 체험해 보세요: https://dev48v.infy.uk/ai/days/day24-lora.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기