약 60분

Checkpointing의 한계

대규모 분산 학습에서 Checkpoint가 왜 필수인지, 그리고 왜 그것이 병목이 되는지 심층 분석합니다.

1. Checkpointing이란?

Checkpoint는 학습 도중의 모델 상태를 스토리지에 저장하는 메커니즘입니다. 학습이 중단되더라도 저장된 시점부터 재개할 수 있게 해주는 Fault Tolerance(장애 허용)의 핵심입니다.

왜 Checkpoint가 필요한가? 수만 개의 GPU를 사용하는 "Frontier Scale" 학습에서는 하드웨어 장애가 예외가 아닌 통계적 필연입니다. Meta의 Llama 3 405B 학습 시 54일간 466번의 장애가 발생했습니다 - 평균 3시간마다 중단.

Checkpoint 없이 학습을 진행한다면, 단 한 번의 GPU 장애로도 수일~수주간의 학습 진행 상황을 모두 잃게 됩니다. 이는 수백만 달러의 컴퓨팅 비용 손실로 직결됩니다.

2. Checkpoint 구성 요소

학습을 완벽하게 복원(Resuming)하기 위해 Checkpoint에는 단순히 모델 가중치뿐만 아니라 학습의 "맥락"이 모두 저장되어야 합니다.

Model Parameters

현재 시점의 모델 가중치. BF16 또는 FP32 정밀도로 저장합니다. 모델의 "두뇌"에 해당하는 핵심 데이터입니다.

Optimizer States

가장 용량이 큽니다. Adam 옵티마이저의 경우 파라미터별 1차 모멘텀(Momentum), 2차 모멘텀(Variance), 누적 스텝 수를 저장합니다. 이를 잃어버리면 학습 재개 시 Loss 스파이크가 발생합니다.

LR Scheduler State

현재 어느 에포크/스텝인지, 현재 Learning Rate 값은 얼마인지 저장합니다. Warmup이나 Cosine Decay 스케줄을 정확히 이어가기 위해 필수입니다.

RNG States

PyTorch, CUDA, NumPy 등의 난수 생성기(Random Number Generator) 시드 및 현재 상태. 데이터 셔플링 순서나 Dropout 등이 정확히 이전 시점과 이어지도록 하기 위해 필수입니다.

Data Loader Position

수백만 개의 문서를 처리하는 도중 끊겼다면, 어느 파일의 몇 번째 배치까지 처리했는지 인덱스를 저장합니다. 같은 데이터를 중복 학습하거나 누락하는 것을 방지합니다.

Gradient Buffers는 저장하지 않습니다 스텝이 끝나면 그래디언트는 업데이트 후 버려지기 때문에, 일반적으로 Checkpoint에 포함하지 않습니다.

3. Checkpoint 크기 계산

3.1 크기 계산 공식

학습 Checkpoint(Full Training Checkpoint)의 크기를 계산할 때는 Mixed Precision 환경을 가정합니다.

Checkpoint Size = Parameters x Bytes per Parameter

3.2 Adam Optimizer 메모리 구성

Adam 옵티마이저와 Mixed Precision 학습을 사용할 때, 파라미터 하나당 필요한 저장 공간:

구성 요소 정밀도 Bytes 설명
Model Weights BF16/FP16 2 실제 학습에 사용되는 가중치
Master Weights FP32 4 누적 오차 방지용 고정밀 가중치
Momentum (m) FP32 4 Adam의 1차 모멘트
Variance (v) FP32 4 Adam의 2차 모멘트
합계 - 14 파라미터당 총 14 bytes

3.3 대표 모델별 Checkpoint 크기

모델 파라미터 수 추론용 (BF16 only) 학습용 Full Checkpoint
Llama 3 8B 8 Billion 16 GB 112 GB
Llama 3 70B 70 Billion 140 GB 980 GB (~1 TB)
Llama 3 405B 405 Billion 810 GB 5,670 GB (~5.7 TB)
DeepSeek R1 671B 671 Billion 1.34 TB ~5 TB
단 한 번의 Checkpoint 저장에 수 테라바이트! Llama 3 405B 모델의 경우 5.7TB를 저장해야 합니다. 이는 일반 SSD의 전체 용량을 초과하며, 네트워크 스토리지에 기록하는 데만 수십 분이 소요될 수 있습니다.

4. Checkpoint I/O 아키텍처

4.1 Synchronous vs Asynchronous Checkpointing

Synchronous Checkpointing

