learn-ai-infra-with-phoebe / Practitioner session 7 of 10
Learn AI Infra with Phoebe · Practitioner track · Session 7 of 10

GPU hours, and the narrow waist

This is the most expensive layer in the stack and the one where the published numbers are least trustworthy. Tonight has two halves. First, GPU economics as arithmetic rather than narrative: five rate cards side by side, two denominator traps that will make you wrong by a factor of eight, and a licence that is charged per installed GPU whether you use it or not. Then the part that survives every vendor change - the model registry as the governance chokepoint, and why one deprecation in MLflow taught the whole industry something.

🟠 Practitioner track Platform · DE · architects Vendor-neutral · real rate cards 45 min
0-3 · Welcome 3-18 · GPU economics without the marketing 18-42 · The registry as narrow waist 42-45 · Q&A
Part 1 · covers AWS, Azure, CoreWeave, Lambda and RunPod rate cards, fetched 2026-08-07

GPU economics without the marketing 8 min live

Every price on this page was fetched on 2026-08-07 from first-party billing feeds, never from a comparison blog. That distinction is not pedantry - Part 1 ends with a 32% error in the most-linked aggregator in this category. Start with the raw list rate for one H100 SXM 80GB for one hour, across five providers.

the real discounters list-price incumbents US$ per GPU-hour H100 SXM 80GB on demand, list $2.69 $3.99 $6.155 $6.88 $12.29 RunPod Lambda CoreWeave AWS Azure SemiAnalysis composite index $2.82/GPU-hr CoreWeave is only 11% under AWS All rates fetched 2026-08-07 from first-party feeds · Azure H100 spot $2.27/GPU-hr.
🔍 Click to zoom - five list prices, and the line showing what the market actually pays
LiveCoreWeave is not cheap on list4 min▶

The neocloud narrative says specialist GPU providers undercut the hyperscalers by two to three times. Check it against the rate card, all fetched 2026-08-07:

ProviderH100 SXM 80GB, per GPU-hourVersus AWS
RunPod$2.692.56x cheaper
Lambda$3.991.72x cheaper
CoreWeave$6.15511% cheaper
AWS$6.88baseline
Azure$12.2979% more expensive

CoreWeave sits 11% below AWS, not 2-3x below. The real discounters on list are RunPod and Lambda. That does not make CoreWeave a bad buy - its value is in committed contracts and InfiniBand fabric, neither of which shows up in an on-demand rate. But if someone in your organization is proposing a neocloud on the grounds that it is dramatically cheaper, that claim does not survive the list price, and you should ask what the committed tiers actually are.

LiveTwo denominator traps that will make you wrong by 8x5 min▶

Both of these have put real numbers into real board decks. Neither is hidden - they are simply units nobody checks.

Trap 1 · CoreWeave publishes per-instance prices The number on the page is for the whole node, not for one GPU. Divide by 8 or be wrong by a factor of eight. And HGX shapes are sold as whole 8-GPU nodes only - there is no single-GPU SKU, so "we only need two GPUs" is not a purchasable configuration.
Trap 2 · Lambda's committed clusters are inverted A 16-GPU H100 cluster runs $6.16/GPU-hour against the 8x on-demand rate of $3.99 (both fetched 2026-08-07). That is 54% more for committing. Everywhere else in cloud, commitment buys a discount. Here it does not, because what you are buying is fabric and guaranteed capacity - the interconnect and the promise that the machines exist when you need them.

The general rule: before comparing any two GPU prices, write down the denominator of each one. Per GPU or per instance. Per hour or per month. With or without the interconnect. Two of the five providers above use a different denominator from the others, and nothing on their pages shouts about it.

LiveReserved, spot, and the price that is below the reserved price4 min▶

