Batch GPU jobs, priced per result.

Upload a manifest of units, get one result per unit, pay a fixed price for each unit that completes.

$ unitfabric submit job.yamluploaded clips.jsonl as r2://grid/uploads/org_ists4trnmppr/up_25iq9pbxjfki/clips.jsonljob_9nww8dhegrj5  queued  units=2  price/unit=0.004000 $ unitfabric job job_9nww8dhegrj5job_9nww8dhegrj5  queued  pending=2 leased=0 done=0 failed=0  cost=$0.000000  price/unit=0.004000 $ unitfabric units job_9nww8dhegrj5unit_id  status   attempts  seconds  price_usd  failure_reasontake-01  pending  0take-02  pending  0 $ unitfabric results job_9nww8dhegrj5 --out ./results

How it works

  1. Pick a template or bring a container.

    Templates define a unit of work and its price. A container that follows the unit contract gets a quote from a calibration run.

  2. Submit a manifest.

    One JSON object per line, one unit per line. A job holds up to a million units.

  3. Collect results.

    Each finished unit is stored under its id. Download one, or the manifest of all of them. A unit is billed only when its result is stored.

Templates and prices

text/embeddings@1

Available

Unit
one batch of up to 1,000 texts of up to 512 tokens each (512k tokens), bge-base vectors
Needs
CPU

$0.001per unit

video/transcode@1

Available

Unit
one video file of up to 60 s and 1,800 frames, 64x64 to 1280x720, anything ffmpeg reads, to H.265 (default) or AV1 MP4
Needs
CPU

$0.004per unit

audio/whisper-large-v3@1

Launching

Unit
one audio file up to 10 minutes, transcript JSON
Needs
12 GB GPU

$0.004per unit

image/flux-schnell@1

Launching

Unit
one 1024x1024 image, 4 steps
Needs
24 GB GPU

$0.004per unit

image/sdxl-turbo@1

Launching

Unit
one image, 512x512 at 2 steps or no more work (up to 768 a side, 1 to 4 steps)
Needs
16 GB GPU

$0.0015per unit

render/blender@1

Launching

Unit
one frame of a .blend file, Cycles, PNG
Needs
16 GB GPU

$0.02per unit

These are launch estimates: the fleet has not been measured yet. Once it is, prices come from measured cost per unit and are republished weekly. See pricing

The dashboard's Overview, with example data: the balance, the spend and the units done this month and the active jobs, then the machines the organization supplies: how many are online, what they earned this month, how many wait to be confirmed and how many have a trust warning.
The dashboard's Overview, shown with example data: what the organization spends and runs, and what the machines it supplies earn.

Every unit completes or costs nothing.

A unit that fails all its attempts (three by default) is reported with its reason, not billed. Node failures, retries and scheduling are ours to handle, not yours.

We tested the guarantee on a video transcode job:

100
units in the job, each billed exactly once
60 s
into the run, we killed the node working on it
100 of 100
outputs byte-identical to an uninterrupted reference run

A job's traffic never leaves from a host's address: all job egress goes through our gateway. Your manifests and results are kept in your organization's own space in our storage, and every download link is signed and expires within the hour. Read the guarantees

Bring your own container

Any OCI image that follows the unit contract can run as a job.

/in
Your worker reads its units from /in/units.jsonl.
/out
It writes each unit's files, then a done.json that names them.
calibration
The first 20 units set the price before the rest run.
network
none, or egress only through our gateway.
Read the unit contract
job.yaml
name: checksumsimage: ghcr.io/acme/checksum@sha256:<64 hex digits>command: ["python", "/app/worker.py"]input: files.jsonl             # or `units: 5000` when the units need no inputresources:  gpu: { min_vram_gb: 16 }     # or `class: rtx4090`; leave it out for any GPU  cpu: 4  memory_gb: 16  scratch_gb: 50unit:  max_seconds: 120             # a unit still running then is stopped and tried again  max_attempts: 3price:  max_per_unit: 0.002          # optional: a calibration quote above this rejects the job; a later requote above it pauses the job until you accept or cancelnetwork: egress-only           # or nonecheckpoint: auto               # or offpool: public                   # or verified, platform, own

What it is not

Not a GPU rental: you do not pick a machine, and you cannot ssh into one. Not for sub-second APIs, databases or multi-GPU training. It is for work that comes in units.

Not a marketplace: we set each price from our own benchmarks, and nobody bids. Not confidential computing: jobs run in locked-down containers, not in hardware enclaves, on Linux machines we rent or own and, unless a job asks for ours alone, on machines other organizations supply.

Put your machine to work

One line puts a Linux or Windows machine, with an NVIDIA GPU or without, to work on other organizations' jobs at the hourly rate you set.

rate
Yours to set. A unit earns it for the time the unit took, at most 80% of the unit's price.
network
None: a job on your machine has no network, so nothing it does reaches the internet from your address.
own jobs
Your organization's jobs run on its own machines first, and free.
payouts
Monthly through Stripe from $25, or spend what you earn on jobs.
Linux
$ curl -fsSL https://unitfabric-site.vercel.app/install.sh | UNITFABRIC_SUPPLY_TOKEN=uf_supply_... sudo -E bash -s -- --control-url <url>
Windows, through WSL2
PS> $env:UNITFABRIC_SUPPLY_TOKEN = 'uf_supply_...'; & ([scriptblock]::Create((irm https://unitfabric-site.vercel.app/install.ps1))) -ControlUrl <url>