Skip to main content

Declarative Workload Specs (YAML/CLI)

Workloads are declared using a clean, Kubernetes-like specification. All fields except image are optional, with sensible system defaults applied.

Full Workload Specification​

# ==============================================================================
# Job Identity & Metadata
# ==============================================================================
name: pytorch-train-run-1 # Optional unique name (per project)
namePrefix: train-run # Optional prefix (generates: <prefix>-<suffix>)
# If neither is set, auto-generates a human-friendly
# Notion-like name (e.g., 'tidal-star-1234')

# ==============================================================================
# Container Execution
# ==============================================================================
image: pytorch/pytorch:2.2.1-cuda12.1-cudnn8-runtime # Required container image URI
command: ["python3"] # Optional entrypoint override
args: # Optional command arguments
- "/mnt/r2/train.py"
- "--epochs"
- "50"
- "--batch-size"
- "128"

env: # Optional environment variables
TORCH_OMP_NUM_THREADS: "8"
PYTHONUNBUFFERED: "1"

# ==============================================================================
# Storage Volumes (FUSE Mounts)
# ==============================================================================
volumes: # Map keyed by volume name (keys must be unique)
datasets: # Volume name — the map key
bucket: my-ml-datasets # Required: target cloud storage bucket
mountPath: /mnt/r2 # Required: container mount path
connection: my-cloudflare-r2 # Optional: defaults to first accessible connection
prefix: "models/checkpoints" # Optional: subpath prefix (defaults to bucket root)

# ==============================================================================
# Hardware Resources
# ==============================================================================
resources: # Optional: defaults to { cpu: 1, memory: 4Gi }
cpu: 8 # vCPU count (or fractional e.g. 0.5)
memory: 32Gi # Memory string (e.g. 512Mi, 4Gi, 64Gi)
gpu: 24Gi # Minimum aggregate GPU VRAM (shorthand for gpu: { vram: 24Gi })

# ==============================================================================
# Placement & Resilience Constraints
# ==============================================================================
cloud: ["aws", "gcp"] # Optional: restrict to specific providers ('aws', 'gcp', 'azure')
region: "americas" # Optional: specific region, array, or macro-region
# ('americas', 'europe', 'apac', 'africa', 'middle-east')
maxRetries: 3 # Optional: container retries inside VM on failure

# ==============================================================================
# Organization & Filtering
# ==============================================================================
labels: # Optional: key-value labels for filtering & billing
environment: production
team: ml-engineering
tags: # Optional: searchable tags
- pytorch
- training
- v2

Submit the file with the CLI (or POST it to the Jobs API):

solti job run -f workload.yaml

Job Naming Strategy​

Solti guarantees that every job has a unique, URL-safe name within its project workspace:

  1. Explicit Name (name) — if supplied, must be unique within the project. Duplicate names return a 409 Conflict.
  2. Prefix-Generated Name (namePrefix) — if namePrefix is supplied (e.g. train-run), Solti appends a random alphanumeric suffix (e.g. train-run-x7k9).
  3. Automatic Notion-like Name — if neither name nor namePrefix is provided, Solti automatically generates a memorable two-word identifier (e.g. tidal-star-1234, sunny-moon-5678).