커뮤니티 입장하기

파인튜닝 기초와 LoRA (데이터 준비, 언제 필요한지)

파인튜닝은 이미 학습된 모델에 내 예시 데이터를 더 학습시켜 답의 형식과 어투, 특정 작업 방식을 고정하는 일입니다. LoRA는 원래 가중치는 얼려 두고 작은 행렬 두 개만 학습해, 필요한 메모리와 결과 파일 크기를 크게 줄이는 파인튜닝 방법입니다.

같은 말:파인튜닝 뜻LoRA 뜻QLoRAmlx_lm lora로컬 모델 파인튜닝

새로 올라온 개념이에요. 먼저 읽어 보고 퀴즈도 풀어 보세요
Share
목차
  1. 🤔 프롬프트를 아무리 고쳐도 같은 형식으로 답하지 않을 때
  2. 🔑 파인튜닝과 LoRA의 정의
  3. 🧭 파인튜닝이 필요한 때와 아닌 때
  4. 🧩 LoRA가 메모리를 줄이는 원리
  5. 📝 학습 데이터 준비
  6. 🍎 맥에서는 MLX-LM
  7. 🟩 엔비디아에서는 Unsloth
  8. 🔁 결과를 올라마에서 쓰기
  9. ⚠️ 자주 하는 실수
  10. ❓ 자주 묻는 질문
  11. 📋 3줄 요약

🤔 프롬프트를 아무리 고쳐도 같은 형식으로 답하지 않을 때

로컬 모델에게 회사 보고서 양식대로 요약해 달라고 하면 매번 형식이 조금씩 달라지고, 우리 팀이 쓰는 말투를 예시로 보여 줘도 몇 줄 뒤에는 원래 말투로 돌아갑니다. 프롬프트를 길게 쓸수록 컨텍스트는 차고 결과는 여전히 들쭉날쭉합니다. 이때 떠오르는 방법이 모델 자체를 내 예시로 더 가르치는 파인튜닝입니다.

지금부터 파인튜닝이 언제 필요하고 언제 다른 방법으로 충분한지, 로컬에서 가장 많이 쓰는 LoRA가 어떻게 메모리를 줄이는지, 학습 데이터를 어떤 형식으로 준비하는지, 맥과 엔비디아에서 각각 어떤 도구를 쓰고 결과를 올라마로 어떻게 가져오는지 정리합니다. 도구 이름과 버전은 2026년 9월 28일 공식 문서 기준입니다.

🔑 파인튜닝과 LoRA의 정의

파인튜닝은 이미 학습된 모델에 내 예시 데이터를 더 학습시켜 답의 형식과 어투, 특정 작업 방식을 고정하는 일이고, LoRA는 원래 가중치는 얼려 두고 작은 행렬 두 개만 학습해 필요한 메모리와 결과 파일 크기를 크게 줄이는 방법입니다.

모델 전체를 다시 학습시키는 전체 파인튜닝은 가중치뿐 아니라 학습에 필요한 기울기와 옵티마이저 상태까지 메모리에 올려야 해서 무겁습니다. 준이아빠블로그의 Qwen3-TTS 목소리 학습 실측에서도 0.6B 음성 모델을 전체 파인튜닝하자 24GB 맥미니에서 메모리 사용이 5GB로 시작해 23GB까지 늘었습니다. LoRA는 이 부담을 줄이려고 고안되었습니다.

🧭 파인튜닝이 필요한 때와 아닌 때

파인튜닝은 마지막에 고르는 방법입니다. 먼저 프롬프트를 다듬고, 모델이 모르는 자료가 문제라면 RAG를 붙이고, 그래도 해결되지 않는 것이 형식과 어투라면 파인튜닝을 봅니다.

문제먼저 볼 방법
모델이 내 회사 자료를 모름, 자료가 자주 바뀜로컬 RAG
답에 출처를 보여 줘야 함RAG
매번 같은 양식, 같은 어투로 답해야 함파인튜닝
긴 지시문을 매번 넣어 컨텍스트가 부족함파인튜닝

파인튜닝으로 새 지식을 넣을 수 있는지는 자료마다 입장이 다릅니다. 준이아빠블로그의 RAG와 파인튜닝 판단 가이드는 파인튜닝을 행동을 고정하는 작업으로 보고, 학습 도구를 만드는 Unsloth 공식 FAQ는 지식도 넣을 수 있다고 적습니다. 다만 자주 바뀌는 자료와 출처가 필요한 자료에는 RAG가 맞다는 점은 두 쪽 모두 크게 다르지 않습니다.

