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

Ashley Innocent

Ashley Innocent

19 March 2026

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

요약 (TL;DR)

nanochatAndrej Karpathy의 오픈소스 LLM 훈련 프레임워크로, 50달러 미만의 비용으로 약 2시간 만에 GPT-2 수준의 챗봇을 훈련할 수 있습니다. 이 프로젝트는 단일 8xH100 GPU 노드, 최소한의 코드(코어 모델의 경우 약 500줄), 그리고 하나의 설정 다이얼(--depth)을 사용하여 모든 하이퍼파라미터를 자동으로 최적화합니다. 현재 기록으로는 1.65시간 만에 훈련을 완료하여 CORE 점수 0.2626을 달성했으며, 이는 2019년 OpenAI의 GPT-2가 43,000달러의 비용과 168시간이 소요되었던 것을 능가합니다.

서론

대규모 언어 모델을 훈련하는 데는 수백만 달러와 박사급 연구원 팀이 필요했습니다. 그런 시대는 지났습니다.

Andrej Karpathy는 방금 멋진 저녁 식사 비용보다 적은 비용으로 유능한 대화형 AI를 훈련하는 오픈소스 프로젝트인 nanochat을 출시했습니다. 전체 파이프라인은 단일 8xH100 GPU 노드에서 실행되며 2시간 이내에 완료됩니다.

지금 이것이 중요한 이유

2026년 초, AI 환경은 극적으로 변화했습니다. 2019년 OpenAI가 168시간과 43,000달러를 들였던 일이 이제는 1.65시간과 48달러로 가능해졌습니다. 이는 알고리즘 개선, 더 나은 하드웨어, 그리고 커뮤니티 최적화에 의해 100배의 속도 향상이 이루어졌음을 의미합니다.

API 개발자와 AI 기반 애플리케이션을 구축하는 팀에게 이는 모든 것을 바꿉니다. 이제 막대한 인프라 예산 없이도 맞춤형 모델 훈련을 실험하고, 아키텍처 변경 사항을 테스트하며, LLM 내부를 이해할 수 있습니다.

💡
이를 Apidog와 같은 API 개발 플랫폼과 결합하여 AI 서비스를 테스트하고 문서화하면, 프로덕션 AI 애플리케이션을 구축하기 위한 완전한 스택을 갖추게 됩니다.
버튼

배울 내용

이 글을 마치면 다음을 이해하게 될 것입니다:

nanochat이란?

nanochat은 토큰화, 사전 훈련, 파인튜닝, 평가, 추론 및 ChatGPT와 유사한 웹 UI를 포함한 전체 개발 파이프라인을 다루는 최소한의 LLM 훈련 하네스입니다.

코드베이스는 단일 저장소에 맞으며, 복잡한 설정 파일이나 프레임워크 복잡성이 없습니다. Karpathy는 이를 읽기 쉽고, 해킹 가능하며, 포크 가능한 "강력한 기준선"으로 설계했습니다.

핵심 주장

GPT-2 수준의 모델 (16억 개의 파라미터)을 다음 비용으로 훈련합니다:

참고로, OpenAI의 2019년 오리지널 GPT-2 훈련 비용은 약 43,000달러였으며 32개의 TPU v3 칩으로 7일이 걸렸습니다.

nanochat이 다루는 내용

단계 스크립트 설명
토큰화 scripts.tok_train BPE 토크나이저 훈련 (어휘 32,768)
사전 훈련 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

깊이를 설정하면 nanochat이 자동으로 다른 모든 것을 계산합니다:

이 "하나의 다이얼" 철학은 Karpathy가 nanochat 미니시리즈라고 부르는 것을 가능하게 합니다. 이는 다양한 크기의 컴퓨팅 최적 모델 제품군이며, 모두 동일한 원칙적 접근 방식으로 훈련됩니다.

이것이 작동하는 이유

