Microsoft LoRA 프로젝트 상세 소개
프로젝트 개요
Microsoft LoRA는 마이크로소프트에서 오픈 소스로 공개한 Python 라이브러리로, "LoRA: Low-Rank Adaptation of Large Language Models"(대규모 언어 모델의 저랭크 적응) 기술을 구현했습니다. 이 프로젝트는 대규모 언어 모델의 효율적인 미세 조정을 위한 혁신적인 솔루션을 제공합니다.
프로젝트 주소: https://github.com/microsoft/LoRA
논문 주소: https://arxiv.org/abs/2106.09685
핵심 기술 원리
LoRA 기술 소개
LoRA(Low-Rank Adaptation)는 파라미터 효율적인 미세 조정 방법으로, 핵심 아이디어는 다음과 같습니다.
- 원래 사전 훈련된 가중치 동결: 원래 모델 파라미터를 수정하지 않음
- 저랭크 분해 행렬 추가: 한 쌍의 저랭크 행렬을 학습하여 모델 적응을 구현
- 훈련 파라미터 대폭 감소: 새로 추가된 저랭크 행렬 파라미터만 훈련
기술 장점
- 파라미터 효율성 극대화
- GPT-3 175B 전체 미세 조정에 비해 LoRA는 훈련 파라미터를 10,000배 줄일 수 있음
- GPU 메모리 요구량 3배 감소
- 뛰어난 성능 유지
- RoBERTa, DeBERTa, GPT-2, GPT-3에서 전체 미세 조정과 비슷하거나 더 나은 성능을 보임
- GLUE 벤치마크 테스트에서 뛰어난 결과 획득
- 배포 용이
- 추가적인 추론 지연 없음
- 효율적인 작업 전환 지원
- 저장 공간 요구량 대폭 감소
성능 결과
GLUE 벤치마크 테스트 결과
GLUE 벤치마크 테스트에서 LoRA는 뛰어난 성능을 보여주었습니다.
| 모델 | 훈련 파라미터 수 | MNLI 정확도 | SST-2 정확도 | MRPC 정확도 |
|---|---|---|---|---|
| RoBERTa Base 전체 미세 조정 | 125M | 87.6 | 94.8 | 90.2 |
| RoBERTa Base LoRA | 0.8M | 87.6±.1 | 95.1±.2 | 89.7±.7 |
| DeBERTa XXL 전체 미세 조정 | 1.5B | 91.1 | 96.8 | 92.9 |
| DeBERTa XXL LoRA | 4.7M | 91.9±.1 | 96.9±.2 | 92.6±.6 |
GPT-2 텍스트 생성 작업
E2E, DART, WebNLG 등 텍스트 생성 작업에서 LoRA는 뛰어난 성능을 보였습니다.
| 방법 | 훈련 파라미터 | E2E (BLEU) | DART (BLEU) | WebNLG (BLEU) |
|---|---|---|---|---|
| GPT-2 M 전체 미세 조정 | 354.92M | 68.2 | 46.0 | 47.6 |
| GPT-2 M LoRA | 0.35M | 70.4±.1 | 47.1±.2 | 55.3±.2 |
프로젝트 구조
microsoft/LoRA/
├── loralib/ # 핵심 라이브러리 소스 코드
├── examples/
│ ├── NLG/ # GPT-2 자연어 생성 예제
│ └── NLU/ # RoBERTa/DeBERTa 자연어 이해 예제
├── README.md
└── setup.py
설치 및 사용
설치 방법
pip install loralib
# 또는 소스 코드에서 설치
pip install git+https://github.com/microsoft/LoRA
기본 사용 예제
1. 선형 레이어 교체
# ===== 수정 전 =====
# layer = nn.Linear(in_features, out_features)
# ===== 수정 후 =====
import loralib as lora
layer = lora.Linear(in_features, out_features, r=16)
2. 훈련 가능한 파라미터 표시
import loralib as lora
model = BigModel()
# "lora_"를 포함하는 파라미터만 훈련 가능하도록 설정
lora.mark_only_lora_as_trainable(model)
# 훈련 루프
for batch in dataloader:
# 정상적인 훈련 과정
pass
3. 체크포인트 저장 및 로드
# LoRA 파라미터 저장
torch.save(lora.lora_state_dict(model), 'lora_checkpoint.pt')
# 사전 훈련된 모델 로드
model.load_state_dict(torch.load('pretrained.pt'), strict=False)
# LoRA 파라미터 로드
model.load_state_dict(torch.load('lora_checkpoint.pt'), strict=False)
지원되는 레이어 유형
현재 LoRA 라이브러리는 다음 레이어 유형을 지원합니다.
nn.Linear→lora.Linearnn.Embedding→lora.Embeddingnn.Conv2d→lora.Conv2dlora.MergedLinear(QKV 투영 등 병합된 선형 레이어에 사용)
고급 기능
1. 병합된 선형 레이어 지원
# QKV 투영 등 시나리오의 경우
qkv_proj = lora.MergedLinear(
d_model, 3*d_model,
r=8,
enable_lora=[True, False, True] # Q와 V에만 LoRA 적용
)
2. 편향 벡터 훈련
# LoRA 관련 편향 훈련
lora.mark_only_lora_as_trainable(model, bias='lora_only')
# 모든 편향 훈련
lora.mark_only_lora_as_trainable(model, bias='all')
3. 추론 시 가중치 병합
# 평가 모드: 가중치 병합, 추론 지연 제거
model.eval()
# 훈련 모드: 분리 상태 복원
model.train()
활용 시나리오
- 대규모 모델 미세 조정: 미세 조정 비용을 크게 절감
- 다중 작업 학습: 효율적인 작업 전환
- 자원 제약 환경: 메모리 및 저장 공간 요구량 감소
- 빠른 프로토타입 개발: 모델 적응 과정 가속화
생태계 통합
- Hugging Face PEFT: HF의 PEFT 라이브러리에 이미 통합됨
- PyTorch 생태계: PyTorch 프레임워크와 완벽하게 호환
- 사전 훈련된 모델: 다양한 주요 사전 훈련된 모델 지원
요약
Microsoft LoRA 프로젝트는 대규모 언어 모델의 효율적인 미세 조정을 위한 획기적인 솔루션을 제공합니다. 영리한 저랭크 적응 기술을 통해 계산 및 저장 비용을 크게 줄이면서도 뛰어난 모델 성능을 유지합니다. 이 프로젝트는 중요한 학문적 가치를 지닐 뿐만 아니라 실제 산업 응용 분야에 실행 가능한 기술 경로를 제공하며, 파라미터 효율적인 미세 조정 분야의 획기적인 작업입니다.