필요한 예시 수도 기준마다 다릅니다. OpenAI 문서는 최소 10개, 50~100개에서 개선이 보인다고 적고(인사이트 인용), Unsloth는 최소 100행, 좋은 결과에는 1,000행 이상을 권합니다. 좋은 입출력 예시를 수십 개도 모으기 어렵다면 아직 파인튜닝할 때가 아닙니다.

🧩 LoRA가 메모리를 줄이는 원리

허깅페이스 PEFT 문서는 LoRA를 이렇게 설명합니다. 학습으로 바뀌는 가중치 변화량을 작은 행렬 두 개의 곱으로 표현하고, 원래 가중치는 얼린 채 이 두 행렬만 학습합니다. 결과를 낼 때는 원래 가중치와 작은 행렬의 결과를 더합니다.

  • 학습하는 양: PEFT 예시에서 Llama-3.2-1B의 어텐션 일부에 랭크 8로 걸면 학습 파라미터는 524,288개, 전체의 0.0424%입니다
  • 결과 파일: 저장하면 adapter_config.json과 adapter_model.safetensors 두 파일만 생기고, 350M 모델 예시에서 어댑터는 6.3MB였습니다(원본 약 700MB)
  • 여러 개 두기: 원본은 그대로 두고 작업마다 가벼운 어댑터를 따로 만들 수 있습니다

QLoRA는 기본 모델을 4비트로 양자화해 올린 뒤 그 위에 LoRA를 학습하는 방법입니다. 양자화한 모델은 원래 추가 학습이 불안정하지만, 추가한 작은 행렬만 학습하기 때문에 가능하다고 PEFT 문서가 설명합니다. 메모리가 적은 개인 기기에서 가장 흔히 쓰는 방식입니다.

📝 학습 데이터 준비

로컬 학습 도구는 대부분 JSONL 파일을 받습니다. JSONL은 한 줄에 JSON 하나씩 적는 형식이고, MLX-LM 문서는 예시 하나를 반드시 한 줄에 쓰라고 강조합니다. 대화형(chat) 형식은 이렇습니다.

{"messages": [{"role": "system", "content": "주간 보고 양식으로 요약한다."}, {"role": "user", "content": "이번 주 회의 내용: ..."}, {"role": "assistant", "content": "1. 결정 사항\n- ...\n2. 다음 할 일\n- ..."}]}
  • 파일 나누기: 학습용 train.jsonl은 필수이고, 검증용 valid.jsonl, 시험용 test.jsonl을 따로 둡니다
  • 질문과 답 형식: {"prompt": "...", "completion": "..."}처럼 간단히 쓸 수도 있습니다
  • 답만 학습: MLX-LM의 --mask-prompt를 주면 질문 부분은 학습에서 빼고 답 부분만 배웁니다
  • 공개 데이터: 한국어 대화 데이터가 필요하면 AI허브에 사후학습용 데이터가 올라와 있지만 데이터마다 이용 조건이 따로 붙습니다

학습 결과를 공개하거나 업무에 쓸 계획이라면 기본 모델의 라이선스도 확인합니다. 예를 들어 업스테이지 Solar 라이선스는 파인튜닝을 허용하되 파생 모델 이름 앞에 Solar-를 붙이는 조건이 있습니다. 라이선스 읽는 법은 오픈 웨이트와 오픈 소스 차이에 정리했습니다.

🍎 맥에서는 MLX-LM

애플 실리콘 맥에서는 애플의 MLX-LM을 씁니다. 설치는 pip install "mlx-lm[train]"이고 학습 명령은 다음과 같습니다.

mlx_lm.lora --model <모델 경로> --train --data <데이터 폴더> --iters 600

--model에 양자화된 모델을 주면 자동으로 QLoRA가 됩니다. 결과 어댑터는 adapters/ 폴더에 저장되고, --test로 시험 데이터 점수를, mlx_lm.generate --adapter-path adapters로 실제 답을 확인합니다. 공식 문서의 예로 M1 Max 32GB에서 7B 모델을 배치 1, 학습 층 4개로 돌리면 초당 약 250토큰을 처리했습니다. 메모리가 부족하면 --batch-size를 줄이고, --num-layers로 학습할 층 수를 줄이고, --grad-checkpoint를 켭니다.

🟩 엔비디아에서는 Unsloth

엔비디아 GPU에서는 Unsloth가 많이 쓰입니다. 2018년 이후 GPU(CUDA Capability 7.0 이상)를 지원하고, 공식 요구 사항 표의 최소 VRAM은 다음과 같습니다.

모델 크기QLoRA (4비트)LoRA (16비트)
8B6GB22GB
14B8.5GB33GB
27B22GB64GB

