
딥러닝 모델의 규모가 커짐에 따라 GPU 컴퓨팅 자원 확보는 데이터 과학자와 엔지니어들에게 가장 큰 비용적 부담이 되고 있습니다. AWS, Google Cloud, Azure와 같은 클라우드 서비스 제공업체는 남는 자원을 저렴하게 제공하는 Spot Instance(스팟 인스턴스)를 운영하고 있으며, 이를 활용하면 온디맨드 가격 대비 최대 70~90%의 비용을 절감할 수 있습니다. 하지만 스팟 인스턴스의 치명적인 단점은 '중단 가능성'입니다. 학습 도중 인스턴스가 회수되면 진행 중인 작업이 유실될 수 있습니다. 본 가이드에서는 파이썬을 활용해 분산 학습 환경에서 이러한 중단 시나리오를 완벽하게 대비하고, 효율적으로 복구할 수 있는 고도화된 체크포인트 전략과 실무 코드를 상세히 다룹니다.
1. 스팟 인스턴스와 온디맨드 인스턴스의 핵심 차이 분석
비용 효율적인 인프라 구성을 위해 두 인스턴스 유형의 기술적 특성을 명확히 이해해야 합니다.
| 구분 항목 | 온디맨드 (On-Demand) | 스팟 인스턴스 (Spot Instance) | 비용 절감 전략 |
|---|---|---|---|
| 가격 구조 | 정가제 (고정 비용) | 입찰제 또는 실시간 변동가 | 최대 90% 저렴하게 운영 가능 |
| 가용성 보장 | SLA에 따른 높은 보장 | 자원 부족 시 강제 회수(Termination) | 체크포인트 복구 로직 필수 |
| 중단 알림 | 없음 (사용자 종료 전까지 유지) | 종료 2분 전 알림 제공 (AWS 기준) | Signal Handler를 통한 즉시 저장 |
| 주요 용도 | 안정성이 필수적인 서비스 운영 | 대규모 분산 학습, 배치 작업 | 무상태성(Stateless) 아키텍처 권장 |
| 확장성 | 예산 범위 내 무제한 | 가용 영역별 재고량에 의존 | 다중 가용 영역(Multi-AZ) 활용 |
2. 분산 학습 시 체크포인트 복구의 핵심 아키텍처
분산 학습(Distributed Training) 환경에서 체크포인트는 단순한 모델 가중치 저장을 넘어섭니다. Optimizer 상태, Epoch 횟수, Learning Rate Scheduler의 상태, 그리고 데이터 로더의 인덱스까지 모두 동기화되어 저장되어야 합니다. 특히 스팟 인스턴스 환경에서는 다음과 같은 3단계 전략이 필요합니다.
- S3/GCS 원격 저장소 직결: 로컬 디스크는 인스턴스 종료 시 사라질 위험이 있으므로 객체 스토리지에 실시간 동기화합니다.
- Atomic Write: 파일 쓰기 도중 중단되어 파일이 손상되는 것을 방지하기 위해 임시 파일 작성 후 이름을 변경하는 방식을 사용합니다.
- Graceful Shutdown: 종료 신호(SIGTERM)를 감지하여 현재 스텝만 마무리하고 즉시 상태를 저장합니다.
3. 실무 적용 가능한 Python Sample Examples
다음 예제들은 PyTorch 및 표준 라이브러리를 기반으로 실무에서 바로 활용 가능한 코드 패턴입니다.
Example 1: AWS 스팟 인스턴스 종료 알림 감지 및 처리
AWS는 인스턴스 종료 2분 전에 메타데이터 서비스를 통해 알림을 보냅니다. 이를 감지하는 파이썬 루프입니다.
import requests
import time
import signal
import sys
def check_spot_interruption():
"""AWS Metadata 서비스를 호출하여 중단 여부 확인"""
url = "http://169.254.169.254/latest/meta-data/spot/instance-action"
try:
response = requests.get(url, timeout=1)
if response.status_code == 200:
print("중단 신호 감지! 체크포인트를 저장하고 안전하게 종료합니다.")
return True
except:
pass
return False
# 학습 루프 내 적용 예시
# while training:
# if check_spot_interruption():
# save_checkpoint(model, optimizer, epoch)
# sys.exit(0)
Example 2: PyTorch 분산 학습용 원자적(Atomic) 체크포인트 저장
파일 오염을 방지하기 위해 임시 경로에 저장한 후 이동(Rename)하는 방식입니다.
import torch
import os
import shutil
def save_atomic_checkpoint(state, filename="checkpoint.pth.tar"):
temp_filename = filename + ".tmp"
torch.save(state, temp_filename)
# 원자적 이동 운영체제 수준에서 보장
os.replace(temp_filename, filename)
print(f"체크포인트가 안전하게 저장되었습니다: {filename}")
# 사용법
state = {
'epoch': 10,
'state_dict': model.state_dict(),
'optimizer': optimizer.state_dict(),
}
save_atomic_checkpoint(state)
Example 3: 분산 학습 환경(DDP)에서의 Rank 0 전용 복구 로직
여러 GPU가 동시에 파일을 쓰면 충돌이 발생합니다. Master 노드(Rank 0)만 저장하도록 제어합니다.
import torch.distributed as dist
def distributed_save(state, is_master, path):
if is_master:
# 마스터 노드만 스토리지에 접근
torch.save(state, path)
print("Master 노드에서 체크포인트 저장 완료.")
# 모든 프로세스가 저장이 끝날 때까지 대기 (동기화)
dist.barrier()
# 분산 학습 환경 설정 후 호출
# is_master = (args.rank == 0)
# distributed_save(state, is_master, "s3://my-bucket/model.pth")
Example 4: 자동 재시작을 위한 최신 체크포인트 로드 함수
인스턴스가 재시작되었을 때 자동으로 마지막 지점을 찾아 연결하는 로직입니다.
import glob
import os
def load_latest_checkpoint(model, optimizer, checkpoint_dir):
checkpoint_files = glob.glob(os.path.join(checkpoint_dir, "checkpoint_*.pth"))
if not checkpoint_files:
print("기존 체크포인트가 없습니다. 처음부터 학습을 시작합니다.")
return 0
latest_ckpt = max(checkpoint_files, key=os.path.getctime)
checkpoint = torch.load(latest_ckpt)
model.load_state_dict(checkpoint['state_dict'])
optimizer.load_state_dict(checkpoint['optimizer'])
print(f"성공적으로 복구되었습니다: {latest_ckpt}")
return checkpoint['epoch']
Example 5: SIGTERM 시그널 핸들러를 이용한 즉시 대응
운영체제로부터 종료 신호를 받았을 때 즉시 콜백을 실행합니다.
import signal
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self, signum, frame):
print(f"Signal {signum} 수신됨. 마지막 체크포인트 저장 중...")
self.kill_now = True
# 학습 루프 내 활용
killer = GracefulKiller()
for epoch in range(100):
train_one_epoch()
if killer.kill_now:
save_checkpoint(model, optimizer, epoch)
break
Example 6: Boto3를 활용한 S3 클라우드 동기화 래퍼
로컬에 저장된 체크포인트를 즉시 클라우드로 전송하여 인스턴스 삭제에 대비합니다.
import boto3
from botocore.exceptions import NoCredentialsError
def upload_to_s3(local_file, bucket, s3_file):
s3 = boto3.client('s3')
try:
s3.upload_file(local_file, bucket, s3_file)
print(f"S3 업로드 성공: {s3_file}")
except NoCredentialsError:
print("AWS 자격 증명을 찾을 수 없습니다.")
# 사용법: 로컬 저장 후 즉시 호출
# upload_to_s3("checkpoint.pth", "my-deeplearning-bucket", "backups/model_v1.pth")
Example 7: 탄력적 분산 학습(Torch Elastic) 구성 설정
PyTorch Elastic(torchrun)을 사용하여 노드 탈퇴 및 진입 시 동적으로 랑데뷰를 수행하는 CLI 예시입니다.
# terminal에서 실행하는 bash 스크립트 형태
# 노드 수가 1~4개 사이에서 유동적으로 변해도 학습이 유지됨
torchrun \
--nnodes=1:4 \
--nproc_per_node=8 \
--rdzv_id=job_123 \
--rdzv_backend=etcd \
--rdzv_endpoint=localhost:2379 \
train_script.py --checkpoint-path ./checkpoints
4. 결론 및 비용 최적화 제언
Spot Instance를 활용한 분산 학습은 단순한 비용 절감을 넘어, 대규모 리소스를 유연하게 다루는 엔지니어링 역량을 요구합니다. 위에서 제시한 체크포인트 원자성 확보, 종료 시그널 감지, 원격 저장소 동기화라는 3요소를 갖춘다면 중단 없는 AI 모델 학습 환경을 구축할 수 있습니다. 데이터 로딩 속도가 병목이 되지 않도록 Shared File System(EFS, FSx) 보다는 Local SSD + Background S3 Sync 방식을 권장하며, 전체 예산의 20% 정도는 관리용 온디맨드 인스턴스(Master Node)에 할당하여 학습 제어권을 유지하는 것이 안정적입니다.
내용 출처:
- AWS Architecture Blog: "High-performance deep learning with Spot Instances"
- PyTorch Documentation: "Distributed Communication Package - torch.distributed"
- Google Cloud Best Practices: "Running cost-optimized batch workloads"
- NVIDIA Developer Blog: "Checkpointing strategies for large scale training"
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] Prometheus와 Grafana를 활용한 2가지 모델 지표 시각화 방법 및 해결 전략 (0) | 2026.04.29 |
|---|---|
| [PYTHON] TensorRT 및 ONNX 변환 시 100% 성공을 위한 미지원 연산자 해결 방법 7가지 (0) | 2026.04.29 |
| [PYTHON] 서버리스 AI 모델 배포 Cold Start 100% 해결 방법 및 7가지 최적화 기법의 차이 (0) | 2026.04.29 |
| [PYTHON] MLflow 및 WandB 실험 이력 관리와 아티팩트 저장소 구조화 해결 방법 7가지 (0) | 2026.04.29 |
| [PYTHON] 분산 환경 Ray 데이터 셔플링 성능 최적화 해결 방법 3가지와 7개 실무 예제 (0) | 2026.04.28 |