DEV Community

Cover image for 5만원으로 나만의 ChatGPT 훈련하는 방법
Rihpig
Rihpig

Posted on • Originally published at apidog.com

5만원으로 나만의 ChatGPT 훈련하는 방법

요약 (TL;DR)

nanochatAndrej Karpathy가 만든 오픈소스 LLM 훈련 프레임워크입니다. 단일 8xH100 GPU 노드에서 약 2시간 만에 GPT-2 수준 챗봇을 50달러 미만으로 훈련할 수 있습니다. 코어 모델은 약 500줄 코드로, 모든 하이퍼파라미터는 --depth 하나로 제어하며 자동 최적화됩니다. 최근 1.65시간 만에 0.2626 CORE 점수를 달성해, 2019년 OpenAI의 GPT-2 훈련(43,000달러/168시간)을 능가했습니다.

지금 Apidog을 사용해보세요

서론

과거에는 대규모 언어 모델을 훈련하려면 수백만 달러와 박사급 연구진이 필요했습니다. 이제는 아닙니다.

Andrej Karpathy의 nanochat 프로젝트는 단일 8xH100 GPU 노드에서 2시간 이내에 실행 가능한 오픈소스 파이프라인을 제공합니다.

지금 이것이 중요한 이유

2026년, AI 개발 환경은 비약적으로 빨라졌습니다. OpenAI가 2019년에 168시간, 43,000달러를 들였던 작업이 이제 1.65시간, 48달러로 가능합니다. 알고리즘, 하드웨어, 커뮤니티 최적화로 100배의 성능 향상이 이루어졌고,

API 개발자와 AI 기반 서비스 팀은 대규모 예산 없이도 맞춤형 LLM 실험, 아키텍처 테스트, 내부 구조 탐구가 가능해졌습니다.

💡 Apidog 같은 API 개발 플랫폼과 결합하면, AI 서비스 테스트 및 문서화까지 프로덕션 AI 애플리케이션 구축에 필요한 완전한 스택을 갖출 수 있습니다.

배울 내용

이 글을 통해 아래 내용을 실전 단계별로 따라 할 수 있습니다:

  • nanochat이 기존 LLM 훈련 대비 100배 비용 절감을 달성하는 방식
  • 전체 아키텍처(GPT 모델, Muon 옵티마이저, 데이터 로딩 구조)
  • 직접 모델을 훈련하는 단계별 실습 절차
  • 빠른 LLM 연구/실험에 nanochat을 적용하는 방법
  • 실제 한계와 GPT-2 수준의 의미

nanochat이란?

nanochat은 토큰화, 사전 훈련, 파인튜닝, 평가, 추론, ChatGPT 유사 웹 UI까지 포함하는 최소 LLM 훈련 하네스입니다.

nanochat 구조

코드베이스는 단일 저장소에 집중되어 있고, 복잡한 설정 파일이나 프레임워크가 없습니다.

Karpathy는 "읽기 쉽고, 해킹 가능하며, 포크하기 쉬운 강력한 기준선"으로 설계했습니다.

핵심 주장

GPT-2 수준(1.6B 파라미터) 모델을 아래 비용으로 훈련할 수 있습니다:

  • 온디맨드: 48달러 (8xH100, 시간당 24달러, 2시간)
  • 스팟 인스턴스: 약 15달러

OpenAI(2019)는 동일 작업에 43,000달러, 168시간(32xTPU v3)이 필요했습니다.

nanochat이 다루는 전체 파이프라인

단계 스크립트 설명
토큰화 scripts.tok_train BPE 토크나이저 훈련 (32,768 vocab)
사전훈련 scripts.base_train 기본 GPT 모델 훈련
파인튜닝 scripts.chat_sft 채팅용 지도 파인튜닝
평가 scripts.base_eval CORE 메트릭, bits-per-byte
추론 scripts.chat_cli CLI 채팅 인터페이스
웹 UI scripts.chat_web ChatGPT 유사 웹 인터페이스

철학: 하나의 다이얼로 모든 것 제어

대부분 LLM 프레임워크는 복잡한 설정 파일을 요구합니다. nanochat은 반대로 하나의 파라미터 --depth (트랜스포머 레이어 수)만으로 모든 하이퍼파라미터를 자동 최적화합니다.

# GPT-1 크기 모델
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=12

# GPT-2 수준 모델
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=24

# 한계 확장
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26
Enter fullscreen mode Exit fullscreen mode

깊이만 지정하면, 아래 항목이 자동으로 계산됩니다:

  • 트랜스포머 너비(임베딩 차원)
  • 어텐션 헤드 수
  • 각 파라미터 그룹별 학습률
  • 훈련 스텝 수
  • 가중치 감쇠 스케줄
  • 배치 크기

