생각을 정리하는 마인드맵, 풀맵 →
릴스 해설

Unsloth로 내 컴퓨터에서 LLM 훈련하기


한 줄 요약: 오픈 모델을 내 컴퓨터에서 훈련하고 실행하는 도구 Unsloth(언슬로스)는 LoRA라는 작은 플러그인 훈련 방식과 4비트 양자화로 메모리를 크게 줄여, 개인 기기에서도 파인튜닝과 추론 전 과정이 가능하게 해줘요.

@techwith.ram님의 카드뉴스 9장짜리 게시물이 눈에 띄었어요. “Running LLMs locally is getting easier, faster, and honestly… pretty exciting”이라는 캡션과 함께, Unsloth를 축으로 로컬에서 LLM을 훈련하는 전 과정을 카드로 정리해 놓았어요. 좋아요 1,014개, 댓글 447개를 기록한 게시물이고, 마지막 장은 Need라는 댓글을 달면 자료와 링크를 보내 주겠다는 안내로 마무리됐어요. 이 글에서는 카드뉴스에 등장한 기술을 처음부터 끝까지 순서대로 풀어 보겠어요.

파인튜닝은 새 직원 교육이다

먼저 대상이 되는 기술부터 짚을게요. 파인튜닝(fine-tuning)은 이미 훈련된 모델을 우리 데이터로 추가 훈련하는 절차예요. 모델을 한 사람으로 그려 보면 이해가 쉬워요. 사전학습(pretraining)을 마친 모델은 인터넷 규모의 글을 읽으며 견문이 넓어진 사람이에요. 하지만 그 사람은 우리 회사 매뉴얼, 고객 응대 규칙, 도메인 용어는 모르죠. 파인튜닝은 바로 이 전지식인에게 추가 교육을 시키는 일이에요. 견문은 그대로 두고, 우리 업무에 필요한 화법과 지식을 얹는 거예요.

왜 굳이 훈련까지 할까요? 일반 모델은 범용 데이터로 만들어졌기 때문에 우리 도메인의 말투나 절차를 그대로 따라 주지 않아요. 그리고 파인튜닝한 모델을 내 기기에서 직접 실행하면 데이터가 외부 API로 나가지 않고, 호출 비용도 들지 않아요. 이 카드뉴스는 “훈련 → 실행 → 배포”의 전 과정을 내 컴퓨터 안에 담는다는 주제로 이어져요.

Unsloth: 같은 공부를 더 싸게

Unsloth는 파인튜닝을 빠르고 가볍게 만들어 주는 오픈소스 라이브러리예요. GitHub 리포(unslothai/unsloth)는 Apache-2.0 라이선스로 공개되어 있고, Python 코드가 99% 수준이에요. 카드뉴스 캡처 당시 66.8k 스타를 받았고, 지금은 더 늘었어요. 리포 설명에 붙은 문구는 “Finetune LLMs 2-5x faster with 70% less memory(파인튜닝을 2~5배 빠르게, 메모리는 70% 덜 쓰게)“예요. Unsloth 자신의 공식 주장이고, 환경에 따라 달라질 수 있는 숫자지만, 방향은 분명해요. 같은 공부를 시키는 데 드는 시간과 노트(메모리)를 대폭 줄여 주는 학습 코치라는 거예요.

이 코치가 중요한 이유는 파인튜닝의 원래 부담 때문이에요. 모델 전체를 훈련하면 모델 크기만큼의 메모리에 훈련용 중간 계산까지 얹어야 하므로, 고성능 GPU가 없으면 시작하기 어려웠어요. Unsloth는 어텐션 계산을 적은 메모리로 처리하는 최적화 커널(Flash Attention)과 4비트 양자화 기반 훈련(QLoRA)을 묶어서 이 문턱을 낮춰요.

5단계로 보는 파인튜닝 흐름

