LLM 파인튜닝 입문 완벽 정리: LoRA·RLHF·KoAlpaca로 배우는 5단계

남의 LLM을 내 용도로 길들이는 LLM 파인튜닝의 큰 그림을 잡는 글이에요. 파인튜닝 vs 프롬프트 vs RAG 의사결정 기준, LoRA가 비용을 줄이는 원리, RLHF·DPO, 한국어 KoAlpaca 사례와 0원 실습 루트까지 한 번에 정리했습니다.


LLM 파인튜닝, 대기업 GPU 없이는 불가능하다고 생각하셨나요?

7B(70억 파라미터)급 모델을 통째로 다시 학습시키려면 수십 GB의 VRAM, A100급 GPU 여러 장이 필요해요. 시간당 수만 원짜리 클라우드 GPU를 며칠씩 돌리는 비용이죠. 그런데 LoRA를 쓰면 학습 대상 파라미터를 전체의 1% 미만으로 줄여서, 무료 Colab의 T4 GPU 한 장으로도 소형 모델 LLM 파인튜닝이 가능해집니다. 논문 기준으로 GPT-3 175B에서 학습 파라미터를 약 1만 분의 1로 줄였다는 수치가 나와요. 📉

이 글은 제가 연재 중인 머신러닝 독학 시리즈의 8화(총 10화)입니다. 이전 화까지가 ‘남의 모델을 잘 쓰는 법’(프롬프트, RAG)이었다면, 이번 화는 모델 자체를 손보는 단계로 넘어가는 회차예요. 이 글만 읽어도 완결되도록 구성했으니 처음 오신 분도 괜찮습니다.

⚡ 이 글의 핵심만 먼저 보기 (Key Takeaways)

  • 선택 기준: 지식 추가는 RAG, 말투·형식·도메인 스타일 교정은 파인튜닝 — 이 한 줄이 의사결정의 8할이에요
  • LoRA의 힘: 원본 가중치는 얼려두고 작은 저차원 행렬만 학습 — GPT-3 기준 학습 파라미터 약 1/10,000, GPU 메모리 약 1/3
  • RLHF vs DPO: 사람 선호 데이터로 모델을 다듬는 기술 — 요즘은 보상 모델 없이 학습하는 DPO가 실무 진입 장벽을 크게 낮췄어요
  • 한국어 사례: KoAlpaca·KoChatGPT는 코드·데이터셋이 전부 공개된 오픈소스라 최고의 교재입니다
  • 당장 할 액션: Hugging Face PEFT + 무료 Colab으로 1B 이하 소형 모델 LoRA 실습부터 — 대형 모델은 그다음이에요

📌 목차

  1. 파인튜닝 vs 프롬프트 vs RAG: 언제 무엇을 쓰나
  2. 풀 파인튜닝은 왜 비싼가 — PEFT·LoRA의 직관
  3. RLHF와 DPO: 사람 선호로 모델 다듬기
  4. 한국어 사례: KoAlpaca·KoChatGPT로 배우기
  5. Hugging Face 생태계와 0원 실습 루트
  6. 이런 분들께 적극 추천합니다
  7. 자주 묻는 질문 (FAQ)

1. 파인튜닝 vs 프롬프트 vs RAG: 언제 무엇을 쓰나

가장 많이 받는 질문이 “우리 회사 문서 학습시키려면 파인튜닝해야 하나요?”인데, 대부분의 정답은 ‘아니요, RAG부터’예요. 세 가지 방법은 경쟁 관계가 아니라 비용과 난이도의 사다리거든요.

방법 잘 맞는 경우 비용·난이도
프롬프트 지시·예시 몇 개로 해결되는 작업 거의 0, 즉시
RAG 최신·사내 지식을 근거로 답해야 할 때 중간, 검색 인프라 필요
파인튜닝 말투·출력 형식·도메인 스타일 자체를 바꿔야 할 때 높음, 데이터·GPU 필요

① Knowledge vs Behavior — 지식이면 RAG, 행동이면 파인튜닝

핵심 기준은 이거예요. 모델에게 새로운 지식을 주고 싶으면 RAG가 싸고 안전하고, 모델의 행동 방식(말투, JSON 출력 형식, 의료·법률 도메인 어휘)을 바꾸고 싶으면 파인튜닝이 맞습니다. 파인튜닝으로 지식을 주입하면 업데이트할 때마다 재학습해야 하고 환각도 잘 안 잡혀요.