팀은 수십 번의 훈련 실행을 통해 스케일링 법칙을 측정했습니다. 그들은 깊이, 너비, 배치 크기 및 훈련 기간 사이에 예측 가능한 관계를 발견했습니다. nanochat은 이 모든 조절 기능을 노출하는 대신, 이러한 관계를 훈련 스크립트에 직접 인코딩합니다.

딥러닝 박사 학위가 없어도 컴퓨팅 최적 훈련을 얻을 수 있습니다.

리더보드: GPT-2를 능가하기 위한 경쟁

nanochat은 "GPT-2 수준 도달 시간"을 추적하는 공개 리더보드를 유지합니다. 목표는 DCLM 벤치마크 스위트의 ARC, MMLU 및 기타 22가지 평가 작업에서 OpenAI의 원래 CORE 점수인 0.256525를 능가하는 것입니다.

현재 기록

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

AI가 최적화를 발견한 방법

실행 5와 6은 Karpathy의 "자동 연구(autoresearch)" 시스템에서 얻은 변경 사항을 통합했습니다. AI 에이전트가 작은 d12 모델(5분 훈련 실행)에서 아키텍처 수정을 탐색한 다음, 성공적인 변경 사항을 전체 d24 설정에 적용했습니다.

이 시스템은 다음 사항에서 개선점을 발견했습니다:

이러한 변경 사항은 훈련 시간을 2.02시간에서 1.65시간으로 줄여, 자율 실험을 통해 19%의 개선을 이끌어냈습니다.

nanochat 작동 방식

코드베이스는 핵심 모듈에 걸쳐 대략 3,000줄로 구성되어 있습니다. 각 구성 요소를 살펴보겠습니다.

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

트랜스포머는 여러 최적화와 함께 최신 모범 사례를 따릅니다:

아키텍처 특징:

값 임베딩 (Value Embeddings, ResFormer):
번갈아 나타나는 레이어에는 입력에 따라 달라지는 게이팅을 통해 혼합되는 학습 가능한 값 임베딩이 포함됩니다:

# Value residual: mix in value embedding with per-head gate
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

이는 상당한 컴퓨팅 오버헤드 없이 용량을 추가합니다.

효율성 트릭:

이 모델은 훈련 역학을 개선하는 세 가지 학습된 메커니즘을 포함합니다:

# 1. Per-layer residual scaling
x = self.resid_lambdas[i] * x + self.x0_lambdas[i] * x0

# 2. Smear: mix previous token embedding for bigram info
gate = self.smear_lambda * torch.sigmoid(self.smear_gate(x[:, :, :24]))
x = x + gate * x_pre_smear

# 3. Backout: subtract mid-layer residual
x = x - self.backout_lambda * x_backout

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

nanochat은 혼합 옵티마이저 전략을 사용합니다:

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

Muon (MomentUm Orthogonalized by Newton-Schulz):

Muon 옵티마이저는 "Polar Express"라고 불리는 5차 뉴턴-슐츠 반복을 사용하여 가중치 업데이트를 직교화합니다:

# Polar Express coefficients (5 iterations)
polar_express_coeffs = [
    (8.156, -22.483, 15.879),
    (4.043, -2.809, 0.500),
    # ... more coefficients
]

# Orthogonalization loop
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

NorMuon 분산 감소 (NorMuon Variance Reduction):

직교화 후, 업데이트는 스케일 붕괴를 방지하기 위해 뉴런별로 정규화됩니다:

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)

분산 훈련 (Distributed Training):

멀티 GPU 설정의 경우, 옵티마이저는 3단계 비동기 통신을 사용하는 ZeRO-2 스타일 샤딩을 구현합니다:

Phase 1: Launch all async reduce_scatter operations
Phase 2: Wait for reduces, compute updates, launch all_gathers
Phase 3: Wait for gathers, copy back updated params

이는 통신과 계산을 중첩시켜 GPU 활용도를 극대화합니다.

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

nanochat은 torch.amp.autocast를 사용하는 대신 정밀도를 명시적으로 관리합니다:

하드웨어 기본 dtype 이유
CUDA SM 80+ (A100, H100) bfloat16 네이티브 BF16 텐서 코어
CUDA SM < 80 (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))

마스터 가중치는 옵티마이저 정밀도를 위해 FP32로 유지됩니다. H100 및 Blackwell GPU의 경우 --fp8을 통해 FP8 훈련이 가능하며, 대부분의 레이어를 텐서 단위 스케일링이 있는 Float8Linear로 변환합니다.

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

데이터 로더는 BOS 정렬 최적 맞춤 패킹 (BOS-aligned best-fit packing)을 사용합니다:

이는 모든 토큰이 BOS로 다시 주의를 기울이고 완전한 문서 컨텍스트를 볼 수 있도록 보장합니다.

# Find largest document that fits entirely
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)
    # Add full document
else:
    # Crop shortest doc to fill remaining space

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

이 프로젝트는 FA3와 PyTorch SDPA 사이를 자동으로 전환하는 통합 인터페이스를 제공합니다:

from nanochat.flash_attention import flash_attn

# Works on any hardware - auto-selects best backend
y = flash_attn.flash_attn_func(q, k, v, causal=True, window_size=window_size)

bfloat16을 사용하는 Hopper GPU에서는 Flash Attention 3를 사용합니다. 다른 모든 곳에서는 PyTorch의 스케일드 닷-프로덕트 어텐션으로 폴백(fallback)됩니다.

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

Engine 클래스는 다음을 통해 효율적인 생성을 처리합니다:

엔진은 모델이 계산기를 호출할 때 도구 출력 토큰을 강제하는 것을 포함하여 대화 흐름을 조정합니다.

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

전체 파이프라인은 runs/speedrun.sh에 있습니다. 실행 방법은 다음과 같습니다.

사전 요구 사항

1단계: 환경 설정

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

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

# 종속성 설치
uv sync --extra gpu

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

# ClimbMix 데이터셋에서 약 20억 문자 다운로드
python -m nanochat.dataset -n 170

# 약 100MB 크기의 샤드 170개 다운로드
# 총 압축 크기: 약 17GB

이 스크립트는 멀티-랭크 조정을 처리하기 위해 파일 잠금(file locking)을 사용하여 사전 훈련 데이터 샤드를 다운로드합니다.

3단계: 토크나이저 훈련

# 32,768개의 어휘를 사용하여 BPE 토크나이저 훈련
python -m scripts.tok_train

# 압축률 평가
python -m scripts.tok_eval

토크나이저는 바이트-폴백 BPE가 있는 GPT-4 스타일 분할 패턴을 사용합니다. 20억 문자에서 훈련은 약 10분 만에 완료됩니다.

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

주요 파라미터:

예상 실행 시간: 약 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

이는 모델에게 대화 형식, 특수 토큰 및 도구 사용법을 가르칩니다.

6단계: 모델과 채팅하기

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

# 또는 웹 UI 실행
python -m scripts.chat_web

웹 UI는 8000번 포트에서 실행되며 ChatGPT와 유사한 인터페이스를 제공합니다.

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

새로운 아이디어를 테스트하려면 더 빠른 반복을 위해 더 작은 모델을 사용하십시오.

