BioPlayground

🧬
목록으로

Foundation Model Fine-tuning: LoRA로 수십억 파라미터를 실험실 GPU에서 다루기

저랭크 행렬 분해로 미세조정 파라미터를 극적으로 줄이는 LoRA 원리와, HuggingFace PEFT로 scGPT·ESM류 모델을 Colab T4에서 미세조정하는 실습을 다룹니다.

중급
|
22
|
검증 완료 (2026-07-29)
LoRAPEFTfine-tuningfoundation model
진행률0/120 (0%)

F16부터 F23까지 쌓인 공통 병목 — 미세조정 비용

F16의 DNABERT부터 F23의 UCE까지, 이 시리즈에서 만난 모델들은 모두 수백만에서 수십억 파라미터 규모입니다. 실험실에서 특정 과제(예: 특정 암종의 세포 유형 분류)에 맞춰 이 모델을 미세조정하려면, 원칙적으로는 모델 전체 파라미터에 대한 그래디언트와 옵티마이저 상태를 GPU 메모리에 올려야 합니다. 이는 대부분의 실험실이 가진 GPU 자원(단일 T4·A10 등)으로는 감당하기 어렵습니다. F24에서는 이 병목을 우회하는 표준 기법, **LoRA(Low-Rank Adaptation)**를 다룹니다.

원리 — 전체를 바꾸지 않고, 저랭크 보정만 더하기

전체 미세조정의 메모리 비용

파라미터 θ\theta개짜리 모델을 일반적인 Adam 옵티마이저로 전체 미세조정(full fine-tuning)한다고 합시다. 모델 가중치, 그래디언트, Adam의 1차·2차 모멘트까지 합치면 대략

기본 저장량 하한θ×(2가중치(fp16)+2그래디언트+8Adam 모멘트, fp32) 바이트=12θ 바이트\text{기본 저장량 하한} \approx \theta \times (\underbrace{2}_{\text{가중치(fp16)}} + \underbrace{2}_{\text{그래디언트}} + \underbrace{8}_{\text{Adam 모멘트, fp32}}) \text{ 바이트} = 12\theta \text{ 바이트}

10억 파라미터 모델이라면 이 하한만 대략 12×10912 \times 10^9 바이트 12\approx 12GB입니다. 실제 학습에는 활성값, 임시 버퍼, 구현에 따라 fp32 마스터 가중치까지 더해지므로, T4의 16GB VRAM으로는 넉넉히 감당하기 어렵습니다.

LoRA — 가중치 변화량을 저랭크로 근사하기

LoRA는 미세조정 과정에서 원래 가중치 행렬 WRd×kW \in \mathbb{R}^{d \times k} 자체를 통째로 갱신하는 대신, 그 변화량 ΔW\Delta W를 훨씬 작은 두 행렬의 곱으로 근사합니다.

W=W+ΔWW+BA,BRd×r, ARr×k, rmin(d,k)W' = W + \Delta W \approx W + BA, \quad B \in \mathbb{R}^{d \times r},\ A \in \mathbb{R}^{r \times k},\ r \ll \min(d, k)

여기서 rr은 랭크(rank)로, 보통 4~64 사이의 작은 값을 씁니다. 원본 가중치 WW는 그대로 고정(freeze)하고, 오직 AABB만 학습합니다.

손 계산 예제: 파라미터 절감 비율

d=k=4096d = k = 4096짜리 정사각 가중치 행렬 하나를 LoRA로 미세조정한다고 합시다. 원본 전체 미세조정 대상 파라미터 수는

d×k=4096×4096=16,777,216d \times k = 4096 \times 4096 = 16{,}777{,}216

랭크 r=8r=8짜리 LoRA를 적용하면 학습 대상 파라미터 수는

d×r+r×k=4096×8+8×4096=65,536d \times r + r \times k = 4096 \times 8 + 8 \times 4096 = 65{,}536

절감 비율은

16,777,21665,536=256\frac{16{,}777{,}216}{65{,}536} = 256\text{배}

즉 이 한 층만 놓고 보면 학습해야 할 파라미터가 원래의 약 0.4%로 줄어듭니다. 모델 전체로 확장해도 이 비율이 대략 유지되며, 이것이 LoRA가 GPU 메모리와 학습 시간을 극적으로 줄이는 근거입니다.

왜 저랭크 근사가 통하는가

사전학습된 대형 모델은 이미 방대한 데이터에서 범용 표현을 학습해둔 상태입니다. 특정 다운스트림 과제에 맞추기 위해 필요한 "보정"은 원본 가중치 공간 전체를 다시 탐색할 필요 없이, 훨씬 낮은 차원의 부분 공간(intrinsic dimension) 안에서 이루어지는 경우가 많다는 것이 LoRA의 경험적 근거입니다.

