약 90분

Checkpointless Training

디스크 I/O 병목을 완전히 제거하고, 메모리 기반 P2P 상태 복제로 패러다임을 전환한 AWS의 혁신적인 Fault Tolerance 기술을 심층 분석합니다.

1. 개요: 패러다임의 전환

1.1 전통적 Checkpoint-Restart

기존 방식은 주기적으로 모델 상태를 디스크(S3, FSx)에 저장하고, 장애 발생 시 전체 클러스터를 종료한 후 디스크에서 상태를 복구합니다.

Train
Save to Disk
Fault!
Kill All
Load from Disk
(병목)
Resume

1.2 Checkpointless: Always-On In-Memory Recovery

Checkpointless Training은 디스크 저장을 제거하고, 클러스터 메모리 내에서 P2P로 상태를 복제합니다.

Train
P2P Memory Sync
(실시간)
Fault!
Swap Node
P2P Restore
(EFA 3200Gbps)
Resume
핵심 차별점 디스크 I/O를 완전히 제거하고, EFA(3,200 Gbps)를 통한 초고속 메모리 간 직접 전송으로 복구 시간을 90초 미만으로 단축합니다.

2. Component 1: Rootless NCCL

2.1 기존 TCPStore의 문제점

표준 NCCL/Gloo 초기화는 중앙의 Rank 0 (Master) 노드가 TCPStore를 관리하여 프로세스를 동기화합니다.

TCPStore 기반 Rendezvous

# 기존 방식: Rank 0가 TCPStore 호스팅
import torch.distributed as dist

dist.init_process_group(
    backend="nccl",
    init_method="tcp://MASTER_ADDR:MASTER_PORT",  # SPOF!
    rank=rank,
    world_size=world_size
)
Single Point of Failure (SPOF) Master 노드(Rank 0)가 죽으면 전체 통신 링이 붕괴됩니다. 모든 노드가 TCPStore에 재연결을 시도하며, 수천 개 프로세스의 재동기화에 수십 분이 소요됩니다.

2.2 Rootless 솔루션: Decentralized Handshake

중앙 집중식 TCPStore를 제거하고, 각 Rank가 독립적으로 피어(Peer) 연결 정보를 계산하는 Symmetric Address Pattern을 도입했습니다.

환경 변수 설정

# Rootless NCCL 활성화
export HPCT_USE_ROOTLESS=1

# TCPStore 우회
export TORCH_SKIP_TCPSTORE=1

# 포트 범위 확장 (다중 프로세스 통신용)
sysctl -w net.ipv4.ip_local_port_range="20000 65535"
항목 기존 TCPStore Rootless NCCL
아키텍처 중앙 집중형 (Master/Slave) 분산형 (Peer-to-Peer)
SPOF 있음 (Rank 0) 없음
재초기화 시간 수십 분 수 초
확장성 대규모에서 병목 수만 노드 지원

3. Component 2: MMAP Data Loading

3.1 Linux mmap 원리

mmap()은 파일이나 메모리 영역을 프로세스의 가상 주소 공간에 매핑합니다. 여러 프로세스가 동일한 물리 메모리를 공유할 수 있어 메모리 효율이 극대화됩니다.

3.2 /dev/shm 공유 메모리

/dev/shm은 Linux의 tmpfs 기반 공유 메모리 영역입니다. RAM에 직접 데이터를 저장하므로 디스크 I/O 없이 초고속 접근이 가능합니다.

메모리 효율성: 8 GPU에서 1개 복사본 기존에는 노드당 8개 GPU가 각각 데이터 복사본을 유지했습니다. MMAP을 사용하면 1개의 공유 복사본만 유지하여 메모리 사용량을 1/8로 줄입니다.

3.3 MMAPDataModule API

from hyperpod_checkpointless_training.dataloader.mmap_data_module import MMAPDataModule
from hyperpod_checkpointless_training.dataloader.config import CacheResumeMMAPConfig