정리하면 검토 순서는 프롬프트 → RAG → 파인튜닝이에요. 프롬프트로 안 되면 RAG를 얹고, 그래도 말투·출력 형식·도메인 스타일이 고정되지 않을 때 비로소 파인튜닝을 꺼냅니다. 지식 자체를 파인튜닝으로 주입하는 건 업데이트할 때마다 재학습해야 하고 환각도 잘 안 잡혀서 가장 마지막 선택지로 두는 게 좋아요.


2. 풀 파인튜닝은 왜 비싼가 — PEFT·LoRA의 직관

풀 파인튜닝은 모델의 모든 파라미터를 업데이트해요. 7B 모델이면 가중치 자체에 더해 그래디언트, 옵티마이저 상태까지 메모리에 올려야 해서 필요 VRAM이 가중치의 3~4배로 뛰죠. 여기서 나온 해법이 PEFT(Parameter-Efficient Fine-Tuning)입니다.

① LoRA — 원본은 얼리고, 작은 행렬만 학습한다

LoRA(Low-Rank Adaptation)의 직관은 단순해요. 원본 가중치는 그대로 얼려두고, 그 옆에 아주 작은 저차원(low-rank) 행렬 두 개를 붙여서 변화량만 학습하는 거예요. 논문 기준 GPT-3 175B에서 학습 파라미터를 약 1만 분의 1로, GPU 메모리를 약 1/3로 줄이면서 풀 파인튜닝과 대등한 성능을 냈습니다. 학습 결과물(어댑터)이 수십 MB라 배포·교체도 가벼워요.

from peft import LoraConfig, get_peft_model

config = LoraConfig(r=8, lora_alpha=16,
    target_modules=['q_proj', 'v_proj'], lora_dropout=0.05)
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# trainable params: 전체의 약 0.1~1% 수준

위 코드에서 r은 저차원 행렬의 랭크(보통 8~16), lora_alpha는 학습된 변화량에 곱해지는 스케일이에요. target_modules는 어텐션의 q_proj·v_proj에 먼저 적용하고, 성능이 아쉬우면 대상 범위를 넓히는 식으로 조정합니다. 값이 클수록 표현력은 늘지만 과적합과 메모리 부담도 함께 커지니, 작은 값에서 시작해 올리는 걸 권해요.

LLM 파인튜닝 관련 이미지

3. RLHF와 DPO: 사람 선호로 모델 다듬기

파인튜닝으로 지시를 따르게 만들었다면, 다음은 ‘더 사람 마음에 드는 답’을 고르게 만드는 단계예요. ChatGPT가 GPT-3와 결정적으로 달라진 지점이 바로 여기입니다.

① RLHF — 답변 두 개 중 어느 쪽이 나은지 가르치기

RLHF(인간 피드백 강화학습)는 3단계예요. 지시 데이터로 기본기를 잡고(SFT), 사람이 “A답변이 B보다 낫다”고 매긴 선호 데이터로 보상 모델을 만들고, 그 보상을 최대화하도록 강화학습을 돌립니다. 강력하지만 모델 3개를 다루는 셈이라 무겁고 불안정하다는 게 단점이에요.

② DPO — 보상 모델 없이 선호를 직접 학습

DPO(Direct Preference Optimization)는 보상 모델과 강화학습을 건너뛰고, 선호 쌍 데이터에서 ‘선택된 답의 확률은 올리고 탈락한 답의 확률은 낮추는’ 손실 함수 하나로 같은 효과를 내요. 일반 파인튜닝과 거의 같은 파이프라인이라 개인도 시도할 수 있는 수준까지 진입 장벽이 내려왔습니다. 요즘 오픈소스 모델 다수가 DPO 계열을 쓰는 이유죠.

실무 진입 순서는 SFT → (필요하면) DPO예요. 선택된 답과 탈락한 답으로 이뤄진 선호 쌍 데이터만 준비되면 Hugging Face TRL 라이브러리의 DPOTrainer로 일반 파인튜닝과 거의 같은 코드로 돌릴 수 있습니다. 보상 모델을 따로 학습하고 서빙할 필요가 없다는 게 RLHF 대비 가장 큰 실무 이점이에요.


4. 한국어 사례: KoAlpaca·KoChatGPT로 배우기