List price is the worst rate available. Two commitments change the picture entirely, both fetched 2026-08-07:

  • AWS 3-year All Upfront: $2.587/GPU-hour - 62% off on-demand. The 1-year All Upfront rate is $4.045/GPU-hour, 41% off.
  • Azure H100 spot: $2.27/GPU-hour - which is below AWS's three-year reserved rate, from the provider with the most expensive list price on the chart.

Sit with that second one. Azure is 79% more expensive than AWS on list and cheaper than a three-year AWS commitment on spot. For interruptible batch work - backfills, embedding regeneration, offline scoring - spot capacity inside a contract you already have is frequently the cheapest compute available to you, and it does not require leaving your security perimeter or signing anything new.

The practical shape of a compute plan is therefore three tiers, not one: reserved for the steady-state baseline, on-demand for interactive work that cannot be interrupted, and spot for everything restartable. Teams that pick one tier and apply it to all workloads overpay in one direction or lose jobs in the other.

LiveThese prices move violently, and lists overstate what the market pays4 min▶

Two facts that should change how long you let a GPU cost model stand without review.

  • AWS cut P5 pricing by 44%, effective 2025-06-01. Not a promotion - a rate-card change.
  • Azure's $98.32/hour for 8xH100 is exactly AWS's pre-cut price. Azure never matched the cut. The most expensive bar on the chart is not a premium product; it is a stale number that a competitor moved away from.

And the market clearing price is not the list price at all. The SemiAnalysis GPU Price Index composite puts H100 at $2.82/GPU-hour (April 2026), down 57% from $6.62 in the second half of 2023. That is the dashed line on the chart, and every list bar except RunPod's sits above it.

★ What to do with that gap Published list prices substantially overstate what the market actually pays. When a vendor quotes you list, you are being quoted the opening position. Bring the index to the conversation, review any GPU cost model at least every six months, and never let a number older than a quarter go into a business case without a re-fetch.
LiveData quality lesson: a 32% error in the most-linked aggregator3 min▶

The most-linked GPU pricing aggregator in this category labels AWS's 3-year no-upfront rate as "1-Year Reserved." AWS's actual 1-year rates are materially higher. The error is roughly 32%, and it sits on the single page most likely to be pasted into a planning document.

Nobody was being dishonest. Someone built a scraper, a label drifted, and thousands of people have since built cost models on top of it. That is how bad numbers propagate in this field: not through fabrication, but through a convenient intermediary that nobody re-checks against the source.

The rule that follows is short and worth writing on a wall: use first-party billing feeds. AWS Price List API, Azure Retail Prices API, the vendor's own published card. If a number in your business case came from an aggregator, it is unverified until you have fetched it yourself.

Self-studyThe licence charged per installed GPU, and the sizing rule5 min read▶

NVIDIA AI Enterprise is the one software rate card in this space published to the dollar. Prices from NVIDIA's own documentation page, updated 2026-06-08, re-checked 2026-08-07:

TermList per GPU
1 year$4,500
3 years$13,500
4 years$18,000
5 years$18,000 - five years for the price of four
Perpetual, including 5-year support$22,500
Cloud marketplace$1.00/GPU-hour, plus the cloud provider's instance cost

Two consequences worth more than the table itself.

  • The break-even is a utilization number. $1.00/GPU-hour is $8,760 per GPU-year at full use. Against the $4,500 self-managed annual price, the two cross at roughly 51% annual utilization. Below that, the hourly cloud entitlement wins. Above it, buy the term. Now ask what your actual GPU utilization is - most organizations do not know, which means most organizations cannot answer this question.
  • It is licensed per INSTALLED GPU, not per GPU used, with one licence per physical GPU on a multi-GPU card. An 8-GPU DGX B300 therefore carries $36,000 per year in software licensing before a single dollar of hardware. This is the line item first-pass budgets miss, and it does not scale down when the machines are idle.