카드뉴스의 “How it works?” 카드는 다섯 단계로 흐름을 그려요.

  1. 모델 불러오기 — Llama, Mistral, Gemma 같은 오픈 모델을 골라요. 코드에서는 FastLanguageModel.from_pretrained("unsloth/llama-3-8b")처럼 Unsloth가 다듬어 둔 모델 이름을 써요.
  2. LoRA 부착 — 다음 섹션에서 자세히 설명할 부분이에요. get_peft_model로 모델에 작은 훈련 부품을 꽂아요.
  3. 데이터 준비 — 지시문(instruction)과 응답(output)이 한 쌍인 간단한 형식으로 준비해요. 예시로 “어텐션을 쉬운 말로 설명해줘”라는 지시문과 그에 맞는 답이 나란히 들어가는 형태예요.
  4. 효율적으로 훈련 — Hugging Face의 훈련 도구 TRL에서 제공하는 SFTTrainer(지도 미세조정을 돌려 주는 클래스)로 훈련해요. 앞서 말한 Flash Attention과 QLoRA가 여기서 함께 돌아가요.
  5. 로컬에서 사용 — 훈련이 끝난 모델은 for_inference로 추론 모드로 바꾼 뒤, generate로 답을 만들고 decode로 텍스트로 되돌려요. 유료 API 없이 내 기기에서 답이 나와요.

LoRA: 두뇌 대신 플러그인 훈련

카드뉴스의 두 번째 단계, LoRA(Low-Rank Adaptation)는 이 흐름의 핵심이에요. 아까 그려본 그 사람(모델)의 두뇌는 수십억 개의 연결선으로 이루어져 있어요. 전통적 파인튜닝은 그 두뇌 전체를 다시 훈련하는 수술이고, LoRA는 두뇌는 그대로 두고 새 업무 전용 작은 플러그인만 끼우는 방식이에요. 원래 두뇌의 연결선 일부에 얇은 보정 층을 얹는 연산이지만, 훈련되는 양이 원본에 비해 극히 적다는 점에서 플러그인 장착과 비슷하게 이해할 수 있어요.

카드에 나온 코드값을 하나씩 읽어볼게요.

  • r = 16: 플러그인의 크기예요. 작을수록 가볍지만 표현력이 줄어요. 8, 16, 32 같은 값이 널리 쓰여요.
  • lora_alpha = 16: 플러그인이 끼치는 영향력의 강도예요. 16은 r과 같은 값으로, 흔히 쓰는 균형 잡힌 조합이에요.
  • lora_dropout = 0.0: 훈련 중 일부 연결을 의도적으로 끊어 과적합(훈련 데이터에만 과하게 맞추는 현상)을 막는 장치인데, 여기서는 0%로 꺼 둔 거예요.
  • target_modules = ["q_proj", "v_proj"]: 플러그인을 꽂을 위치예요. 모델 내부에서 어텐션의 질의(query)와 값(value)을 계산하는 모듈 두 곳을 지정했어요.

핵심 이득은 두 가지예요. 훈련해야 할 매개변수가 원본의 극히 일부만 되니 메모리와 시간이 크게 줄고, 원본은 변하지 않아서 플러그인만 따로 저장·교체·제거할 수 있어요. Unsloth는 여기서 나아가 QLoRA를 지원하는데, 원본 모델을 4비트로 양자화(매개변수를 더 거친 눈금으로 압축하는 기술)해서 메모리에 올려 두고 플러그인만 정밀하게 훈련해요. 양자화 원리는 이 블로그의 GGUF 양자화 해설에서 깊게 다뤘으니 참고하세요.

설치는 명령어 몇 줄이면 끝

“Setting Up the Local Environment” 카드는 설치 과정을 여섯 걸음으로 나눠요.

  1. 파이썬 확인 — 3.9 이상이 필요해요. python --version으로 확인해요.
  2. 가상환경 만들기 — 프로젝트별로 설치한 라이브러리를 분리해 두는 독립된 파이썬 공간(가상환경)을 만들어요. python -m venv unsloth-env으로 만들고, 맥·리눅스는 source unsloth-env/bin/activate, 윈도우는 unsloth-env\Scripts\activate로 활성화해요.
  3. Unsloth 설치 — pip install unsloth로 본체와 필수 의존성을 한 번에 설치해요.
  4. 설치 확인 — 파이썬에서 import unsloth 후 버전을 출력해 정상 설치를 확인해요.
  5. 추가 의존성(선택) — 성능과 훈련 도구를 위해 xformers, trl, accelerate를 더 설치할 수 있어요.
  6. 준비 완료 — unsloth/llama-3-8b, unsloth/mistral-7b, unsloth/gemma-7b 같은 모델을 불러 쓰면 돼요.

