9M 파라미터짜리 초소형 LLM으로 언어 모델 작동 원리 직접 이해하기
Show HN: I built a tiny LLM to demystify how language models work
TL;DR Highlight
물고기 Guppy 캐릭터를 학습한 870만 파라미터짜리 미니 LLM을 Colab 노트북 하나로 5분 만에 처음부터 직접 만들어볼 수 있는 교육용 프로젝트로, LLM의 블랙박스 이미지를 걷어내는 데 초점을 맞췄다.
Who Should Read
LLM이 내부적으로 어떻게 동작하는지 궁금하지만 대형 모델 코드베이스는 너무 복잡해서 접근이 어려웠던 개발자. PhD나 고성능 GPU 없이도 토크나이저부터 학습 루프까지 전 과정을 직접 코드로 따라가보고 싶은 입문자에게 특히 적합하다.
Core Mechanics
- GuppyLM은 파라미터 수가 870만 개(~9M)에 불과한 초소형 LLM으로, 물고기 Guppy 캐릭터처럼 물, 먹이, 빛, 어항 생활에 대한 짧고 소문자로 된 문장을 생성한다.
- 학습 데이터는 60개 토픽에 걸친 6만 개의 합성 대화(synthetic conversations)로 구성되어 있으며, 실제 인터넷 크롤링 데이터 없이 생성된 데이터만 사용했다.
- 아키텍처는 Transformer 기반으로, 레이어 6개, 히든 차원(hidden dim) 384, 어텐션 헤드(attention head) 6개, FFN(피드포워드 네트워크) 차원 768로 구성된 매우 단순한 구조다.
- Google Colab 노트북 하나로 단일 GPU에서 약 5분 만에 데이터 생성 → 토크나이저 학습 → 모델 아키텍처 정의 → 학습 루프 → 추론까지 전 파이프라인을 직접 실행해볼 수 있다.
- 모델 크기가 작아서 브라우저에서도 실행 가능한 수준이며, 복잡한 인프라 없이도 LLM의 전체 작동 흐름을 end-to-end로 읽고 이해할 수 있도록 코드를 최대한 단순하게 유지했다.
- 학습 데이터가 전부 소문자로 되어 있어 대문자 입력(예: 'HELLO')을 넣으면 엉뚱한 응답이 나오는 한계가 있는데, 이는 토크나이저와 학습 데이터가 모델의 행동을 얼마나 직접적으로 결정하는지 보여주는 좋은 교육적 사례다.
- next token prediction(다음 토큰 예측) 방식으로만 학습되며, RLHF나 파인튜닝 같은 추가 기법 없이도 캐릭터 일관성 있는 대화가 가능하다는 점이 흥미롭다.
- 저장소에는 학습용 Jupyter 노트북(train_guppylm.ipynb)과 추론용 노트북(use_guppylm.ipynb)이 분리되어 있어, 학습과 실행 단계를 구분해서 살펴볼 수 있다.
Evidence
- Andrej Karpathy의 microgpt, minGPT와 비교하는 질문이 나왔는데, GuppyLM은 코드 복잡도를 더 낮추고 캐릭터 학습이라는 구체적 목표를 통해 초보자가 처음 접하기에 더 진입 장벽이 낮다는 평가가 있었다.
- multi-head attention, ReLU FFN, LayerNorm, learned positional embeddings 같은 개념을 모르는 개발자에게는 코드만으로는 이해가 어렵다는 지적이 있었고, 이에 따라 더 상세한 문서화가 필요하다는 의견이 나왔다. Minix가 OS 교육에 쓰이듯 GuppyLM도 LLM 교육 도구로 자리잡을 수 있다는 비유도 함께 제시됐다.
- https://bbycroft.net/llm 사이트가 언급됐는데, 이 사이트는 LLM 레이어를 3D로 시각화해서 내부 동작을 보여주기 때문에 GuppyLM과 함께 보면 이해에 도움이 된다는 추천이 있었다.
- 한 댓글 작성자는 비슷한 방식으로 밀턴의 「실낙원(Paradise Lost)」을 학습 데이터로 써서 자신만의 미니 LLM을 만든 경험을 공유했고, 이런 교육적 접근이 실제로 LLM 이해에 효과적이었다고 밝혔다.
- 여러 에이전트가 공유 월드에서 상호작용하는 시스템을 개발 중인 한 댓글 작성자는, 같은 모델과 프롬프트를 써도 리소스 제약, 다른 에이전트, 영구 메모리 같은 환경 요소가 바뀌면 행동이 극적으로 달라진다는 경험을 공유하며 모델 최적화보다 환경 설계에 더 신경을 써야 한다는 인사이트를 남겼다.
- 일부 예시 응답이 학습 데이터를 그대로 재현한 것처럼 보인다는 지적이 있었고, 학습 데이터에 없는 완전히 새로운 질문에 어떻게 반응하는지에 대한 궁금증이 제기됐다.
- '삶의 의미는 먹이'라는 Guppy의 대답을 두고, 1만 배 큰 모델들보다 오히려 더 솔직한 세계관이라는 유머러스한 댓글이 높은 호응을 받았다.
How to Apply
- LLM 내부 구조를 처음 공부하는 경우, train_guppylm.ipynb 노트북을 Google Colab에서 직접 실행해보면 토크나이저 구성 → 모델 아키텍처 정의 → 학습 루프 → 추론까지 전 과정을 5분 안에 경험할 수 있고, 각 단계에서 코드를 수정해보며 어떤 영향이 생기는지 즉시 확인할 수 있다.
- 특정 도메인에 특화된 소형 모델의 가능성을 실험하고 싶다면, 60K 합성 대화 데이터 생성 방식을 참고해 자신만의 도메인 데이터를 만들고 동일한 아키텍처로 학습해보면 데이터 품질과 다양성이 모델 출력에 얼마나 직접적인 영향을 미치는지 체감할 수 있다.
- 팀에 LLM 개념을 교육해야 하는 상황이라면, GuppyLM의 Minix-like 철학(단순하지만 실제로 동작하는 구현)을 활용해 multi-head attention, positional embedding 등 핵심 개념을 코드 레벨에서 설명하는 스터디 자료로 활용할 수 있다.
- 브라우저에서 LLM을 실행하는 데모를 만들어야 하는 경우, GuppyLM처럼 870만 파라미터 수준으로 모델을 작게 유지하면 WebAssembly나 ONNX 변환을 통해 클라이언트 사이드 실행이 가능하며, 이 프로젝트의 아키텍처 설정값(레이어 6, 히든 384, 헤드 6)을 기준점으로 삼아 크기를 조절해볼 수 있다.
Terminology
next token prediction모델이 지금까지의 텍스트를 보고 다음에 올 단어(토큰)를 예측하도록 학습하는 방식. 이걸 수십억 번 반복하면 자연스러운 문장 생성 능력이 생긴다.
multi-head attentionTransformer의 핵심 메커니즘으로, 문장 내 단어들이 서로 얼마나 관련 있는지 여러 관점에서 동시에 계산하는 구조. '여러 명의 독자가 동시에 문장을 읽고 각자 중요한 부분을 표시하는 것'에 비유할 수 있다.
FFNFeed-Forward Network의 약자. Transformer 레이어 안에서 attention 결과를 받아 비선형 변환을 적용하는 단순한 2층 신경망으로, 모델이 더 복잡한 패턴을 학습할 수 있게 해준다.
LayerNormLayer Normalization의 줄임말. 각 레이어의 출력값 분포를 정규화해서 학습이 안정적으로 진행되도록 돕는 기법. 배치 정규화(Batch Norm)와 비슷하지만 시퀀스 데이터에 더 적합하다.
learned positional embeddings단어의 순서 정보를 모델에게 알려주기 위해 각 위치(1번째, 2번째...)에 학습 가능한 벡터를 붙이는 방식. Transformer 자체는 순서를 모르기 때문에 이 정보를 별도로 주입해야 한다.
synthetic conversations사람이 실제로 나눈 대화가 아니라 규칙이나 다른 AI를 이용해 인위적으로 생성한 대화 데이터. 특정 캐릭터나 도메인에 맞는 데이터를 빠르게 대량으로 만들 수 있다는 장점이 있다.