Infrastructure

Multi-cloud capacity

GPUs are scarce, expensive, and unevenly distributed across clouds. Running inference across multiple providers is not about vendor neutrality. It is about getting capacity when you need it.

The GPU shortage of 2023-2024 taught every inference team the same lesson: if your capacity plan depends on a single cloud provider, you will get burned. Reserved instances sell out. Spot capacity disappears during training runs by large labs. Entire regions run dry of H100s for weeks. The solution is multi-cloud capacity, and it's less about ideology ("avoid vendor lock-in!") and more about survival ("we need GPUs, anywhere, right now").

Why multi-cloud for inference specifically

Multi-cloud for web services has been debated for years and often dismissed as unnecessary complexity. Inference is different for a few concrete reasons:

The architecture: a unified control plane

The key architectural decision is where to put the routing layer. You need a single control plane that knows about all your GPU pools across clouds and can route requests intelligently. This looks like:

# Simplified multi-cloud routing
clouds = {
    "aws-us-east-1":    {"gpus": "8xH100", "replicas": 4, "healthy": 4, "cost_per_hr": 25.0},
    "gcp-us-central1":  {"gpus": "8xH100", "replicas": 2, "healthy": 2, "cost_per_hr": 22.0},
    "coreweave-us-east": {"gpus": "8xH100", "replicas": 6, "healthy": 5, "cost_per_hr": 18.0},
}

def route_request(request, strategy="cheapest"):
    available = {k: v for k, v in clouds.items() if v["healthy"] > 0}
    if strategy == "cheapest":
        return min(available, key=lambda k: available[k]["cost_per_hr"])
    elif strategy == "nearest":
        return nearest_by_latency(request.source_region, available)
    elif strategy == "least_loaded":
        return min(available, key=lambda k: load_metric(k))

In practice, frameworks like SkyPilot, Anyscale, or custom Kubernetes federation layers handle this. The control plane needs to track health, queue depth, and cost across all providers and make routing decisions in single-digit milliseconds.

Challenges that actually bite

Multi-cloud sounds clean on a whiteboard. Here's where it gets messy:

Spot and preemptible: the cost lever

The biggest cost savings in multi-cloud inference come from using spot/preemptible GPU instances for non-latency-critical workloads. Spot H100s can be 60-70% cheaper than on-demand. The catch: they can be reclaimed with 30 seconds to 2 minutes of notice.

For inference, this works if:

Cost math

A fleet of 16 H100 GPUs at $3/hr on-demand costs $1,152/day. If you can run 12 of those on spot at $1/hr and keep 4 on-demand, that's $864 + $288 = $1,152... wait, that's the same. But spot at $1/hr for 12 GPUs is $288/day, plus $288/day for 4 on-demand = $576/day. That's a 50% cost reduction. The engineering complexity is the price of admission.

Container portability

Multi-cloud only works if your inference workload is portable. This means containerized serving with no cloud-specific dependencies baked in. NIMs and container packaging help here: a single container image with the model weights, serving engine, and health checks can run on any cloud with NVIDIA GPU support.

The stack I've seen work best:

When not to go multi-cloud

Multi-cloud adds real operational overhead. If you can get reliable reserved capacity on a single provider, that's simpler and often cheaper per GPU-hour than the engineering cost of running across clouds. Multi-cloud makes sense when:

For everyone else, a single cloud with reserved instances and a good autoscaling setup is the right starting point. Add clouds when the pain justifies the complexity.

Next: zero-downtime deploys and cost, because getting a model update out without dropping requests is its own challenge.