The term price and the hourly price cross at about 51% utilization $8,760 $4,500 $0 0% 50% 100% annual utilization $1.00/GPU-hr cloud entitlement $4,500/GPU-yr self-managed term cross at ~51% utilization Licensed per INSTALLED GPU, not per GPU used - one licence per physical GPU. An 8-GPU DGX B300 carries $36,000 a year in licensing before any hardware cost. From NVIDIA's own documentation page, updated 2026-06-08, re-checked 2026-08-07. Five years costs $18,000 and four years also costs $18,000. Never buy the four-year term.
🔍 Click to zoom - you cannot answer this without knowing your real utilization

One more planning number, because it turns a vendor conversation into arithmetic. The storage sizing rule is approximately 12.5 Gb/s of storage bandwidth per GPU, and it is linear - 16 GPUs need around 200 Gb/s. When a vendor tells you their array is fast enough for your cluster, that claim is now checkable in one line of multiplication.

Part 2 · covers MLflow model registry documentation and Google's skew-versus-drift guidance

The model registry as the narrow waist ★ 12 min · everyone follows along

Prices go stale in months. This does not. The registry is the chokepoint of the MLOps layer, and the reason is structural rather than a feature of any particular product. Here is the definition to carry out of the room: a model registry is the versioned system of record between experimentation and production - the place where a trained artifact becomes a governed, addressable, promotable object.

Check the five properties against whatever you currently use. Named versioned artifacts - every model has an identity and a history, not a filename.

Mutable pointers for promotion - something can be marked as the one serving traffic, and that mark can move without moving the artifact.

Lineage to the training run and the training data - you can walk backwards from a prediction to the rows that produced the model.

Metadata and annotations - metrics, parameters, evaluation results, and whatever your reviewers need to make a decision.

Approval gates - a human step that produces a record, not a Slack message.

LiveWhy the registry, specifically, is the governance chokepoint4 min▶

Look at the shape of the traffic through it. Upstream is plural and messy - many experiments, many notebooks, many people, most of whose work will never ship. Downstream is singular and consequential - one artifact, serving real traffic, making real decisions about real people.

Anywhere a stack goes from plural to singular, you have a narrow waist. And the registry is the only point in the whole MLOps layer where all four governance questions can be answered at the same time:

  • What is in production right now?
  • Where did it come from?
  • Who approved it?
  • How do I undo it?

Ask those four questions of a training pipeline and you get two answers. Ask them of a serving endpoint and you get a different two. Only the registry holds all four.

★ The corollary, and it is the whole evaluation test A registry that developers can bypass - by deploying an artifact straight from object storage - provides zero governance, regardless of how good its UI is. Not weak governance. Zero, for exactly the population you were worried about, because the people who go around it are the people the controls existed for. When a vendor demos approval workflows, the only question that matters is what stops someone skipping the whole thing.
LiveMLflow deprecated Model Stages, and the reason is worth learning5 min▶

MLflow deprecated Model Stages as of version 2.9.0, in favour of aliases plus tags. This is not a cosmetic API change - it is a design correction that any registry you build or buy has to get right.

What was wrong with stages. A stage encoded the environment into the model object itself. So "Production" meant one thing in one cluster and something else in another, and the word travelled with the artifact into contexts where it was false. Worse, a model could occupy exactly one stage, so you could not have two candidates under evaluation at once - which is the normal state of a healthy team.

What aliases fix. An alias is a pointer, decoupled from the artifact:

models:/MyModel@champion     # the version serving traffic today
models:/MyModel@challenger   # the candidate under evaluation

# promotion  = reassign @champion to the challenger version
# rollback   = reassign @champion back to the previous version
# the artifacts never move, and never change

Three things fall out of that. @champion and @challenger coexist, so a real evaluation is expressible. The pointer belongs to the environment, not to the model, so the same artifact can be champion in one place and unused in another without lying about itself. And rollback becomes a pointer reassignment rather than a redeployment - seconds instead of a release cycle, at the moment you least want a release cycle.

Tags carry the rest: approval status, evaluation results, ticket references, whatever your reviewers need. The general principle transfers well beyond MLflow: never encode an environment into an artifact. Point at artifacts from environments instead.

