본문 바로가기
C.W.K.
Stream
Lesson 06 of 07 · published

LoRA 미세 조정

~8 min · keras-nlp

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

전체 미세 조정이 메모리를 많이 쓰는 이유

큰 모델의 모든 가중치를 학습하려면 각 가중치의 그래디언트와 옵티마이저 상태까지 보관해야 해. 이 추가 상태가 모델 자체보다 먼저 GPU 메모리를 소진해. LoRA(Low-Rank Adaptation)는 원래 가중치를 모두 고정하고 옆에 더하는 작은 저랭크 행렬 쌍만 학습해 문제를 피하지. 수억 개 대신 수십만 개 매개변수만 갱신하면서 전체를 조정한 것에 가까운 동작을 얻어.

한 줄로 얻는 두 가지 큰 이점

KerasHub에서 backbone.enable_lora(rank=r)를 호출한 뒤 평소처럼 fit()을 실행하면 어댑터만 갱신돼. rank가 높을수록 적응 용량과 학습 매개변수가 함께 늘며 대부분의 경우 4~16이면 충분해. 첫째, 학습 가능 매개변수가 크게 줄어 클러스터가 필요하던 모델도 GPU 한 장에 들어갈 수 있어. 둘째, 전체 모델 복사본이 아니라 작은 어댑터 가중치만 저장하므로 같은 백본을 열 번 미세 조정해도 작은 파일 열 개만 추가돼.

QLoRA는 양자화까지 결합해

QLoRA는 고정된 백본을 먼저 quantize()로 int8이나 int4로 줄인 뒤 LoRA 어댑터를 붙여. 백본은 작고 고정돼 있으며 어댑터만 작고 학습 가능해, 전체 미세 조정에 가까운 품질을 노릴 수 있어. 이 조합 덕분에 7B급 모델의 미세 조정도 소비자용 하드웨어에서 가능해졌어.

Code

LoRA 활성화와 양자화를 결합한 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)를 활성화해. backbone.count_params() 전후를 비교하고 학습 가능 매개변수가 2B에서 수백만 수준으로 줄어드는 것을 기록해.

Progress

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

댓글 0

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

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