학습을 완전히 멈추고 모든 노드가 동시에 Checkpoint를 저장합니다.

  • 구현이 단순하고 일관성 보장
  • 저장 완료까지 GPU 유휴 상태
  • 수 TB 저장 시 10-20분 학습 중단

Asynchronous Checkpointing

백그라운드에서 Checkpoint를 저장하며 학습은 계속 진행합니다.

  • 학습 중단 시간 최소화
  • 메모리 복사본 필요 (메모리 오버헤드)
  • 구현 복잡도 증가

4.2 PyTorch DCP (Distributed Checkpoint)

PyTorch 2.0+에서 제공하는 분산 Checkpoint 라이브러리로, 대규모 모델을 효율적으로 저장/로드합니다.

from torch.distributed.checkpoint import save, load
from torch.distributed.checkpoint.state_dict import get_state_dict, set_state_dict

# 분산 저장 - 각 Rank가 자신의 샤드만 저장
state_dict = get_state_dict(model, optimizer)
save(state_dict, checkpoint_dir="/fsx/checkpoints/step_1000")

# 분산 로드 - 자동으로 샤딩된 데이터 매핑
set_state_dict(model, optimizer, load(checkpoint_dir))

4.3 Storage Tiers

Checkpoint는 성능과 비용에 따라 다양한 스토리지 계층에 저장됩니다.

Storage Tier 속도 용량 비용 용도
Local NVMe 7+ GB/s ~30 TB/node 인스턴스 포함 임시 저장, 빠른 복구
FSx for Lustre ~1 GB/s/TiB 확장 가능 중간 공유 스토리지, 중간 Checkpoint
Amazon S3 ~100 MB/s 무제한 저렴 장기 보관, 최종 Checkpoint

5. 기존 복구 프로세스: 6단계 순차 실행

전통적인 Checkpoint 기반 복구는 다음 6단계를 순차적으로 실행해야 합니다.

1. Detect
장애 감지
~30초
2. Terminate
전체 Job Kill
~1분
3. Replace HW
노드 교체
~3-5분
4. Re-init NCCL
통신 초기화
~2-5분
5. Load from S3
수 TB 다운로드
~5-20분
6. Resume
학습 재개
~1분
각 단계 상세 분석

1. Detect (장애 감지) - ~30초

Health check 주기에 따라 장애를 감지합니다. GPU hang, CUDA error, heartbeat timeout 등 다양한 신호를 모니터링합니다.

2. Terminate All (전체 프로세스 종료) - ~1분

하나의 GPU에서 장애가 발생하면 전체 클러스터의 모든 프로세스를 강제 종료합니다. 1,000개 이상의 노드에서 동시에 프로세스를 정리하는 데 시간이 소요됩니다.

3. Replace Hardware (노드 교체) - ~3-5분

결함이 있는 노드를 클러스터에서 제거하고, Hot Spare 노드를 투입하거나 새 인스턴스를 프로비저닝합니다.

4. Re-init NCCL (통신 재설정) - ~2-5분

TCPStore 기반 Rendezvous를 다시 수행합니다. 수천 개의 프로세스가 서로의 존재를 확인하고 통신 그룹을 재구성하는 데 상당한 시간이 소요됩니다.

5. Load from S3 (Checkpoint 로드) - ~5-20분 (병목!)

수 TB의 Checkpoint 데이터를 S3에서 다운로드합니다. 네트워크 대역폭과 스토리지 IOPS가 병목이 됩니다. 이 단계가 전체 복구 시간의 대부분을 차지합니다.

6. Resume Training (학습 재개) - ~1분

모델과 옵티마이저 상태를 GPU에 로드하고, DataLoader를 초기화하여 학습을 재개합니다.

총 복구 시간: 15분 ~ 1시간 이상 모델 크기, 클러스터 규모, 네트워크 상태에 따라 복구 시간이 크게 달라집니다. 이 시간 동안 수천 개의 고가 GPU가 유휴 상태로 방치됩니다.

6. 실제 장애 통계

6.1 Meta Llama 3 405B 학습 사례

54일간의 학습 기록

총 장애 횟수 466회
평균 장애 간격 ~3시간
GPU 장애 30%
HBM3 메모리 오류 17%
기타 (네트워크, 소프트웨어 등) 53%

6.2 Google Gemini 학습 사례

Google은 Gemini Ultra 학습 중 "machine failures are commonplace"라고 밝혔습니다.

  • Silent Data Corruption (SDC): 1-2주마다 발생
  • SDC는 명시적 오류 없이 잘못된 계산 결과를 생성하여 감지가 어려움
  • Checksum 검증 등 추가적인 데이터 무결성 검사 필요

