랜덤 가중치가 모델이 되는 한 step의 생애
초기화는 모든 가중치 행렬을 평균 0, 작은 표준편차의 정규분포에서 뽑는 거다. GPT-2·nanoGPT·OLMo 2는
std 0.02, DeepSeek는 0.006을 쓴다. 여기에 깊이 보정이 붙는다. GPT-2 논문은 잔차 층의 가중치를
1/√N(N=잔차 층 수)로 스케일링했고, nanoGPT 코드는 c_proj에 0.02/√(2·n_layer)를
적용한다. 잔차 스트림에 2L개의 서브층 출력이 더해지니 각 출력의 분산을 줄여야 스트림이 깊이에 따라
폭발하지 않는다추론. muP는 이를 폭에 대해 체계화했고, modded-nanogpt
스피드런은 projection의 0 초기화를 핵심 기법으로 쓴다. OpenAI·Anthropic·Gemini의 초기화 방식은
공개되지 않았다.
forward — 정수 ID가 logits가 되기까지
배치 B, 시퀀스 T, 폭 d, 어휘 V일 때 입력은 정수 텐서 [B, T]다. 임베딩 조회로 [B, T, d]가 되고,
각 층에서 Q·K·V를 만든 뒤 softmax(QKᵀ/√h_d + 인과 마스크)V를 잔차에 더하고, RMSNorm과 SwiGLU를
거쳐 다시 더한다. nanoGPT의 네 줄짜리 attention은 실제 학습에서
scaled_dot_product_attention 한 줄, 즉 FlashAttention 커널 하나로 대체된다. 인과
마스크 덕분에 한 번의 forward로 T개 위치 전부의 "다음 토큰" 예측이 병렬로 나온다. 최종 logits
[B, T, V]는 크다. B=1, T=8192, V=128,256이면 BF16으로 2.1GB라서 청크 단위 cross-entropy 커널이
필요하다계산.
파라미터 N인 모델에서 토큰당 forward는 약 2N FLOPs, backward는 약 4N이므로 학습 총 연산 ≈ 6·N·D(D=토큰 수)다. 이 식 하나가 이 교과서의 모든 비용 계산의 뿌리다. H100 SXM은 BF16 dense 989 TFLOPS이고, FlashAttention-3는 s×s 점수 행렬을 HBM에 쓰지 않고 SRAM 안에서 타일별로 계산해 75% 활용을 낸다.
cross entropy — 첫 step의 손실은 ln V다
교차 엔트로피는 각 위치의 logits에 softmax를 적용해 정답 토큰의 확률에 −log를 취한 뒤 평균한 값이다. 초기화 직후 모델은 어휘 전체에 거의 균등한 확률을 내므로 손실은 ln V에 가깝다. GPT-2 어휘 50,257이면 10.825, Llama 3 어휘 128,256이면 11.762다. 이게 실무의 첫 번째 정상성 검사다. 첫 step 손실이 ln V보다 훨씬 낮으면 정보 누출(인과 마스크 누락), 훨씬 높으면 초기화가 너무 크다는 뜻이다추론.
활성값은 별도다 — 긴 시퀀스에서는 활성값이 가중치보다 크다. 첫 손실이 이 값보다 1 이상 낮게 나오면 마스크를 의심하자.
backward · AdamW · 학습률
역전파는 forward에서 저장한 활성값을 거꾸로 되짚는다. 출발점은 dL/dlogits = (softmax − onehot)/(B·T)이고, 이게 출력 헤드·각 층·임베딩 순으로 전파돼 모든 가중치의 기울기를 만든다. 층당 활성 메모리는 s·b·h·(34 + 5·a·s/h) 바이트라서 긴 시퀀스에서는 5as²b 항 때문에 활성값이 메모리를 지배한다. 선택적 재계산은 GPT-3-175B에서 2.7%의 연산으로 70%의 활성 메모리를 절약한다.
AdamW는 기울기의 이동평균(m)과 제곱의 이동평균(v)으로 좌표별 보폭을 조절하고, 가중치 감쇠를 갱신식에서 분리한다. 공개 레시피의 값은 놀랄 만큼 일치한다. β₁=0.9, β₂=0.95, 감쇠 0.1, 클리핑 1.0 — Llama 2, DeepSeek, OLMo 2가 같다. β₂=0.95는 기본값 0.999보다 훨씬 짧은 기억(약 20 step)이라 손실 스파이크를 줄인다고 여겨진다추론. 2025~2026년에는 Muon이 등장했다. Kimi K2의 MuonClip은 "손실 스파이크 0"을, DeepSeek-V4도 Muon을 채택했다.
학습률은 크기에 따라 내려간다. Llama 3는 8B/70B/405B에 3e-4/1.5e-4/8e-5, DeepSeek-V3는 2.2e-4다. 첫 step의 Adam 갱신은 편향 보정 때문에 정확히 −η·sign(g)이라 기울기 크기와 무관하게 모든 좌표가 ±η만큼 움직인다. 그래서 워밍업이 필요하다. 스케줄은 코사인(Llama 3: 8,000 step 워밍업 후 1.2M step 감쇠)과 WSD(MiniCPM: "마지막 10%의 감쇠면 충분하고 2.5%는 부족") 두 계보다. 배치도 램프한다. Llama 3는 4M→8M→16M 토큰으로 키웠다.
손실 스파이크는 클리핑을 해도 난다. PaLM은 약 20번의 스파이크를 겪고 100 step 전 체크포인트에서 재시작해 200~500 배치를 건너뛰는 식으로 복구했다. 2024~2025년의 대응은 구조적이다. OLMo 2는 QK-norm·z-loss·임베딩 감쇠 제거로, DeepSeek-V3는 "전체 학습 동안 복구 불가능한 스파이크나 롤백이 한 번도 없었다"고 보고한다.
혼합 정밀도 — 파라미터당 16바이트의 정체
BF16 가중치 2 + BF16 기울기 2 + FP32 마스터 가중치 4 + Adam m 4 + Adam v 4 = 16바이트. 7B는 112GB, 405B는 6.48TB, 671B는 10.7TB가 상태만으로 필요하다. 이게 한 GPU(80GB)로 학습할 수 없는 첫 번째 이유다. FP8은 E4M3(forward)와 E5M2(기울기) 두 형식이 있고 텐서별 스케일링이 필요하다. DeepSeek-V3는 공개된 가장 큰 FP8 사전학습으로, 활성값 1×128 타일·가중치 128×128 블록 스케일링에 FP32 누적을 써서 BF16 대비 상대 손실 오차가 0.25% 미만이었다. Blackwell은 NVFP4를 하드웨어로 지원하고 NVIDIA는 405B 사전학습이 FP8보다 1.9배 빨랐다고 보고한다. 프론티어 폐쇄형 모델이 FP4로 끝까지 학습됐는지는 공개되지 않았다.
전체를 연결하면
한 step은 (1) 데이터로더가 [B, T] 배치를 읽고 → (2) forward가 활성값을 저장하며 logits를 만들고 → (3) cross-entropy가 스칼라 손실을 내고 → (4) backward가 모든 가중치의 BF16 기울기를 만들고 → (5) 전역 노름을 재서 클리핑하고 → (6) AdamW가 FP32 마스터·m·v를 갱신한 뒤 BF16으로 캐스팅하고 → (7) 스케줄러가 다음 η를 정하고 → (8) 주기적으로 체크포인트와 평가가 돈다. 이 루프가 Llama 3 405B에서는 약 100만 번(15.6T/16M) 반복돼계산 ln V ≈ 11.8에서 시작한 손실이 2 아래로 내려가면 그게 파운데이션 모델이다. 재개용 체크포인트에는 BF16 가중치, FP32 마스터, Adam m·v, 스케줄러 step, 난수 상태, 데이터로더 위치가 다 들어가야 한다. Llama 3의 16K GPU에서는 54일간 419건의 예기치 않은 중단(약 3.1시간마다 1건)이 있었으니 수십 분 이하 간격 저장이 필요하고, 그래서 2~7TB/s 스토리지를 갖춘 거다추론.
출처: nanoGPT · GPT-2 · Ultra-Scale Playbook · Korthikanti et al. · AdamW · MiniCPM (WSD) · PaLM · ZeRO · DeepSeek-V3 (FP8) · Llama 3