← All episodes

Episode 9 · October 12, 2026

Idle SageMaker Real-Time Endpoints Bill Every Hour, Even With Zero Traffic

SageMaker real-time endpoints run on dedicated instances that bill every hour they are in service, whether or not a single request arrives. This episode covers why the billing works that way, the math for an ml.t2.medium endpoint at $0.056 per hour in us-east-1 (about $40 a month while idle) and how larger GPU instances multiply it, how to spot an idle endpoint with the CloudWatch Invocations metric at zero over at least seven days, what deleting the endpoint does (it stops the instance charge and keeps the model and endpoint configuration so it can be recreated), what to check first such as scheduled jobs and hard-coded references, and when serverless or asynchronous inference fits spiky traffic better. Find this waste on your own machine, read-only: pip install cloudcostwise

Idle SageMaker Real-Time Endpoints Bill Every Hour, Even With Zero Traffic

Read the related post

Transcript

Auto-generated from the audio. The hosts are AI-generated voices; mistakes in the transcript are possible.

Welcome to the Deep Dive. Today we're looking at a stack of AWS documentation and cloud optimization notes to uncover a pretty silent budget killer in your AWS environment. Yeah, we're tracking down zombie machine learning resources today. Right, because, you know, we're also conditioned by modern cloud architectures at this point. You spin up a serverless Lambda function and you expect to pay for the exact milliseconds it runs.

Which makes sense. Yeah, but jump over to Amazon SageMaker real-time endpoints and that logic completely flips. Oh, totally. You are billed for every instance, every hour it is in service, whether or not anyone sends it a single request. Yeah, and there's a very specific architectural reason for that.

Because unlike a serverless function that scales down to zero, a real-time endpoint provisions dedicated persistent EC2 instances. Right. It has to load your machine learning model into memory and keep it there, you know, so it can respond with millisecond latency. The hardware is locked up specifically for you. So it's like less like a taxi meter running and more like renting an entire private jet and keeping it fully staffed on the runway 24/7.

Yeah, exactly. Just in case you decide you want to fly somewhere. You aren't just paying for the flight, you're paying to monopolize the hardware. That's actually the perfect way to look at it. Let's look at the absolute floor for this unit math-wise.

Okay. If you spin up an ml.t2.medium, which is the smallest real-time hosting instance, it costs 5.6 cents per hour. 5.6 cents. Right, or 0.056 dollars in US East 1. So 5.6 cents times the hours in a month is about $40 a month.

Wow. For a completely idle resource. Okay, so $40 a month, I mean a lot of engineers might hear that and say, you know, who cares? That's just a rounding error on our AWS bill. Sure.

Why does this actually matter? Well, because that is just the baseline, right? You generally aren't running serious models in production on a tiny instance. Oh, right. Larger GPU instances cost far more per hour.

And the organizational reality is that highly competent engineering teams let this waste survive for months because nobody explicitly owns that specific endpoint. It just gets forgotten. Exactly. It does not alarm when traffic drops to zero. It just, it blends into the background noise of the monthly AWS invoice on a high level per service bill.

So if these costs are buried in the invoice noise like that, do you need some expensive third-party platform to dig them out? Not at all. You can track this down manually using a signal you already have. You just need to check the CloudWatch invocations metric. Oh, just right in CloudWatch?

Yep, the threshold you are looking for is an invocations metric at absolute zero over a window of at least seven days. Okay, so absolute zero over a week. Yeah, if you see that, you are looking at an idle endpoint. Wait, so if the model hasn't been touched at all for a week, why not just go into the console and delete it immediately to stop the bleeding? Well, you can.

The AWS documentation points out that deleting the endpoint stops the instance charge. Nice. And crucially, it keeps the model and the endpoint configuration intact, so it can be recreated later. Oh, that's great, so you don't lose the setup. Right, but hold on.

Before anyone goes in and just deletes these, I need to issue a hard technical warning. Okay. You should never call a resource provably or guaranteed unused. There is no preview that makes a delete risk-free. Wait, really?

Because something might still be depending on it. Precisely, if you delete it, anything that calls that endpoint name is going to fail until it is recreated. Oh, wow, like a scheduled script that only runs at the end of the month. Yeah, or a downstream rollback procedure, or even a hard-coded reference by ID hidden in some legacy code somewhere. You always have to verify those first.

That makes total sense. And you know, if you have an application that just has highly spiky or rare traffic, where you need the model occasionally but hate paying for the idle hours, you should really look into serverless or asynchronous inference. No, definitely. Those architectural alternatives avoid paying for idle hours entirely. For sure.

And if you want a fast way to automate finding these idle endpoints without digging through CloudWatch manually, there is a free, source-available scanner. Oh, cool. Yeah, you just run pip install cloudcostwise. It runs read-only on your own machine, flags this pattern, and sends nothing to CloudWise. That's super handy.

Definitely take a look at your own AWS environment today. But looking beyond just finding the waste, it really makes you wonder, as AI models get larger and require massive multi-GPU clusters just to sit in memory, will the financial penalty for all this idle time become the primary bottleneck for AI adoption in the enterprise? Yeah, it's a huge question. Something to think about next time you provision a model. Thanks for joining us on this deep dive.

Find this waste in your own account, read-only, on your own machine: pip install cloudcostwise