Memory-Enforced GPU Sharing in Kubernetes with NVIDIA CUDA 13.4 NVIDIA's CUDA 13.4 adds a memory-enforcement boundary to Multi-Process Service, letting each workload see and be capped at a fraction of GPU memory under a new time-sharing mode alongside the existing sm-sharing compute mode. A new open-source Kubernetes operator, gpu-fractioning, hosted under the KAI Scheduler organization on GitHub, runs alongside the NVIDIA GPU Operator to set up MPS on every GPU node, apply each container's memory limits and compute mode from Pod annotations, and measure memory and compute use per fraction rather than per GPU. KAI Scheduler is the first scheduler integrated with gpu-fractioning, offering a GPU-sharing mode called NvFractions starting with v0.18.0. Many AI workloads need only a fraction of a GPU. Giving each one an entire device can leave capacity idle; sharing GPUs lets platform teams serve more workloads with the infrastructure they already have. NVIDIA GPUs already support several approaches to sharing. Multi-instance GPU MIG splits a GPU into hardware-isolated instances that are transparent to the application, time-slicing lets several processes take turns without memory enforcement, and Multi-Process Service https://docs.nvidia.com/deploy/mps/latest/index.html MPS lets them run concurrently in separate address spaces sm-sharing . CUDA 13.4 now enforces a memory boundary that is transparent to the application with a new time-sharing mode, alongside the compute sharing mode sm-sharing that already existed in MPS. Here is what the CUDA release https://developer.nvidia.com/cuda-downloads brings: - An exact memory amount: A workload asks for a memory size and CUDA holds it there. An allocation above that size fails, just as it would on a smaller GPU. - A range: A workload gets a guaranteed minimum plus a maximum it can grow into when memory is free. - A compute mode: Each workload can choose to use its compute in an sm-sharing mode rather than using the default time-sharing mode. - A transparent memory limit: Each workload sees only a fraction of the GPU memory. The missing piece: Getting there from Kubernetes CUDA provides the memory enforcement capability, but a Kubernetes cluster can’t use it on its own. On every GPU node, something has to: - Run and supervise the daemons that these features depend on - Apply each Pod container’s memory limits and compute mode before the process starts - Report what each fraction actually uses, rather than what the whole GPU uses This work belongs on the node, independent of whichever scheduler placed the workload. GPU fractioning: An open-source Kubernetes operator A new open-source Kubernetes operator, gpu-fractioning https://github.com/kai-scheduler/gpu-fractioning , is hosted under the KAI Scheduler https://github.com/kai-scheduler/KAI-scheduler readme organization on GitHub. It runs next to the NVIDIA GPU Operator, https://github.com/NVIDIA/gpu-operator readme which provides the driver and the container runtime setup. GPU Fractioning Operator handles three jobs: - It sets up and runs MPS on every GPU node. - It applies each workload’s memory limits and compute mode. - It measures memory and compute use per fraction rather than per GPU. How schedulers pass GPU allocations to the operator The developers write the resource and mode annotations in the pod YAML. Then the scheduler selects the GPUs for a workload and records its memory allocation and compute-sharing mode in per-container Pod annotations. GPU Fractioning Operator reads those annotations and configures the assigned GPUs to apply the workload’s memory limits and compute mode: | Annotation | Meaning | |---|---| | nvidia.com/container.