intrinsic dimension of task adaptationfull parameter space\text{intrinsic dimension of task adaptation} \ll \text{full parameter space}

실습: HuggingFace PEFT로 Nucleotide Transformer류 모델 LoRA 미세조정

python
# Colab T4, 무료 티어에서 실행 가능한 규모(소형 변형 모델 기준)입니다.
from transformers import AutoModel, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
# 사전학습 모델 로드 (F17에서 다룬 경로 예시)
# base_model = AutoModel.from_pretrained("InstaDeepAI/nucleotide-transformer-v2-50m-multi-species")
# tokenizer = AutoTokenizer.from_pretrained("InstaDeepAI/nucleotide-transformer-v2-50m-multi-species")
lora_config = LoraConfig(
task_type=TaskType.FEATURE_EXTRACTION,
r=8, # 랭크: 4~64 사이에서 과제 난이도에 맞춰 조정
lora_alpha=16, # 스케일링 계수, 보통 r의 2배 근방
lora_dropout=0.1,
# 모델마다 실제 모듈 이름이 다릅니다. named_modules()로 확인한 뒤 지정합니다.
target_modules=["query", "value"],
)
# peft_model = get_peft_model(base_model, lora_config)
# peft_model.print_trainable_parameters()
# 출력 예시: "trainable params: 294,912 || all params: 50,219,904 || trainable%: 0.587%"
print("LoRA 설정 예시:", lora_config)

target_modules를 attention의 Query·Value 투영 행렬로 제한하는 것은 흔한 절충안이지만, 이름(query, value)은 모델 아키텍처마다 다릅니다. 먼저 base_model.named_modules()로 실제 선형층 이름을 확인하고 소형 배치로 어댑터 삽입·forward pass를 점검하세요. 모든 선형층에 LoRA를 적용하면 성능이 조금 더 오를 수 있지만 파라미터 절감 폭이 줄어들므로, 가진 GPU 메모리와 목표 성능 사이에서 적용 범위를 조정하는 것이 실무적입니다.

CS 매핑

  • 저랭크 행렬 분해(low-rank matrix factorization): LoRA의 핵심은 선형대수의 저랭크 근사입니다. 큰 행렬을 두 작은 행렬의 곱으로 근사하는 것은 추천시스템의 행렬 분해(matrix factorization)나 PCA의 저차원 투영과 동일한 수학적 도구입니다.
  • 파라미터 효율 학습(Parameter-Efficient Fine-Tuning, PEFT): LoRA는 PEFT라는 더 넓은 기법군의 대표 사례입니다. 어댑터(adapter) 레이어 삽입, 프롬프트 튜닝 등 다른 PEFT 기법도 "원본을 고정하고 작은 추가 모듈만 학습한다"는 같은 철학을 공유합니다.
  • 모듈화된 배포(modular deployment): 학습된 LoRA 가중치는 원본 모델과 분리해 별도로 저장·배포할 수 있어, 소프트웨어 공학의 플러그인 아키텍처와 유사하게 하나의 기반 모델 위에 여러 과제별 어댑터를 갈아 끼울 수 있습니다.

자주 만나는 결함

  • 랭크 rr을 무조건 작게 설정: rr을 지나치게 작게 잡으면 과제에 필요한 표현력 자체가 부족해질 수 있습니다. 여러 rr 값으로 검증 성능을 비교해보는 것이 안전합니다.
  • target_modules를 임의로 축소해 성능 저하를 LoRA 자체의 한계로 오해: 적용 범위를 좁게 잡으면 필요한 만큼의 적응력을 확보하지 못할 수 있습니다. 성능이 기대에 못 미치면 랭크와 적용 모듈 범위를 함께 재검토해야 합니다.
  • 양자화(quantization)와 LoRA를 혼동: QLoRA처럼 양자화와 LoRA를 결합하는 기법도 있지만, LoRA 자체는 가중치 정밀도를 바꾸는 기법이 아니라 학습 대상 파라미터 수를 줄이는 기법입니다. 둘을 명확히 구분해야 합니다.

더 깊게 파고 싶다면

본문은 BPD 연구진이 직접 재구성한 서술입니다. 원 논문과 공식 자료로 심화해봅시다.

  • LoRA 원 논문: Hu et al. (2021), LoRA: Low-Rank Adaptation of Large Language Models, arXiv 사전 인쇄본 (ICLR 2022 게재).
  • QLoRA 원 논문: Dettmers et al. (2023), QLoRA: Efficient Finetuning of Quantized LLMs, NeurIPS.
  • HuggingFace PEFT 공식 문서: 라이브러리 사용법과 지원 기법 목록.

다음 편(F25)에서는 이 시리즈 전체(F01~F24)에서 다룬 모델들을 HuggingFace Bio 모델 허브에서 실제로 탐색·선택·비교하는 실무 투어로 F1 파운데이션 모델 티어를 마무리합니다.