FinOpsForge — Independent cloud cost reviews. No vendor sponsorships. No paid rankings.

GPU Price Index Methodology: Sources, Normalization & Regions

// FinOps Data Asset — methodology(GPU Cloud Pricing) // July 2026 // independently researched
// Affiliate disclosure: FinOpsForge may earn a commission if you sign up via links on this page. This never affects the sourcing or figures documented here.
This page documents exactly how the GPU Cloud Price Index is built: which sources are used, how prices are normalized to a common unit, which region is used per provider, and what is deliberately left out. It follows the same disclosure-first approach as FinOpsForge's general tool review methodology, adapted for a pricing dataset instead of a scored review.

Sources Per Provider

Every price in the index traces to exactly one of the following official vendor sources — no third-party pricing aggregator, benchmark site, or reseller listing is ever used as a source of truth:

ProviderSourceFormat
Lambdalambda.ai/pricingStatic HTML price table
CoreWeavecoreweave.com/pricingStatic HTML price table (priced per 8-GPU instance; normalized by dividing by GPU count)
RunPodrunpod.io/pricingStatic HTML price table, Secure Cloud tier
GCPcloud.google.com — Accelerator-optimized VM pricingStatic HTML price table (on-demand, Spot, and 1yr/3yr Committed Use Discount columns)
AzureAzure Retail Prices APIUnauthenticated public JSON API, queried per armSkuName + armRegionName
Nebiusnebius.com/pricesStatic HTML price table, explicit "On-demand, GPU-hour" column (already per-GPU)
Crusoecrusoe.ai/cloud/pricingStatic HTML price table, explicit "$/GPU-hr" pricing (already per-GPU)
Together AItogether.ai/pricing — GPU ClustersStatic HTML price table, "per GPU per hour" (already per-GPU). Together AI also publishes a separate, higher-priced "Dedicated Inference" table for the same GPU names — this index sources only the GPU Clusters figures, never the Dedicated Inference ones, to avoid conflating the two products.
Verdaverda.com/pricingStatic HTML price table (USD view), already per-GPU. Verda is the current name of the company formerly known as DataCrunch; verda.ai is an unrelated company and is not a source for this index.
Vultrvultr.com/pricing (GH200 row cross-checked against the dedicated GH200 product page)Static HTML price table, "Cloud GPU" section, already per-GPU. One SKU on this page (HGX B200) is excluded from this index because its own page copy labels it a 36-month contract price rather than on-demand — see What's Excluded.
OVHcloudus.ovhcloud.com/public-cloud/pricesStatic HTML price table, "Cloud GPU" section, USD (US site), already per-GPU for the single-GPU SKU variants used in this index.
JarvisLabsjarvislabs.ai/pricingStatic HTML price table, per-minute billing shown as an hourly-equivalent "On-demand" rate, already per-GPU. One GPU on this page (RTX Pro 6000 Blackwell) is out of this index's GPU model scope — see What's Excluded.
AWSaws.amazon.com/ec2/capacityblocks/pricingStatic HTML price table — EC2 Capacity Blocks for ML reservation pricing only (6 SKUs); regular on-demand and Spot pricing still not sourced this edition, see What's Excluded

Every row in the underlying dataset carries its own source URL and a "checked" date recorded at build time — visible in the full pricing table on the index page itself, not just in this summary.

How Normalization Works

The index's unit is USD per GPU-hour. Two normalization cases apply:

  • Already per-GPU. Lambda's Instances price table, RunPod's Pods price table, and GCP's T4 GPU-attachment table all publish a single-GPU price directly (Lambda's table is explicitly labeled "Price/GPU/Hr"). These are used as-is.
  • Multi-GPU instance, divided by GPU count. CoreWeave's on-demand and spot prices are published per 8-GPU instance (except its 1-GPU GH200 SKU); GCP's a3-highgpu-8g, a2-highgpu-8g, and g2-standard-96 machine types price the whole VM; Azure's ND96isr_H100_v5 and ND96asr_v4 SKUs price the whole 8-GPU VM. In every one of these cases, the published on-demand, spot, and committed-use price is divided by the GPU count in that SKU to produce the normalized per-GPU rate shown in the index.

Committed-use pricing on Azure is published as a total contract price for the reservation term (for example, a specific dollar figure for "1 Year" or "3 Years"), not an hourly rate. To make it comparable, that total is divided by the number of hours in the term (8,760 hours for 1 year; 26,280 hours for 3 years) to produce an hourly-equivalent, then normalized per GPU the same way as on-demand.

Region Selection

Each provider uses one representative, explicitly named region or tier — chosen for consistency within that provider, not necessarily the cheapest region available:

ProviderRegion / scope usedWhy
AzureeastusStandard US primary region; matches the region used for the Azure H100 SKU cited in GPU Cost Optimization.
GCPus-central1 (Iowa)Default region shown on GCP's own accelerator-optimized pricing page.
CoreWeaveNorth AmericaCoreWeave's pricing page publishes separate North America and Europe tables; North America is used for consistency with the US-centric regions used elsewhere in the index.
LambdaSingle global price listLambda's Instances pricing page does not expose a region selector — one price list applies.
RunPodSecure Cloud tierRunPod's Pods pricing table is not region-differentiated on the public pricing page; Secure Cloud (rather than Community Cloud) is used per FOF-003's build scope.
NebiusGlobal (single price list)Nebius's GPU instance pricing table has no region column or region selector — one price list applies globally.
CrusoeGlobal (single price list)Crusoe's GPU instances pricing table has no region column or region selector — one price list applies globally.
Together AIGlobal (single price list)Together AI's GPU Clusters pricing table has no region column or region selector — one price list applies globally.
VerdaNot region-differentiatedVerda's pricing page publishes one USD/EUR price table with no region field, despite the company being EU-headquartered.
VultrGlobal (single price list)Vultr's Cloud GPU pricing table has no region column or region selector — one price list applies globally.
OVHcloudUS (single list across listed US regions)OVHcloud's public-cloud pricing page lists many named US data centers (Boston, Hillsboro, Phoenix, and others) as region tabs, but the Cloud GPU prices shown do not vary between them.
JarvisLabsGlobal (India & EU regions, single price list)JarvisLabs advertises live capacity across India and EU regions but publishes one price list with no region-specific pricing.

Because each provider uses a single fixed region, cross-provider comparisons in this index are not adjusted for regional price variation within a given provider — a GPU model may be cheaper or more expensive in a different region of the same cloud.

One representative, named region/scope per provider for on-demand pricing, with two documented exceptions: Lambda = single global on-demand price list (no region selector on the pricing page); CoreWeave = North America; RunPod = Secure Cloud tier (pricing page is not region-differentiated); GCP = us-central1 (Iowa), the default region shown on the accelerator-optimized pricing page; Azure = eastus for the H100 and A100 rows; Nebius, Crusoe, and Together AI = each provider's on-demand GPU pricing page carries no region selector or region column at all (single global price, same pattern as Lambda) as of the 2026-07-21 addition; Verda = pricing page is not region-differentiated (company is EU-headquartered but does not publish a region field on the pricing table); Vultr = no region selector on the Cloud GPU pricing page (single global on-demand price list, same pattern as Lambda/Nebius/Crusoe/Together AI), as of the 2026-07-22 addition; OVHcloud = single US price list shown across all listed US regions (Boston, Hillsboro, Phoenix, Saint-Louis, Salt Lake City, Vint Hill, Atlanta, Chicago, Dallas, Denver, Los Angeles, Miami, New York, Palo Alto, Seattle) on us.ovhcloud.com, no per-region price differentiation shown on the public pricing page; JarvisLabs = single price list spanning India and EU regions, no region selector on the pricing page. Exception 1: Azure's MI300X row uses canadacentral instead of eastus, because the MI300X SKU is not offered in eastus (zero items returned from the Azure Retail Prices API) -- canadacentral is MI300X's primary GA region on Azure. Exception 2: AWS EC2 Capacity Blocks pricing is not region-uniform on the vendor's own pricing page (prices differ by instance family and region), so each AWS row states its own region individually rather than sharing one representative region across all AWS rows -- US East (N. Virginia) is used wherever the vendor page offers it, falling back to US East (Ohio) for the one SKU (p5e.48xlarge) where N. Virginia is not listed. See the methodology page for full detail.

What's Excluded