LiveSkew versus drift - two words that save weeks4 min▶

Most monitoring tools give you one bucket called "drift," and most teams therefore respond to two completely different problems with the same reflex, which is to retrain. Google's split is better, and it is the most immediately useful thing in this section:

One question separates a bug you shipped from the world moving A model is underperforming Was it ever right in production? no yes Training-serving skew A bug you shipped: a preprocessing mismatch. Present on day one. Fix the code, not the model. Prediction drift The world changing under a model that is still correct. Retrain on recent data. Most tools give you one bucket called "drift", so teams answer both with a retrain. Eight weeks of retraining will not fix a feature scaled in training and not in serving.
🔍 Click to zoom - if it was never right, no amount of retraining will make it right
Training-serving skewPrediction drift
What it isA bug you shipped - a preprocessing mismatch between training and servingThe world changing underneath a model that is still correct
When it appearsPresent on day one, whether or not you noticeEmerges over time as behaviour or conditions shift
The fixFix the code. Retraining will not help and may hide itRetrain on recent data

Blurring these wastes weeks. The classic sequence: a model underperforms, the team retrains, it underperforms again, they retrain on more data, it underperforms again - and eight weeks later someone notices that a feature is scaled in the training pipeline and not in the serving path. Skew was present from the first deployment. No amount of retraining addresses a preprocessing mismatch.

The diagnostic is simple. Was it ever right in production? If performance was poor from day one, suspect skew and go read the serving code. If it was good and decayed, suspect drift and retrain.

Part 3 · covers AWS SageMaker documentation, Vertex AI, and the Kubeflow 2023 survey

Vendor risk, live 6 min live

Everything above assumes the components you designed around still exist. That assumption is weaker than it looks, and the evidence is in the vendors' own documentation - one sentence, published quietly, with no announcement attached.

Real world

Verbatim from AWS documentation: "Amazon SageMaker Model Monitor is no longer open to new customers."

Read what that sentence actually costs. Model Monitor is the governance-critical component of the service - the part that tells you whether the thing in production is still behaving. It was closed to new customers inside a flagship managed service, communicated through a docs banner rather than a deprecation notice, and anyone who designed a monitoring architecture around it in the preceding year is now rebuilding it.

Second example, same pattern, different shape: Vertex AI is now the "Gemini Enterprise Agent Platform." Renames are not deprecations, but they reorganize documentation, break links, shift feature boundaries and often mark a change in what a platform is for.

LiveThe habit to build: check the notices before you design3 min▶

Before you design around any managed feature, open its documentation page and look for exactly this class of sentence. It takes two minutes per component and it is the cheapest risk control in this entire course.

  • "No longer open to new customers" - the component is in maintenance. Existing customers are usually safe for a while; new architectures should not depend on it.
  • A rename or a repositioning - expect documentation churn and a possible change of strategic direction.
  • No release notes in eighteen months - not an announcement, but the same signal arriving silently.

Then weight the finding by where the component sits. A stalled visualization widget is an inconvenience. A stalled governance component is a compliance gap that appears at your next audit, not at your next sprint review. Governance components deserve the most scrutiny and usually get the least, because they are the boring part of the demo.

Self-studyKubeflow's honest cost, from its own survey4 min read▶

Kubeflow's own 2023 community survey - 90 responses, so directional rather than authoritative, and say so whenever you quote it - reports:

  • 49% in production. Roughly half of adopters had it running in production at the time.
  • Pipelines used by 90% of respondents, by a wide margin the most-used component.
  • Top gaps: documentation at 55% and installation at 39%.

The gap list is the interesting half. Documentation and installation are not model-quality problems or scale problems - they are platform operations problems, and they are exactly what you inherit when you adopt a Kubernetes-native MLOps stack.

