Type something to search...
When Is Self-Hosting an LLM Cheaper Than Bedrock?

When Is Self-Hosting an LLM Cheaper Than Bedrock?

Two questions send teams down this path: “our Bedrock bill is growing, should we run this on our own GPU?” and “we fine-tuned a Llama, where does it go?” For most teams the answer to both is no, and the reason is not token price. A GPU instance bills 24 hours a day whether or not anyone calls it. Your traffic does not work that way. The decision is about duty cycle, not volume — and there is a third option between the two that most comparisons skip entirely.

You Are Comparing Billing Shapes, Not Prices

The three options bill on fundamentally different axes, which is why comparing headline rates gets people to the wrong answer.

OptionBilled onCost when idle
Bedrock on-demandTokens processedNothing
Bedrock Custom Model ImportActive model-copy minutes, in 5-minute blocksNothing, after 5 minutes idle
Self-hosted on EC2Instance-hoursFull rate, always

Only the third one charges you for the hours nobody is using it. That single asymmetry decides most real cases before token rates enter the picture.

The Option Most Comparisons Skip

If you have fine-tuned an open-weights model, the common assumption is that self-hosting is your only route. It is not.

Amazon Bedrock Custom Model Import takes your own fine-tuned weights and serves them through Bedrock’s managed, serverless On-Demand mode. Supported architectures include Meta Llama (2, 3, 3.1, 3.2), Mistral 7B, Mixtral 8x7B, Flan, and IBM Granite. You import from S3 or by referencing a SageMaker model ARN.

How it bills:

  • Import is free. You pay for inference, based on the number of active model copies and how long they stay active.
  • Billing runs in 5-minute increments, starting from the first successful invocation of each model copy.
  • Capacity is measured in Custom Model Units (CMUs), determined by architecture, parameter count and context length. AWS’s published examples: Llama 3.1 8B at 128K is 2 CMUs; Llama 3.1 70B at 128K is 8 CMUs.
  • With no invocations for 5 minutes, it scales to zero, and back up on demand — with a cold start of tens of seconds. It maintains zero to three copies by default, adjustable through Service Quotas.
  • A monthly storage fee per CMU applies on top.

The constraints matter as much as the capability. Weights must be in Safetensors format at FP32, FP16 or BF16 — no 4-bit quantized weights. LoRA-style adapters must be merged into the base model before import. It is available in us-east-1, us-east-2, us-west-2 and eu-central-1, and it does not work with batch inference or CloudFormation.

That precision requirement is worth pausing on, because it exposes a flaw in most self-hosting cost comparisons — see below.

The Formula

Skip the token arithmetic. The question is what fraction of the time your model is actually serving.

Define duty cycle as the share of billed time your model spends active. Then:

Effective hourly cost, self-hosted = instance_hourly_rate ÷ duty_cycle
Effective hourly cost, per-use     = per_active_hour_rate  (idle is free)

Self-hosting wins when:

duty_cycle > instance_hourly_rate ÷ per_active_hour_rate

That is the whole decision. A GPU at $1/hour running at 25% duty cycle costs $4 for every productive hour, and that is the number to compare — not the sticker rate.

Working it through

Take AWS’s own published example: a fine-tuned Llama 3.1-type 8B model at 128K sequence length in us-east-1 needs 2 CMUs, priced at $0.1570 per minute, with $3.90 per month of storage.

That is $9.42 per active hour — far more than any single-GPU instance costs per hour. Read in isolation it looks like a bad deal.

Now apply the formula. Against an illustrative $1/hour GPU instance:

break-even duty cycle = 1.00 ÷ 9.42 = ~11%

Below roughly 11% duty cycle, Custom Model Import is cheaper. Above it, the dedicated instance is. For an internal tool used during business hours, or anything bursty, you are well under that line. For a customer-facing feature under steady load, you are well over it.

Substitute your own instance rate and current CMU pricing — the shape of the answer holds even as the numbers move, which is the point of using the formula rather than memorising a threshold.

The 5-minute trap

Duty cycle here is not measured in seconds of GPU time. Billing starts at the first invocation and runs in 5-minute blocks, and the scale-to-zero timer needs 5 minutes of complete silence.

So a workload receiving one request every four minutes never scales to zero. It has a duty cycle near 100% while doing almost no work. Ten requests spread across an hour can bill the same as continuous load.

Request spacing, not request count, drives the bill. Batching sporadic traffic into deliberate bursts is the single highest-leverage optimisation on this path, and it is invisible if you reason in tokens per month.

