Blog
Sharing GPUs across teams on Kubernetes: MIG, time-slicing, quotas
Splitting one card across teams: MIG, time-slicing, namespace quotas and a multi-tenant cluster. What each mode actually isolates.
Hidora article published 27 May 2026. Figures, prices and comparisons are as of that date.
Device plugins, GPU Operator, MIG and time-slicing: the complete guide
Managing GPUs in Kubernetes is a major technical challenge for organisations deploying AI workloads at scale. According to Collabnix, 48% of organisations now run their AI/ML workloads on Kubernetes, with searches for "Kubernetes AI" up 300% in 2025. That adoption puts pressure on infrastructure teams: how do you orchestrate GPU resources costing CHF 2 to 10 an hour while maximising utilisation and guaranteeing isolation between tenants?
Kubernetes does not natively treat GPUs as first-class resources. The standard scheduler treats GPUs as binary counters (0 or 1), ignoring their specific characteristics: model, VRAM, network topology. That simplistic approach creates waste: pods consuming 10% of a GPU while blocking access to the other 90%, heterogeneous clusters where H100s serve workloads that only need a T4. This article details the three critical components of GPU management in Kubernetes, Device Plugin, GPU Operator and specialised schedulers, sets out the GPU sharing strategies (MIG, time-slicing), and proposes a progressive deployment framework tested in production.
This article’s angle: fitting several teams onto the same cards, MIG, time-slicing, quotas and gang scheduling. This is the sharing question, not the cost one: cost per job is in GPU FinOps.
The three key components of Kubernetes GPU
GPU orchestration in Kubernetes rests on three complementary software layers that turn hardware accelerators into schedulable resources.
Device Plugin, exposing GPUs to the scheduler
The Device Plugin framework is the mechanism by which Kubernetes discovers and allocates specialised hardware resources. Each device plugin runs as a DaemonSet on GPU nodes, communicates with the kubelet over gRPC, and exposes extended resources visible to the scheduler. For NVIDIA, the official k8s-device-plugin exposes the resource nvidia.com/gpu.
The architecture is simple: the device plugin periodically queries the NVIDIA driver to list the GPUs available on the node, then notifies the kubelet of those resources through the ListAndWatch API. When a pod requests nvidia.com/gpu: 1, the kubelet reserves a GPU and configures the container runtime (containerd or CRI-O) to expose the GPU device to the container through the NVIDIA Container Toolkit.
Device Plugin architecture:
Node with 4× A100 80GB
Device Plugin (DaemonSet)
↓ gRPC ListAndWatch
Kubelet
↓ exposes resources
Kubernetes scheduler
↓ placement decision
Pod with nvidia.com/gpu, 2
↓ runtime configuration
Container with access to 2× GPU
The standard device plugin has two major limitations. First, it treats all GPUs as homogeneous: there is no way to request an H100 specifically rather than an A100, the scheduler places the pod on the first node with GPUs available regardless of model. Second, allocation is all-or-nothing: a pod requesting one GPU gets full exclusive access, even when it only uses 15% of its capacity.
GPU Operator, automating the lifecycle
The NVIDIA GPU Operator solves the problem of managing the GPU software stack on every node. Before GPU Operator, administrators had to install manually on each node: NVIDIA drivers, NVIDIA Container Toolkit, device plugin, DCGM for monitoring, GPU Feature Discovery for labelling. That manual approach produced version inconsistencies, configuration errors, and deployment times counted in days.
GPU Operator implements the Kubernetes Operator pattern: a Custom Resource Definition (ClusterPolicy) describes the desired state of the GPU cluster, and the operator automatically converges the actual state towards it. On deployment, GPU Operator installs through DaemonSets on GPU nodes: NVIDIA drivers (or detects pre-installed drivers), NVIDIA Container Toolkit, k8s-device-plugin, DCGM Exporter, GPU Feature Discovery, Node Status Exporter.
GPU Operator installation (Helm):
# Add the NVIDIA Helm repo
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
# Install GPU Operator
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--version v24.9.0 \
--set driver.enabled=true
# Verify deployment
kubectl get pods -n gpu-operator
kubectl get nodes -o json | jq '.items[].status.allocatable'
GPU Feature Discovery (GFD), a GPU Operator component, automatically applies labels to nodes describing their GPUs, nvidia.com/gpu.product (commercial name such as A100-SXM4-80GB), nvidia.com/gpu.memory (VRAM in bytes), nvidia.com/gpu.count (number of GPUs), nvidia.com/cuda.driver.major and minor (driver version), nvidia.com/gpu.family (architecture, ampere, hopper). These labels allow precise nodeSelectors and affinities in pod specs.
Specialised schedulers: beyond the default
The standard Kubernetes scheduler uses predicates (filters) and priorities (scores) to place pods. For GPUs its limitations become critical: no gang scheduling (all pods of a multi-GPU job or none), no quotas per tenant or queue, no intelligent preemption based on business priority, network topology (NVLink, InfiniBand) ignored during placement.
Specialised schedulers fill those gaps. The NVIDIA KAI Scheduler, open-sourced in January 2025, introduces: fractional GPU requests (nvidia.com/gpu, 0.5), native gang scheduling through PodGroups, hierarchical queues with quotas, topology-aware scheduling for distributed workloads, and preemption configurable by priority and fairness.
Kueue, developed by a Kubernetes SIG, works as an admission control layer ahead of scheduling, workloads (Jobs, PyTorchJobs, RayJobs) are enqueued in LocalQueues bound to ClusterQueues with configured quotas. Kueue simulates scheduling on the cluster and admits (or holds) the workload atomically. Cohorts let several queues share idle quota with weighted fairness.
Volcano, a CNCF project, implements strict gang scheduling and optimised bin-packing: all pods in a PodGroup are scheduled simultaneously or none are, avoiding deadlocks. Volcano supports several scheduling algorithms: proportion (fair-share), gang (atomicity), DRF (dominant resource fairness), binpack (minimise fragmentation).
| Scheduler | Main strength | Best use case | Complexity |
|---|---|---|---|
| Kubernetes standard | Simplicity, default | Single-GPU workloads, low concurrency | Low |
| KAI Scheduler | Fractional GPU, topology | Multi-tenant, GPU sharing, disaggregated serving | Medium |
| Kueue | Quotas, cohorts, fairness | Multi-team, GPU budgets, business priorities | Medium |
| Volcano | Gang scheduling, bin-packing | Distributed training, multi-GPU/multi-node workloads | High |
GPU sharing strategies, MIG against time-slicing
Sharing a GPU between several pods improves utilisation and cuts cost. Two approaches dominate: Multi-Instance GPU (MIG) with hardware isolation, and software time-slicing.
MIG, hardware isolation by partition
Multi-Instance GPU (MIG), introduced with the Ampere architecture (A100, A30), physically partitions a GPU into up to seven independent instances. Each MIG instance has dedicated resources: Streaming Multiprocessors (SM), VRAM, memory controllers, L2 cache. Isolation is guaranteed in hardware: a crash in one MIG instance does not affect the others, and memory bandwidth is guaranteed by hardware QoS.
An A100 80GB supports several MIG profiles, 1g.10gb (1/7 of the GPU, 10 GB VRAM), 2g.20gb (2/7, 20 GB), 3g.40gb (3/7, 40 GB), 7g.80gb (the full GPU). An H100 80GB offers: 1g.10gb, 2g.20gb, 3g.40gb, 4g.40gb, 7g.80gb. The profiles define the possible combinations: an A100 can host 7× 1g.10gb simultaneously, or 2× 3g.40gb plus 1× 1g.10gb, as required.
MIG configuration in Kubernetes:
# Enable MIG on the GPU (requires a reboot)
nvidia-smi -i 0 -mig 1
# Create the MIG instances (example: 2× 3g.40gb + 1× 1g.10gb)
nvidia-smi mig -cgi 3g.40gb -C
nvidia-smi mig -cgi 3g.40gb -C
nvidia-smi mig -cgi 1g.10gb -C
# GPU Operator ConfigMap for MIG
apiVersion: v1
kind: ConfigMap
metadata:
name: gpu-operator-config
data:
migStrategy: mixed # single, mixed or none
The mixed mode exposes both full GPUs (nvidia.com/gpu) and MIG instances (nvidia.com/mig-3g.40gb). Pods can request either a full GPU or a specific MIG instance. The single mode exposes only MIG instances, forcing every workload to use MIG.
MIG limitations include: static configurations requiring a GPU reset to change, a maximum of seven instances per GPU limiting granularity, management overhead for small clusters (fewer than 10 GPUs), and support limited to Ampere and Hopper GPUs (A100, A30, H100, H200).
Time-slicing, software sharing by multiplexing
Time-slicing lets several containers share a GPU through CUDA time-slicing, the GPU driver switches context rapidly between processes, giving each a slice of execution time. Unlike MIG, there is no memory isolation and no bandwidth guarantee. A noisy-neighbour pod can exhaust VRAM and cause CUDA OOM errors in the other pods sharing the same GPU.
Time-slicing is ideal for: development environments and interactive notebooks, light inference (chatbots, APIs) with tolerant latency, older GPUs that do not support MIG (T4, V100, P100), and very granular sharing (16+ workloads per GPU). Conversely, time-slicing does not suit workloads requiring predictable and guaranteed performance, strict memory isolation, ultra-low latency (below 50 ms), or intensive training needing an exclusive GPU.
Time-slicing configuration (ConfigMap):
apiVersion: v1
kind: ConfigMap
metadata:
name: device-plugin-config
namespace: gpu-operator
data:
A100-SXM4-80GB: |-
version: v1
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 4 # 1 physical GPU → 4 logical GPUs
Tesla-T4: |-
version: v1
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 8 # 1 T4 → 8 replicas
Once this configuration is applied, a node with 1× A100 80GB will advertise nvidia.com/gpu, 4 instead of nvidia.com/gpu, 1. Four pods can each request nvidia.com/gpu: 1 and run concurrently on the same physical GPU. GPU Feature Discovery adds the label nvidia.com/gpu.product: A100-SXM4-80GB-SHARED to distinguish time-sliced GPUs.
| Criterion | MIG | Time-slicing |
|---|---|---|
| Isolation | Hardware (VRAM, SM, cache) | None (software) |
| Performance | Guaranteed, predictable | Variable, contention possible |
| Granularity | Max 7 instances per GPU | Unlimited (practically 8-16) |
| Supported GPUs | Ampere and Hopper only | All NVIDIA GPUs |
| Configuration | Static, requires GPU reset | Dynamic, ConfigMap |
| Best use case | Multi-tenant production, strict SLAs | Dev/test, light inference |
Step by step, a Kubernetes GPU cluster
Deploying a GPU Kubernetes cluster for AI workloads follows a methodical progression in five steps, each validated before moving to the next.
Step 1, infrastructure preparation (1-2 days)
GPU nodes need specific system prerequisites. A recent Linux kernel (5.15+) with NVIDIA modules enabled, secure boot disabled (incompatible with proprietary drivers), base packages installed: build-essential, gcc, make, linux-headers-$(uname -r). For cloud deployments (AWS, Azure, GCP), use dedicated GPU instance types: AWS p4d.24xlarge (8× A100), Azure NC A100 v4, GCP a2-highgpu-8g.
On-premise, check the BIOS settings, IOMMU enabled for GPU passthrough, PCIe ASPM disabled (it can cause instability), Above 4G Decoding enabled for GPUs of 80GB and more. Confirm GPU visibility with lspci | grep -i nvidia. Install a compatible container runtime: containerd 1.7+ or CRI-O 1.28+ with CDI (Container Device Interface) support.
Step 2, GPU Operator deployment (3-4 hours)
GPU Operator installs through the official Helm chart. The ClusterPolicy configuration determines which components are deployed. For production, enable: NVIDIA drivers (unless pre-installed on the nodes), device plugin, DCGM Exporter for monitoring, GPU Feature Discovery, toolkit and validation.
Full GPU Operator installation:
# Create namespace
kubectl create namespace gpu-operator
# Install through Helm with production parameters
helm install gpu-operator nvidia/gpu-operator \
-n gpu-operator \
--set driver.enabled=true \
--set driver.version="550.90.07" \
--set toolkit.version="1.16.2" \
--set devicePlugin.version="v0.16.2" \
--set dcgmExporter.enabled=true \
--set gfd.enabled=true \
--set operator.defaultRuntime=containerd
# Validation
kubectl wait --for=condition=ready pod -l app=gpu-operator -n gpu-operator --timeout=600s
kubectl get nodes -o json | jq '.items[].status.allocatable | select(.["nvidia.com/gpu"] != null)'
Validation confirms that the nodes expose the nvidia.com/gpu resource and that GFD labels are applied. Testing with a simple CUDA pod verifies end-to-end operation.
Step 3: GPU sharing configuration (4-6 hours)
Decide the sharing strategy by use case, MIG for multi-tenant production with SLAs, time-slicing for dev/test and light inference, exclusive GPUs for intensive training. Strategies can be mixed across node pools: a "production" pool with MIG, a "dev" pool with time-slicing, a "training" pool with exclusive GPUs.
For MIG, configure the profiles on each GPU then change the ClusterPolicy to the MIG strategy. For time-slicing, create a ConfigMap with configurations per GPU model, then patch the ClusterPolicy to reference it. Apply node labels for precise selection: kubectl label nodes gpu-node-1 gpu-sharing=mig, kubectl label nodes gpu-node-2 gpu-sharing=time-sliced.
Step 4, monitoring and observability (2-3 hours)
DCGM Exporter, deployed by GPU Operator, exposes GPU metrics in Prometheus format. Critical metrics: DCGM_FI_DEV_GPU_UTIL (utilisation %), DCGM_FI_DEV_FB_USED and DCGM_FI_DEV_FB_FREE (VRAM), DCGM_FI_DEV_POWER_USAGE (draw in W), DCGM_FI_DEV_GPU_TEMP (temperature), DCGM_FI_DEV_SM_CLOCK (GPU clock).
Configure Prometheus to scrape DCGM Exporter on port 9400. Import the pre-configured Grafana dashboard (ID 12239) showing: GPU utilisation per node, VRAM use with thresholds, temperature and throttling, total cluster power draw. Define alerts: GPU utilisation below 30% for an hour (under-use), VRAM above 90% (OOM risk), temperature above 85°C (throttling imminent).
Step 5, quotas and policies (1-2 days)
Kubernetes ResourceQuotas limit GPU consumption per namespace. A typical quota: requests.nvidia.com/gpu, "8" caps a namespace at 8 concurrent GPUs. LimitRanges define minimum and maximum per pod: preventing pods that request 0 GPUs or more than 4.
For advanced control, deploy Kueue or Volcano. Kueue implements queues with quotas: team A with a 16-GPU quota, team B with 8, and a cohort allowing idle quota to be borrowed. Volcano implements priorities and preemption: high-priority pods can preempt low-priority ones to free GPUs.
The five mistakes that degrade GPU efficiency
1. Not using node labels and affinity
Symptom: deploying pods with no nodeSelector or affinity, letting the scheduler place workloads on any available GPU node regardless of model.
Impact: light inference workloads scheduled on expensive H100s (CHF 7/h) when a T4 (CHF 1.20/h) would do. Models of 70B and above scheduled on A100 40GB nodes causing immediate OOM instead of targeting A100 80GB. GPU fragmentation: a cluster with 50% of H100s idle while jobs wait for A100s that are all busy. Estimated waste: 30 to 50% of the GPU budget on heterogeneous clusters.
Fix: label nodes by GPU model and capabilities. Use nodeSelector for simple workloads: nodeSelector, nvidia.com/gpu.product, Tesla-T4. Use node affinity for complex logic: prefer H100 but accept A100 if unavailable. Create dedicated node pools: an "inference" pool with T4/L40S, a "training" pool with A100/H100. Automate through admission controllers validating that every GPU pod specifies an appropriate nodeSelector.
2. Ignoring resource limits
Symptom: defining only requests.nvidia.com/gpu without limits, or the reverse.
Impact: for GPUs, requests and limits must be identical, because a GPU cannot be shared by throttling the way a CPU can. A pod with requests: 1, limits, 2 gets one GPU but reserves two slots, causing waste. A pod without limits is not OOM-killable on the GPU side (the kubelet cannot force a GPU to be released). Namespace quotas can be bypassed if only requests are quota'd. The result: resource fragmentation, ineffective quotas, imprecise billing.
Fix: always define identical requests and limits for GPUs, resources, limits, nvidia.com/gpu, "2" requests, nvidia.com/gpu, "2". Use a LimitRange to enforce that equality at namespace level. Monitor pods where requests differ from limits through a policy engine (OPA, Kyverno) and reject them automatically. For fractional GPUs (KAI Scheduler), apply the same principle with fractional values: nvidia.com/gpu, "0.5" in both requests and limits.
3. Underestimating multi-GPU network configuration
Symptom: deploying distributed multi-GPU/multi-node training without configuring RDMA, GPUDirect or NVLink topology.
Impact: a PyTorch DistributedDataParallel training run on 32 GPUs (4 nodes × 8 GPUs) communicates over standard Ethernet (25 Gbps) instead of RDMA InfiniBand (200 Gbps). Gradient synchronisation time goes from 150 ms (InfiniBand) to 1,200 ms (Ethernet), multiplying iteration time by five. Over a 1,000-epoch training run, network overhead adds several days. Wasted GPU cost: 60-70% of the time spent waiting on the network. Across 4 H100 nodes at CHF 56/h combined, that is CHF 35/h burned idling on the network.
Fix: configure RDMA on GPU nodes, install InfiniBand or RoCEv2 drivers, enable GPUDirect RDMA in GPU Operator (--set rdma.enabled=true). On-premise, deploy an InfiniBand HDR network at 200 Gbps minimum. In cloud, use instance types with optimised networking: AWS p4d (400 Gbps EFA), Azure ND A100 v4 (200 Gbps InfiniBand). Use topology-aware scheduling (KAI Scheduler, Volcano) to place pods from the same job on topologically close nodes. Validate GPU-to-GPU network bandwidth with NCCL benchmarks before production.
4. Mixing MIG and time-slicing without a clear strategy
Symptom: enabling MIG on some GPUs and time-slicing on others within the same node pool, with no documentation or clear labels.
Impact: user confusion, some pods request nvidia.com/gpu, 1 and get a full GPU, others get a MIG instance, others a time-slice, depending on which node the scheduler picked. Unpredictable performance: the same pod redeployed performs differently depending on placement. Complex debugging: identifying which type of GPU a pod received requires inspecting node labels, the device plugin ConfigMap and the MIG configuration. Wasted DevOps time: 2-3 hours per diagnostic incident.
Fix: define a clear strategy per node pool, pool A exclusive full GPUs, pool B MIG only, pool C time-slicing only. Label explicitly: gpu-mode, exclusive, gpu-mode, mig, gpu-mode, time-sliced. Force users to specify a nodeSelector for the GPU mode they want through an admission policy. Document in the internal wiki which pool suits which use case. For experts, mixed mode is possible but demands rigour: expose MIG and time-slice as different resources (nvidia.com/mig-3g.40gb against nvidia.com/gpu.shared), never an ambiguous nvidia.com/gpu.
5. No gang scheduling for distributed training
Symptom: launching distributed training jobs (PyTorchJob, MPIJob) on a standard Kubernetes cluster without gang scheduling, hoping all pods will be scheduled.
Impact: a PyTorchJob needs 16 pods (16 GPUs). The scheduler places 12 immediately, but 4 stay Pending because there are not enough GPUs available in the cluster. The 12 running pods wait indefinitely for the missing 4 (DistributedDataParallel blocks at the rendezvous). The GPUs of those 12 pods sit idle at 100% reservation until timeout (often 30-60 minutes). At CHF 3.20/h per A100, that is CHF 38 wasted per failed job. In production, 20-40% of training jobs fail this way without gang scheduling, according to Uber's KubeCon 2024 benchmarks.
Fix: deploy a scheduler with gang scheduling, Volcano (high maturity, CNCF), Kueue (native Kubernetes integration), or KAI Scheduler (advanced NVIDIA features). For Volcano, wrap the Job in a PodGroup specifying minMember equal to the total number of pods: all scheduled simultaneously or none. Configure a reasonable timeout: 10-15 minutes for 8-16 GPU jobs, 30 minutes for jobs of 32 GPUs and above. Monitor gang scheduling metrics: rate of jobs admitted first time, average queue wait, rate of deadlocks avoided. Immediate ROI: 20-30% saving on the training budget by eliminating partial failures.
Illustrative scenario, a multi-tenant cluster for ML teams
This scenario is an illustration built to show the reasoning, not a Hikube customer and not a deployment Hikube measured. It runs on an on-premise cluster; the figures describe that case and are not a result the platform reproduces.
The case: an AI startup with three teams (Research, Production, Data Science), a GPU budget of CHF 25,000 a month, and heterogeneous needs. Infrastructure: an on-premise Kubernetes cluster with three node pools, 4× H100 80GB nodes (intensive training), 8× A100 80GB nodes (production inference and fine-tuning), 6× L40S 48GB nodes (dev/test and light inference).
Configuration deployed:
- Training pool (H100): exclusive GPUs, Volcano gang scheduling, quotas per team, Research 50% (2 nodes), Production 30%, Data Science 20%
- Production pool (A100): MIG 2× 3g.40gb plus 1× 1g.10gb per GPU, Kueue with strict quotas, latency SLA below 200 ms
- Dev pool (L40S): time-slicing with 8 replicas per GPU, no gang scheduling, best-effort QoS
Kueue quotas implemented:
ClusterQueue "production":
- Flavors: A100-MIG-3g40gb, A100-MIG-1g10gb
- Nominal quota: 12× 3g.40gb, 4× 1g.10gb
- Max per workload: 4× 3g.40gb
ClusterQueue "research":
- Flavors: H100-full
- Nominal quota: 16 full H100
- Max per workload: 8 H100 (gang scheduling)
- Borrowing: can borrow from "production" when idle
ClusterQueue "dev":
- Flavors: L40S-shared
- Nominal quota: 48 replicas (6 GPUs × 8 replicas)
- Max per workload: 2 replicas
- Preemption: can be preempted by priority queues
Results measured after three months:
- Overall GPU utilisation, 35% (baseline) → 72% (+106%)
- Training jobs succeeding first time, 62% → 94% (gang scheduling)
- Cost per inference, CHF 0.12 → CHF 0.05 (-58% through MIG and batching)
- Time-to-first-GPU for dev, 15 min → 30 sec (time-slicing removes the wait)
- Monthly saving, CHF 9,200 (37% of the initial budget)
The key lessons, gang scheduling eliminates 90% of distributed training failures, MIG in production halves inference cost against exclusive GPUs, time-slicing transforms the developer experience (waiting eliminated), and Kueue quotas avoid inter-team conflict while allowing intelligent borrowing.
In short, three key points
GPU orchestration needs specialised components beyond standard Kubernetes
Kubernetes does not natively treat GPUs as first-class resources. The complete architecture combines three essential layers: Device Plugin (exposes GPUs to the scheduler), GPU Operator (automates the NVIDIA software lifecycle), and specialised schedulers (KAI, Kueue, Volcano for gang scheduling, quotas, topology). The standard scheduler ignores GPU model, VRAM and network topology, producing sub-optimal placement and waste. GPU Operator cuts setup time from several days (manual installation on each node) to a few hours (automated Helm deployment). Advanced schedulers bring critical capabilities the default lacks: gang scheduling eliminates 90% of distributed training failures, hierarchical quotas with borrowing enable effective multi-tenancy, and topology-aware placement cuts network latency by 70-80% for multi-node workloads.
MIG and time-slicing answer distinct needs and are not interchangeable
MIG provides hardware isolation (dedicated VRAM, SM, cache) guaranteeing predictable performance and QoS, ideal for multi-tenant production under strict SLAs. Time-slicing multiplexes in software with no memory isolation, accepting contention and performance variability in exchange for finer granularity (16+ replicas against a maximum of 7 MIG instances) and universal compatibility (all NVIDIA GPUs against Ampere and Hopper only). Practical cases show a clear separation: production inference under SLA uses MIG (cost cut 50-60% against exclusive GPUs), dev/test uses time-slicing (GPU waiting eliminated, developer experience improved tenfold), intensive training stays on exclusive GPUs (maximum performance). Mixing the two in the same node pool without a documented strategy creates confusion and operational overhead. The correct decision: define dedicated node pools with a clear strategy, and force users to select explicitly through nodeSelector.
Gang scheduling and intelligent quotas transform cluster efficiency
Gang scheduling guarantees atomicity, all pods of a distributed job scheduled simultaneously or none, eliminating deadlocks where partial pods hold GPUs while waiting indefinitely for the missing ones. Without gang scheduling, 20-40% of training jobs fail while wasting GPUs (Uber benchmarks). Kueue and Volcano implement gang scheduling through PodGroups with quotas configurable per team and borrowing between queues: a guaranteed nominal quota, with the option to borrow idle quota from other teams according to configured policies. The illustrative scenario below quantifies the impact: GPU utilisation up 106% (35% to 72%), job success rate up 52% (62% to 94%), inference cost down 58%, ROI in three months. The initial investment (1-2 weeks of engineering to deploy Kueue or Volcano, configure quotas and document) pays back in under two months through GPU savings and reduced friction between teams.
Ready to run on 100% Swiss infrastructure?
14-day trial, no credit card. GPUs included.