The rule of thumb You need a platform team already running Kubernetes competently before Kubeflow is a net win. Adopting Kubeflow in order to acquire Kubernetes competence is backwards - you will spend your first two quarters on installation and documentation gaps instead of on models, and the survey's own top-gap list tells you so before you start.

There is a lighter path hiding in that 90% Pipelines number: most Kubeflow adoptions are, in practice, orchestration adoptions. If pipelines are what you actually want, ask whether you want them badly enough to run the cluster underneath them, or whether the orchestrator from b4 already covers the need.

Homework

Try it yourself - this week ◐ 30-40 min total

Source material

Official sources covered

First-party billing feeds and vendor documentation, every price carrying its fetch date, with sample sizes stated wherever a survey is quoted. This page covers:

✓AWS, Azure, CoreWeave, Lambda and RunPod GPU rate cards (fetched 2026-08-07)Part 1 · the five-provider table, both denominator traps, reserved and spot rates
✓NVIDIA AI Enterprise pricing page (updated 2026-06-08, re-checked 2026-08-07)Part 1 · per-installed-GPU licensing, the ~51% break-even, the storage sizing rule
✓MLflow model registry documentation - Model Stages deprecated as of 2.9.0Part 2 · aliases and tags, why environment must not be encoded into an artifact
✓AWS SageMaker documentation · Google Cloud Vertex AI documentationPart 3 · the Model Monitor closure notice, verbatim · the Vertex rename
◐Kubeflow community survey, 2023 (90 responses)Part 3 · 49% in production, Pipelines 90%, documentation and installation gaps
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · A colleague pastes CoreWeave's published H100 price into a cost model next to AWS's per-GPU rate. What is wrong?

Two denominator problems in one line. CoreWeave quotes whole nodes and sells HGX shapes as 8-GPU nodes only, so the raw figure is 8x the per-GPU rate. And once corrected, the neocloud discount narrative does not survive contact with the rate card - the real discounters on list are RunPod at $2.69 and Lambda at $3.99 (all fetched 2026-08-07).

2 · MLflow deprecated Model Stages in favour of aliases as of 2.9.0. What was the design flaw being corrected?

An alias is a pointer that belongs to the environment rather than to the artifact, so @champion and @challenger coexist, an evaluation is expressible, and rollback becomes a pointer reassignment instead of a redeployment. The transferable principle: never encode an environment into an artifact.

3 · A vendor demos a model registry with lineage, annotations and approval gates. What single question decides whether it governs anything?

The registry is the narrow waist between plural upstream experimentation and singular downstream serving, and it is the only place all four questions can be answered at once. But a waist only governs if it is the only door - and the people who route around it are precisely the population the controls existed for.

Practitioner session 7 cheat sheet · pin this

H100 list, per GPU-hourRunPod $2.69 · Lambda $3.99 · CoreWeave $6.155 · AWS $6.88 · Azure $12.29. All fetched 2026-08-07.
The neocloud correctionCoreWeave is 11% under AWS, not 2-3x. The real discounters on list are RunPod and Lambda.
Denominator trapsCoreWeave quotes per instance - divide by 8. Lambda's 16-GPU cluster at $6.16 is 54% MORE than 8x on-demand at $3.99.
Commitment and spotAWS 3yr All Upfront $2.587/GPU-hr, 62% off. Azure spot $2.27 is below that - use it for restartable batch.
List overstates the marketSemiAnalysis composite H100 $2.82/GPU-hr, down 57% from $6.62. AWS cut P5 44% on 2025-06-01; Azure never matched.
NVIDIA AI Enterprise$4,500/GPU/year vs $1/GPU-hour cloud, crossing at ~51% utilization. Per INSTALLED GPU - an 8-GPU DGX B300 is $36,000/year.
The registry corollaryUpstream plural, downstream singular. Bypassable by deploying from object storage means zero governance, whatever the UI shows.
Aliases, skew, drift@champion and @challenger beat stages. Skew is a bug present day one - fix the code. Drift is the world moving - retrain.