Backed by Y Combinator

Capacity disappears. Your workload should not.

Nodus is the infrastructure execution layer for AI workloads. Describe the work and the budget. We pick the machine, spend against what it costs to finish rather than the hourly rate, and resume the run when the capacity is preempted mid-job.

routing one fine-tune, every candidate scored
Nodus selects the best available route for an AI workload 70B FINE-TUNE data · deadline · budget NODUS CANDIDATE B200 cluster · higher cost SELECTED H100 capacity · best fit RECOVERY PATH A100 capacity · ready

What Nodus owns

The whole lifetime of a run

You give Nodus the work, the deadline, and the budget. Nodus derives everything between that and a finished job.

01

Match

A profiler reads the work: memory ceiling, expected runtime, deadline. The router derives the fit from that and hands back a nodus: catalog entry, across accelerators and plain VMs alike. You never shop provider SKUs.

02

Cost

Routing scores cost to completion, meaning the run plus the recovery it is likely to need, rather than the sticker price per hour. Bid ceilings come out of the budget you set, so the cheap hour that never finishes loses to the one that does.

03

Completion

Cheap capacity gets taken back, and the price will not tell you how often. Discount and interruption risk barely track each other. When yours is preempted mid-run, Nodus cuts the old machine off, brings up another, and resumes from the last verified checkpoint rather than from zero.

The interface

Describe the work, not the machine

There is no instance type in this call, and no provider name. You state what the job needs and what you will spend; the router resolves the rest and keeps resolving it if the infrastructure underneath goes away.

  • Constraints, not SKUs. Memory, runtime and budget are the inputs the router actually needs.
  • Checkpointed by default. continuity decides whether progress is portable; the default keeps it.
  • Not just accelerators. Pass compute_class="vm" for CPU and batch work.
submit.py
import nodus

with nodus.Client() as client:
    wl = client.run(
        image="pytorch/pytorch:2.6.0-cuda12.4-cudnn9-runtime",
        command=["python", "train.py"],
        peak_memory_gb=80,
        expected_runtime_hours=4,
        budget=100,
    )

    done = client.wait(wl.id)
    print(done.status, done.spend_usd)

Put a workload through it

The docs walk from a first submit to a recovered run. The console shows what the router decided and why.