TL;DR: Spot is the same hardware at 50–90% off because AWS can reclaim it on 2 minutes' notice — fatal for web servers, nearly free money for training jobs that checkpoint. Managed Spot Training automates the whole dance: flip use_spot_instances=True, write checkpoints to /opt/ml/checkpoints/, and SageMaker resumes interrupted jobs from S3 on fresh capacity. The trade is wall-clock predictability, which is why SLA-bound production retrains stay On-Demand.
The numbers
| Instance | On-Demand | Typical Spot | Discount |
|---|---|---|---|
| ml.p3.2xlarge | ~$3.80/hr | ~$1.14–1.90/hr | 50–70% |
| ml.p3.16xlarge | ~$28/hr | ~$8.40–14/hr | 50–70% |
| ml.c5.4xlarge | ~$0.85/hr | ~$0.26–0.43/hr | 50–70% |
Field examples: a vision researcher's 24–36 h jobs dropped from $300–400 to $90–120 per run; a 200-configuration hyperparameter sweep went from $1,200 to $240 — stragglers don't matter when jobs run in parallel.
Do this
-
Wire checkpoints first — model weights, optimizer state, epoch/step counters — into
/opt/ml/checkpoints/; SageMaker syncs that path to S3 continuously. PyTorch/TensorFlow/MXNet all support this natively. -
Flip the estimator flags:
estimator = Estimator( ..., use_spot_instances=True, max_run=7200, # expected training time max_wait=14400, # ~2x max_run: interruption + re-queue headroom checkpoint_s3_uri="s3://my-bucket/checkpoints/", ) -
Test the resume path before trusting it: run a short job, kill it manually, restart, confirm it picks up mid-training. Five minutes now prevents the "resumed from epoch 0 after six hours" disaster.
-
Prioritize by dollars: long GPU jobs and hyperparameter sweeps first; they're where percentage discounts become real money.
-
Verify realized savings in the console —
BillableTimeInSecondsvs training time shows exactly what Spot saved per job.
Gotchas
- No checkpoints = no savings, just lost progress on every interruption. This is the entire failure mode.
max_waitmust exceedmax_rungenerously — a tight window means interrupted jobs fail instead of resuming.- Spot scarcity is real at peak times (re:Invent week, quarter-end) — GPU capacity especially; expect longer waits.
- Sub-10-minute jobs lose the savings to provisioning overhead.
- SLA-bound retrains don't belong here: a fraud-detection team's 1-hour jobs stretched to 2–3 hours under interruption and blew a 30-minute deploy SLA — they moved that one workload back to On-Demand and kept Spot for everything else. Hybrid is the right answer.
Skip this if
- Training must complete by a hard deadline every time — pay for On-Demand predictability on that job.
- Your framework genuinely can't checkpoint (rare today).
- Training is a rounding error next to inference — endpoints can't use Spot; that half of the bill is SageMaker Savings Plans territory.