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
TrueAttributes
| 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).