---
title: "9M 파라미터 초소형 LLM을 밑바닥부터 만들어봤다 — GuppyLM"
published: 2026-04-06T00:20:12.000Z
canonical: https://jeff.news/article/1575
---
# 9M 파라미터 초소형 LLM을 밑바닥부터 만들어봤다 — GuppyLM

LLM의 전체 파이프라인(데이터 생성, 토크나이저, 모델 아키텍처, 학습, 추론)을 Colab 노트북 하나로 5분 만에 체험할 수 있는 교육용 프로젝트. 8.7M 파라미터 바닐라 트랜스포머로 물고기 캐릭터 챗봇을 만들었고, 60K 합성 대화 데이터로 학습함.

- **9M 파라미터짜리 초소형 LLM을 밑바닥부터 만든 프로젝트** — 이름은 GuppyLM, 물고기 "Guppy" 역할을 하는 챗봇임
  - PhD도 필요 없고 거대 GPU 클러스터도 필요 없음. Colab 노트북 하나, 5분이면 학습 끝
  - 데이터 생성 → 토크나이저 → 모델 아키텍처 → 학습 루프 → 추론까지 전 과정을 직접 체험할 수 있음

- **"LLM이 블랙박스처럼 느껴지는 사람"을 위한 교육 목적 프로젝트**
  - 에세이를 쓰는 모델이 아니라, 모든 조각이 어떻게 맞물리는지 보여주는 게 핵심
  - 원문 텍스트 → 학습된 가중치 → 생성 출력까지의 흐름을 눈으로 확인 가능

- **모델 스펙이 깔끔하게 정리돼 있음**
  - 파라미터 8.7M / 레이어 6 / Hidden dim 384 / 헤드 6 / FFN 768 (ReLU)
  - 어휘 크기 4,096 (BPE) / 최대 시퀀스 128토큰
  - GQA, RoPE, SwiGLU, Early Exit 같은 최신 기법 전부 빼고 **바닐라 트랜스포머**로만 구성
  - "이 규모에서는 복잡한 기법이 품질 향상에 도움이 안 된다"는 판단

- **학습 데이터도 직접 만듦** — 60K 합성 대화, 60개 주제
  - 인사, 감정, 온도, 음식, 빛, 수중 생활 등 물고기 세계관에 맞는 토픽들
  - 템플릿 합성 + 랜덤 컴포넌트(수조 오브젝트 30종, 음식 17종, 활동 25종) 조합으로 ~16K 고유 출력 생성
  - 일관된 캐릭터 성격을 위해 합성 데이터를 선택한 건 꽤 합리적인 접근

- **실제 대화가 꽤 귀여움**
  - "삶의 의미가 뭐야?" → "음식. 답은 항상 음식이야"
  - "농담 해봐" → "물고기가 벽에 부딪히면 뭐라고 해? 댐(dam)."
  - "날 사랑해?" → "넌 내가 제일 좋아하는 큰 형체야"

> [!TIP]
> `pip install torch tokenizers && python -m guppylm chat`으로 바로 실행 가능. 브라우저에서도 돌아갈 만큼 가벼움

- **설계 결정들이 교육적으로 잘 설명돼 있음**
  - 시스템 프롬프트 안 쓰는 이유 → 모든 학습 샘플이 동일한 프롬프트였고, 9M 모델은 조건부 지시 따르기가 불가. 성격이 가중치에 구워져(baked) 있어서 프롬프트 빼면 추론당 ~60토큰 절약
  - 싱글턴만 지원하는 이유 → 128토큰 컨텍스트 윈도우 때문에 3~4턴차부터 출력이 깨짐. "기억력 없는 물고기"는 캐릭터에 맞지만 깨진 출력은 아님
  - 바닐라 트랜스포머 고수 이유 → 9M 스케일에서 GQA/SwiGLU/RoPE는 복잡성만 올리고 품질 차이 없음

---

## 기술 맥락

- 바닐라 트랜스포머라는 건 2017년 "Attention Is All You Need" 원논문 구조 그대로라는 뜻이에요. 요즘 나오는 Llama나 Mistral 같은 모델들은 RoPE(회전 위치 임베딩), GQA(그룹 쿼리 어텐션), SwiGLU(활성화 함수) 같은 최적화를 잔뜩 넣는데, 이 프로젝트에서는 "9M 규모에선 그런 거 필요 없다"고 과감하게 다 뺐거든요

- BPE(Byte Pair Encoding) 토크나이저를 4,096 어휘로 직접 학습한 것도 포인트예요. GPT 계열이 50K~100K 어휘를 쓰는 것과 비교하면 극도로 작은데, 물고기 캐릭터의 제한된 언어 세계에서는 이 정도면 충분하다는 판단이에요

- 학습 데이터를 합성으로 만든 접근이 꽤 실용적이에요. 캐릭터 일관성이 필요한 경우 실제 대화 데이터를 크롤링하면 톤이 들쭉날쭉해지거든요. 템플릿 기반 합성 + 랜덤 컴포넌트 조합은 적은 노력으로 다양성과 일관성을 동시에 잡는 방법이에요

- 임베딩 가중치를 LM 헤드와 공유(weight-tied)하는 건 소형 모델에서 파라미터 효율을 높이는 전통적인 기법이에요. 입력 임베딩과 출력 프로젝션이 같은 가중치를 쓰니까 모델 크기를 더 줄일 수 있거든요

## 핵심 포인트

- PhD나 대규모 GPU 없이 Colab 5분이면 LLM 전체 파이프라인 학습 가능
- 8.7M 파라미터 바닐라 트랜스포머 — GQA, RoPE, SwiGLU 등 최신 기법 전부 제외
- 60K 합성 대화 데이터를 템플릿 합성으로 직접 생성
- 설계 결정(싱글턴, 시스템 프롬프트 제거, 바닐라 아키텍처)마다 이유가 명확히 설명됨

## 인사이트

LLM을 직접 만들어보고 싶은데 진입장벽이 높다고 느끼는 개발자에게 딱 맞는 프로젝트. 모델 크기를 극단적으로 줄이면서도 각 설계 결정의 근거를 명확히 설명하는 게 교육 자료로서의 가치를 높임.