# MMAP 기반 데이터 로더 설정
data_module = MMAPDataModule(
    data_module=MY_DATA_MODULE(...),
    mmap_config=CacheResumeMMAPConfig(
        cache_dir="/dev/shm/pdl_cache",    # 공유 메모리 경로
        prefetch_length=10,                # 미리 가져올 배치 수
        val_prefetch_length=10,            # 검증용 prefetch
        lookback_length=2,                 # 최근 소비된 배치 보관 수
        checkpoint_frequency=None,         # 캐시 체크포인트 주기
        enable_batch_encryption=False     # 배치 암호화 여부
    ),
)

3.4 CacheResumeMMAPConfig 파라미터

파라미터 타입 기본값 설명
cache_dir str /dev/shm/pdl_cache 공유 메모리 캐시 경로
prefetch_length int 10 미리 가져올 배치 수
val_prefetch_length int 10 검증용 prefetch 배치 수
lookback_length int 2 최근 소비된 배치 보관 수 (롤백용)
checkpoint_frequency int/None None 캐시 메타데이터 저장 주기
enable_batch_encryption bool False 민감 데이터 암호화 여부
복구 시 이점 프로세스가 재시작되어도 캐시된 배치 데이터가 RAM에 그대로 유지됩니다. 데이터 인덱스를 처음부터 다시 스캔할 필요 없이 즉시 학습을 재개할 수 있습니다.

4. Component 3: In-Process Recovery (IPR)

4.1 기존 방식: 전체 Kill

기존에는 하나의 GPU에서 CUDA Error가 발생하면 전체 클러스터의 모든 프로세스를 강제로 종료하고 처음부터 다시 시작했습니다 (Job-level Restart).

4.2 IPR: 프로세스 격리

장애를 프로세스 레벨(Process-level)로 격리합니다. 정상 노드들은 프로세스를 종료하지 않고 기존의 CUDA Context와 컴파일러 캐시를 유지한 채 대기 상태(Wait state)에 진입합니다.

4.3 Recovery 유형

유형 약어 원인 메커니즘
In-Process Recovery IPR 코드 레벨 오류, 예외 기존 프로세스 내에서 RCB 재실행
Process Level Restart PLR 손상된 CUDA Context, 프로세스 종료 Training Operator가 프로세스 재시작 (K8s Pod 재시작 생략)
Job Level Restart JLR 영구적 하드웨어 장애 노드 교체 후 전체 Job 재시작

4.4 @HPWrapper Decorator

Re-executable Code Block (RCB)을 지정하는 데코레이터입니다. 장애 발생 시 해당 블록만 재실행됩니다.

from hyperpod_checkpointless_training.inprocess.wrap import HPWrapper
from hyperpod_checkpointless_training.inprocess.health_check import CudaHealthCheck
from hyperpod_checkpointless_training.inprocess.train_utils import HPAgentK8sAPIFactory
from hyperpod_checkpointless_training.inprocess.abort import (
    CheckpointlessAbortManager,
    CheckpointlessFinalizeCleanup
)

# In-Process Recovery Wrapper
@HPWrapper(
    health_check=CudaHealthCheck(),                    # CUDA 상태 검사
    hp_api_factory=HPAgentK8sAPIFactory(),            # K8s API 연동
    abort_timeout=60.0,                              # Abort 타임아웃
    abort=CheckpointlessAbortManager.get_default_checkpointless_abort(),
    finalize=CheckpointlessFinalizeCleanup(),
)
def run_main(cfg, caller=None):
    # 이 블록 전체가 Re-executable Code Block (RCB)
    trainer = Trainer(...)
    trainer.wrapper = caller  # wrapper 연결 필수
    trainer.fit(model, data_module)

4.5 CudaHealthCheck

CUDA 디바이스의 상태를 주기적으로 검사합니다. 기본 타임아웃은 30초입니다.

4.6 wait_rank() API

HyperPod Training Operator로부터 Rank 정보를 수신할 때까지 대기합니다.

from hyperpod_checkpointless_training.inprocess.train_utils import wait_rank

