카테고리 없음

mini GPT 과제 0편 - 구현 결과와 전체 구조 지도

cedis 2026. 6. 1. 11:31

mini GPT 과제 랩 구현 시리즈 0편

이번 과제는 PyTorch만 사용해 작은 GPT 계열 언어 모델을 직접 구현하는 과제였다. 완성 목표는 ChatGPT 같은 대형 모델이 아니라, LLM의 핵심 부품을 직접 만들어 보며 내부 흐름을 이해하는 것이다.

이 글은 정답 코드를 한 번에 던지는 글이 아니다. 실제 구현 브랜치와 노트북 실행 결과를 기준으로, 어떤 파일이 어떤 책임을 맡았고 어떤 테스트가 그 책임을 확인했는지 먼저 지도처럼 정리한다.

최종 확인 결과

제출 노트북에는 Python 3.11 가상환경과 CUDA 환경에서 실행한 테스트 결과가 저장되어 있었다. 현재 글은 이 실행 결과와 실제 소스 코드를 근거로 작성한다.

구분 결과 의미
전체 테스트 28 passed 필수 구현 함수가 단위 테스트 기준으로 연결됨
실행 환경 Python 3.11, CUDA 과제 권장 환경에서 실행 기록 확인
장기 사전학습 로그 best val loss 약 4.5587 학습 루프와 checkpoint 흐름이 실제로 동작

1. 과제는 여섯 개의 큰 부품으로 나뉜다

파일 이름만 보면 많아 보이지만 구현 흐름은 선형적이다. 토크나이저가 텍스트를 숫자로 바꾸고, 데이터셋이 다음 토큰 예측 샘플을 만들고, 모델이 logits를 만들고, 학습 루프가 loss를 줄인다.

1
BPE tokenizer
한글 리뷰 문자열을 UTF-8 byte 기반 token ID로 바꾼다.
2
Dataset / Embedding
입력과 정답을 한 칸 차이로 만들고, token ID를 벡터로 바꾼다.
3
Multi-Head Attention
각 토큰이 이전 문맥 중 어디를 볼지 계산한다.
4
GPTModel
LayerNorm, GELU, FeedForward, TransformerBlock을 조립한다.
5
Pretraining utilities
loss 계산, checkpoint, generate, 학습 루프를 담당한다.
6
Fine-tuning
GPT backbone 위에 감성 분류용 classification head를 붙인다.

2. 테스트는 무엇을 검증했나

테스트 통과 숫자만 적으면 별 의미가 없다. 중요한 것은 각 테스트가 어떤 책임을 확인했는지다.

테스트 파일 통과 수 핵심 검증
test_bpe.py 6 특수 토큰 ID, save/load, 한글 encode/decode 복원, BPE 학습
test_dataset.py 4 input/target 길이, DataLoader batch shape, embedding 출력 shape
test_attention.py 2 MHA 출력 shape, causal mask에서 미래 위치 attention 차단
test_model.py 7 LayerNorm, GELU, FFN, Block, GPT forward, loss, greedy generation
test_train.py 5 batch loss, loader loss, checkpoint, temperature/top-k generation
test_finetune.py 4 NSMC 분리, 리뷰 padding, classification head shape, train/eval 함수 존재

3. 전체 테스트 로그는 이렇게 읽는다

전체 테스트 통과는 좋은 신호지만, 모델이 좋은 문장을 만든다는 뜻은 아니다. 여기서 보장되는 것은 각 부품이 약속한 shape와 최소 동작 조건을 만족한다는 것이다.

pytest tests/ -v
collected 28 items

test_attention.py  2 passed
test_bpe.py        6 passed
test_dataset.py    4 passed
test_finetune.py   4 passed
test_model.py      7 passed
test_train.py      5 passed

따라서 이 시리즈는 테스트를 단순히 “통과했다”로 끝내지 않는다. 각 편에서 “이 테스트가 무엇을 막아주는가”까지 같이 볼 것이다.

4. 학습 로그는 결과보다 한계를 같이 봐야 한다

노트북에는 실제 CUDA 환경에서 사전학습을 돌린 기록이 남아 있다. loss는 줄었고 checkpoint를 이어서 학습한 흔적도 있다. 다만 생성 샘플에는 깨진 문자와 어색한 표현이 남아 있었다.

확인된 성과

train loss와 validation loss가 장기 실행에서 감소했다.

주의할 한계

loss 감소가 곧 자연스러운 한국어 생성 품질을 의미하지는 않는다.

다음 분석 지점

vocab 크기, 데이터 양, 모델 크기, 학습 시간의 영향을 따로 봐야 한다.

latest epoch: 1390
global_step: 305800
train_loss: 3.9400
val_loss: 4.5616
best_val_loss: 4.5587

이번 글에서 기억할 것

  • 과제는 BPE부터 fine-tuning까지 GPT 흐름을 작은 부품으로 나누어 구현한다.
  • 전체 테스트 28개 통과는 필수 부품의 최소 동작 계약을 만족했다는 의미다.
  • 학습 로그는 구현이 실제로 돌아간 근거지만, 생성 품질까지 자동으로 보장하지는 않는다.

스스로 점검

  1. BPE 테스트에서 한글 encode/decode 복원을 확인해야 하는 이유는 무엇인가?
  2. attention 테스트에서 causal mask를 확인하지 않으면 어떤 문제가 숨어 있을 수 있는가?
  3. fine-tuning에서 LM head와 classification head는 왜 역할이 다른가?

다음 글 예고

다음 글에서는 첫 구현 항목인 byte-level BPE를 본다. 핵심은 “한글을 깨지 않고 숫자 ID로 바꾸고 다시 원문으로 복원하는 법”이다.

한 줄 정리: 이번 과제의 성과는 한 번에 완성된 챗봇이 아니라, GPT를 이루는 부품들이 테스트와 학습 로그로 연결되었다는 점이다.