Skip to main content

OwnVsRentScenario

Economics scenarios · Implementation: mlsysim/engine/scenario_definitions/economics.py.

Construct this scenario with keyword inputs. The fields below show the types and defaults declared by this class.

Owning gpus accelerators against renting them at rent_rate per GPU-hour for utilization of every hour, over years.

Owning pays the nodes, network, and facility up front, then a running cost per year: a fixed opex_per_year and staffing_per_year, plus electricity for power at pue and electricity_price. Electricity is charged every hour unless energy_scales_with_use, when it is drawn only while busy. A year is 8,760 hours and a month one twelfth of it, the book’s convention.

Notes

Equation: Ownership is upfront + years*annual_operation; rental is gpus*rate*annual_hours*utilization*years.

Assumptions: Constant prices, annual duration convention, divisible node sizing, and the declared utilization/power policy.

Excludes: Discounting, financing, residual resale value, price escalation, and utilization uncertainty.

References

Derivation: Initial purchases are paid once, whereas operating and rental charges repeat over the ownership horizon. Separating fixed annual costs from utilization-dependent electricity makes the break-even utilization algebra explicit; mlsysim.physics.economics.calc_ownership_breakeven_utilization and calc_rent_crossover perform the corresponding inversions.

Examples

>>> from mlsysim import Scenarios
>>> s = Scenarios.OwnVsRentH100Cluster1K
>>> s.owned_total.to("USD").magnitude > 0
True

Attributes

Name Description
breakeven_utilization Continuous utilization where lifetime rental and ownership costs agree.
crossover_months Months until cumulative rent overtakes owning; None if it never does.
electricity_per_year_full Electricity for one year of full use (PUE included).
electricity_price
energy_scales_with_use
facility_capex
fixed_cost_per_year Annual USD cost independent of utilization, including always-on electricity when configured.
gpus
gpus_per_node
hardware_capex Accelerator-node purchase cost in USD, excluding network and facility capital.
hours_per_year Annual hours from the package’s explicit year-duration convention.
lifetime_hours Total hours in the ownership horizon.
network_capex
node_price
nodes Whole-node count by integer division; the configured GPU count should be divisible by GPUs per node.
opex_per_year
owned_cost_per_month Monthly operating budget in USD, one twelfth of the annual total; capital excluded.
owned_cost_per_year Running cost of owning per year at this utilization.
owned_cost_per_year_amortized Up-front cost spread evenly over the years, plus the running cost.
owned_total Lifetime USD ownership cost: initial capital plus annual operation for the horizon.
power
pue
rent_lifetime_full Rent for every hour of the whole life.
rent_per_month Monthly rental budget in USD, one twelfth of the annual total.
rent_per_year Annual USD rental cost at the supplied utilization.
rent_per_year_full Annual USD rental cost if all configured GPUs are rented for every annual hour.
rent_rate
rented_total Lifetime USD rental cost over the same horizon and utilization.
savings Lifetime USD rent minus ownership cost; negative means renting costs less.
staffing_per_year
upfront Total initial node, network, and facility capital outlay in USD.
use_cost_per_year_full Annual USD electricity component that scales with utilization, or zero for always-on power.
utilization
years

gpus

Type: int.

Declared default: required.

gpus_per_node

Type: int.

Declared default: required.

node_price

Type: Quantity.

Declared default: required.

rent_rate

Type: Quantity.

Declared default: required.

utilization

Type: float.

Declared default: required.

years

Type: int.

Declared default: required.

network_capex

Type: Quantity.

Declared default: Q_(0, 'USD').

facility_capex

Type: Quantity.

Declared default: Q_(0, 'USD').

opex_per_year

Type: Quantity.

Declared default: Q_(0, 'USD').

staffing_per_year

Type: Quantity.

Declared default: Q_(0, 'USD').

power

Type: Optional[Quantity].

Declared default: None.

pue

Type: float.

Declared default: 1.0.

electricity_price

Type: Optional[Quantity].

Declared default: None.

energy_scales_with_use

Type: bool.

Declared default: False.

hours_per_year

engine.scenario_types.OwnVsRentScenario.hours_per_year

Annual hours from the package’s explicit year-duration convention.

Equation: Q_(HOURS_PER_YEAR, 'hour').

nodes

