GuppyLM 소개
"언어 모델을 처음부터 학습시키려면 수십억 달러의 투자와 수천 장의 GPU가 필요하다"는 인식이 있지만, 그 핵심 원리를 이해하기 위해 꼭 그런 자원이 필요한 것은 아닙니다. GuppyLM은 Google Colab 노트북 하나와 약 5분의 학습 시간만으로 처음부터(from scratch) 언어 모델을 구축할 수 있음을 보여주는 교육용 오픈소스 프로젝트입니다. 이름처럼 작은 물고기(guppy)에서 영감을 받아, 모든 문장을 물고기의 관점으로 생성하는 특이한 언어 모델을 통해 트랜스포머 언어 모델의 학습 과정 전체를 직접 체험할 수 있습니다.
GuppyLM의 핵심 설계 철학은 의도적 단순성(intentional simplicity) 입니다. 개발자들은 Group Query Attention, Rotary Position Embedding(RoPE), Gated Linear Unit(GLU) 같은 최신 최적화 기법들을 일부러 도입하지 않았습니다. 8.7M 파라미터, 6개 레이어, 384 히든 차원의 바닐라 트랜스포머 아키텍처를 선택한 이유는 코드 단순성과 교육적 명확성을 최우선으로 삼았기 때문입니다. 특히 9M 규모의 파라미터에서는 시스템 프롬프트를 통해 동작을 조건부로 변경하는 것이 사실상 불가능하므로, 물고기 성격을 시스템 프롬프트가 아닌 학습 데이터와 가중치 자체에 직접 내재화하는 방식을 택했습니다. 이는 LLM에서 인스트럭션 파인튜닝(instruction fine-tuning)과 사전학습(pre-training)의 역할 차이를 직관적으로 이해하게 해줍니다.
브라우저 기반 데모도 제공되는데, WebAssembly를 활용한 약 10MB의 양자화 ONNX 모델이 서버 없이 클라이언트 측에서 완전히 동작합니다. HuggingFace 모델 허브에서 사전학습된 가중치를 다운로드하거나, 직접 Colab에서 전체 학습 과정을 재현해볼 수 있어 학습자 친화적입니다.
GuppyLM의 트랜스포머 아키텍처
GuppyLM은 현대 LLM의 기본 구성 요소를 모두 포함하되, 최소한의 형태로 구현된 교과서적인 트랜스포머입니다.
아키텍처 상세 사양
| 구성 요소 | 사양 |
|---|---|
| 총 파라미터 | 8.7M |
| 트랜스포머 레이어 | 6층 |
| 히든 차원 | 384 |
| 어텐션 헤드 | 6개 |
| FFN 폭 | 768 (ReLU 활성화) |
| 어휘 사전 | 4,096 BPE 토큰 |
| 컨텍스트 윈도우 | 최대 128 토큰 |
| 정규화 | LayerNorm |
| 위치 인코딩 | 학습된 임베딩(learned embeddings) |
| 출력 레이어 | 임베딩 레이어와 가중치 공유(weight-tied) |
핵심 트랜스포머 블록 (단순화 의사코드)
class TransformerBlock(nn.Module):
def __init__(self, d_model=384, n_heads=6, ffn_dim=768):
super().__init__()
# 멀티헤드 셀프 어텐션 (바닐라 구현)
self.attn = nn.MultiheadAttention(d_model, n_heads, batch_first=True)
self.ln1 = nn.LayerNorm(d_model)
# FFN: d_model → ffn_dim → d_model (ReLU)
self.ffn = nn.Sequential(
nn.Linear(d_model, ffn_dim),
nn.ReLU(),
nn.Linear(ffn_dim, d_model)
)
self.ln2 = nn.LayerNorm(d_model)
def forward(self, x, mask=None):
# Pre-norm + 잔차 연결
attn_out, _ = self.attn(x, x, x, attn_mask=mask)
x = self.ln1(x + attn_out)
ffn_out = self.ffn(x)
x = self.ln2(x + ffn_out)
return x
class GuppyLM(nn.Module):
def __init__(self, vocab_size=4096, d_model=384, n_layers=6):
super().__init__()
self.embed = nn.Embedding(vocab_size, d_model)
self.pos_embed = nn.Embedding(128, d_model) # 학습된 위치 인코딩
self.blocks = nn.ModuleList([TransformerBlock() for _ in range(n_layers)])
self.ln_final = nn.LayerNorm(d_model)
# 가중치 공유: 출력 레이어 = 임베딩 레이어의 전치
self.lm_head = nn.Linear(d_model, vocab_size, bias=False)
self.lm_head.weight = self.embed.weight # weight tying
학습 데이터 및 과정
GuppyLM은 60가지 주제에 걸쳐 6만 개의 합성 대화 데이터로 학습됩니다. 인사, 감정 표현, 온도 인식, 음식 선호, 조명, 수질 특성, 수조 생활, 물고기 관점의 추상 개념 등이 포함됩니다. 학습 데이터 생성은 템플릿 기반 합성으로 이루어지며, 57,000개의 학습 세트와 3,000개의 테스트 세트로 분리됩니다.
학습 과정:
# Colab T4 GPU에서 약 5분 소요
python train.py \
--data data/guppy_conversations.json \
--epochs 50 \
--lr 3e-4 \
--scheduler cosine # 코사인 학습률 스케줄링
# AMP(자동 혼합 정밀도)로 학습 가속
설치 및 사용법
pip install guppylm
# 대화형 채팅 실행
python -m guppylm chat
# 또는 Python에서
from guppylm import GuppyLM
model = GuppyLM.from_pretrained("arman-bd/guppylm-9M")
response = model.generate("what is your favorite food?", max_tokens=50)
print(response)
# → "i love worms. worms are best. you drop worm? i wait."
브라우저에서 바로 체험
별도 설치 없이 브라우저에서 바로 GuppyLM을 테스트할 수 있습니다. WebAssembly 기반으로 약 10MB의 ONNX 양자화 모델이 클라이언트에서 완전히 동작합니다.
라이선스
GuppyLM은 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 활용할 수 있습니다.
GuppyLM 브라우저 데모
GuppyLM 모델 (HuggingFace)
GuppyLM 프로젝트 GitHub 저장소
더 읽어보기
-
MiniMind: 단돈 3달러, 2시간 만에 64M GPT를 처음부터 학습시키며 학습하는 오픈소스 초경량 언어 모델 프로젝트
-
LLM Internals: 토크나이저부터 Flash Attention까지, LLM 내부 구조를 단계별로 학습하는 오픈소스 교육 자료
-
flash-moe: 순수 C와 Metal로 구현한, M3 Max 맥북 프로에서 397B 파라미터 MoE 모델을 실행하는 고성능 추론 엔진
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()
