News icon

We raised a Series A! Read a post from our CEO, Zhen Lu: 1M devs and the cloud we're building next.

The GPU Control Plane Is a Specialist Problem

When you need to run generic compute workloads at fleet scale, you reach for Kubernetes (K8S). That instinct makes sense. Kubernetes has been the default answer to "how do I orchestrate an entire data center" for a decade, and for the problem it was built to solve, it earned that community. Kubernetes competently handles stateless microservices, rolling deployments, and generalized compute scheduling across a heterogeneous fleet.

However, it’s the wrong instinct once workloads require GPUs. Kubernetes was designed in 2014, before GPUs were a first-class scheduling concern, and everything GPU-specific has been added since, one layer at a time. Hardware-vendor-written device plugins and drivers allow K8S Pods to access GPUs. Custom schedulers or scheduler extensions handle fractional allocation and Multi-Instance GPU (MIG) partitioning. Topology-aware scheduling and NVIDIA Collective Communications Library (NCCL)-aware placement exist because the default scheduler has no idea that GPU-to-GPU bandwidth matters. None of this is a knock on Kubernetes. It is a description of what happens when you point a generalist tool at a specialist problem: you inherit generalist drawbacks that are reinforced patch by patch.

What retrofitting actually costs

Here's what a Kubernetes-based GPU stack requires in practice, beyond running kubectl apply and calling it done. You need device plugins so the scheduler can see GPUs at all. You need a custom scheduler or scheduler extension if you want fractional GPU allocation or MIG partitioning, because the default scheduler treats every GPU as an identical, indivisible unit. You need Helm charts, RBAC configuration, and namespace-per-tenant patterns if more than one team touches the cluster. And you need someone on staff who understands all of it well enough to keep it running at 2 a.m.

The market has already built a business around closing that gap. Dedicated GPU scheduling platforms exist specifically because raw Kubernetes doesn't do fractional GPU allocation or fair-share scheduling on its own, and at least one such platform started as a standalone company before being acquired and rebuilt on an open-source scheduler. Someone has to build that layer, and public pricing for tools like it makes clear it isn't free: per-GPU annual licensing, plus the Kubernetes expertise, Helm charts, and RBAC configuration required to operate it.

The Kubernetes-native approach assumes Kubernetes expertise, or at least a willingness to adopt a specific cloud's managed Kubernetes layer, and advanced multi-team GPU orchestration may require additional platform layers on top of that. That's the retrofit tax.

None of this makes Kubernetes the wrong choice for every team. If your organization already has this infrastructure in place, already amortized the learning curve, and already has an on-call rotation that understands it, the tax is sunk, not marginal. This post is written for the team that hasn't paid it yet.

AI workloads need something GPU-native, not GPU-adjacent

A control plane built for GPUs from the ground up has to solve problems that Kubernetes GPU scheduling was never designed to solve. It needs model-and-weight locality: knowing whether a multi-gigabyte checkpoint is already sitting near a given GPU, or whether it has to be moved across the network first. It needs to understand cold-start economics, because an idle GPU has a completely different cost profile than an idle CPU pod. And it needs to handle burst and scale-to-zero patterns that barely exist outside of inference workloads.

Storage is the part of this that people underestimate. It isn't GPU compute in isolation, and it isn't networking in isolation. It's the interaction between the three. Brennen Smith, Runpod's CTO, has pointed out that storage is what glues these systems together, and that one of the most common complaints from customers has nothing to do with the model itself—it is the result of slow Docker image loading. That's a control-plane problem wearing a performance-complaint disguise.

There's also a forward-looking requirement that generalist orchestrators weren't built for at all. Workloads are increasingly bursty, unpredictable, and initiated by autonomous systems rather than a human clicking deploy. This shift in how compute is requested is showing up industry-wide. A fleet manager tuned for predictable microservice traffic patterns isn't tuned for the demands of AI computing at scale.

Runpod's answer: container orchestration, not infrastructure administration

Runpod took the other path: an orchestration layer for Docker container images and GPU placement, not a Kubernetes distribution with GPU plugins bolted on afterward.

The practical difference shows up immediately. There's no cluster to provision. There are no Helm charts to write. There's no YAML file defining resource requests and limits by hand. You write a dockerfile, build a container, and deploy it to a serverless GPU endpoint. Even simpler, decorate a Python function with the Runpod Flash SDK, and the platform automatically handles GPU and CPU provisioning and worker scaling on its own.