Where Model Size Changes the Answer

A common claim is that self-hosting economics improve with model size, because managed inference charges a premium that scales with model tier while hardware does not.

On the Custom Model Import path, it goes the other way. CMUs scale sub-linearly with parameters: 8B at 128K is 2 CMUs, 70B at 128K is 8 CMUs — 4× the units for 8.75× the parameters. Meanwhile the GPU capacity you need to serve a 70B model grows faster than 4× relative to an 8B, once you account for VRAM headroom for the KV cache.

The practical implication reverses the usual advice: the larger your fine-tuned model, the better Custom Model Import looks against a dedicated instance, not worse. Note that CMU counts also scale with context length, so a long-context configuration costs more units than the same parameter count at a shorter window.

The Comparison Almost Everyone Gets Wrong

Self-hosting cost estimates are usually built on 4-bit quantized weights, because that is how you fit a 70B model onto affordable hardware. The managed alternative is then priced at full precision.

Those are not the same product. A 4-bit quantized model produces measurably different output from the FP16 original, and a cost comparison that ignores this is pricing two different things against each other.

Custom Model Import accepting only FP32, FP16 and BF16 is AWS treating that gap as material. If your self-hosted plan depends on 4-bit quantization to make the arithmetic work, the honest comparison is: cheaper inference and a different model. That may well be an acceptable trade — but decide it deliberately, and evaluate quality before committing, not after.

What the Formula Leaves Out

Duty cycle decides the compute line. Three things sit outside it and regularly outweigh it for small teams.

Someone has to run it. Configuring the inference server, handling spot interruptions, monitoring GPU memory, and updating model versions is ongoing work, not a one-off setup. It does not appear on the bill, which is precisely why it gets left out of the comparison.

Spot changes the arithmetic and adds a failure mode. Spot capacity moves the break-even duty cycle sharply in favour of self-hosting, and brings two-minute reclamation notices with it. You need a fallback — a second capacity pool, an on-demand fallback, or request queuing — and that fallback is infrastructure you also own.

Scale-to-zero has a cold start. Custom Model Import takes tens of seconds to wake. If a real user waits on that first request, it is a product decision, not just a cost one. Keeping a copy warm removes the wait and removes the savings.

Choosing

Bedrock on-demand — you are using a base model as published, or you are early enough that traffic is unpredictable. No floor, no infrastructure. This is the default and most teams should stop here.

Custom Model Import — you have fine-tuned open weights on a supported architecture, in a supported Region, and your duty cycle is low. Bursty internal tools, business-hours workloads, anything spiky. Cold start must be acceptable, and you cannot need batch inference.

Self-host on EC2 — your duty cycle is genuinely high and sustained, or you need something the managed paths cannot serve: an unsupported architecture, quantization Bedrock will not accept, or a hard requirement that inputs never leave your own compute. You also need the team to absorb the operational load.

If you are landing on self-hosting mainly because you have fine-tuned a model, check Custom Model Import first. That was the strongest argument for running your own GPU, and it stopped being one.

Summary

  • A GPU bills 24/7; the managed paths bill only while working. That asymmetry, not token price, drives the decision.
  • Compute the duty cycle break-even: instance_hourly ÷ per_active_hour. Below it, per-use wins; above it, the instance does.
  • Custom Model Import serves your own fine-tuned weights serverlessly and scales to zero after 5 minutes idle. Free to import; billed per active model-copy minute.
  • Billing granularity is 5 minutes. One request every four minutes bills like continuous load. Batch sporadic traffic into bursts.
  • CMUs scale sub-linearly with size — 2 for 8B/128K, 8 for 70B/128K — so bigger fine-tuned models favour Custom Model Import, not self-hosting.
  • 4-bit self-hosted versus FP16 managed is not like-for-like. Custom Model Import accepts FP32/FP16/BF16 only.
  • Constraints to check first: Safetensors, merged LoRA adapters, four Regions, and no batch inference.

Pricing, CMU values and Region availability change. Verify against the Amazon Bedrock pricing page and the Custom Model Import documentation before committing — the formula is the durable part, not the numbers.

Want this math run against your actual traffic?

Book a 30-minute call with Pratik — no pitch deck, no pressure, just your real token volume and traffic shape against the three options.

Book an intro call

Related Posts

What an AI Agent Costs Per Conversation on AgentCore

What an AI Agent Costs Per Conversation on AgentCore

You can read AgentCore's per-service rates straight off the AWS pricing page. What that page can't tell you — and what you actually need before you build a business on agents — is what one of your u