6.3 MTBF at Scale

Mean Time Between Failures (MTBF)는 클러스터 규모에 반비례합니다.

Cluster MTBF = Single GPU MTBF / Number of GPUs
MTBF 계산 예시

단일 GPU의 MTBF가 10,000시간(약 14개월)이라고 가정할 때:

클러스터 규모 GPU 수 예상 MTBF
Small 64 ~156시간 (6.5일)
Medium 512 ~19.5시간
Large 4,096 ~2.4시간
Frontier 16,000+ ~37분

16,000개 GPU 클러스터에서는 37분마다 장애가 발생할 수 있습니다!

7. GPU 장애 유형

장애 유형 빈도 증상 복구 가능성
HBM3 Memory Errors 높음 CUDA OOM, ECC 오류 재부팅으로 일시 해결, 반복 시 교체
Thermal Throttling 중간 성능 저하, 클럭 다운 쿨링 개선, 워크로드 조정
NVLink Failures 중간 노드 내 GPU 간 통신 실패 노드 교체 필요
Network Failures 높음 NCCL timeout, 노드 간 통신 실패 네트워크 재설정, 노드 교체
Silent Data Corruption 낮음 (치명적) 오류 메시지 없음, 잘못된 계산 결과 감지 어려움, Checksum 검증 필요
Silent Data Corruption (SDC)의 위험성 SDC는 명시적인 오류 없이 잘못된 계산을 수행합니다. 학습이 완료된 후에야 모델 품질 저하로 발견되는 경우가 많아, 전체 학습을 다시 시작해야 할 수 있습니다.

8. 비용 분석

8.1 p5.48xlarge 인스턴스 비용

항목
GPU 8x NVIDIA H100 80GB
On-Demand 시간당 가격 ~$98.32
분당 비용 ~$1.64

8.2 복구 시간당 비용 손실

256 노드 클러스터, 20분 복구 시나리오

Cost = 256 nodes x $1.64/min x 20 min = $8,396.80

단 한 번의 장애 복구에 약 1천만원의 비용이 발생합니다.

8.3 월간 비용 추정

하루 8회 장애 발생 가정 (3시간마다):

항목 계산 비용
일일 복구 비용 $8,397 x 8회 $67,176
월간 복구 비용 $67,176 x 30일 $2,015,280
월 20억원 이상의 손실! 256 노드 규모의 클러스터에서 기존 Checkpoint-Restart 방식으로는 월간 20억원 이상의 비용이 복구 시간에 낭비됩니다.

8.4 Goodput 분석

Goodput은 실제 유효 학습에 사용된 시간의 비율입니다.

Goodput = (Total Time - Recovery Time - Checkpoint I/O Time) / Total Time
시나리오 Checkpoint 주기 복구 시간 예상 Goodput
보수적 1시간 30분 60-70%
일반적 2시간 20분 70-80%
공격적 4시간 15분 80-85%

9. Checkpoint 빈도 트레이드오프

자주 저장하면...

  • 장애 시 손실되는 학습량 감소
  • I/O 오버헤드 증가
  • 스토리지 비용 증가
  • 학습 중단 빈도 증가 (동기식)

드물게 저장하면...

  • I/O 오버헤드 감소
  • 스토리지 비용 절감
  • 장애 시 더 많은 학습량 손실
  • 복구 후 진행 상황 후퇴

9.1 최적 Checkpoint 주기 계산

최적의 Checkpoint 주기는 다음 요소들의 균형점입니다:

Optimal Interval = sqrt(2 x Checkpoint_Time x MTBF)
최적 주기 계산 예시

가정:

  • Checkpoint 저장 시간: 10분
  • 클러스터 MTBF: 180분 (3시간)

계산:

Optimal = sqrt(2 x 10 x 180) = sqrt(3600) = 60분

이 시나리오에서는 1시간마다 Checkpoint를 저장하는 것이 최적입니다.

9.2 현실적인 권장 사항

클러스터 규모 예상 MTBF 권장 Checkpoint 주기
Small (64 GPU) ~6일 4-6시간
Medium (512 GPU) ~20시간 2-4시간
Large (4,096 GPU) ~2.5시간 30분-1시간
Frontier (16,000+ GPU) ~40분 15-30분
결론: Checkpoint의 딜레마 대규모 클러스터에서는 어떤 Checkpoint 주기를 선택하든 상당한 오버헤드가 발생합니다. 이것이 바로 Checkpointless Training이 필요한 이유입니다.