Three categories are deliberately left out of the index, each for a documented reason:

  • AWS — Capacity Blocks in, on-demand/Spot still out. This edition adds 6 AWS EC2 Capacity Blocks for ML reservation pricing rows (checked 2026-07-20) — a distinct, separately-published, static-HTML price list. Regular AWS EC2 on-demand and Spot pricing remains excluded: AWS's standard EC2 on-demand and Spot pricing pages (aws.amazon.com/ec2/pricing) remain JavaScript-rendered and return no usable price data to a static content fetch; the unauthenticated bulk pricing offer file (pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/...) is gigabyte-scale and not retrievable in a single web_fetch call; a smaller AWS-hosted metered-unit-maps endpoint was tested directly and confirmed to contain only instance attribute metadata and internal rateCode identifiers, not actual prices.
  • AWS G6/G5 instance families (all pricing modes). G6 and G5 (L4- and A10G-based) instance families are not part of the EC2 Capacity Blocks for ML program -- the live Capacity Blocks pricing page (aws.amazon.com/ec2/capacityblocks/pricing/, fetched 2026-07-20) only lists P5/P5e/P5en/P4d/P4de, the P6 family (P6e/P6-B300/P6-B200), and Trn1/Trn2. No other live, official, unauthenticated AWS source for G6/G5 pricing was found this session, so they remain fail-closed dropped in their entirety.
  • Scaleway. Scaleway was evaluated for this edition (2026-07-21) but dropped entirely, for two independent reasons. First, Scaleway's GPU pricing page is EUR-denominated only, with no USD price list published, and this index has no established EUR→USD conversion policy — inventing a conversion rate would be a fabricated figure. Second, the specific EUR per-GPU-hour figures for Scaleway's H100 and B300 instances could not be reproduced from Scaleway's own live pricing page in a static fetch: the default zone (PAR-1) shows those rows as "Not available in this zone," requiring a browser-rendered, JS-driven switch to zone PAR-2 that this index's sourcing method cannot trigger. Scaleway remains a candidate for a future refresh, pending both a documented currency-conversion policy and a browser-based re-verification with the zone explicitly set to PAR-2.
  • Vast.ai and other GPU marketplaces. Vast.ai is a peer-to-peer GPU rental marketplace: prices vary by individual listing and host, not by a single vendor-published rate, so there is no stable number to normalize. It is intentionally excluded from the index and is only referenced qualitatively elsewhere on FinOpsForge as "marketplace, pricing varies."
  • Negotiated / enterprise pricing. Every price in this index is public list pricing. Enterprise agreements, private pricing, and volume discounts negotiated directly with a vendor are not reflected and are typically lower than the list prices shown here.
  • Vultr HGX B200 (added 2026-07-22). Vultr's own Cloud GPU pricing page states, for this SKU only, that the table price "reflect[s] 36-month contract pricing" — contradicting the page's own top-level claim that "Pricing shown is on-demand and billed hourly." Every other Vultr GPU on the same page (AMD MI355X, MI325X, MI300X; NVIDIA HGX H100, GH200) is included, since each of those is described as an on-demand or on-demand/preemptible rate. HGX B200 is fail-closed dropped rather than assumed on-demand; a genuine on-demand figure would need direct confirmation from Vultr.
  • RTX Pro 6000 / RTX 6000 Ada / RTX A6000 (JarvisLabs, Verda; added 2026-07-22). These workstation-lineage GPUs are outside this index's GPU model set (H100/H200/A100/L40S/L4/T4/MI300X/B200/B300/GB300/GH200/V100 and the AMD MI355X/MI325X and V100S/A30 variants added this edition) — the same reasoning already applied to CoreWeave's and Nebius's RTX Pro 6000 rows. Each has a real, published on-demand price; they are out-of-scope exclusions, not fail-closed sourcing drops.

Individual SKUs are also dropped on a case-by-case fail-closed basis when a specific price cannot be live-verified — for example, a GPU model advertised in vendor marketing copy but not present on the current live pricing page, or a SKU not offered in the provider's chosen representative region. Each such drop is documented in the underlying dataset rather than silently omitted. Rack-scale GB200/GB300 NVL72 SKUs (CoreWeave, Nebius, Crusoe, Together AI) are excluded on the same non-standard-GPU-accounting or no-public-price basis described above — except Verda's GB300, which is added: Verda prices it as an explicit single-GPU instance ("1x GB300 SXM6 288GB") with an unambiguous per-GPU rate, not a rack-scale unit, so the usual GB-series exclusion does not apply to it. Verda's separately-marketed rack-scale "GB300 NVL72" product (distinct from that single-GPU row) carries no per-unit price on the pricing page and is neither added nor formally dropped this edition — there is simply nothing to price.

Refresh Cadence

The index is intended to be refreshed on a monthly cadence: the same data collection and generator process is re-run against each provider's live pricing source, replacing the dataset and regenerating both this page and the index page. The "Last updated" date on the index page always reflects the most recent refresh. Because GCP notes that its own Spot prices can change up to once every 30 days, a monthly refresh keeps the index within one pricing cycle of current for the most volatile purchasing mode covered.

// FAQ

Why isn't negotiated or enterprise pricing included?
Negotiated pricing is private by nature and not publicly verifiable — including it would break this index's core rule that every figure must trace to a live, checkable source. List pricing is the only pricing every reader can independently confirm.
Will full AWS on-demand/Spot pricing be added?
AWS EC2 Capacity Blocks for ML reservation pricing (6 SKUs, checked 2026-07-20) is already included as of this edition — see What's Excluded above. Regular AWS EC2 on-demand and Spot pricing is not yet included: if a reliably fetchable, official source becomes available — for example, a region- and instance-family-filtered slice of the bulk offer file that stays under a practical fetch size, or a future AWS-published API — those rows will be added on a future refresh. Until then, on-demand/Spot AWS pricing is omitted rather than sourced from a third party.
How is a multi-GPU instance price turned into a per-GPU price?
The provider's published price for the whole instance (on-demand, spot, or committed-use) is divided by the number of GPUs in that specific SKU. See How Normalization Works above for the exact provider-by-provider breakdown.

See the Current Prices

The full normalized GPU pricing table, updated monthly.

View the GPU Cloud Price Index →

// Related