# Training Operator가 RANK, WORLD_SIZE 환경변수를 설정할 때까지 대기
wait_rank()

# 이후 분산 학습 초기화
rank = int(os.environ["RANK"])
world_size = int(os.environ["WORLD_SIZE"])

5. Component 4: P2P State Replication

5.1 N+1 Redundancy / M-copy Scheme

모델의 Weights와 Optimizer State를 여러 노드 그룹에 중복 복제합니다. num_distributed_optimizer_instances >= 2 설정으로 활성화됩니다.

핵심 원리 S3에서 수 TB의 Checkpoint를 다운로드하는 대신, 살아있는 피어(Peer) 노드의 CPU/GPU 메모리에서 EFA 네트워크(3,200 Gbps)를 통해 직접 상태를 가져옵니다.

5.2 데이터 전송 경로

GPU VRAM
(Source Node)
CPU DRAM
(Staging)
EFA
3,200 Gbps
CPU DRAM
(Target Node)
GPU VRAM
(Restored)

5.3 CheckpointlessMegatronStrategy

from hyperpod_checkpointless_training.nemo_plugins.strategy import CheckpointlessMegatronStrategy

trainer = Trainer(
    strategy=CheckpointlessMegatronStrategy(
        # N+1 Redundancy: 최소 2개 인스턴스 필요
        num_distributed_optimizer_instances=2,

        # 기타 Megatron 설정
        tensor_model_parallel_size=8,
        pipeline_model_parallel_size=4,
        context_parallel_size=1,
    ),
)
메모리 오버헤드 num_distributed_optimizer_instances >= 2 설정은 추가 메모리를 사용합니다. 대략 DCP Checkpoint 크기만큼의 메모리가 복제본 당 추가로 필요합니다. 단, 저정밀도 가중치, 그래디언트, 활성화 메모리는 모델 병렬 처리로 샤딩되어 영향받지 않습니다.

5.4 CheckpointManager API

from hyperpod_checkpointless_training.nemo_plugins.checkpoint_manager import CheckpointManager

checkpoint_manager = CheckpointManager(
    enable_checksum=False,   # 모델 상태 체크섬 검증
    enable_offload=False,    # CPU 메모리로 오프로드
)

# 주요 메서드
checkpoint_manager.save_checkpoint(trainer)              # 메모리에 저장
checkpoint_manager.try_checkpointless_load(trainer)      # P2P 복구 시도
checkpoint_manager.checkpointless_recovery_feasible(trainer)  # 복구 가능성 검증
checkpoint_manager.store_rng_states()                    # RNG 상태 저장
checkpoint_manager.load_rng_states()                     # RNG 상태 복원

5.5 PEFTCheckpointManager

PEFT(Parameter-Efficient Fine-Tuning) 워크플로우용 확장 매니저입니다. Base 모델 가중치와 Adapter 파라미터를 분리하여 관리합니다.

from hyperpod_checkpointless_training.nemo_plugins.checkpoint_manager import PEFTCheckpointManager

# PEFT (LoRA 등) 학습용
peft_checkpoint_manager = PEFTCheckpointManager(
    enable_checksum=False,
    enable_offload=False,
)

6. Component 5: Training Operator

6.1 개요

HyperPod Training Operator는 모든 복구 과정을 조율하는 Kubernetes-native Operator입니다.

6.2 K8s CRD (Custom Resource Definition)

HyperPodPytorchJob CRD를 통해 학습 Job을 정의합니다.

apiVersion: sagemaker.amazonaws.com/v1
kind: HyperPodPytorchJob
metadata:
  name: checkpointless-training-job
  namespace: default
spec:
  nprocPerNode: "8"
  runPolicy:
    cleanPodPolicy: "None"
  replicaSpecs:
    - name: worker
      replicas: 16
      template:
        spec:
          containers:
            - name: training
              image: <hyperpod-checkpointless-container-image>
              env:
                - name: HPCT_USE_ROOTLESS
                  value: "1"
              command:
                - hyperpodrun
                - --nproc_per_node=8
                - --inprocess-restart   # IPR 활성화
                - training_script.py

