Skip to content
NewFinOps, Kubernetes and AI, on one platform
Book a demo

KubeOn GPU

Every GPU busy, shared or switched off

KubeOn GPU measures every GPU-hour, then its opt-in optimizer acts on what it finds: MIG and time-slicing for workloads that need part of a card, GPU nodes that scale and pack with demand, burst capacity from other regions, clouds or your data center, and idle GPUs scaled to zero. Each policy runs as a proposal, with an approval, or automatically within limits you set.

The problem

Allocated is not used

GPUs are the fastest-growing line on many cloud bills, and published research on shared clusters shows how much of that capacity sits idle or barely busy.

Read the research on idle GPUs

14%

of EC2 compute spend went to GPU instances across Datadog's customers, up from 10% a year earlier

Datadog, State of Cloud Costs 2024

~52%

average utilization of the GPUs in use in a large multi-tenant training cluster at Microsoft

Jeon et al., USENIX ATC 2019

0.042

of a GPU: the median task's use in Alibaba's production cluster of over 6,000 GPUs

Weng et al., USENIX NSDI 2022

74% / 18%

of GPUs allocated, against average GPU utilization, on one group of Alibaba machines

Weng et al., USENIX NSDI 2022

The optimizer

Four ways it puts GPUs to work

Step through each one on sample clusters: what the optimizer saw, what it did, and what it logged.

Whole GPUs, barely used

  • dc1-gpu-07embed-svc6%
  • dc1-gpu-08classify-svc9%
  • dc1-gpu-09ocr-svc5%

GPU optimizer

Policy dc1-mig, Approve mode

  1. 1Find GPUs under 10%
  2. 2Choose the slice that fits
  3. 3Wait for your approval
  4. 4Repartition in the change window

After

  • dc1-gpu-07Three services on MIG slicesShared
  • dc1-gpu-08Back in the poolFree
  • dc1-gpu-09Back in the poolFree
  • SavedTwo A100s at the rate card-$1,723/mo
Figures are from a sample company. The repartition waits for a reviewer, then runs in the Saturday change window.

Control

You choose how far each policy goes

Every policy starts as a proposal. Move it to Approve, then Automatic, when its proposals have earned your trust.

  • Installed only in clusters you choose, as its own Helm release, separate from the read-only agent
  • Acts only on the node pools and namespaces a policy names; everything else is out of reach
  • Hard limits per policy: minimum and maximum nodes, monthly cost, GPU-hour price
  • Disruptive steps such as drains and repartitions run only in the policy's change window
  • Evicts through the Eviction API, so PodDisruptionBudgets are always respected
  • No access to Secrets or ConfigMaps outside the GPU Operator config it manages
  • Pulls policies and approvals from the hub over HTTPS; the hub never connects into your cluster
  • Every action in the audit log with the policy that allowed it, and a one-click revert where the change can be undone

Mode 1

Recommend · A proposal, nothing else

The optimizer writes the change as a proposal with its evidence and patch. Your pipeline applies it, like other KubeOn proposals. Every policy starts here.

Mode 2

Approve · Approve once, the optimizer applies

Each change waits for a named reviewer. Once approved, the optimizer applies it in the policy's change window and records the outcome.

Mode 3

Automatic · Acts within the limits you set

The optimizer acts on its own, but only on the node pools and namespaces the policy names, within its node, cost and time limits.

Where the GPU savings are

52%

average use of the GPUs in a large Microsoft training cluster

Jeon et al., USENIX ATC 2019
18%

average GPU use on Alibaba machines with 74% of GPUs allocated

Weng et al., USENIX NSDI 2022
$8,433/mo

saved by removing one GPU node after the peak at our sample company

Sample company, not a customer result

KubeOn GPU modules

Five areas, one GPU optimizer

Part of KubeOn

GPU sharing

MIG partitions and time-slicing, applied for workloads that use part of a GPU

GPU autoscaling

GPU nodes added on demand, spot first, packed tight and scaled to zero when idle

GPU burst

GPUs from other regions, clouds or your data center when the home region runs out

GPU cost and utilization

GPU node cost by team, idle GPU time and real utilization

GPU data centers

GPU-hour rates for servers you own, shared and used before you buy more

Where it works

Cloud GPUs and the ones you own

Cloud GPUs are priced from your billing export, owned GPUs from a rate card. The optimizer drives Karpenter or your cloud's node groups and the NVIDIA GPU Operator, and reports every action to KubeOn.

GPU data centers
  • Amazon EKS
  • Azure Kubernetes Service
  • Google Kubernetes Engine
  • Red Hat OpenShift
  • Kubernetes on VMware or bare metal
  • NVIDIA GPU Operator and device plugin
  • NVIDIA DCGM exporter
  • Karpenter and managed node groups

Published permissions

What the optimizer may change, in the open

The optimizer is the only KubeOn component with write access, and only in clusters where you install it. Its ClusterRole is published here and on the security page, so your security team can review it first. It never reads Secrets.

Security and trust center
GPU optimizer ClusterRole
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: kubeon-gpu-optimizerrules:  # Read what it optimizes  - apiGroups: [""]    resources: [nodes, pods, namespaces]    verbs: [get, list, watch]  - apiGroups: [apps]    resources: [deployments, statefulsets, replicasets]    verbs: [get, list, watch]  - apiGroups: [policy]    resources: [poddisruptionbudgets]    verbs: [get, list, watch]  # Label, taint and cordon GPU nodes; drain through the Eviction API  - apiGroups: [""]    resources: [nodes]    verbs: [patch]  - apiGroups: [""]    resources: [pods/eviction]    verbs: [create]  # Add and remove GPU capacity through Karpenter  - apiGroups: [karpenter.sh]    resources: [nodepools, nodeclaims]    verbs: [get, list, watch, create, patch, delete]  # Its own policies, synced from the hub, and their status  - apiGroups: [gpu.kubeon.io]    resources: [gpupolicies, gpupolicies/status]    verbs: [get, list, watch, create, update, patch, delete]---# Created only in namespaces named by a ScaleToZero policykind: Rolerules:  - apiGroups: [apps]    resources: [deployments/scale, statefulsets/scale]    verbs: [get, patch]---# In the gpu-operator namespace, for time-slicing onlykind: Rolerules:  - apiGroups: [""]    resources: [configmaps]    resourceNames: [time-slicing-config]    verbs: [get, patch]

KubeOn GPU: your questions answered

See what KubeOn GPU does for your fleet.

Tell us about your GPU fleet and we will plan the rollout with you, starting with what the optimizer would propose.