Local LLM Hosting Revenue Estimator
Estimate monthly profit from renting your GPU for LLM inference. Pick a GPU, marketplace, utilization, and electricity rate to see net revenue, $/hour, and break-even months.
Inputs
Best consumer card for local LLM hosting. High demand on Vast.ai / RunPod.
Reboots, updates, relocations.
GPU + system used for break-even.
Gross monthly revenue
โ
Platform fees
โ
Electricity cost
โ
Net monthly profit
โ
Net $ per rented hour
โ
Break-even months
โ
Annual net profit (after hardware)
โ
Verdict
โ
Utilization sensitivity
Net monthly profit at different utilization rates, holding your current hourly rate, power, and fees.
How the math works
- Rentable hours = hours/day ร days/month ร (1 โ downtime reserve).
- Gross revenue = rentable hours ร utilization ร hourly rate.
- Platform fees = gross revenue ร platform fee %.
- Electricity = hours online ร power (kW) ร electricity rate.
- Net profit = gross โ fees โ electricity โ maintenance.
- Break-even = hardware cost รท monthly net profit.
Hosting reality checks
- โข 24 GB cards (RTX 3090/4090) are the sweet spot for local LLM rentals.
- โข Typical consumer rates: $0.70-2.00/hr depending on VRAM and demand.
- โข Utilization above 70% is excellent; below 40% is hard to justify vs selling the hardware.
- โข Power costs dominate in regions above $0.20/kWh.
- โข Self-hosting direct customers keeps the most margin but requires support.
๐ค Use this tool in your agent
โ Agent-ready codeCopy the snippet below into your agent, newsletter, or script. The tool page at hermesdispatch.dev/tools/local-llm-hosting-revenue-estimator/ is the canonical contract: inputs, outputs, and formulas.
# Hermes Dispatch Tool โ Local LLM Hosting Revenue Estimator
# Source: https://hermesdispatch.dev/tools/local-llm-hosting-revenue-estimator/
# Description: Estimate monthly revenue from renting local GPU inference capacity.
# License: MIT (generated by hermesdispatch.dev)
#
# INSTALL:
# 1. Save this file as ~/.hermes/hermes-agent/tools/local_llm_hosting_revenue_estimator.py
# 2. Restart Hermes or run /reset in a session
# 3. The tool auto-registers if Hermes uses auto-discovery of tools/*.py
#
# MANUAL REGISTRY (if auto-discovery is off):
# from tools.local_llm_hosting_revenue_estimator import register
# register()
import json
DATA = {"defaults": {"hourly_rate": 1.25, "hours_per_day": 20, "days_per_month": 30, "utilization_pct": 65, "electricity_rate": 0.13, "gpu_power_w": 350, "platform_fee_pct": 15, "hardware_cost": 2200, "maintenance_per_month": 25, "downtime_reserve_pct": 10}, "gpus": [{"slug": "rtx-4090", "name": "NVIDIA RTX 4090 (24 GB)", "vram_gb": 24, "power_w": 350, "typical_rate": 1.5, "hardware_cost": 2200, "notes": "Best consumer card for local LLM hosting. High demand on Vast.ai / RunPod."}, {"slug": "rtx-3090", "name": "NVIDIA RTX 3090 (24 GB)", "vram_gb": 24, "power_w": 320, "typical_rate": 0.85, "hardware_cost": 1200, "notes": "Workhorse for inference. Slower than 4090 but cheaper to acquire."}, {"slug": "rtx-3090-ti", "name": "NVIDIA RTX 3090 Ti (24 GB)", "vram_gb": 24, "power_w": 360, "typical_rate": 0.95, "hardware_cost": 1400, "notes": "Slightly faster 3090 variant. Watch power draw."}, {"slug": "rtx-4080", "name": "NVIDIA RTX 4080 (16 GB)", "vram_gb": 16, "power_w": 280, "typical_rate": 0.75, "hardware_cost": 1200, "notes": "Good for 7B-13B quantized models. Lower rental demand than 24 GB cards."}, {"slug": "rx-7900-xtx", "name": "AMD RX 7900 XTX (24 GB)", "vram_gb": 24, "power_w": 330, "typical_rate": 0.7, "hardware_cost": 1000, "notes": "Linux/ROCm inference. Smaller rental marketplace but cheap per GB."}, {"slug": "a100-40gb", "name": "NVIDIA A100 40GB", "vram_gb": 40, "power_w": 250, "typical_rate": 2.5, "hardware_cost": 8000, "notes": "Datacenter reliability. Higher rates but slower turnover for hobbyists."}, {"slug": "h100", "name": "NVIDIA H100 80GB", "vram_gb": 80, "power_w": 350, "typical_rate": 6.0, "hardware_cost": 30000, "notes": "Enterprise demand. High barrier to entry, top revenue per hour."}], "platforms": [{"slug": "vastai", "name": "Vast.ai", "fee_pct": 15, "notes": "Peer-to-peer. You set price. High competition."}, {"slug": "runpod", "name": "RunPod Secure Cloud", "fee_pct": 20, "notes": "Managed marketplace. Easier ops, higher take rate."}, {"slug": "lambda", "name": "Lambda Cloud", "fee_pct": 20, "notes": "Curated supply. Good for stable demand."}, {"slug": "fluidstack", "name": "FluidStack", "fee_pct": 20, "notes": "GPU cloud focused on AI training/inference."}, {"slug": "self-hosted", "name": "Self-hosted / direct customers", "fee_pct": 3, "notes": "Stripe/payment fees only. You do support and billing."}], "presets": [{"slug": "crypto-pivot", "name": "Crypto miner pivot", "icon": "\u26cf\ufe0f", "hourly_rate": 1.35, "hours_per_day": 20, "utilization_pct": 60, "electricity_rate": 0.12, "platform_fee_pct": 15, "maintenance_per_month": 20, "downtime_reserve_pct": 15, "gpu_slug": "rtx-3090"}, {"slug": "hobbyist", "name": "Hobbyist home node", "icon": "\ud83c\udfe0", "hourly_rate": 1.1, "hours_per_day": 12, "utilization_pct": 50, "electricity_rate": 0.15, "platform_fee_pct": 15, "maintenance_per_month": 15, "downtime_reserve_pct": 20, "gpu_slug": "rtx-4090"}, {"slug": "small-farm", "name": "Small inference farm", "icon": "\ud83d\udda5\ufe0f", "hourly_rate": 1.2, "hours_per_day": 22, "utilization_pct": 70, "electricity_rate": 0.11, "platform_fee_pct": 18, "maintenance_per_month": 40, "downtime_reserve_pct": 10, "gpu_slug": "rtx-4090"}, {"slug": "enterprise", "name": "Enterprise A100/H100", "icon": "\ud83c\udfe2", "hourly_rate": 3.5, "hours_per_day": 24, "utilization_pct": 75, "electricity_rate": 0.13, "platform_fee_pct": 20, "maintenance_per_month": 100, "downtime_reserve_pct": 8, "gpu_slug": "a100-40gb"}]}
def _ok(result):
return json.dumps({"success": True, "data": result}, indent=2)
def _err(message):
return json.dumps({"success": False, "error": message}, indent=2)
TOOL_NAME = "local_llm_hosting_revenue_estimator"
TOOLSET = "hardware"
SCHEMA = {
"type": "function",
"function": {
"name": "local_llm_hosting_revenue_estimator",
"description": "Estimate revenue from renting local GPU inference capacity by the hour.",
"parameters": {
"type": "object",
"properties": {
"gpu": {
"type": "string",
"description": "GPU slug: rtx-4090, rtx-3090, rtx-3090-ti, rtx-4080, rx-7900-xtx, a100-40gb, h100"
},
"platform": {
"type": "string",
"description": "Platform slug or generic."
},
"hours_per_day": {
"type": "number",
"description": "Average rented hours per day."
},
"hourly_rate": {
"type": "number",
"description": "Rental price per hour in USD."
}
},
"required": []
}
}
}
def _run(args):
gpu_slug = args.get("gpu", DATA["defaults"].get("gpu", DATA["gpus"][0]["slug"]))
platform_slug = args.get("platform", DATA["defaults"].get("platform", "generic"))
hourly_usage = float(args.get("hours_per_day", DATA["defaults"]["hours_per_day"]))
price_per_hour = float(args.get("hourly_rate", DATA["defaults"]["hourly_rate"]))
gpu = next((g for g in DATA["gpus"] if g["slug"] == gpu_slug), DATA["gpus"][0])
days = DATA["defaults"]["days_per_month"]
monthly_hours = hourly_usage * days
utilization = DATA["defaults"]["utilization_pct"] / 100
billable_hours = monthly_hours * utilization
gross_revenue = billable_hours * price_per_hour
platform_fee = gross_revenue * (DATA["defaults"]["platform_fee_pct"] / 100)
power_cost = gpu["power_w"] * monthly_hours / 1000 * DATA["defaults"]["electricity_rate"]
maintenance = DATA["defaults"]["maintenance_per_month"]
net_revenue = gross_revenue - platform_fee - power_cost - maintenance
return _ok({
"monthly_hours": round(monthly_hours, 0),
"billable_hours": round(billable_hours, 0),
"gross_revenue": round(gross_revenue, 2),
"platform_fee": round(platform_fee, 2),
"power_cost": round(power_cost, 2),
"maintenance": round(maintenance, 2),
"net_revenue": round(net_revenue, 2),
"roi_months": round(gpu["hardware_cost"] / max(net_revenue, 0.01), 1)
})
def HANDLER(args):
try:
return _run(args)
except Exception as e:
return _err(str(e))
def register():
"""Manual registry hook. Import and call this to register with Hermes."""
try:
from tools.registry import registry
registry.register(
name=TOOL_NAME,
toolset=TOOLSET,
schema=SCHEMA,
handler=HANDLER,
)
except ImportError:
print("Hermes registry not found; skipping manual registration.")
if __name__ == "__main__":
# CLI smoke test
print(HANDLER({}))
Want early access to the next locked tool? Subscribe to The Hermes Dispatch.