Comparison
Runqy vs Modal
Modal is a serverless platform: you decorate Python functions, and Modal builds the containers, finds the GPUs and scales them on its cloud. Runqy is a self-hosted task queue: your workers run wherever you put them, including GPUs you already own.
Modal does more than queue jobs: web endpoints, cron, volumes, sandboxes. Runqy focuses on one thing: getting jobs to GPU workers on your own terms. Runqy is our project; this page says when Modal is the better choice.
What you get out of the box
Features available without writing glue code or adding another service.
| Out of the box | Modal | Runqy |
|---|---|---|
| Where code runs | Modal's cloud only | Your machines, RunPod, Vast.ai, any server |
| Platform | Managed service; open-source client | Open-source server and worker (MIT), self-hosted |
| How you define a worker | Python decorators; image and GPU declared in code | @load / @task in Python; queue config in YAML |
| Ship new code | ✓ modal deploy | ✓ push to Git, then code-update |
| GPU autoscaling and scale to zero | ✓ automatic | ✓ triggers per queue, RunPod and Vast.ai |
| Use GPUs you already own | ✗ | ✓ |
| Keeps a model loaded between jobs | ✓ container lifecycle | ✓ @load |
| Job queue | ✓ spawn, Queue | ✓ Redis, sub-queues |
| Retries and timeouts | ✓ | ✓ per queue |
| Cron and scheduled functions | ✓ Period, Cron | ~ scheduled machine pre-warming only |
| Web endpoints | ✓ FastAPI, ASGI, WSGI | ~ REST API to enqueue and read results |
| Secrets | ✓ | ✓ encrypted vaults |
| Persistent volumes | ✓ | ✗ use your own storage |
| Billing | Per second of usage | Free software; you pay your machines and rentals |
✓ built in · ~ partial or limited · ✗ not built in (you add a separate tool or write it yourself)
The same GPU job, both ways
Modal
import modal
app = modal.App("images")
image = modal.Image.debian_slim().pip_install("diffusers")
@app.function(gpu="L40S", image=image)
def generate(prompt):
return save(load_pipeline()(prompt))
# modal deploy, then generate.spawn("a fox")Runqy
from runqy_python import load, task, run
@load
def setup():
return {"pipe": load_pipeline()}
@task
def generate(payload, ctx):
return save(ctx["pipe"](payload["prompt"]))
run()
# POST /queue/add {"queue": "images", ...}Choose Modal when
- You do not own GPUs and do not want to manage any infrastructure.
- You also need web endpoints, cron jobs, volumes or sandboxes on the same platform.
- Fast cold starts and a wide choice of datacenter GPUs matter more than the hourly price.
Choose Runqy when
- You own GPUs, at home or in a lab, and want them in production.
- You want marketplace prices on Vast.ai or RunPod for peaks, with your own machines as the base.
- Your data and your code must stay on infrastructure you control.
- You want no lock-in: plain Python workers and a server you can run anywhere.
Try Runqy
Open source and self-hosted. Start with your own machine, add rented GPUs when you need them.