Read more
Bedrock Agents vs AgentCore: What to Use Now

Bedrock Agents vs AgentCore: What to Use Now

Updated 2 September 2026: Amazon Bedrock Agents Classic moved to maintenance mode in June 2026. This post has been rewritten around the options that are actually available now. **Amazon Bedrock Age

Read more
Connect Claude Code to Live AWS Tools with the Agent Toolkit

Connect Claude Code to Live AWS Tools with the Agent Toolkit

AI coding agents are getting remarkably capable — but they have a blind spot. The models powering them were trained on data that's months or years old. When you ask your agent about Amazon S3 Tables,

Read more
Why Your AWS Bedrock Bill Makes No Sense (And How to Fix It)

Why Your AWS Bedrock Bill Makes No Sense (And How to Fix It)

When a startup says "our AWS bill is too high," the conversation almost always starts at the aggregate level — total monthly spend, a few large services, maybe a spike someone noticed. That's not wher

Read more
AWS Bedrock Cost Structure: What You're Actually Paying For

AWS Bedrock Cost Structure: What You're Actually Paying For

AWS Bedrock looks simple from the outside — call an API, get a response, pay per token. The reality is that a production Bedrock setup has several distinct cost layers, and they behave very differentl

Read more
AWS Bedrock vs SageMaker: How to Pick the Right One

AWS Bedrock vs SageMaker: How to Pick the Right One

If you're building an AI product on AWS, you'll hit this question early: Bedrock or SageMaker? The short answer is that they solve different problems, and most startups only need one. What Each Se

Read more
Stretch Your Claude Code Budget with Bedrock Prompt Caching

Stretch Your Claude Code Budget with Bedrock Prompt Caching

Anthropic recently tightened usage limits on Claude Code — and if you're doing serious development work, you feel it. Long refactoring sessions, codebase-wide architecture questions, iterative debuggi

Read more
Deploying Engineering Resource Management Knowledge Graph on AWS

Deploying Engineering Resource Management Knowledge Graph on AWS

Resource planning in engineering orgs is a multi-hop problem. The data is there — skills, project history, availability — it's just stored in flat tables that you need to join on demand. This post wal

Read more
LLM Inference on AWS: Every Option Explained

LLM Inference on AWS: Every Option Explained

AWS gives you two fundamentally different ways to run an LLM -SageMaker, you provision and pay for the infrastructure that serves the model. Bedrock, AWS already runs the model, and you just call

Read more
Model Evals: How to Know If You Can Use a Cheaper Model

Model Evals: How to Know If You Can Use a Cheaper Model

An eval, in the AI FinOps context, is a structured comparison: run a representative sample of real production inputs through your current model and a cheaper candidate, score both against a defined qu

Read more
How to Build RAG on Your S3 Documents with Bedrock

How to Build RAG on Your S3 Documents with Bedrock

If your documents already sit in Amazon S3 and you want to ask questions of them, the shortest path on AWS is Amazon Bedrock Managed Knowledge Base: point it at the bucket, and it handles parsing,

Read more
S3 Vectors vs OpenSearch Serverless for RAG on AWS

S3 Vectors vs OpenSearch Serverless for RAG on AWS

This is a choice you only face on the customer-managed path — if you have not ruled out the fully managed option yet, [building RAG on your S3 documents with Bedrock](/blog/rag-on-s3-documents-with-be

Read more
What Is AI FinOps?

What Is AI FinOps?

AI FinOps is the practice of making AI workload costs visible, attributable, and optimizable — applied to the specific economics of model inference, where the unit of cost is the token, not the instan

Read more
What Is Amazon Bedrock AgentCore? (And When to Use It)

What Is Amazon Bedrock AgentCore? (And When to Use It)

Amazon Bedrock AgentCore is a managed platform for deploying and operating AI agents you've already built — in any framework, with any model — without managing the runtime, memory, identity, or observ

Read more
Cheaper Alternatives to AWS in 2026: What Each One Cuts

Cheaper Alternatives to AWS in 2026: What Each One Cuts

There is no single cheapest alternative to AWS, because AWS bills are not shaped the same way. A bill dominated by EC2 has a different answer from one dominated by egress, RDS or GPU-hours. And severa

Read more
Hetzner vs AWS: The Real Cost Difference in 2026

Hetzner vs AWS: The Real Cost Difference in 2026

For a standing 8-vCPU, 16 GB server, AWS charges about $212 per month on demand and Hetzner charges €20.99, or roughly $25. That is a factor of nine, and it is not a rounding error. The gap is also no

Read more