Skip to main content

스팟 가상머신 운영

개요

스팟 가상머신은 ECI의 유휴 GPU 자원을 온디맨드 대비 할인된 가격으로 제공합니다. 할인율은 자원 수급 상황에 따라 변동되며, 자원 상황에 따라 가상머신이 회수될 수 있으므로 체크포인트 저장과 회수 감지 설정이 필수입니다.


스팟 가상머신 생성

  1. 컴퓨트 > 가상머신 목록에서 가상 머신 생성을 클릭합니다.
  2. 기본 정보 단계에서 가격 유형스팟으로 선택합니다. (스팟 선택 시 항상 켜기·재해 복구 옵션이 자동으로 비활성화됩니다.)
  3. 인스턴스 타입 목록에서 가용 상태가 현재 사용 가능인 GPU 타입을 선택합니다.
  4. 나머지 설정을 완료하고 생성합니다.

가용 자원 확인

스팟 자원은 유휴 GPU를 활용하므로 가용 상태가 수시로 변동됩니다.

방법 1: 가상머신 생성 화면

스팟 가격 유형을 선택하면 인스턴스 타입별 가용 상태가 인라인으로 표시됩니다.

방법 2: 인프라 > 리소스 현황 > 스팟 메뉴

가용 상태설명
현재 사용 가능 ({n}개)자원이 확보되어 가상머신 생성·실행이 가능합니다
현재 사용 가능한 자원 없음자원이 부족하여 생성 및 실행이 불가합니다

회수 (Reclamation)

자원이 부족해지면 ECI가 스팟 가상머신을 강제 회수합니다.

회수 프로세스

  1. 회수가 결정되면 메타데이터 API를 통해 종료 예정 시각이 제공됩니다.
  2. 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 폴링을 설정하고 체크포인트를 주기적으로 저장해 두면 재시작 시 이어서 진행할 수 있습니다.

실행 버튼이 비활성화되어 있어요.

현재 스팟 자원이 부족한 상태입니다 ("현재 스팟 자원이 부족하여 실행할 수 없습니다" 안내 표시). 인프라 > 리소스 현황 > 스팟 메뉴에서 가용 상태를 확인하고 잠시 후 다시 시도하세요.

스팟 가격이 변경되었어요.

스팟 가격은 가상머신 실행 시점에 적용되며, 재실행 시 변경된 가격이 적용될 수 있습니다.


다음 단계