Gemma 파인튜닝 첫걸음 — LoRA로 내 데이터에 맞춘 모델 만들기
로컬 LLM을 쓰다 보면 "이 모델이 내 말투로, 내 형식대로 답하면 좋겠다"는 순간이 온다. 이전 글 "로컬 LLM 제대로 활용하는 법"에서 파인튜닝을 개념으로만 다뤘는데, 이 글은 그 심화 실전편이다. Gemma를 LoRA 방식으로 가볍게 파인튜닝해서 다시 Ollama에 올려 쓰기까지의 전체 흐름을, 처음 하는 사람 기준으로 순서대로 밟는다. 결론부터 말하면 생각보다 어렵지 않고, 생각보다 만능도 아니다.
1. 파인튜닝 vs RAG — 언제 뭘 쓰나
시작 전에 방향부터 잡자. 새로운 "지식"을 넣고 싶은 거라면 파인튜닝이 아니라 RAG가 먼저다. 파인튜닝은 지식 주입에 비효율적이고, 문서가 바뀔 때마다 재학습해야 한다. 반면 말투·출력 형식·응답 규칙·도메인 특유의 문체처럼 "태도"를 바꾸고 싶다면 파인튜닝이 맞다. 예를 들어 항상 정해진 JSON 형식으로 답하게 하거나, 고객 응대 문체를 일관되게 만들거나, 특정 분야 용어 사용 습관을 들이는 일이다. 둘은 경쟁 관계가 아니라 보완 관계라서, 지식은 RAG로 공급하고 형식은 파인튜닝으로 굳히는 조합이 실전에서 흔하다.
2. LoRA가 뭔가 — 전체 재학습과의 차이
모델의 수십억 개 파라미터를 전부 다시 학습하는 풀 파인튜닝은 개인 GPU로는 비현실적이다. LoRA(Low-Rank Adaptation)는 기존 가중치를 전부 동결해 두고, 그 옆에 붙인 작은 저랭크 행렬(어댑터)만 학습하는 기법이다. 학습 대상 파라미터가 전체의 몇 퍼센트 수준으로 줄어들기 때문에 GPU 메모리 요구가 크게 낮아지고, 결과물도 수십~수백 MB짜리 어댑터 파일 하나로 떨어진다. 여기에 4비트 양자화를 결합한 QLoRA를 쓰면 무료 Colab의 T4 GPU로도 소형 Gemma를 학습할 수 있다. 어댑터는 본체와 분리되어 있으므로 용도별로 여러 개 만들어 갈아 끼우는 운용도 가능하다.
3. 데이터셋 준비 — 형식과 최소 규모
가장 오래 걸리고 가장 중요한 단계다. 지시-응답 쌍을 JSONL(한 줄에 JSON 하나) 형식으로 만든다. 원하는 출력의 "모범 답안"을 사람이 직접 써 주는 작업이라고 생각하면 된다.
{"instruction": "다음 회의록을 3줄로 요약하라.", "input": "...회의록 원문...", "output": "· 결정: ...\n· 담당: ...\n· 기한: ..."}
{"instruction": "다음 문의에 우리 스튜디오 톤으로 답하라.", "input": "환불이 가능한가요?", "output": "안녕하세요. 구매일로부터..."}
규모는 목적에 따라 다르지만, 형식·말투 교정처럼 좁은 목표라면 수백 개 수준에서도 변화가 보인다는 것이 여러 커뮤니티와 도구 문서의 공통된 경험칙이다. 개수보다 중요한 것은 일관성이다. 출력 예시들끼리 형식이 어긋나 있으면 모델도 어긋난 것을 배운다. 전체의 10% 정도는 학습에 쓰지 않고 남겨서, 학습 후 품질 확인용으로 쓴다. 데이터를 처음부터 지어내기보다는 이미 갖고 있는 재료를 쓰는 것이 빠르다. 그동안 클라우드 AI와 주고받으며 만족스러웠던 답변, 실제 업무에서 쓴 문서와 그 요약본 같은 것들이 좋은 원석이고, 형식만 지시-응답 쌍으로 다듬으면 된다.
4. 학습 실행 — Unsloth와 무료 Colab
학습 도구는 Hugging Face의 TRL/PEFT를 직접 써도 되지만, 입문에는 Unsloth가 가장 수월했다. 메모리를 아끼는 최적화가 들어 있고, Gemma용 무료 Colab 노트북을 공식 문서에서 제공하므로 내 GPU가 약해도 된다. 흐름의 골격만 코드로 옮기면 다음과 같다(세부 API는 Unsloth 공식 노트북 기준을 따르는 것이 안전하다).
from unsloth import FastModel
# 1) 4비트로 베이스 모델 로드 (예: Gemma 3 4B instruct)
model, tokenizer = FastModel.from_pretrained(
"unsloth/gemma-3-4b-it",
load_in_4bit=True,
)
# 2) LoRA 어댑터 부착 (r: 랭크, 클수록 표현력과 용량 증가)
model = FastModel.get_peft_model(model, r=16, lora_alpha=16)
# 3) 준비한 데이터셋으로 학습 (TRL의 SFTTrainer 사용)
# 에폭 1~3, 학습률 2e-4 안팎에서 시작하는 것이 보통이다
학습 시간은 데이터 수백~수천 건에 소형 모델 기준으로 수십 분에서 몇 시간 수준이다. 중요한 주의점 하나는 채팅 템플릿이다. 학습할 때 적용한 대화 템플릿과 나중에 실행할 때의 템플릿이 다르면 품질이 눈에 띄게 망가진다. Unsloth 문서에서도 가장 흔한 실패 원인으로 꼽는 부분이라, 노트북이 제공하는 Gemma 템플릿 설정을 그대로 쓰는 것이 안전하다.
5. 결과 병합과 Ollama에서 쓰기
학습이 끝나면 어댑터를 베이스 모델에 병합하고 GGUF 형식으로 내보낸다. Unsloth는 이 과정을 한 번에 처리하는 내보내기 기능을 제공하며, 로컬 실행용으로는 8비트 양자화(Q8_0)가 무난하다. GGUF 파일을 내 PC로 내려받았다면 Modelfile을 하나 만들어 Ollama에 등록한다.
# Modelfile
FROM ./my-gemma-ft.Q8_0.gguf
ollama create my-gemma -f Modelfile
ollama run my-gemma "환불 문의에 답해줘"
이 순간이 이 튜토리얼의 보상이다. 학습은 클라우드 GPU에서 하고, 실행은 평소처럼 내 PC의 Ollama에서 한다. 역할을 나누면 파인튜닝의 진입 장벽은 대부분 데이터 준비로 좁혀진다.
6. 현실적 기대치
마지막으로 기대치를 조정하자. LoRA 파인튜닝으로 얻을 수 있는 것은 형식과 문체의 일관성, 반복 지시의 내재화다. 얻기 어려운 것은 새로운 사실 지식, 추론 능력의 향상이다. 오히려 좁은 데이터로 과하게 학습하면 원래 잘하던 일반 능력이 무뎌지는 부작용도 있다. 그래서 순서는 이렇게 권한다. 먼저 프롬프트와 시스템 지시로 해결되는지 시도하고, 지식 문제면 RAG를 붙이고, 그래도 매번 형식이 흔들리는 반복 작업이 있을 때 그 좁은 목표를 겨냥해 LoRA를 쓴다. 그 용도로는 확실히 값을 한다.
함께 보면 좋은 글: 로컬 LLM 제대로 활용하는 법 — 클라우드 AI와 역할 분담, RAG와 파인튜닝까지
※ 이 글의 도구와 학습 절차는 2026년 기준이며 변경될 수 있습니다.
댓글
댓글 쓰기