스팟 가상머신 운영
개요
스팟 가상머신은 ECI의 유휴 GPU 자원을 온디맨드 대비 할인된 가격으로 제공합니다. 할인율은 자원 수급 상황에 따라 변동되며, 자원 상황에 따라 가상머신이 회수될 수 있으므로 체크포인트 저장과 회수 감지 설정이 필수입니다.
스팟 가상머신 생성
- 컴퓨트 > 가상머신 목록에서 가상 머신 생성을 클릭합니다.
- 기본 정보 단계에서 가격 유형을 스팟으로 선택합니다. (스팟 선택 시 항상 켜기·재해 복구 옵션이 자동으로 비활성화됩니다.)
- 인스턴스 타입 목록에서 가용 상태가 현재 사용 가능인 GPU 타입을 선택합니다.
- 나머지 설정을 완료하고 생성합니다.
가용 자원 확인
스팟 자원은 유휴 GPU를 활용하므로 가용 상태가 수시로 변동됩니다.
방법 1: 가상머신 생성 화면
스팟 가격 유형을 선택하면 인스턴스 타입별 가용 상태가 인라인으로 표시됩니다.
방법 2: 인프라 > 리소스 현황 > 스팟 메뉴
| 가용 상태 | 설명 |
|---|---|
현재 사용 가능 ({n}개) | 자원이 확보되어 가상머신 생성·실행이 가능합니다 |
| 현재 사용 가능한 자원 없음 | 자원이 부족하여 생성 및 실행이 불가합니다 |
회수 (Reclamation)
자원이 부족해지면 ECI가 스팟 가상머신을 강제 회수합니다.
회수 프로세스
- 회수가 결정되면 메타데이터 API를 통해 종료 예정 시각이 제공됩니다.
- 1~2분의 유예 시간 후 가상머신이 강제 회수됩니다.
회수 감지: 메타데이터 API
가상머신 내부에서 아래 명령어로 회수 예정 여부를 확인할 수 있습니다.
curl -s --unix-socket /run/eci-guest-agent.sock \
http://localhost/vm/metadata?key=spot_termination_time
- 회수 예정 없음:
404 page not found - 회수 예정: 종료 예정 시각 반환 (예:
"2026-04-08T05:00:00+00:00")
회수 감지 스크립트 (백그라운드 실행)
#!/bin/bash
# spot_watcher.sh
while true; do
HTTP_CODE=$(curl -s -o /tmp/spot_response -w "%{http_code}" \
--unix-socket /run/eci-guest-agent.sock \
http://localhost/vm/metadata?key=spot_termination_time)
if [ "$HTTP_CODE" -eq 200 ]; then
echo "[$(date)] 회수 예정: $(cat /tmp/spot_response)"
/path/to/save_checkpoint.sh # 체크포인트 저장 스크립트 호출
break
fi
sleep 5
done
chmod +x spot_watcher.sh
nohup ./spot_watcher.sh &
체크포인트 저장
회수 시 가상머신 내 데이터는 손실됩니다
가상머신 메모리와 로컬 임시 데이터는 회수 시 사라집니다. 반드시 블록 스토리지에 주기적으로 체크포인트를 저장하세요.
PyTorch 체크포인트 예시
import torch, os
CHECKPOINT_PATH = "/data/checkpoints/checkpoint.pt"
def save_checkpoint(model, optimizer, epoch, step, loss):
os.makedirs(os.path.dirname(CHECKPOINT_PATH), exist_ok=True)
torch.save({
'epoch': epoch,
'step': step,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss,
}, CHECKPOINT_PATH)
print(f"[epoch {epoch}] 체크포인트 저장 완료")
def load_checkpoint(model, optimizer):
if os.path.exists(CHECKPOINT_PATH):
ckpt = torch.load(CHECKPOINT_PATH)
model.load_state_dict(ckpt['model_state_dict'])
optimizer.load_state_dict(ckpt['optimizer_state_dict'])
return ckpt['epoch'], ckpt['step']
return 0, 0 # 처음부터 시작
# 학습 루프
start_epoch, start_step = load_checkpoint(model, optimizer)
for epoch in range(start_epoch, total_epochs):
for step, batch in enumerate(dataloader, start=start_step):
train_step(model, batch)
if step % 100 == 0:
save_checkpoint(model, optimizer, epoch, step, loss) # 100 스텝마다 저장
회수 감지 시에만 저장하면 늦을 수 있습니다
유예 시간(1~2분) 내에 저장이 완료되지 않을 수 있습니다. 정기 저장(N 스텝마다)을 병행하세요.
제한 사항
- GPU 인스턴스 타입에만 적용됩니다. CPU 전용 인스턴스에는 스팟이 없으며, 연결되는 블록 스토리지·공인 IP·네트워크 등 다른 리소스는 일반 단가로 과금됩니다
- 항상 켜기(Always On) 사용 불가
- 재해 복구(DR) 사용 불가
- 가상 클러스터 연결 불가
자주 묻는 질문
가상머신이 갑자기 종료되었어요.
스팟 자원 부족으로 회수된 것입니다. 메타데이터 API 폴링을 설정하고 체크포인트를 주기적으로 저장해 두면 재시작 시 이어서 진행할 수 있습니다.
실행 버튼이 비활성화되어 있어요.
현재 스팟 자원이 부족한 상태입니다 ("현재 스팟 자원이 부족하여 실행할 수 없습니다" 안내 표시). 인프라 > 리소스 현황 > 스팟 메뉴에서 가용 상태를 확 인하고 잠시 후 다시 시도하세요.
스팟 가격이 변경되었어요.
스팟 가격은 가상머신 실행 시점에 적용되며, 재실행 시 변경된 가격이 적용될 수 있습니다.
다음 단계
- Terraform 스팟 가상머신 가이드: IaC로 스팟 가상머신 자동화
- 과금 체계: 스팟 vs 온디맨드 vs 약정형