이론은 영어 자료가 많지만, 한국어 모델을 만들고 싶다면 국내 오픈소스 사례가 최고의 교재예요. 코드·데이터셋·시행착오가 전부 공개돼 있거든요.

① KoAlpaca — 한국어 지시 데이터로 만든 대표 오픈소스

KoAlpaca는 스탠포드 Alpaca 방식을 한국어로 재현한 프로젝트예요. 한국어 지시-응답 데이터셋을 만들고 공개 모델(Polyglot-ko 등)에 파인튜닝한 전 과정이 GitHub에 올라와 있습니다. ‘데이터를 어떻게 만들었는가’ 부분만 읽어도 데이터 품질이 성능을 좌우한다는 걸 체감하게 돼요. KoChatGPT는 여기에 RLHF 단계까지 한국어로 재현한 사례라, 3장의 내용을 실제 코드로 확인할 수 있습니다.

KoAlpaca를 실습에 쓰는 가장 쉬운 방법은 저장소의 지시-응답 데이터셋 포맷(instruction·output)을 그대로 빌려 값만 자기 도메인 데이터로 바꿔 끼우는 거예요. 베이스 모델도 저장소가 안내하는 Polyglot-ko 계열을 그대로 따라가면 포맷 설계와 모델 선택의 시행착오를 크게 줄일 수 있습니다.

한 가지 주의할 점, 라이선스 확인은 필수예요. 베이스 모델과 데이터셋의 라이선스에 따라 상업적 이용 가능 여부가 갈리니, 실무 적용 전 반드시 확인하세요. ⚠️


5. Hugging Face 생태계와 0원 실습 루트

실습 도구는 사실상 Hugging Face 생태계로 수렴했어요. 모델 로딩은 Transformers, LoRA 적용은 PEFT, 데이터 처리는 datasets — 이 세 라이브러리만 익히면 파인튜닝 파이프라인이 완성됩니다.

① 계정과 액세스 토큰 발급

먼저 huggingface.co에서 무료 회원가입을 하고, 모델·데이터셋을 코드에서 내려받으려면 액세스 토큰이 필요해요. 발급 절차는 이렇습니다.

  1. 우측 상단 프로필 → SettingsAccess Tokens 메뉴로 이동
  2. New token 클릭 → 이름을 정하고, 다운로드만 할 거면 권한을 Read로(모델 업로드까지 하려면 Write) 선택
  3. 생성된 토큰 문자열을 복사 (한 번만 보이니 안전한 곳에 보관하세요)
  4. Colab이나 터미널에서 huggingface-cli login을 실행하고 토큰을 붙여넣으면 인증 완료

Gemma·Llama처럼 접근 승인이 필요한 모델은 모델 카드에서 라이선스에 먼저 동의해야 토큰으로 내려받을 수 있어요.

② 설치와 최소 LoRA 학습 코드

필요한 라이브러리는 한 줄로 설치합니다.

pip install transformers peft datasets accelerate

데이터는 instruction·output 형태의 지시-응답 쌍으로 준비해요. JSON Lines 파일에서 한 줄이 한 샘플입니다.

{"instruction": "다음 문장을 정중하게 바꿔줘.", "output": "요청 주신 내용을 정중한 표현으로 정리했습니다."}
{"instruction": "파인튜닝을 한 문장으로 설명해줘.", "output": "사전학습된 모델을 특정 목적에 맞게 추가로 학습시키는 과정입니다."}

아래는 무료 Colab T4에서 소형 모델에 LoRA를 붙여 학습하는 최소 뼈대예요. 모델명과 데이터 경로만 바꾸면 그대로 돌아갑니다.

from transformers import (AutoModelForCausalLM, AutoTokenizer,
    Trainer, TrainingArguments)
from peft import LoraConfig, get_peft_model
from datasets import load_dataset

model_name = "..."  # 1B 이하 소형 모델을 지정
tok = AutoTokenizer.from_pretrained(model_name)
base = AutoModelForCausalLM.from_pretrained(model_name)

# 1) LoRA 어댑터 부착
lora = LoraConfig(r=8, lora_alpha=16,
    target_modules=['q_proj', 'v_proj'], lora_dropout=0.05)
model = get_peft_model(base, lora)

