C.W.K.
Stream
Lesson 06 of 07 · published

LoRA fine-tuning

~8 min · keras-nlp

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

full fine-tuning 이 아픈 이유

큰 모델의 모든 weight 를 학습한다는 건 weight 마다 gradient 와 optimizer state 까지 들고 있어야 한다는 뜻 — 모델 자체보다 한참 먼저 GPU 메모리를 터뜨리는 게 바로 이 항목이야. LoRA (Low-Rank Adaptation) 는 영리한 베팅으로 이걸 비껴가: 원래 weight 는 통째로 freeze 하고, 그 옆에 더해지는 작은 low-rank 행렬 쌍만 학습해. 수억 개 대신 수십만 개 parameter 만 학습하는데, 모델은 전체를 튜닝한 것처럼 동작해.

한 줄, 두 가지 큰 이득

KerasHub 에선 backbone.enable_lora(rank=r) 한 줄 — 그 뒤 fit() 을 평소대로 호출하면 adapter 만 update 돼 (Code 참고). rank 가 다이얼이야: 높으면 적응 capacity 늘지만 학습할 parameter 도 늘어. 4~16 이면 대부분 커버. 공짜로 따라오는 이득 둘. 첫째 메모리: trainable param 이 자릿수째로 줄어서, cluster 필요했던 모델이 카드 한 장에 들어가. 둘째 저장: full 모델 복사본이 아니라 작은 adapter weight 만 save — 같은 base 를 열 번 fine-tune 해도 full checkpoint 열 개가 아니라 작은 파일 열 개야.

QLoRA — quantization 까지 쌓기

QLoRA 는 한 발 더 가: frozen backbone 을 먼저 quantize() 로 int8 (또는 int4) 로 줄여 resident 모델을 작게 만들고, 그 다음 위에 LoRA adapter 를 얹어. base 는 작고 frozen, adapter 는 작고 trainable, quality 는 full fine-tuning 에 근접. 이 조합이 7B 급 fine-tuning 을 consumer 하드웨어에 올린 거야.

Code

LoRA enable, 그 위에 quantization 쌓아 QLoRA·python
# Enable LoRA on the model backbone
classifier.backbone.enable_lora(rank=4)

# Check trainable params — dramatically reduced!
print(classifier.summary())
# Total params: 110M, Trainable: ~300K (0.3%!)

# QLoRA: Quantize first, then LoRA
classifier.backbone.quantize("int8")     # Reduce model size
classifier.backbone.enable_lora(rank=4)  # Add adapters
# Even less memory, nearly same quality

External links

Exercise

Gemma-2b 로드. LoRA(rank=8) enable. backbone.count_params() 전후 비교 — trainable parameter 가 2B 에서 수백만 으로 떨어지는 거 메모.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.