카테고리 없음

LoRA란?

로이제로 2025. 6. 16. 22:00
반응형

LoRA란?

대형 언어모델을 가볍게 fine-tuning 할 수 있는 효율적인 기법

최근 들어 LLM(대형 언어 모델)을 개인화하거나 특정 도메인에 맞게 조정하는 수요가 많아졌습니다. 그러나 기존 방식은 많은 GPU 메모리와 계산량이 요구되어 일반 사용자나 소규모 프로젝트에 부담이 되었습니다.

이런 문제를 해결하기 위해 등장한 것이 바로 LoRA (Low-Rank Adaptation) 입니다.


왜 LoRA가 필요한가요?

기존의 Fine-Tuning 방식은 모델의 모든 파라미터를 업데이트합니다. 하지만:

  • 수억 개의 파라미터를 매번 학습하기엔 너무 무겁고
  • 저장 공간도 많이 필요하며
  • 전이 학습(transfer learning)의 효율도 떨어집니다.

LoRA는 이 문제를 해결하면서도 성능은 유지할 수 있는 놀라운 아이디어를 제공합니다.


LoRA의 핵심 아이디어

LoRA는 전체 모델을 학습시키지 않고, 일부 레이어에만 아주 작은 행렬(저차원 행렬)을 추가해서 학습합니다.

예시로 설명해보겠습니다:

기존 Transformer 모델에서 자주 사용되는 Linear Layer는 다음과 같이 표현됩니다.

Y = W × X

여기서 LoRA는 W를 직접 바꾸지 않고, 아래와 같이 두 개의 작은 행렬 A, B 를 더해줍니다.

Y = (W + B × A) × X

여기서:

  • A: 작은 크기의 행렬 (low-rank)
  • B: 원래 크기의 행렬로 복원해주는 역할

즉, 전체 파라미터 중 일부만 학습하면서도 모델의 능력은 그대로 유지하는 방식입니다.


왜 'Low-Rank'인가요?

행렬의 'rank'는 정보의 복잡도를 나타내는데, LoRA에서는 정보를 저차원 공간(low-rank) 에서 학습하고 다시 복원하는 방식이기 때문에 파라미터 수가 크게 줄어듭니다.

  • 기존 파라미터: 수억 개
  • LoRA로 조정되는 파라미터: 수십만 개 수준

이 덕분에:

  • GPU 메모리 소모가 적고
  • 학습 속도가 빠르며
  • 저장 용량도 줄어듭니다.

실습 코드 예시

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model, LoraConfig, TaskType

# 사전 학습된 모델 불러오기
model = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-neo-125M")
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-neo-125M")

# LoRA 설정
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=8,                     # low-rank 차원 수
    lora_alpha=32,
    lora_dropout=0.1,
    target_modules=["q_proj", "v_proj"]  # 특정 Linear Layer에만 적용
)

# LoRA 적용
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # 학습되는 파라미터만 출력

LoRA는 어디에 유용할까요?

  • 개인화된 챗봇 구축
  • 특정 산업/분야용 QA 시스템
  • 메모리가 제한된 환경에서의 미세 조정
  • 여러 사용자 버전의 모델을 빠르게 만들고 싶을 때

마무리하며

LoRA는 기존 LLM을 효율적으로 활용하고자 하는 모든 분들께 매우 실용적인 기법입니다. 특히 사내 시스템, 특정 고객 데이터에 맞춘 커스터마이징을 할 때 GPU 자원이 부족하더라도 좋은 선택이 될 수 있습니다.

SFTTrainer와 결합하면 더 적은 비용으로도 강력한 모델을 만들 수 있습니다.

반응형