이 방식을 통해 서로 다른 크기의 모델도 동일 철학으로 훈련 가능합니다.

작동 원리

Karpathy 팀은 반복 실험을 통해 깊이, 너비, 배치 크기, 훈련 기간의 스케일링 법칙을 찾아냈습니다. nanochat은 이 관계를 코드에 직접 인코딩해, 사용자는 --depth만 조정하면 됩니다.

스케일링 법칙

딥러닝 이론이나 박사 학위 없이도 최적 훈련 설정을 사용할 수 있습니다.

리더보드: GPT-2 능가하기

nanochat은 "GPT-2 수준 도달 시간"을 추적하는 공개 리더보드를 운영합니다.

목표는 DCLM 벤치마크 스위트에서 OpenAI 원본 CORE 점수(0.256525)를 넘는 것입니다.

실행 모델 시간 CORE 점수 주요 혁신
GPT-2 1.6B 168h 0.2565 OpenAI 2019 기준
실행 1 d24 3.04h 0.2585 초기 기준
실행 2 d26 2.91h 0.2578 FP8 훈련
실행 3 d26 2.76h 0.2602 1M 토큰 배치
실행 4 d24 2.02h 0.2571 ClimbMix 데이터셋
실행 5 d24 1.80h 0.2690 AI 기반 최적화
실행 6 d24 1.65h 0.2626 개선된 smear/backout

AI가 최적화(실행 5,6)를 발견하는 방법

Karpathy의 "자동 연구(autoresearch)" 시스템이 작은 d12 모델에서 아키텍처 수정을 탐색, 성공적 변경을 전체 d24에 적용하여 훈련 시간을 2.02h→1.65h(19% 개선)로 단축했습니다.

  • Backout mechanism: 중간 레이어 잔차 최적화
  • Smear 구현: 빅그램 혼합 개선

nanochat 작동 방식

코어 코드는 약 3,000줄로, 실질적인 각 모듈의 핵심 스니펫을 아래에 제시합니다.

1. GPT 모델 (nanochat/gpt.py)

최신 트랜스포머 구조와 최적화:

  • 로터리 임베딩(RoPE)
  • QK normalization (대규모 안정성)
  • 분리된 임베딩/출력 레이어
  • ReLU² 활성화
  • Grouped Query Attention(GQA)
  • 슬라이딩 윈도우 어텐션
  • Flash Attention 3 통합(자동 fallback)

Value Embedding(ResFormer) 예시:

if ve is not None:
    ve = ve.view(B, T, self.n_kv_head, self.head_dim)
    gate = 3 * torch.sigmoid(self.ve_gate(x[..., :self.ve_gate_channels]))
    v = v + gate.unsqueeze(-1) * ve
Enter fullscreen mode Exit fullscreen mode

효율성 트릭(학습된 메커니즘):

# 1. 레이어별 residual scaling
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0

# 2. Smear: 이전 토큰 bigram info
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear

# 3. Backout: mid-layer residual 빼기
x = x - self.backout_lambda * x_backout
Enter fullscreen mode Exit fullscreen mode

2. Muon 옵티마이저 (nanochat/optim.py)

파라미터별 혼합 옵티마이저 적용:

파라미터 옵티마이저 목적
임베딩/lm_head AdamW 표준 적응형
스칼라 파라미터 AdamW 학습된 스케일링
2D 행렬 Muon 직교화된 업데이트

Muon 직교화 예시:

for a, b, c in polar_express_coeffs[:ns_steps]:
    A = X.mT @ X
    B = b * A + c * (A @ A)
    X = a * X + X @ B
Enter fullscreen mode Exit fullscreen mode

NorMuon 분산 감소:

v_mean = g.float().square().mean(dim=red_dim, keepdim=True)
v_norm = v_mean.sum(dim=(-2, -1), keepdim=True).sqrt()
final_scale = step_size * (v_norm / v_norm_new.clamp_min(1e-10))
g = g * final_scale.to(g.dtype)
Enter fullscreen mode Exit fullscreen mode

분산 훈련(ZeRO-2 스타일 샤딩)

1. async reduce_scatter
2. update/async all_gather
3. gathering 후 param 복사
Enter fullscreen mode Exit fullscreen mode

3. 정밀도 관리 (nanochat/common.py)

하드웨어별 dtype을 명시적으로 관리:

하드웨어 기본 dtype 이유
A100/H100 bfloat16 네이티브 BF16 지원
V100/T4 float32 BF16 미지원
CPU/MPS float32 정밀도 감소 코어 없음

Linear 레이어 dtype 일치 예시:

class Linear(nn.Linear):
    def forward(self, x):
        return F.linear(x, self.weight.to(dtype=x.dtype))
Enter fullscreen mode Exit fullscreen mode