6.3 Health Monitoring & Hot Spare Pool

Training Operator는 클러스터 상태를 지속적으로 모니터링하고, 미리 준비된 Hot Spare 노드를 즉시 투입합니다.

6.4 장애 복구 흐름

Failure
감지
Cordon
노드 격리
Swap
Hot Spare 투입
P2P Restore
상태 복구
Resume
학습 재개

6.5 hyperpodrun 명령

# entrypoint.sh 예시
#!/bin/bash
set -ex

# Rootless NCCL 설정
export HPCT_USE_ROOTLESS=1
sysctl -w net.ipv4.ip_local_port_range="20000 65535"

# HyperPod Elastic Agent로 학습 실행
hyperpodrun \
    --nproc_per_node=8 \
    --inprocess-restart \
    --inprocess-timeout=120 \
    --shutdown-signal=SIGKILL \
    --shutdown-timeout=15 \
    training_script.py

7. Recovery Flow 전체

Checkpointless Recovery Flow

  1. Training loop 시작 - 정상 학습 진행
  2. Fault 발생 - GPU 오류, 네트워크 장애 등
  3. Resume 가능성 평가 - checkpointless_recovery_feasible()
  4. 분기점:
    • 가능: Checkpointless resume 시도 (P2P State Restore)
    • 불가능: 전통적 Checkpoint 로딩으로 Fallback
  5. Resource Cleanup - Process group abort, 메모리 해제
  6. Training loop 재개 - 1단계로 복귀
Checkpointless Resume이 불가능한 경우
  • 복제본을 가진 모든 노드가 동시에 장애 발생
  • 하드웨어 장애로 노드 교체가 필요하고 Hot Spare가 없음
  • 초기 학습 단계에서 복제가 완료되지 않음
  • 네트워크 파티션으로 피어 노드 접근 불가

이런 경우 시스템은 자동으로 전통적 Checkpoint 로딩으로 Fallback합니다.

8. Managed Tiered Checkpointing

Checkpointless Training과 별개로, AWS는 Tiered Checkpointing 기능도 제공합니다. RDMA over EFA와 S3 통합을 통해 기존 Checkpoint I/O를 최적화합니다.

Checkpointless vs Tiered Checkpointing
  • Checkpointless: 디스크 I/O 완전 제거, 메모리 기반 P2P 복구
  • Tiered Checkpointing: 디스크 I/O 최적화, 계층형 스토리지 활용
두 기술은 상호 보완적으로 사용할 수 있습니다.

8.1 amzn-sagemaker-checkpointing 라이브러리

from amzn_sagemaker_checkpointing import (
    SageMakerTieredStorageWriter,
    SageMakerTieredStorageReader
)
import torch.distributed.checkpoint as dcp

# Tiered Storage Writer 설정
writer = SageMakerTieredStorageWriter(
    path="s3://my-bucket/checkpoints/",
    storage_path="/local/nvme/staging/",  # 로컬 NVMe 스테이징
    thread_count=32,                       # 병렬 업로드 스레드
)

# 분산 Checkpoint 저장
dcp.save(
    state_dict=state_dict,
    storage_writer=writer,
)

# Tiered Storage Reader 설정
reader = SageMakerTieredStorageReader(
    path="s3://my-bucket/checkpoints/step_1000/",
    storage_path="/local/nvme/staging/",
    thread_count=32,
)

# 분산 Checkpoint 로드
dcp.load(
    state_dict=state_dict,
    storage_reader=reader,
)

8.2 Tiered Storage 아키텍처

Tier 스토리지 용도 특징
Tier 0 GPU VRAM P2P 복제 (Checkpointless) 가장 빠름, 용량 제한
Tier 1 CPU DRAM P2P 복제 대기 EFA로 직접 전송
Tier 2 Local NVMe 스테이징 고속 I/O
Tier 3 FSx for Lustre 공유 스토리지 노드 간 공유
Tier 4 Amazon S3 장기 보관 내구성, 저비용