다만 한 가지 단서가 필요해요. 표지가 MacBook을 든 그림이라 어떤 컴퓨터든 될 것 같지만, pip로 설치하는 Unsloth 라이브러리의 훈련은 NVIDIA GPU 환경(리눅스·윈도우)을 전제로 하는 경우가 대부분이에요. 자기 환경에서 가능한지는 공식 문서(docs.unsloth.ai)에서 설치 요건을 확인하는 게 안전해요. GPU가 없어도 Google Colab 같은 무료 클라우드 노트북에서 그대로 따라 하는 방법이 문서에 정리되어 있어요.

GRPO: 답 여러 개 쓰고 상대 채점

다섯 번째 카드가 이 게시물에서 가장 깊은 주제예요. GRPO(Group Relative Policy Optimization, 그룹 상대 정책 최적화)는 모델의 추론 능력을 끌어올리는 강화학습 기법이에요. DeepSeek이 DeepSeekMath 논문에서 소개하고 이후 DeepSeek-R1 훈련에 사용한 방식으로, Unsloth 블로그는 이 방법을 개인 GPU에서도 따라 할 수 있게 정리해 두었어요.

동작은 이렇게 흘러가요.

  1. 질문 입력 — 추론이 필요한 복잡한 문제를 줘요.
  2. 여러 응답 생성 — 모델이 같은 문제에 답을 여러 개(한 그룹) 적어봐요.
  3. 채점과 상대 보상 — 보상 함수(정답 여부 같은 기준을 사람이 설계한 채점 도구)로 각 답에 점수를 매기고, 그 그룹의 평균과 비교해요.
  4. 모델 업데이트 — 평균보다 좋은 답을 만든 풀이 습관을 강화해요.

이름의 “Group Relative”가 바로 이 채점 방식을 가리켜요. 정답 예시를 통째로 외우게 하는 대신, 같은 반 안에서의 상대 점수로 공부 방향을 잡게 하는 거예요. 정답 여부만으로 채점할 수 있는 과제(수식, 코드, 형식 요건)에 잘 맞고, 사람이 풀이 과정을 일일이 라벨로 만들지 않아도 돼요. Unsloth 블로그는 법·의학 같은 도메인 보상 설계, 그리고 “정답 데이터만 있고 풀이 과정이 없을 때 풀이를 스스로 만들어 내는” 쓰임을 예로 들었어요. 코드에서는 TRL의 GRPOTrainer에 보상 함수를 넘겨 돌리고, 카드에도 “커스텀 보상 함수로 정답성·추론 단계·과제별 기준을 설계할 수 있다”고 적혀 있어요.

왜 파인튜닝만으로 부족할까요? 지도 학습(정답 예시를 보여 주는 훈련)은 모방은 잘하지만, 스스로 풀어보고 어디가 나은지 피드백을 받는 과정이 빠져요. 추론 능력은 그 시행착오 회로가 켜질 때 크게 늘어요. Unsloth는 GRPO가 원래 요구하던 대형 GPU 메모리를 LoRA·QLoRA와 결합해 크게 줄였고, 블로그 기준 7GB VRAM에서 1.5B 모델의 GRPO 훈련이 가능해요.

GGUF로 내보내 데스크톱 앱에

여섯 번째 카드는 훈련 결과를 꺼내 쓰는 과정이에요.

  1. 모델 저장 — save_pretrained("./my-finetuned-model")로 훈련된 모델을 저장해요.
  2. 형식 변환 — export_to_gguf로 GGUF 파일로 내보내요. 이때 quantization = "Q4_K_M"을 지정하는데, 4비트 양자화의 K-quant 계열 중 중간(medium) 정밀도 등급을 뜻해요. 메모리 절감과 품질의 균형점으로 널리 쓰여요.
  3. 로컬 앱에서 로드 — llama.cpp(로컬 추론 엔진)의 파이썬 래퍼 llama_cpp로 불러요. n_ctx=4096은 문맥 창(모델이 한 번에 기억할 길이)이고, n_gpu_layers=-1은 모델의 모든 층을 GPU로 넘기라는 뜻이에요.
  4. 데스크톱 UI 만들기 — PyQt, Electron, Tauri 같은 데스크톱 앱 프레임워크로 화면을 감싸면, 나만의 로컬 AI 앱이 완성돼요.

카드는 결과물의 장점을 세 가지로 적었어요. Private(데이터가 내 기기에만 머문다), Fast(로컬 추론에 최적화), Customizable(내 용도에 맞춘 기능을 붙일 수 있다). 파인튜닝한 모델을 완전 오프라인 앱으로 배포할 수 있다는 게 이 흐름의 도착점이에요.