# 2) 데이터 로드 & 토크나이즈
ds = load_dataset("json", data_files="train.jsonl")["train"]
def fmt(x):
    text = f"### 지시:\n{x['instruction']}\n### 응답:\n{x['output']}"
    out = tok(text, truncation=True, max_length=512)
    out["labels"] = out["input_ids"].copy()
    return out
ds = ds.map(fmt)

# 3) 학습 & 어댑터 저장
args = TrainingArguments(output_dir="out", num_train_epochs=3,
    per_device_train_batch_size=2, learning_rate=2e-4, fp16=True)
Trainer(model=model, args=args, train_dataset=ds).train()
model.save_pretrained("my-lora-adapter")  # 어댑터만 저장(수십 MB)

③ 작게 완주하고 나서 키우기

권하는 순서는 이래요. 무료 Colab에서 1B 이하 소형 모델을 골라, 공개 지시 데이터셋으로 LoRA 학습을 끝까지 한 번 돌려보는 것. 처음부터 대형 모델을 잡으면 메모리 에러와 씨름하다 파이프라인 감을 못 잡습니다. 작게 완주해 저장·추론까지 확인한 뒤에 모델과 데이터를 키우는 게 가장 빠른 길이에요. 메모리가 빠듯하면 4bit 양자화(QLoRA)로 더 큰 모델도 올릴 수 있습니다. 연재 1화에서 소개한 스타 3.2k GitHub 자료집에도 KoAlpaca·KoChatGPT를 포함한 파인튜닝 자료 링크가 정리돼 있으니 함께 보시면 좋아요.


6. 이런 분들께 적극 추천합니다

  • RAG까지 해봤고, 이제 모델 자체를 손보고 싶은 백엔드·AI 개발자
  • 사내 GPU 없이 무료 자원으로 LLM 파인튜닝을 경험해보고 싶은 주니어 개발자
  • 한국어 도메인 특화 챗봇·어시스턴트를 준비 중인 스타트업 실무자
  • LoRA·RLHF·DPO가 뉴스에 나올 때마다 개념이 헷갈렸던 기획자·PM
  • 머신러닝 독학 로드맵을 따라오다 LLM 트랙으로 넘어온 독학러

7. 자주 묻는 질문 (FAQ)

Q. 파인튜닝하려면 데이터가 몇 건이나 필요한가요?

A. 정해진 숫자는 없지만, 처음부터 수만 건이 필요한 건 아니에요. 스타일·형식 교정 목적이라면 고품질 1,000~5,000쌍으로도 체감 효과가 납니다. 양보다 품질이 우선이라, 노이즈 많은 1만 건보다 깨끗한 1천 건이 낫다는 게 공통된 경험칙이에요.

Q. 무료 Colab만으로 정말 실습이 되나요?

A. 대형 모델은 어렵지만, 소형 모델은 충분히 됩니다. 무료 T4(16GB)에서 1B 이하 모델 LoRA 학습은 무리 없이 돌아가요. 4bit 양자화(QLoRA)를 쓰면 더 큰 모델도 가능하고, 파이프라인을 익히는 목적이라면 무료 자원으로 부족함이 없습니다.

Q. RLHF까지 개인이 해봐야 하나요?

A. 필수는 아니에요. 실무 대부분은 SFT+LoRA 단계에서 끝나고, 선호 최적화가 필요하면 RLHF보다 훨씬 가벼운 DPO로 시작하면 됩니다. 원리를 이해하는 것과 직접 운영하는 것은 별개이니, 개념은 이 글 수준으로 잡고 필요할 때 DPO부터 시도하세요.


✍️ 글을 마치며

정리하면 이래요. 지식은 RAG로, 행동은 파인튜닝으로. 비용은 LoRA로 낮추고, 취향은 DPO로 다듬는다 — 이 네 문장이 LLM 파인튜닝 입문의 뼈대입니다. 한국어라면 KoAlpaca·KoChatGPT가 살아있는 교재고요.

저는 무료 Colab에서 소형 모델 LoRA 노트북을 끝까지 한 번 완주하는 것을 가장 먼저 해볼 것 같아요. 파이프라인을 한 바퀴 돌아본 경험이 있어야 다음 화(9화)의 내용도 손에 잡히거든요.

여러분은 어떤 부분이 가장 인상적이셨나요? 댓글로 자유롭게 의견 남겨주세요! 😊

댓글 남기기