microgpt
(karpathy.github.io)- 200줄짜리 순수 Python 단일 파일로 GPT 모델의 학습과 추론 전 과정을 구현한 최소형 언어모델 구조
- 데이터셋, 토크나이저, 자동미분 엔진, GPT-2 유사 신경망, Adam 옵티마이저, 훈련 및 추론 루프를 모두 포함
- 이름 데이터셋을 학습해 새로운 이름을 생성하며, 자체 구현된 autograd와 Transformer 구조를 통해 GPT의 핵심 원리를 드러냄
- 대규모 LLM과 달리 의존성 없이 순수 Python으로 작동, 알고리듬적 본질만 남긴 형태
- microgpt를 이해하면 ChatGPT 등 대형 모델의 근본 알고리듬 구조를 이해할 수 있음
microgpt 개요
- microgpt는 200줄의 Python 코드로 작성된 최소형 GPT 구현으로, 외부 라이브러리 의존성이 없음
- 데이터셋, 토크나이저, 자동미분, GPT-2 유사 구조, Adam 옵티마이저, 학습 및 추론 루프를 모두 포함
- Karpathy가 LLM을 본질 수준으로 단순화하기 위해 만든 예술적 프로젝트로, micrograd·makemore·nanogpt 등의 연장선상에 있음
- 전체 코드는 GitHub Gist, 웹페이지, Google Colab에서 제공
데이터셋
- 약 32,000개의 이름을 한 줄씩 포함한 텍스트 파일을 사용
- 각 이름은 하나의 문서로 간주되며, 모델은 이 패턴을 학습해 새로운 이름을 생성
- 학습 후 생성 예시: kamon, ann, karai, jaire, vialan 등
토크나이저
- 각 고유 문자에 정수 ID를 부여하는 단순 문자 기반 토크나이저
- 알파벳 a–z와 BOS(beginning of sequence) 토큰을 포함해 총 27개 토큰
- 각 문서는
[BOS, e, m, m, a, BOS]형태로 감싸져 학습됨
자동미분 (Autograd)
-
Value클래스가 스칼라 값과 그래디언트를 추적하며, 연산 그래프를 구성 - 덧셈, 곱셈, 거듭제곱, 로그, 지수, ReLU 등 기본 연산의 국소 미분값(local gradient) 을 저장
-
backward()메서드가 체인룰을 적용해 역전파 수행 - PyTorch의
.backward()와 동일한 알고리듬을 스칼라 단위로 직접 구현
파라미터 초기화
- 모델은 약 4,192개의 파라미터를 가짐
- 임베딩 테이블, 어텐션 가중치, MLP 가중치, 출력 프로젝션 등으로 구성
- 각 파라미터는 가우시안 분포 난수로 초기화됨
모델 아키텍처
- GPT-2 구조를 단순화한 형태로, RMSNorm, ReLU, 잔차 연결(residual connection) 사용
- 주요 구성:
- 임베딩 단계: 토큰과 위치 임베딩을 합산
- 멀티헤드 어텐션: Q, K, V 벡터 계산 후 KV 캐시를 통해 과거 토큰 정보 활용
- MLP 블록: 2층 피드포워드 네트워크로 지역적 계산 수행
- 출력 단계: 어휘 크기(27)에 대한 로짓(logit) 생성
- KV 캐시는 학습 중에도 활성 상태로, 역전파가 캐시를 통해 흐름
학습 루프
- 각 스텝에서 문서를 선택해
[BOS, ... , BOS]로 토크나이즈 - 모델이 다음 토큰 확률을 예측하고, 교차 엔트로피 손실을 계산
-
loss.backward()로 그래디언트 계산 후 Adam 옵티마이저로 파라미터 갱신 - 학습률은 선형 감쇠(linear decay) 방식
- 1,000 스텝 동안 손실이 약 3.3 → 2.37로 감소
추론(Inference)
- 학습 완료 후, BOS 토큰으로 시작해 새 이름을 생성
- 각 단계에서 softmax 확률에 따라 다음 토큰을 샘플링
- temperature 값으로 창의성 조절 (낮을수록 보수적, 높을수록 다양)
- 예시 출력: kamon, ann, karai, jaire, vialan, karia, yeran, anna 등
실행 방법
- Python만 있으면 실행 가능 (
python train.py) - 약 1분 내 학습 완료, 손실값이 단계별로 출력됨
- Colab 노트북에서도 동일하게 실행 가능
코드 발전 단계
-
train0.py부터train5.py까지 단계별 확장- Bigram → MLP → Autograd → Attention → Multi-head → Adam
- 각 단계는 Gist의 build_microgpt.py 리비전에서 확인 가능
실제 LLM과의 차이
- 데이터: microgpt는 32K 이름, 실제 LLM은 수조 개 토큰
- 토크나이저: 문자 단위 vs. BPE 기반 서브워드
- Autograd: 스칼라 기반 Python vs. GPU 텐서 연산
- 아키텍처: 4K 파라미터 vs. 수천억 파라미터
- 훈련: 단일 문서 반복 vs. 대규모 배치·혼합정밀도 학습
- 최적화: 단순 Adam vs. 정밀 튜닝된 하이퍼파라미터 및 스케줄링
- 후처리: SFT와 RL 단계를 거쳐 ChatGPT 형태로 발전
- 추론 인프라: GPU 분산, KV 캐시 관리, 양자화, speculative decoding 등
FAQ 요약
- 모델은 수학적 함수로, 입력 토큰을 다음 토큰 확률로 변환
- “이해”는 없으며, 통계적 규칙 학습을 통해 예측 수행
- ChatGPT와 동일한 토큰 예측 루프를 축소 형태로 구현
- “환각(hallucination)”은 확률적 샘플링의 자연스러운 결과
- 속도는 느리지만, LLM의 핵심 알고리듬을 완전하게 재현
- 더 나은 결과를 위해 학습 스텝, 모델 크기, 데이터셋을 조정 가능
- 데이터셋을 교체하면 도시명, 포켓몬 이름, 시 등 다양한 패턴 학습 가능
microgpt는 LLM의 모든 핵심 알고리듬을 최소 단위로 구현한 교육적·실험적 모델로, 대규모 언어모델의 작동 원리를 완전히 드러내는 예시임.
Hacker News 의견들
-
누군가 microgpt를 수정해 한국어 이름을 생성하는 작은 GPT를 만들었음
전체 과정을 시각화한 웹페이지도 있음 — 토크나이징부터 추론까지 파이프라인 전체를 탐색할 수 있음
English GPT lab에서 직접 체험 가능- 이런 건 훨씬 더 가벼운 모델로도 쉽게 구현 가능함
PyTorch char_rnn 튜토리얼을 참고하면 됨 - 사이트 제작자와는 무관하지만, LLM 내부 구조를 배우는 데 아주 유용한 사이트임
토크나이징, 임베딩, 어텐션, 손실·그래디언트, 학습, 추론, Real GPT와의 비교까지 잘 설명되어 있음 - ‘수정했다’는 말은 사실상 영어 이름 리스트를 한국어 이름으로 바꾼 정도임
사이트 자체는 원본 블로그 포스트를 기반으로 한 AI 생성 시각화에 가까움
- 이런 건 훨씬 더 가벼운 모델로도 쉽게 구현 가능함
-
나는 microgpt를 C++로 포팅했음
코드 링크
코드 라인은 2배지만 속도는 10배 빠름
가장 어려웠던 부분은 Value 클래스를 C++에서 표현하는 것이었고, 결국 shared_ptr를 사용했음- 나는 autodiff 없이 명시적 역전파를 구현했는데, Python에서 8배 더 빨랐음
-
“환각(hallucination)”이란 게 뭔지 궁금했음
모델은 단지 확률 분포에서 토큰을 샘플링할 뿐, 진실 개념은 없음
그렇다면 LLM이 자신의 답변에 대한 신뢰도 점수를 가질 수 있을까 하는 의문이 생김- 모델이 출력 분포의 confidence를 보고할 수는 있지만, 그게 실제로 정확히 보정(calibrated)된 것은 아님
사전학습 모델은 보정되어 있지만, 지시 따르기(post-training) 이후에는 깨짐
관련 연구: 논문1, 논문2 - 신뢰도 점수는 훈련 데이터의 샘플링 방식을 모르면 의미가 없음
통계에서 모집단을 모르는 신뢰구간처럼, LLM의 확률도 실제 세계와의 연결이 없음
결국 LLM은 세상 경험 없이 책만 읽은 사람과 같음 - 실제로 LLM은 확률 분포를 반환하고, 그걸 샘플링해 토큰을 생성함
하지만 이 확률은 “진실일 확률”이 아니라 “이 상황에서 내가 이 토큰을 낼 확률”임 - 생성은 가능하지만, ‘진짜 분포’를 모르기 때문에 그 신뢰도는 의미가 없음
- “잘 모르겠지만 아마 이럴 거야” 같은 문장은 출력에는 안 보이지만, 내부 추론 과정에는 존재함
- 모델이 출력 분포의 confidence를 보고할 수는 있지만, 그게 실제로 정확히 보정(calibrated)된 것은 아님
-
나는 학습용으로 microgpt를 Rust로 변환했음
microgpt-rs
autograd 그래프 구조를 Rust 타입으로 표현하는 게 가장 까다로웠음
지금은 WebAssembly로 브라우저에서 돌릴 수 있도록 수정 중이며, 블로그에 올릴 예정임
Karpathy의 코드는 정말 시적이고 간결한 설계임- 가중치 구조에 미분값을 저장하는 건 꽤 해킹스럽지만, 대부분 그렇게 함
- 나도 다른 언어로 한 번 구현해보고 싶음
-
코드가 아름답고 읽기 쉽지만, backbone.js처럼 한 줄씩 주석이 달린 설명이 있었으면 좋겠음
Backbone 문서 참고- Backbone의 주석 달린 소스는 Docco로 생성된 것임
Docco 프로젝트도 같은 제작자가 만든 멋진 도구임 - 정말 아름다운 문학적 프로그래밍(literate programming) 예시임
HTML 버전 코드도 있음 - Karpathy의 walkthrough 블로그도 있음
microgpt 블로그 - 그냥 고성능 LLM에게 설명을 시켜보라는 제안도 있음
- Backbone의 주석 달린 소스는 Docco로 생성된 것임
-
Karpathy의 영상과 코드 덕분에 경사하강법, 역전파, 연쇄법칙을 처음으로 제대로 이해한 느낌임
수학만 봤을 땐 혼란스러웠는데, 코드와 함께 보니 명확해졌음
개인적으로 인생의 성취감 같은 경험이었음- 나도 그걸 직관적으로 설명해보려 함
Karpathy가 말했듯, 진짜 이해하려면 남에게 가르쳐보는 것이 중요함
- 나도 그걸 직관적으로 설명해보려 함
-
이 프로젝트가 HN에 이제야 올라온 게 놀라움
나는 PicoGPT라는 35줄짜리 JS 버전과 Python 버전을 만들었고,
웹에서 바로 실행 가능함
심지어 QR 코드로도 실행 가능한 초소형 LLM임 -
나는 microgpt 코드를 시각화 블로그 포스트로 만들었음
블로그 링크
코드 흐름을 따라가며 인터랙티브하게 보여줌- 학습이 끝나면 “kamon”, “karai”, “anna”, “anton” 같은 이름을 생성한다고 했지만,
사실 이 네 개 모두 데이터셋에 포함되어 있음 - 이 글은 HN에 따로 기사로 올릴 가치가 있음
- 보통 LLM이 도와 쓴 블로그엔 비판적인 편인데, 이건 진짜 훌륭한 예시임
- ML 초보자인 나에게도 Karpathy 원본만큼 도움이 된 자료였음
- 정말 멋진 작업임
- 학습이 끝나면 “kamon”, “karai”, “anna”, “anton” 같은 이름을 생성한다고 했지만,
-
요즘 AI에서 ‘micro’ 트렌드가 흥미로움
단순히 모델을 키우는 것보다, 작고 집중된 모델에서 효율이 더 커지고 있음
실제로 Gemini Flash를 도메인 분석용으로 쓰는데, 속도·비용 비율이 훨씬 좋음
지연(latency) 차이만으로도 만들 수 있는 제품의 종류가 달라짐- 하지만 이건 실제 응용보다는 교육용 목적의 micro 모델임
-
이름을 microgpt라 하기엔 nanogpt보다 작아서, picogpt가 더 어울린다고 생각함
그래도 멋진 프로젝트임