7B 매개변수 LLM을 전체 미세 조정하면 과제마다 갱신된 7B 매개변수를 모두 저장해야 해. 가중치만 14GB야. LoRA (Low-Rank Adaptation, Hu et al. 2021)는 원래 가중치를 동결하고 각 선형층 옆에 학습 가능한 작은 저랭크 행렬을 추가해. 이때 해당 층의 미세 조정 결과는 W' = W + (BA)로 나타내며, A: [d, r]와 B: [r, d]에서 r << d야.
그 결과 약 0.1%의 추가 매개변수만 학습하면서도 전체 미세 조정에 견줄 만한 정확도를 얻을 수 있어. 기본 모델을 다시 불러오지 않고 LoRA 어댑터를 교체하거나 제거할 수도 있지. 개인도 LLM을 현실적으로 미세 조정할 수 있게 만든 기술이야.
팁: LoRA에서 보통 사용하는 랭크는 r=8~64야. 랭크가 낮으면 매개변수가 적어져 더 빠르고 저렴하지만 과소적합 위험이 커져. 랭크가 높으면 전체 미세 조정에 가까워져. r=16부터 시작한 뒤 결과에 맞춰 조정해.
QLoRA — 양자화된 기본 모델 위의 LoRA
QLoRA (Dettmers et al., 2023)는 동결된 기본 모델을 4-bit 양자화 형태로 유지하면서 LoRA 어댑터를 BF16으로 학습해. 그 결과 70B 모델을 8개가 아닌 단일 80GB H100에서 미세 조정할 수 있어. 개인과 소규모 팀도 본격적인 LLM 미세 조정을 현실적으로 시도할 수 있게 만든 기술이야.
PEFT 라이브러리
Hugging Face의 peft 라이브러리는 LoRA, QLoRA, prefix tuning, prompt tuning, IA3 등을 통일된 API로 구현해. 어떤 사전학습 모델이든 get_peft_model(model, lora_config)로 감싼 뒤 평소처럼 학습하고, 작은 파일인 어댑터를 저장해 어디서든 다시 불러올 수 있어.
원칙: 현대 미세 조정의 기본 선택은 LoRA야. 전체 미세 조정은 LoRA와의 정확도 차이가 중요하고 충분한 연산 자원을 사용할 수 있을 때만 선택해. 일상적인 모델 적응에는 LoRA가 더 유리해.
Code
PEFT로 12줄 만에 구현하는 LoRA 미세 조정·python
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import LoraConfig, get_peft_model, TaskType
base = "meta-llama/Llama-3.1-8B"
tok = AutoTokenizer.from_pretrained(base)
model = AutoModelForCausalLM.from_pretrained(base, torch_dtype="bfloat16",
device_map="auto")
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, lora_alpha=32, lora_dropout=0.05,
target_modules=["q_proj", "v_proj"],
)
model = get_peft_model(model, config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 8,034,455,552 || trainable%: 0.052%