Calculations
Every published figure comes out of the steps below. The numbers in the examples are real published prices, so each one can be checked against the provider.
GPU-hour normalization
No provider publishes a price for one GPU for one hour. The general form is the complete machine price divided by the number of GPUs in that machine.
GPU-hour = complete machine price per hour ÷ GPUs in the machine
AWS and Azure: divide the VM price
Both price the whole instance, so the division is direct. The GPU count comes from the AWS price file for AWS, and from the Microsoft size-series documentation for Azure.
AWS p5.48xlarge, us-east-1 $55.0400 per hour ÷ 8 GPUs = $6.8800 per GPU-hour Azure Standard_ND96is_H100_v5, eastus $88.4880 per hour ÷ 8 GPUs = $11.0610 per GPU-hour
Google Cloud: rebuild the machine, then divide
Google bills the accelerator, the vCPU and the memory as three separate SKUs. The accelerator price alone is not the price of renting the machine, and using it directly would compare a bare GPU against two complete machines. So the machine is rebuilt from its components first.
Google Cloud a3-highgpu-8g, us-central1
8 GPUs × $9.796600 per GPU-hour = $78.372800
208 vCPU × $0.025498 per vCPU-hour = $5.303584
1872 GB × $0.002220 per GB-hour = $4.155840
-----------
complete machine price = $87.832224 per hour
÷ 8 GPUs = $10.979028 per GPU-hourThe A4 family, which carries B200, is the exception. Google publishes a bundled per-GPU slice price for A4 and no A4 Core or Ram SKU exists, so the slice price is already a complete per-GPU figure and is used as published. Every stored observation records which method produced it and keeps the component values.
Google Cloud figures exclude the local SSD attached to A2 and A3 machines, which is billed separately, while AWS and Azure bundle local NVMe into the instance price. That gap is around one percent of the node price and is stated rather than silently absorbed.
Regions, variants and eligibility
An offering enters the benchmark only if all of the following hold.
- It is the canonical variant for that GPU, not a different memory size or form factor.
- It is a 8-GPU node, so every provider is measured on the same shape.
- It is Linux, on-demand, shared tenancy, with no licence and no pre-installed software.
- Its GPU count is confirmed against provider documentation.
Where a provider lists several equivalent nodes in one region, for instance an Azure host with and without InfiniBand, the regional price is the lowest of them: that is what renting the GPU there actually costs.
regional price(provider, region) = min( eligible per-GPU prices in that region )
The reference price
Two medians, in this order. Balancing at the provider level is what stops the provider with the most published regions from dominating the result.
for each provider: provider median = median( its regional prices ) reference = median( available provider medians ) regional range = min(all regional prices) .. max(all regional prices)
A worked month, H100 in August 2026:
AWS median of 13 regional prices = $8.6000 Google Cloud median of 41 regional prices = $13.1870 Azure median of 25 regional prices = $14.3793 reference = median($8.6000, $13.1870, $14.3793) = $13.1870 range = $6.8800 (aws us-east-1) .. $23.3260 (azure southafricawest)
With two providers the median is their average. With one it is that provider's own median, and the provider count shown next to the figure says so.
GPU-month equivalent
A presentation of the same number, not a separate measurement.
GPU-month = GPU-hour × 730 $3.20 per GPU-hour → $2,336 per GPU-month $13.19 per GPU-hour → $9,627 per GPU-month
Period change
A change is only quoted when both endpoints measure the same thing. GPUQuant rebuilds both from the providers present in both months and reports that basis.
common = providers present in both months if common is empty → unavailable, with a reason value(month) = median( provider medians restricted to common ) change = (value(to) − value(from)) ÷ value(from) × 100
This is why a twelve-month change can read N/A on a series whose price is plainly visible. The chart shows the headline reference; the change is declining to compare a two-provider month against a three-provider month.
Step series
A list price holds until it is republished, so a month with no publication carries the previous value forward and is marked as held rather than observed. Months before a series begins are absent, not zero, and a series that has stopped being published is not held forward indefinitely.
Jan $12.29 observed Feb $12.29 held Mar $12.29 held Apr $10.81 observed ← the provider republished May $10.81 held
The complete definition, including known limitations, is on the methodology page.