FP8 훈련(--fp8 옵션): H100/Blackwell에서 텐서 단위 스케일링 지원

4. 데이터 로딩 (nanochat/dataloader.py)

BOS-aligned best-fit packing:

  • 모든 시퀀스는 BOS 토큰으로 시작
  • 최적 맞춤 알고리즘으로 문서 패킹, 자투리 최소화
  • 2048 길이에서 약 35% 토큰 절감, 100% 활용률
best_idx = -1
best_len = 0
for i, doc in enumerate(doc_buffer):
    doc_len = len(doc)
    if doc_len <= remaining and doc_len > best_len:
        best_idx = i
        best_len = doc_len

if best_idx >= 0:
    doc = doc_buffer.pop(best_idx)
else:
    # 남은 공간에 맞게 잘라 넣기
Enter fullscreen mode Exit fullscreen mode

5. 플래시 어텐션 통합 (nanochat/flash_attention.py)

FA3와 PyTorch SDPA 자동 전환:

from nanochat.flash_attention import flash_attn
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)
Enter fullscreen mode Exit fullscreen mode

bfloat16/Hopper GPU는 FA3, 그 외는 PyTorch SDPA fallback.

6. 추론 엔진 (nanochat/engine.py)

  • KV 캐시: FA3의 flash_attn_with_kvcache
  • 도구 사용: 특수 토큰으로 Python 계산기 호출
  • 배치 생성: KV 캐시 복제해 병렬 샘플링

단계별: 나만의 모델 훈련하기

전체 파이프라인은 runs/speedrun.sh에 정리되어 있습니다.

사전 요구 사항

  • 8xH100 GPU 노드(또는 동급)
  • 20GB 이상 디스크
  • Python 3.10+
  • uv 패키지 관리자

1단계: 환경 설정

# uv 설치
curl -LsSf https://astral.sh/uv/install.sh | sh

# 가상 환경 생성 및 활성화
uv venv
source .venv/bin/activate

# 종속성 설치
uv sync --extra gpu
Enter fullscreen mode Exit fullscreen mode

2단계: 훈련 데이터 다운로드

# ClimbMix 데이터셋 약 20억 문자 다운로드
python -m nanochat.dataset -n 170
# 총 압축: 약 17GB(샤드 170개)
Enter fullscreen mode Exit fullscreen mode

3단계: 토크나이저 훈련

# BPE 토크나이저 훈련 (32,768 vocab)
python -m scripts.tok_train

# 압축률 평가
python -m scripts.tok_eval
Enter fullscreen mode Exit fullscreen mode

훈련 시간: 약 10분(20억 문자 기준)

4단계: 기본 모델 사전 훈련

# d24(GPT-2 수준) 모델 훈련
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
    --depth=24 \
    --target-param-data-ratio=8 \
    --device-batch-size=16 \
    --fp8 \
    --run=my-first-model
Enter fullscreen mode Exit fullscreen mode
  • --depth=24: GPT-2 크기
  • --target-param-data-ratio=8: 빠른 실험용
  • --device-batch-size=16: GPU당 배치
  • --fp8: H100+에서 FP8 훈련

실행 시간: 약 2시간

5단계: 지도 파인튜닝

# 아이덴티티 대화 데이터 다운로드
curl -L -o ~/.cache/nanochat/identity_conversations.jsonl \
    https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl

# SFT 실행
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft -- \
    --device-batch-size=16 \
    --run=my-sft
Enter fullscreen mode Exit fullscreen mode

모델에 대화 형식, 특수 토큰, 도구 사용법 지도

6단계: 모델과 채팅하기

# CLI 채팅
python -m scripts.chat_cli -p "Why is the sky blue?"

# 또는 웹 UI 실행 (8000번 포트)
python -m scripts.chat_web
Enter fullscreen mode Exit fullscreen mode

연구 워크플로우: 빠른 실험

작은 모델(d12 등)로 아이디어를 빠르게 실험하세요.

빠른 실험 예시 (약 5분)

OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
    --depth=12 \
    --run="d12-test" \
    --core-metric-every=999999 \
    --sample-every=-1 \
    --save-every=-1
Enter fullscreen mode Exit fullscreen mode

아키텍처 변경 테스트에 적합합니다.

모니터링할 지표

Weights & Biases 등에서 아래 지표를 추적:

  1. val_bpb: 검증 bits-per-byte(어휘 크기 무관)
  2. core_metric: DCLM CORE 평가 점수
  3. train/mfu: 모델 FLOPS 활용률
  4. train/tok_per_sec: 처리량

테스트 요구 사항

모든 개선은 d12~d26 등 모든 모델 깊이에서 동작해야 하며, 단일 크기에 대한 과적합을 방지합니다.

nanochat이 중요한 이유

비용 접근성