Unsloth는 학습률을 2e-4에서 시작하고, 에포크(데이터 전체를 한 번 도는 횟수)는 1~3번, 랭크는 8이나 16에서 시작하라고 권합니다. 에포크를 3번 넘게 돌리면 예시를 외워 버리는 과적합 위험이 커진다고 적습니다.

🔁 결과를 올라마에서 쓰기

여기에 2026년 9월의 중요한 변경이 있습니다. 올라마 Modelfile 공식 문서에서 어댑터를 따로 붙이는 ADAPTER 지시어가 2026년 9월 15일에 빠졌고, v0.34.1부터는 어댑터가 들어간 Modelfile을 LoRA adapters are no longer supported 오류로 거부합니다. 예전 글의 ADAPTER 방법은 지금 버전에서 동작하지 않습니다.

지금 쓰는 경로는 병합 후 가져오기입니다.

  1. 어댑터 병합: 맥은 mlx_lm.fuse --model <모델 경로>로 fused_model/ 폴더를 만들고, PEFT는 merge_and_unload()로 병합합니다
  2. 올라마로 가져오기: Modelfile에 FROM /병합한/폴더 또는 FROM /파일.gguf를 적고 ollama create 내모델을 실행합니다
  3. 양자화는 먼저: 올라마는 가져올 때 GGUF를 양자화하지 않으므로 llama.cpp의 llama-quantize로 미리 줄입니다

어댑터를 병합하지 않고 따로 붙여 쓰고 싶다면 llama.cpp의 llama-server --lora 파일을 씁니다. 가져온 모델을 서버로 여는 방법은 로컬 모델 서빙에서 다뤘습니다.

⚠️ 자주 하는 실수

  • 학습 손실이 내려가면 성공이라고 봅니다: Qwen3-TTS 실측에서는 공식 스크립트 버그로 손실이 12.2에서 3.6까지 내려갔는데 출력은 잡음이었습니다. 학습 전에 원본 모델로 손실을 한 번 확인하고, 결과는 실제 답으로 봅니다
  • 에포크를 늘릴수록 좋다고 봅니다: 같은 실측에서 4에포크 판이 6에포크 판보다 자연스러웠습니다
  • 검증 데이터를 두지 않습니다: 과적합을 알아챌 방법이 없어집니다
  • 다른 기본 모델에 어댑터를 붙입니다: 어댑터는 학습한 그 모델에서만 제대로 동작합니다

❓ 자주 묻는 질문

16GB 맥에서도 파인튜닝이 되나요?

작은 모델을 QLoRA로 학습하는 것은 됩니다. 공식 문서도 메모리가 부족하면 양자화 모델, 작은 배치, 적은 학습 층 수로 줄이라고 안내합니다. 다만 모델 크기와 예시 길이에 따라 필요한 메모리가 크게 달라서, 작은 데이터로 한 번 돌려 메모리 사용량을 보는 편이 정확합니다.

파인튜닝한 모델이 원래 능력을 잃지는 않나요?

특정 형식으로 너무 많이 학습하면 다른 요청에서 답이 어색해질 수 있습니다. 그래서 에포크를 1~3번으로 두고, 학습에 쓰지 않은 질문으로 원래 모델과 나란히 비교해 봅니다.

학습 데이터는 모델이 만든 답으로 채워도 되나요?

큰 모델이 만든 답으로 작은 모델을 학습시키는 방식은 증류라고 부르며 실제로 쓰입니다. 다만 모델마다 이용 약관에 다른 모델 학습에 쓰는 것을 제한하는 조건이 있을 수 있으므로 먼저 확인합니다. 증류의 원리는 AI 모델 증류에 정리했습니다.

📋 3줄 요약

  1. LoRA는 원래 가중치를 얼려 두고 작은 행렬 두 개만 학습하며, 허깅페이스 PEFT 예시에서 1B 모델에 걸면 전체 파라미터의 약 0.04%만 학습합니다.

  2. 맥에서는 mlx_lm.lora로 JSONL 데이터를 학습하고 양자화 모델을 주면 자동으로 QLoRA가 되며, 엔비디아에서는 Unsloth 기준 8B 모델 QLoRA에 최소 6GB VRAM이 듭니다.

  3. 올라마는 2026년 9월 v0.34.1부터 LoRA 어댑터를 따로 붙이지 않으므로, 어댑터를 기본 모델에 병합한 뒤 FROM으로 가져와 씁니다.

Share

제대로 이해했는지 한 문제로 확인해 볼까요?

답을 고르면 바로 풀이가 나와요.

2026년 9월 28일 기준으로 맥에서 LoRA로 학습한 결과를 올라마에서 쓰려면 어떻게 해야 할까요?

5개념 / 클래스로컬 음성 합성과 목소리 학습 (Qwen3-TTS, 동의와 표시)