코드 없이 쓰는 Unsloth Studio

일곱 번째 카드는 코드를 쓰고 싶지 않은 사람을 위한 대안이에요. Unsloth Studio는 브라우저에서 도는 로컬 웹 UI예요. 카드 화면에는 채팅, 파인튜닝, 모델 관리 탭과 함께 Llama 3.1 8B, Mistral 7B, Gemma 2B, Qwen 2.5 7B 목록이 보여요.

  • Chat — 로컬 모델과 브라우저에서 바로 대화해요.
  • Fine-tune — 기본 모델을 고르고, 데이터셋(JSON, CSV)을 업로드하고, 학습 스텝(카드 예시는 500)을 정한 뒤 클릭 몇 번으로 훈련을 시작해요.
  • Models — Unsloth 생태계의 모델을 탐색하고 내려받아요.

채팅 화면 오른쪽에는 Max New Tokens(300), Temperature(0.7), Top P(0.9), System Prompt 같은 설정도 노출되어 있어요. Temperature는 답의 무작위성 정도, Top P는 다음 토큰 후보를 상위 확률 집합으로 제한하는 값이에요. 실제로 Unsloth Studio는 베타로 공개된 오픈소스 프로젝트로, 문서는 “GGUF·MLX 모델을 Mac·윈도우·리눅스에서 로컬로 실행하며 GPU 없이도 가능하다”고 설명해요. 코드 몇 줄이 부담스러운 독자에게는 이 인터페이스가 로컬 AI의 가장 낮은 진입로예요.

직접 추론 돌려 보기

여덟 번째 카드는 훈련 없이도 로컬 추론이 어떻게 돌아가는지 코드로 보여줘요. 네 단계예요.

  1. 모델 불러오기 — from_pretrained로 모델을 불러와요.
  2. 입력 준비 — 프롬프트를 토크나이저(모델의 글 읽는 버릇에 해당하는, 텍스트를 토큰으로 쪼개는 장치)로 넘기고 return_tensors="pt"로 PyTorch 텐서 형식으로 바꿔요.
  3. 추론 실행 — generate에 max_new_tokens=300(최대 300토큰 생성)과 temperature=0.7을 넘겨요.
  4. 출력 되돌리기 — decode에서 skip_special_tokens=True는 출력에 노출되면 안 되는 제어용 특수 토큰을 빼고 순수 텍스트만 남기는 옵션이에요.

카드가 강조하는 것은 이 전 과정이 내 컴퓨터에서 일어나고 유료 API가 필요 없다는 점이에요. 파인튜닝은 선택 사항이고, Unsloth가 없어도 llama.cpp나 Ollama 같은 실행 도구로 로컬 추론 자체는 가능해요. 이 블로그의 Ollama 5단계 해설은 실행에만 집중한 흐름을 다뤘어요. 이 게시물의 차별점은 내 데이터로 훈련까지 이어지는 데 있어요.

어떻게 연결되는가

한 줄로 정리하면: Unsloth는 LoRA 플러그인 훈련과 4비트 양자화로 파인튜닝의 메모리 문턱을 낮추고, GRPO로 추론 능력까지 강화한 뒤, GGUF로 내보내 llama.cpp나 데스크톱 앱, 아니면 노코드 Studio에서 돌릴 수 있게 하는 도구 모음이에요.

카드뉴스의 흐름을 다시 읽으면, 각 카드가 사실 한 파이프라인의 구간을 담당하고 있었어요. 환경 설치(카드 4) → 모델 로드·LoRA 부착·데이터 준비·훈련(카드 3) → 추론 테스트(카드 8) → GRPO 심화(카드 5) → GGUF 내보내기·앱 배포(카드 6) → 노코드 대안(카드 7). 처음부터 끝까지 훈련한 모델을 내 컴퓨터에 남겨 두는 것이 이 게시물의 완성 그림이에요.

시작하려면 두 가지만 기억하면 돼요. 첫째, 훈련 환경(주로 NVIDIA GPU)과 도구 요건을 공식 문서에서 먼저 확인하고, 둘째, 일단은 훈련 없는 로컬 추론으로 재미를 본 다음 데이터가 모였을 때 LoRA 파인튜닝으로 넘어가는 순서가 부담이 적어요. 이전 글의 양자화 해설과 함께 읽으면 “왜 내 노트북에 큰 모델이 들어가는지”까지 자연스럽게 이어져요.

출처