from sagemaker.estimator import Estimatorestimator = Estimator( image_uri=container, role=role, instance_count=1, instance_type="ml.g5.xlarge", use_spot_instances=True, # Spot 학습 켜기 max_run=86400, # 학습 자체 최대 시간(초) max_wait=90000, # Spot 대기 포함 최대 시간(초) checkpoint_s3_uri="s3://ml-checkpoints/job-123/", # 회수 대비 체크포인트)
MaxWaitTimeInSeconds(max_wait)는 MaxRuntimeInSeconds(max_run)보다 크거나 같아야 한다 — Spot 용량을 기다리는 시간을 포함하기 때문이다.
체크포인트가 핵심: Spot은 중간에 회수(interruption)될 수 있다. CheckpointConfig로 S3에 진행 상태를 저장하면, 회수 후 재개 시 처음부터가 아니라 체크포인트에서 이어간다. 체크포인트 없이 Spot을 쓰면 회수 때마다 처음부터 다시 학습한다.
저장만으로는 부족하다. 학습 스크립트가 재시작 시 그 경로를 읽어 이어받도록 짜여 있어야 실제로 재개된다.
절감이 실제로 났는지는 작업 설명에서 확인한다.
import boto3sm = boto3.client("sagemaker")d = sm.describe_training_job(TrainingJobName="job-123")print(d["TrainingTimeInSeconds"]) # 실제 학습에 쓴 시간print(d["BillableTimeInSeconds"]) # 과금된 시간 — Spot이면 이쪽이 훨씬 작다
Spot이 학습에 잘 맞는 이유는 "학습은 멱등하게 재개 가능한 배치 작업"이라서다. 회수돼도 체크포인트에서 이어가면 결과가 같다. 반대로 실시간 추론 엔드포인트는 회수되면 서비스가 끊기므로 Spot이 부적절하다 — "Spot은 학습에, 실시간 추론에는 안 쓴다"가 시험의 기본 원칙이다.
⚠️ 함정: "마감이 빡빡해 절대 지연되면 안 되는 학습"에는 Spot이 오답이다. Spot은 용량을 기다릴 수 있고 회수도 될 수 있어 완료 시각을 보장하지 않는다. 비용 문항이라도 "기한 보장"이 조건에 붙어 있으면 온디맨드가 답이다.
인스턴스를 잘못 고르면 돈을 버린다. 두 방향의 낭비가 있다 — 너무 크게(과프로비저닝) 또는 작업에 안 맞는 종류로.
워크로드
고를 것
이유
전통 ML 학습(XGBoost, 선형 등)
CPU (m5/c5)
트리·선형 모델은 GPU 이득이 거의 없다. p4d를 붙이는 건 돈 낭비
딥러닝 학습
GPU (g5/p4d)
큰 모델일수록 GPU 메모리·병렬 연산 성능이 중요
딥러닝 추론 단가 절감
Inferentia (inf1/inf2)
추론 전용 가속기로 단위 비용을 낮춤
추론 인스턴스가 뭐가 맞는지 모를 때
Inference Recommender
부하 테스트로 비용·지연 최적 인스턴스를 추천
학습 쪽은 자동 추천이 없으므로, 작은 데이터로 시험 실행해 메트릭(GPU 사용률·처리량)을 보고 조정한다.
Right-sizing의 원칙은 "워크로드 특성에 맞는 최소 충분 크기"다. GPU는 병렬 행렬 연산(딥러닝)에서만 값을 하고, 트리 모델에는 거의 무용하다. 비용 상황에서 "XGBoost에 GPU"는 오답이 되기 쉽고, "딥러닝 추론에 Inferentia"는 정답 후보가 된다.
튜닝은 학습 작업을 여러 번 돌리는 것이므로 비용이 작업 수 × 작업당 비용으로 커진다. 여기서 새는 돈이 의외로 크다.
from sagemaker.tuner import HyperparameterTunertuner = HyperparameterTuner( estimator=estimator, objective_metric_name="validation:auc", hyperparameter_ranges=ranges, max_jobs=20, # 총 학습 작업 수 = 비용 상한 max_parallel_jobs=2, # 동시 실행 수(너무 크면 탐색 효율이 떨어진다) early_stopping_type="Auto", # 가망 없는 작업을 조기 중지)
max_jobs가 사실상 튜닝의 예산 상한이다. 범위를 좁히고 작업 수를 줄이는 게 가장 확실한 절감이다.
early_stopping_type을 켜면 목표 지표가 가망 없는 작업을 중간에 끊어 낭비를 막는다.
튜닝 작업의 개별 학습에도 Spot을 적용할 수 있다(Estimator에 설정하면 튜닝이 그 설정을 따른다).
학습이 발산하거나 과적합으로 치닫는 걸 규칙으로 감지해 작업을 자동 중지시키는 것도 낭비를 끊는 장치다(Debugger 규칙).
추론 비용의 큰 그림은 "트래픽이 0인 구간의 always-on 비용을 없애는 것"이다(Week 6 복습과 연결).
옵션
과금 대상
트래픽이 0일 때
적합한 상황
실시간 엔드포인트
떠 있는 인스턴스 시간
최소 1대 비용이 계속 발생
꾸준한 트래픽, 낮은 지연이 필수
서버리스 추론
호출 처리 시간·메모리
0
간헐적·예측 어려운 트래픽. 콜드 스타트 감수
비동기 추론
인스턴스 시간
큐가 비면 0까지 축소 가능
큰 페이로드·긴 처리, 즉답 불필요
배치 변환
작업이 도는 동안만
0 (작업 끝나면 인스턴스 종료)
일괄 점수화. 가장 저렴
MME(다중 모델 엔드포인트)
공유 인스턴스 시간
인스턴스 비용은 발생
모델이 아주 많고 각각의 호출은 드물 때
비용 최적화 결정유휴 구간이 있는가? ├─ 예 → 일괄 처리 가능? → 예: 배치 변환 / 아니오: 서버리스(작은 페이로드) 또는 비동기(큰 페이로드) └─ 아니오(상시 트래픽) → 실시간 + 오토스케일링 + MME(다수 모델) + Inferentia(딥러닝)
비용 관점 의사결정: 트래픽이 0으로 떨어지는 구간이 있으면 서버리스·비동기·배치로 그 구간 비용을 0에 가깝게. 항상 트래픽이 차 있으면 실시간 + Auto Scaling + (다수 모델이면)MME + (딥러닝이면)Inferentia로 단위 비용을 낮춘다.
⚠️ 함정: 모델 하나를 위해 엔드포인트 하나를 만드는 습관이 비용을 조용히 갉아먹는다. 모델이 수십·수백 개인데 각각 호출 빈도가 낮으면 답은 인스턴스 축소가 아니라 MME로 합치는 것이다. 반대로 모든 모델이 상시 고트래픽이면 MME는 오히려 서로 자원을 다투게 만든다.
Studio·노트북 자동 종료: 유휴 노트북은 라이프사이클 구성(LCC)이나 Studio의 유휴 종료 설정으로 일정 시간 후 자동 종료. 데이터 사이언티스트가 켜두고 퇴근하는 비용을 막는다.
학습 작업 MaxRuntimeInSeconds: 무한정 도는 작업을 시간으로 끊는다. 버그로 멈춘 학습이 GPU를 며칠씩 태우는 사고를 방지.
엔드포인트 정리: 안 쓰는 실시간 엔드포인트는 always-on 비용이 계속 나가므로 삭제하거나 서버리스로 전환.
Auto Scaling + 스케일 인: 트래픽이 줄면 인스턴스를 줄여(최소 용량까지) 비용을 낮춘다.
S3 수명 주기: 오래된 데이터셋·구버전 아티팩트·로그는 저빈도/아카이브 계층으로 옮기거나 만료시킨다. 학습이 끝나도 스토리지 비용은 계속 쌓인다.
ML 비용 사고는 대개 "끄지 않은 리소스"에서 나온다 — 유휴 노트북, 잊힌 엔드포인트, 무한 루프 학습. 자동 종료(유휴 타이머, MaxRuntime, 오토스케일 스케일인)는 사람의 실수를 시스템으로 막는 장치다. 시험에서 "예상치 못한 비용 급증"의 정답은 대개 이 자동 종료/정리 관련이다.
태그를 붙였는데 Cost Explorer에서 안 보인다는 상황이 있다. 태그는 붙이는 것만으로 끝이 아니라 Billing 콘솔에서 "비용 할당 태그"로 활성화해야 비용 보고서에 나타나고, 활성화 이후의 사용분부터 집계된다. 과거 비용이 소급되지 않는다는 점까지 기억한다.
비용 거버넌스는 "측정 → 귀속 → 예산 → 알림"의 순환이다. 태그로 비용을 팀·프로젝트에 귀속(allocation)시켜야 누가 얼마 쓰는지 보이고, Budgets로 한도를 정하고 초과 시 알린다. "비용을 팀별로 나눠 보고 싶다"는 시나리오의 정답은 거의 항상 비용 할당 태그다.