Skip to content

System types

@app.job(system=...) requests a GPU tier for the job, from a fixed list of four: simulo.SystemType.TIER_1 through TIER_4. The tier decides which GPU model runs the job.

@app.job(type="train", system=simulo.SystemType.TIER_2, timeout=60 * 60)
def train(num_envs: int = 512, max_iterations: int = 200) -> dict:
...

simulo systems prints the list. It reads a catalog built into the simulo package, so it needs no network or login; --json prints the same data for scripts.

TIER GPU MODEL VRAM VCPU MEMORY MAX PARALLEL ENVS STATUS
Tier 1 (tier1) T4 16 GB 4 16 GB 16 available
Tier 2 (tier2) A10G 24 GB 4 16 GB not yet measured available
Tier 3 (tier3) L4 24 GB 4 16 GB not yet measured not yet available
Tier 4 (tier4) L40S 48 GB 4 32 GB not yet measured not yet available

Tiers 3 and 4 are listed so you can see what is planned, but no machines can run them yet, and requesting one is refused (below).

MAX PARALLEL ENVS is a ceiling measured for one default workload on that tier. It is not the same number as your job’s num_envs, and nothing enforces it: a bigger scene needs more memory per environment, a smaller one less. Benchmark your own num_envs on the tier you use.

  • It picks the GPU. A GPU machine belongs to one tier and takes that tier’s jobs, plus jobs that named no tier. A TIER_2 job runs on an A10G with 24 GB; a TIER_1 job runs on a T4 with 16 GB. For a job near 16 GB, that is the difference between running and running out of memory.
  • It is not a priority. No tier is served ahead of another, and naming one does not move your job up the queue.
  • Leaving it out is a normal choice. A job with no tier can run on any free machine, whatever its tier. When a new machine has to be started for it, that machine is Tier 1.

STATUS above comes from the built-in catalog, so it can’t tell you what your platform has running. If the platform has no machines for the tier you name, the submit is refused and the error lists the tiers it does have. A tier with no machines running at the moment is normal: one starts for your job, and waiting for it is what queued usually means.

@app.job checks system= when Python imports your file, before anything uploads. A string is refused, even one that spells a real tier:

@app.job(system=...) must be a simulo.SystemType member, e.g. system=simulo.SystemType.TIER_1; got 'tier1'. Run `simulo systems` to list the tiers.

A tier that can’t run yet raises a ValueError at the same point, naming the GPU you asked for and the tiers you can use:

ValueError: @app.job(system=SystemType.TIER_3) (L4) is not available on the platform yet. Available today: SystemType.TIER_1 (T4), SystemType.TIER_2 (A10G). Run `simulo systems` for the full catalog.

gpu= is not an @app.job argument. Passing it is refused with an instruction to use system= instead.