name: modal-serverless-gpu
description: Serverless GPU cloud platform for running ML workloads. Use when you need on-demand GPU access without infrastructure management, deploying ML models as APIs, or running batch jobs with automatic scaling.
version: 1.0.0
author: Orchestra Research
license: MIT
dependencies: [modal>=0.64.0]
metadata:
hermes:
tags: [Infrastructure, Serverless, GPU, Cloud, Deployment, Modal]
Modal Serverless GPU
Comprehensive guide to running ML workloads on Modal's serverless GPU cloud platform.
When to use Modal
Use Modal when:
- - Running GPU-intensive ML workloads without managing infrastructure
- - Deploying ML models as auto-scaling APIs
- - Running batch processing jobs (training, inference, data processing)
- - Need pay-per-second GPU pricing without idle costs
- - Prototyping ML applications quickly
- - Running scheduled jobs (cron-like workloads)
- - Serverless GPUs: T4, L4, A10G, L40S, A100, H100, H200, B200 on-demand
- - Python-native: Define infrastructure in Python code, no YAML
- - Auto-scaling: Scale to zero, scale to 100+ GPUs instantly
- - Sub-second cold starts: Rust-based infrastructure for fast container launches
- - Container caching: Image layers cached for rapid iteration
- - Web endpoints: Deploy functions as REST APIs with zero-downtime updates
- - RunPod: For longer-running pods with persistent state
- - Lambda Labs: For reserved GPU instances
- - SkyPilot: For multi-cloud orchestration and cost optimization
- - Kubernetes: For complex multi-service architectures
- - Advanced Usage - Multi-GPU, distributed training, cost optimization
- - Troubleshooting - Common issues and solutions
- - Documentation: https://modal.com/docs
- - Examples: https://github.com/modal-labs/modal-examples
- - Pricing: https://modal.com/pricing
- - Discord: https://discord.gg/modal
Key features:
Use alternatives instead:
Quick start
Installation
`bash
pip install modal
modal setup # Opens browser for authentication
`
Hello World with GPU
`python
import modal
app = modal.App("hello-gpu")
@app.function(gpu="T4")
def gpu_info():
import subprocess
return subprocess.run(["nvidia-smi"], capture_output=True, text=True).stdout
@app.local_entrypoint()
def main():
print(gpu_info.remote())
`
Run: modal run hello_gpu.py
Basic inference endpoint
`python
import modal
app = modal.App("text-generation")
image = modal.Image.debian_slim().pip_install("transformers", "torch", "accelerate")
@app.cls(gpu="A10G", image=image)
class TextGenerator:
@modal.enter()
def load_model(self):
from transformers import pipeline
self.pipe = pipeline("text-generation", model="gpt2", device=0)
@modal.method()
def generate(self, prompt: str) -> str:
return self.pipe(prompt, max_length=100)[0]["generated_text"]
@app.local_entrypoint()
def main():
print(TextGenerator().generate.remote("Hello, world"))
`
Core concepts
Key components
| Component | Purpose | |
| ----------- | --------- | |
App | Container for functions and resources | |
Function | Serverless function with compute specs | |
Cls | Class-based functions with lifecycle hooks | |
Image | Container image definition | |
Volume | Persistent storage for models/data | |
Secret | Secure credential storage | |
| Command | Description | |
| --------- | ------------- | |
modal run script.py | Execute and exit | |
modal serve script.py | Development with live reload | |
modal deploy script.py | Persistent cloud deployment | |
| GPU | VRAM | Best For |
| ----- | ------ | ---------- |
T4 | 16GB | Budget inference, small models |
L4 | 24GB | Inference, Ada Lovelace arch |
A10G | 24GB | Training/inference, 3.3x faster than T4 |
L40S | 48GB | Recommended for inference (best cost/perf) |
A100-40GB | 40GB | Large model training |
A100-80GB | 80GB | Very large models |
H100 | 80GB | Fastest, FP8 + Transformer Engine |
H200 | 141GB | Auto-upgrade from H100, 4.8TB/s bandwidth |
B200 | Latest | Blackwell architecture |
| Decorator | Use Case | |
| ----------- | ---------- | |
@modal.fastapi_endpoint() | Simple function → API | |
@modal.asgi_app() | Full FastAPI/Starlette apps | |
@modal.wsgi_app() | Django/Flask apps | |
@modal.web_server(port) | Arbitrary HTTP servers | |
| Issue | Solution | |
| ------- | ---------- | |
| Cold start latency | Increase container_idle_timeout, use @modal.enter() | |
| GPU OOM | Use larger GPU (A100-80GB), enable gradient checkpointing | |
| Image build fails | Pin dependency versions, check CUDA compatibility | |
| Timeout errors | Increase timeout, add checkpointing |