engine.scenario_types.OwnVsRentScenario.nodes

Whole-node count by integer division; the configured GPU count should be divisible by GPUs per node.

Equation: gpus // gpus_per_node.

hardware_capex

engine.scenario_types.OwnVsRentScenario.hardware_capex

Accelerator-node purchase cost in USD, excluding network and facility capital.

Equation: (nodes * node_price).to('USD').

upfront

engine.scenario_types.OwnVsRentScenario.upfront

Total initial node, network, and facility capital outlay in USD.

Equation: (hardware_capex + network_capex + facility_capex).to('USD').

electricity_per_year_full

engine.scenario_types.OwnVsRentScenario.electricity_per_year_full

Electricity for one year of full use (PUE included).

Equation: Full-use electricity cost = power * annual_hours * PUE * electricity_price; absent power gives zero USD.

fixed_cost_per_year

engine.scenario_types.OwnVsRentScenario.fixed_cost_per_year

Annual USD cost independent of utilization, including always-on electricity when configured.

Equation: Fixed annual cost = opex + staffing, plus full electricity cost when energy does not scale with use.

use_cost_per_year_full

engine.scenario_types.OwnVsRentScenario.use_cost_per_year_full

Annual USD electricity component that scales with utilization, or zero for always-on power.

Equation: electricity_per_year_full if energy_scales_with_use else Q_(0, 'USD').

owned_cost_per_year

engine.scenario_types.OwnVsRentScenario.owned_cost_per_year

Running cost of owning per year at this utilization.

Equation: (fixed_cost_per_year + utilization * use_cost_per_year_full).to('USD').

owned_cost_per_year_amortized

engine.scenario_types.OwnVsRentScenario.owned_cost_per_year_amortized

Up-front cost spread evenly over the years, plus the running cost.

Equation: (upfront / years + owned_cost_per_year).to('USD').

rent_per_year_full

engine.scenario_types.OwnVsRentScenario.rent_per_year_full

Annual USD rental cost if all configured GPUs are rented for every annual hour.

Equation: (gpus * rent_rate * hours_per_year).to('USD').

rent_per_year

engine.scenario_types.OwnVsRentScenario.rent_per_year

Annual USD rental cost at the supplied utilization.

Equation: (rent_per_year_full * utilization).to('USD').

rent_per_month

engine.scenario_types.OwnVsRentScenario.rent_per_month

Monthly rental budget in USD, one twelfth of the annual total.

Equation: rent_per_year / 12.

owned_cost_per_month

engine.scenario_types.OwnVsRentScenario.owned_cost_per_month

Monthly operating budget in USD, one twelfth of the annual total; capital excluded.

Equation: owned_cost_per_year / 12.

crossover_months

engine.scenario_types.OwnVsRentScenario.crossover_months

Months until cumulative rent overtakes owning; None if it never does.

Equation: Delegates repayment time to mlsysim.physics.economics.calc_rent_crossover; returns None if no positive monthly saving exists.

owned_total

engine.scenario_types.OwnVsRentScenario.owned_total

Lifetime USD ownership cost: initial capital plus annual operation for the horizon.

Equation: (upfront + years * owned_cost_per_year).to('USD').

rented_total

engine.scenario_types.OwnVsRentScenario.rented_total

Lifetime USD rental cost over the same horizon and utilization.

Equation: (years * rent_per_year).to('USD').

savings

engine.scenario_types.OwnVsRentScenario.savings

Lifetime USD rent minus ownership cost; negative means renting costs less.

Equation: (rented_total - owned_total).to('USD').

rent_lifetime_full

engine.scenario_types.OwnVsRentScenario.rent_lifetime_full

Rent for every hour of the whole life.

Equation: (years * rent_per_year_full).to('USD').

lifetime_hours

engine.scenario_types.OwnVsRentScenario.lifetime_hours

Total hours in the ownership horizon.

Equation: (years * hours_per_year).to('hour').

breakeven_utilization

engine.scenario_types.OwnVsRentScenario.breakeven_utilization

Continuous utilization where lifetime rental and ownership costs agree.

Equation: float(calc_ownership_breakeven_utilization(upfront, fixed_cost_per_year, rent_per_year_full, years, use_cost_per_year_full).to('').magnitude).

Back to top