방식 비용 시간 하드웨어
OpenAI GPT-2(2019) $43,000 168h 32xTPU v3
nanochat(2026) $48 2h 8xH100
nanochat 스팟 ~$15 2h 8xH100 스팟
  • 개인 연구자, 소규모 스타트업, 대학, 취미 개발자도 LLM 실험 가능

교육적 가치

  • GPT 모델: 약 500줄
  • 옵티마이저: 약 530줄
  • 모든 설계에 명확한 주석, 숨겨진 설정 없음
  • 학생/개발자 누구나 전체 파이프라인 읽고, 수정, 실험 가능

연구 속도

  • 훈련 시간 단축 → 더 많은 실험/빠른 가설 테스트/실패 비용 절감
  • 리더보드를 통한 커뮤니티 협력

투명성

  • 모든 설계 결정 및 실험 기록 문서화(dev/LOG.md, GitHub Discussions)
  • 리더보드에 재현 가능한 정보 공개, AI 기여 명확히 구분

한계점 및 현실 점검

하드웨어 요구

  • 48달러는 8xH100 노드 기준
  • Lambda Labs: 시간당 약 25달러
  • RunPod: 시간당 약 15달러(스팟)
  • 전체 실행(사전훈련+SFT): 약 50~100달러

성능 한계

  • GPT-2 수준(2019년) 도달
  • 할 수 있는 것: 기본 대화, 간단한 추론, 초등 수학, 일부 사실 기억
  • 할 수 없는 것: 복잡한 추론, 고급 코드 생성, 섬세한 지시 따르기, GPT-4 등과 경쟁

데이터 요구

  • 약 170개 데이터 샤드, 17GB 압축, 약 20억 문자
  • 충분한 저장공간 및 네트워크 필요

메트릭 한계

  • CORE 점수는 22개 작업만 측정(실제 대화 품질, 도메인 지식, 안전성 등은 미포함)
  • 시드에 따라 약 0.016 CORE 분산 발생

자주 묻는 질문

nanochat으로 모델을 훈련하는 데 드는 비용은?

온디맨드 기준 약 48달러(2시간, 시간당 24달러), 스팟 인스턴스는 약 15달러. 사전훈련 기준이며, 파인튜닝(SFT)은 30분 내외 추가.

어떤 GPU가 필요합니까?

최소: 단일 데이터센터급 GPU, 최적: 8xH100/A100. 1~8개 GPU까지 자동 확장.

훈련에는 얼마나 걸립니까?

1.65~3시간(설정/하드웨어에 따라 다름). d24 모델 리더보드 기록: 1.65시간.

CORE 메트릭이란?

DCLM CORE 점수는 ARC, MMLU 등 22개 작업 기반 모델 평가. GPT-2: 0.256525, nanochat: 0.26 이상.

단일 GPU에서 훈련할 수 있습니까?

가능. torchrun 없이 실행하면 자동으로 그라디언트 누적 적용. 훈련 시간은 8배 길어지나 결과는 거의 동일.

nanochat은 어떤 데이터셋을 사용합니까?

최신: ClimbMix(NVIDIA 큐레이션 웹 데이터). 이전: FineWeb-EDU.

토크나이저는 약 8개 샤드, 20억 문자로 훈련.

nanochat은 Apple Silicon에서 작동합니까?

예. float32 정밀도로 MPS에서 실행되며, CUDA보다는 느림.

체크포인트에서 훈련을 재개할 수 있습니까?

예. --resume-from-step=<step> 옵션 사용. 데이터로더 상태도 저장.

nanochat과 nanoGPT의 차이점은?

nanoGPT는 사전훈련만, nanochat은 전체 파이프라인(토큰화~웹UI) 제공.

결론

nanochat은 LLM 훈련이 더 이상 막대한 예산이나 전문 인프라를 필요로 하지 않음을 증명합니다. 2019년 43,000달러 들던 작업이 50달러 미만으로 가능해졌습니다.

최소, 읽기 쉬운 코드와 "하나의 다이얼" 인터페이스로 Karpathy는 연구 및 교육 모두에 적합한 도구를 만들었습니다.

주요 요점

  • 100배 비용 절감: GPT-2 기능, 43,000달러 → 48달러
  • 100배 속도 향상: 168시간 → 1.65시간
  • 단일 다이얼: --depth 하나로 전부 제어
  • 완전한 파이프라인: 토큰화~웹UI까지
  • 커뮤니티 주도: 공개 리더보드 기반 지속 개선

다음 단계

자신만의 모델을 훈련하려면 nanochat 저장소runs/speedrun.sh를 참고하세요.

API 개발자에게 LLM 훈련 내부를 실험하고, 애플리케이션에 통합하는 진입 장벽이 극적으로 낮아졌습니다.

Top comments (0)