If you already have a Dockerized inference service, it deploys to Runpod Serverless directly. No rewrite needed.. Flash sits on top of that same Serverless infrastructure as an optional convenience layer: it exists for the case where you'd rather push hot code into your prebaked container image. Neither path is more "real" than the other. They're two entry points into the same control plane, and you can start with a container today and adopt Flash later, or skip containers entirely and start with Flash. Runpod is a universal orchestrator for private, hybrid, and public clouds. The platform doesn't think in terms of individual data centers. It treats the global fleet as a single substrate, and workload placement is handled automatically, continuously re-optimized for latency, cold-start time, and delivery.

You can see this thinking in a feature the team has built for this exact problem. Model weights, once deployed anywhere in a given datacenter, become available to every worker in that datacenter without triggering a repeat download, and the scheduler is locality-aware: it preferentially places new work where the model already lives. A generalist scheduler like Kubernetes can't make that decision out of the box, because it doesn't know what a model even is. It just sees a workload and a node.

Flash is the developer-facing surface of this control plane. You decorate a Python function with @Endpoint, run flash deploy, and the framework handles dependency installation and autoscaling behind the interface. If you want to see the mechanics directly, the source is public at github.com/runpod/flash.

The outcome: simpler and faster, with numbers

Simpler shows up as effort you don't have to expend. There's no cluster to administer and no DevOps hire required just to get a container running on a GPU, which stands in direct contrast to the Kubernetes stack described earlier in this post. Flash's dependency management happens automatically on remote workers, so your local script is the deployed artifact. There is no separate build pipeline to maintain.

Faster shows up as numbers you can check. Serverless cold starts run under 200ms at the infrastructure level, meaning the time it takes a worker to come online once a request arrives, before model weight size enters the picture at all. That infrastructure number holds regardless of workload, but total time-to-ready still depends on model size and image pull time. A small embedding model will feel instant. A 70B-parameter LLM will take real, measurable seconds to load into GPU memory on top of that 200ms, and this post won't pretend otherwise. The platform is tuned to shrink that second number too: cached-model scheduling pre-loads model files onto workers before a request ever arrives, and scaling strategies, whether queue-delay or request-count based, are tuned specifically for the traffic patterns LLM workloads actually produce.

There's a third proof point worth naming, because it points at where demand is heading rather than where it's been. Agent-initiated workloads, requests that originate from an autonomous system rather than a human clicking deploy, are a measurable and growing traffic pattern on the platform. A control plane built for humans clicking deploy buttons is a different problem than a control plane built for systems requesting compute on their own schedule. Runpod's is built for both.

Best practices for building on Runpod today

A few configuration choices make a measurable difference once you're running on Runpod Serverless.

  1. Set your minimum worker count to 1 or higher only when cold starts are genuinely unacceptable for your use case. Otherwise, let scale-to-zero do its job and stop paying for idle time. 
  2. Use cached models wherever your workload allows it, since pre-loaded model files cut initialization time meaningfully. 
  3. Choose request-count scaling with a low scaler value for LLM or short-request workloads, and reach for queue-delay scaling instead when your workload can tolerate a few seconds of buffering in exchange for higher utilization. 
  4. Set your maximum worker count roughly 20% above expected peak concurrency, treating it as a safety margin rather than a hard ceiling. 
  5. And, where your workload supports it, prefer fewer, higher-end GPUs per worker over a larger number of lower-tier GPUs.

Who this is for, and who it isn't

If your team has already built deep operational muscle around Kubernetes, with pipelines, tooling, and institutional knowledge accumulated over years, switching orchestration models is a real cost, not a free win. This post isn't arguing that every Kubernetes shop should migrate tomorrow. The choice must make sense for the teams maintaining the infrastructure and the AI workloads it serves.

This post is for the team standing up new AI infrastructure today, and for the team whose Kubernetes-based GPU setup is a tax they're paying because nobody told them there was another way to solve the problem.

Here's the honest version of the tradeoff. The Kubernetes stack as described in the earlier sections of this post reduces overhead by trading upfront setup time for a standing team that maintains it. Runpod reduces overhead by removing the standing team requirement entirely: support runs through Runpod directly rather than through an internal platform engineer you'd otherwise need to hire and staff for on-call. That's a different risk profile — not a risk-free one — and it's worth weighing against your own team's Kubernetes experience before you decide which tradeoff fits.

Get Started

The best way to experience the ease of Runpod is with Flash.

Purple glow background

Related articles

View All
No items found.

Build what’s next.

Build, train, and scale AI workloads on Runpod with cloud GPUs, Serverless, and Clusters.

Star field background