빠른 실험 (약 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

이것은 최소한의 로깅으로 d12 (GPT-1 크기) 모델을 훈련합니다. 아키텍처 변경 사항을 테스트하는 데 완벽합니다.

모니터링할 지표

Weights & Biases에서 다음을 추적하십시오:

  1. val_bpb: 검증 바이트당 비트 (어휘 크기와 무관한 손실)
  2. core_metric: DCLM CORE 평가 점수
  3. train/mfu: 모델 FLOPS 활용 (하드웨어 효율성)
  4. train/tok_per_sec: 훈련 처리량

테스트 요구 사항

모든 개선 사항은 모든 깊이(d12부터 d26까지)에서 작동해야 합니다. 이는 단일 모델 크기에 대한 과적합을 방지하고 원칙적인 발전을 보장합니다.

nanochat이 중요한 이유

비용 접근성

접근 방식 비용 시간 하드웨어
OpenAI GPT-2 (2019) $43,000 168시간 32 TPU v3
nanochat (2026) $48 2시간 8xH100
nanochat 스팟 ~$15 2시간 8xH100 스팟

이는 LLM 훈련을 다음 범위 내로 가져옵니다:

교육적 가치

코드베이스는 학습 자료로 활용됩니다:

학생들은 완전한 LLM 파이프라인을 읽고, 수정하고, 실험할 수 있습니다.

연구 속도

훈련 시간을 며칠에서 몇 시간으로 단축하면 다음이 가능해집니다:

투명성

모든 설계 선택은 문서화됩니다:

한계점 및 현실 점검

nanochat은 인상적이지만 명확한 한계가 있습니다.

하드웨어 요구 사항

48달러라는 수치는 8xH100 노드에 대한 접근을 전제로 합니다. 클라우드 대여 비용은 다양합니다:

제공업체에 따라 전체 실행에는 약 50~100달러가 필요할 것입니다.

성능 한계

nanochat은 GPT-2 수준의 성능 (2019년 기술)을 달성합니다. 이는 다음을 의미합니다:

할 수 있는 것:

할 수 없는 것:

유치원생을 생각해보세요: 기본적인 대화는 가능하지만 전문가 수준의 작업은 아닙니다.

데이터 요구 사항

전체 스피드런은 다음을 다운로드합니다:

충분한 저장 공간과 대역폭이 필요합니다.

메트릭 한계

CORE 점수는 22가지 작업을 측정하지만 다음을 포착하지 못합니다:

다른 랜덤 시드는 약 0.016 CORE 분산을 생성합니다. 결과는 다를 수 있습니다.

자주 묻는 질문

nanochat으로 모델을 훈련하는 데 드는 비용은 얼마입니까?

온디맨드 방식으로 약 48달러 (시간당 24달러 x 2시간) 또는 스팟 인스턴스에서 약 15달러입니다. 이는 사전 훈련에만 해당됩니다. SFT에는 약 30분을 추가하십시오.

어떤 GPU가 필요합니까?

최소: 단일 GPU (모든 최신 데이터센터 GPU). 최적: 가장 빠른 훈련을 위해 8xH100 또는 8xA100. 코드는 자동 그라디언트 누적을 통해 1개 GPU에서 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 (Metal Performance Shaders)에서 실행됩니다. 훈련은 CUDA보다 느리지만 실험에는 기능적입니다.

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

예. --resume-from-step=<step>을 사용하여 저장된 체크포인트에서 계속 진행할 수 있습니다. 데이터 로더 상태도 정확한 재개를 위해 저장됩니다.

nanochat과 nanoGPT의 차이점은 무엇입니까?

nanoGPT는 사전 훈련만 다루었습니다. nanochat은 토큰화, 사전 훈련, SFT, RLHF, 평가, 추론 및 웹 UI를 포함한 전체 파이프라인으로 확장됩니다.

결론

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

이 프로젝트의 영향은 단순한 비용 절감을 넘어섭니다. 최소한의 읽기 쉬운 코드베이스와 "하나의 다이얼" 인터페이스를 제공함으로써 Karpathy는 연구 도구이자 교육 자료를 만들었습니다.

주요 요점

다음 단계

자신의 모델을 훈련할 준비가 되셨습니까? nanochat 저장소runs/speedrun.sh 스크립트부터 시작하십시오.

AI 기반 애플리케이션을 구축하는 API 개발자에게 LLM 훈련 내부를 이해하는 것이 그 어느 때보다 쉬워졌습니다. 진입 장벽은 "벤처 자금 지원 스타트업"에서 "주말 프로젝트" 수준으로 낮아졌습니다.

버튼

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요