Gpu for llm workloads reference
LLM workloads are not "regular workloads that happen to need more RAM." They are memory-bandwidth-bound during decode, compute-bound during prefill, and topology-bound the moment a model can't fit on one GPU. The hardware spec sheet, the VM config, the container runtime, the Kubernetes device plugin, and the multi-GPU pattern you pick are all the same decision at different layers. Get one wrong and the others stop mattering.
This is a reference for the whole stack — from the HBM3e bandwidth of a Blackwell GPU to the nvidia.com/gpu resource advertised by a DaemonSet to the tensor-parallel group size that decides whether your 70B model serves or stalls. Every number is verified against a primary source, dated 2026-06-16.
Glossary¶
The post is dense. If a term below trips you up, jump back here.
Hardware & memory
- VRAM — video RAM on the GPU. Model weights and KV cache live here. Larger is better.
- HBM, HBM2e, HBM3, HBM3e — High-Bandwidth Memory. Stacked DRAM that sits next to the GPU die, giving 1–8 TB/s bandwidth. Each generation roughly doubles the bandwidth. HBM3e (used on H200, B200) is the current top tier.
- GDDR6, GDDR7 — cheaper, more common graphics memory. Lower bandwidth per GB than HBM but cheaper to make and available in larger capacities. L40S = GDDR6; RTX PRO 6000 = GDDR7.
- FP8 / FP16 / FP4 / BF16 / TF32 — numeric precisions. Lower = less memory, faster math, slightly less accurate. FP8 is the new norm for LLM inference (vs FP16) because it halves memory traffic and doubles tensor-core throughput. FP4 is Blackwell-only.
- TDP — Thermal Design Power, the watts a GPU draws at full load. 350W = air-cooled in a normal rack; 1000W+ = needs liquid cooling.
- NVLink — NVIDIA's proprietary GPU-to-GPU interconnect (900 GB/s on Hopper, 1.8 TB/s on Blackwell). Faster than PCIe but only between NVIDIA GPUs.
- NVSwitch — the chip that ties 8 NVLink GPUs into a fully connected fabric (e.g. inside an HGX H100 baseboard).
- PCIe — the standard slot your GPU plugs into. PCIe Gen5 = 128 GB/s. 8–10× slower than NVLink, which is why data center GPUs use SXM/NVLink instead.
- SXM vs PCIe — SXM is a mezzanine connector with more pins, more NVLink lanes, and higher TDP budget. PCIe is the standard slot.
LLM-specific
- Prefill — the "read the prompt" phase. Compute-bound, parallelizes well.
- Decode — the "generate token by token" phase. Memory-bandwidth-bound, hard to parallelize.
- KV cache — the running memory of attention keys/values. Grows with context length × batch size. Must fit in VRAM alongside weights, or inference falls apart.
- PagedAttention — vLLM's technique for managing KV cache in non-contiguous memory pages, like OS virtual memory. Lets you serve many requests with one model.
- MoE (Mixture of Experts) — an architecture where only some of the model's "experts" run per token. Qwen3-Coder-30B-A3B has 30B total params but only 3B active per token. Saves compute, costs memory.
- Tensor-parallel (TP), Pipeline-parallel (PP), Data-parallel (DP), Expert-parallel (EP) — ways to split one model across many GPUs. §7 covers them in detail.
Virtualization & sharing
- VFIO passthrough — VM-level direct GPU access via IOMMU. Highest performance, no hypervisor in the data path. Different from K8s "passthrough" — see §6.
- IOMMU — Input/Output Memory Management Unit. The hardware feature that makes VFIO passthrough possible (AMD = AMD-Vi, Intel = VT-d).
- MIG (Multi-Instance GPU) — hardware partition of a single GPU into 2–7 fully isolated instances, each with its own SMs and memory. A100/H100/H200/B200/RTX PRO 6000 only. L40S does not support MIG.
- vGPU — licensed NVIDIA product that gives a VM a fraction of a physical GPU with hardware isolation. Costs ~$1K+/GPU/year. Supported on L40S, A100, RTX PRO 6000.
- Time-slicing — software-only GPU sharing. Multiple pods take turns in 1ms slices. No isolation. Free.
- CUDA MPS — Multi-Process Service. One CUDA context shared by multiple processes.
- SR-IOV — Single Root I/O Virtualization. Hardware-isolated virtual functions of a PCIe device. AMD MI300X supports it; NVIDIA does not.
- vGPU (re-stated for cross-link) — see above.
Containers & Kubernetes
- OCI runtime — the low-level component that actually creates a container (e.g.
runc,crun,nvidia-container-runtime). Distinct from containerd/Docker, which are higher-level. - CDI (Container Device Interface) — a CNCF spec for how to expose devices (GPUs, NICs) to containers. The modern path; replaces the legacy
NVIDIA_VISIBLE_DEVICESenv-var approach. - Pod — the smallest deployable unit in K8s. Usually one container, sometimes a few tightly-coupled ones.
- DaemonSet — a K8s controller that runs one pod per node. GPU Operator's components all run as DaemonSets.
- kubelet — the K8s agent on each node. Calls the device plugin's
AllocateRPC when a pod needs a GPU. - Helm — a package manager for K8s. The GPU Operator is installed via
helm install. - Operator — a K8s pattern where a controller watches custom resources (CRDs) and reconciles them. GPU Operator, Karpenter, Kubeflow Trainer are all Operators.
- Device plugin — a K8s framework for advertising specialized hardware (GPUs, FPGAs, NICs) as schedulable resources. The NVIDIA device plugin registers
nvidia.com/gpu. - DRA (Dynamic Resource Allocation) — the K8s 1.30+ replacement for device plugins. Uses
ResourceClaimobjects that describe what a pod needs (e.g. "H100 with ≥80GB"); a DRA driver matches. Beta default-on in K8s 1.36, use 1.36.2+ to avoid a double-allocation bug. - ResourceClaim / ResourceSlice / DeviceClass — the DRA primitives.
ResourceClaimis per-pod,ResourceSlicedescribes a device pool,DeviceClassis a class of device. - ComputeDomain — a DRA abstraction for Multi-Node NVLink. The NVIDIA DRA driver uses it to make a 72-GPU NVL72 act as one scheduling unit.
- Karpenter — a K8s node provisioner. Faster than Cluster Autoscaler, the right answer for GPU nodes.
- Multus CNI — a CNI plugin that lets a pod have multiple network interfaces (e.g. one normal, one RDMA fabric).
- SR-IOV CNI — CNI for binding SR-IOV virtual functions into pods.
- DCGM — NVIDIA Data Center GPU Manager. The library that exposes GPU metrics (temperature, util, ECC errors, XID codes).
- Prometheus — the time-series database that scrapes those DCGM metrics.
- NCCL — NVIDIA's collective communication library (all-reduce, all-gather, etc.). What PyTorch uses under the hood for distributed training.
- InfiniBand / RoCE — high-speed network fabrics. InfiniBand = dedicated, lower latency. RoCE = RDMA over Converged Ethernet, cheaper.
- RDMA — Remote Direct Memory Access. Lets a NIC read/write GPU memory directly, bypassing the CPU. Required for multi-node training.
1. What "GPU for LLM" actually means¶
The first-order metrics for sizing LLM infrastructure are not the same as for training a vision model or running a database:
- VRAM capacity — model weights + KV cache must fit, or you page to host RAM / NVMe, which adds 10–100× latency.
- HBM bandwidth — drives decode throughput (tokens/sec/user) once weights are loaded. For a 70B model on H100 SXM, decode is 100% memory-bandwidth-bound.
- Inter-GPU bandwidth (NVLink) — drives tensor-parallel efficiency. Below ~600 GB/s aggregate all-to-all, TP scaling collapses.
- FP8/FP4 tensor throughput — doubles FP16 throughput on Hopper/Blackwell; critical for serving at scale.
- Host-to-GPU link (PCIe / NVLink-C2C) — matters for model loading, not for steady-state inference.
The math: a 70B model in FP16 needs ~140 GB just for weights. The H100 NVL ships 94 GB specifically because it needed to fit Llama-2-70B FP16 with a usable KV cache. The H200's 141 GB is the response to "we want one GPU, not two, for inference of 70B-class models."
The bandwidth plateau: H100 SXM = 3.35 TB/s. H200 SXM = 4.8 TB/s. B200 SXM ≈ 8 TB/s per GPU. The per-generation gain in memory bandwidth is real but smaller than the FLOPS gain — which is why FP8 and FP4 matter: you do the same memory work in less time.
2. Physical layer: the silicon¶
2.1 NVIDIA line-up (June 2026)¶
All spec numbers verified against NVIDIA's .md mirror on nvidia.com (2026-06-16).12202122345
| GPU | Arch | VRAM | Mem bw | FP8 Tensor (sparse) | FP4 Tensor (sparse) | NVLink | TDP | MIG |
|---|---|---|---|---|---|---|---|---|
| A100 80GB SXM (Ampere, 2020) | Ampere | 80 GB HBM2e | 2.04 TB/s | 1,248 TOPS INT8 | — | 600 GB/s | 400W | 7×10GB |
| A100 80GB PCIe | Ampere | 80 GB HBM2e | 1.94 TB/s | 624 TOPS INT8 | — | NVLink Bridge 600 GB/s | 300W | 7×10GB |
| L40S (Ada, 2023) | Ada Lovelace | 48 GB GDDR6 | 864 GB/s | 1,466 TFLOPS | — | none (PCIe only) | 350W | none |
| H100 SXM 80GB | Hopper | 80 GB HBM3 | 3.35 TB/s | 3,958 TFLOPS | — | 900 GB/s | 700W | 7×10GB |
| H100 NVL 94GB | Hopper | 94 GB HBM3 | 3.9 TB/s | 3,341 TFLOPS | — | 600 GB/s | 350–400W | 7×12GB |
| H200 SXM | Hopper | 141 GB HBM3e | 4.8 TB/s | 3,958 TFLOPS | — | 900 GB/s | 700W | 7 instances |
| B200 SXM (HGX, per-GPU) | Blackwell | (per-GPU) | ~8 TB/s | 9 PFLOPS | 18 PFLOPS | 1.8 TB/s | ~1000W | 7×21/23GB |
| RTX PRO 6000 BSE (2026) | Blackwell | 96 GB GDDR7 | 1.6 TB/s | 2 PFLOPS | 4 PFLOPS | none (PCIe Gen5) | 600W | 4 instances |
| GB200 superchip | Blackwell | 372 GB HBM3e | 16 TB/s | 20 PFLOPS | 40 PFLOPS | 3.6 TB/s | per-superchip | 7×23/93GB |
| GB300 NVL72 (rack) | Blackwell Ultra | 13.4 TB HBM3e | 576 TB/s total | 720 PFLOPS | 1,440 PFLOPS | 130 TB/s | liquid | 7×34GB per GPU |
| Rubin SXM (HGX) | Rubin | 288 GB HBM4 | 22 TB/s per GPU | 17.5 PFLOPS | 50 PFLOPS | 3.6 TB/s per GPU | n/a | yes |
Three things this table tells you:
- Memory bandwidth is the actual ceiling. A100 = 2.04 TB/s, H100 SXM = 3.35 TB/s, H200 = 4.8 TB/s, B200 ≈ 8 TB/s. The +43% from H100 → H200 was the single biggest change in two years. FP8/FP4 exist because we can't make HBM faster.
- HBM is not the only memory type. A100, H100, H200, B200, GB200 all use HBM (or HBM2e/HBM3/HBM3e). L40S uses GDDR6 (cheaper, 1/4 the bandwidth per GB) — fine for batch=1 inference of 7B models, but decode throughput on 30B+ models is bandwidth-bound. RTX PRO 6000 uses GDDR7 — a 2026 hybrid: 96 GB capacity close to H200's 141 GB, at 1.6 TB/s bandwidth (between H100 and H200). The trade-off is real: GDDR7 capacity scales cheaper than HBM3e, but you pay in bandwidth.
- NVLink is the gating factor for multi-GPU. 600 GB/s (A100) is the floor. 900 GB/s (H100/H200) is fine for TP8. 1.8 TB/s (Blackwell) unlocks larger TP domains. L40S and RTX PRO 6000 have no NVLink at all — they are PCIe-only single-GPU cards. Multi-GPU on those platforms is InfiniBand or Ethernet only.
- TDP jumped. A100 SXM = 400W. H100 SXM = 700W. B200 SXM ≈ 1kW. GB300 NVL72 is fully liquid-cooled. L40S = 350W (air-cooled in a standard 4U server). RTX PRO 6000 = 600W (air or liquid).
- MIG isn't universal. H100, H200, B200, GB200, RTX PRO 6000 (up to 4 instances), and A100 support MIG. L40S does not — use time-slicing or vGPU instead.
2.2 What changed Blackwell (2024 → 2026)¶
Verified against the Blackwell architecture page.3
| Innovation | What it does | LLM relevance |
|---|---|---|
| Two-die GPU | 208B transistors, TSMC 4NP, 10 TB/s chip-to-chip interconnect | A "B200" is effectively two GPUs fused; doubles SMs and HBM channels while exposing as one device to CUDA |
| 2nd-gen Transformer Engine | Adds NVFP4 with micro-tensor scaling | 2× model size in same VRAM (with measured accuracy loss); 2× decode vs FP8 |
| 5th-gen NVLink | 1.8 TB/s per GPU, 130 TB/s aggregate in NVL72 | One rack-scale NVLink domain — trillion-param inference becomes tractable |
| Decompression Engine | LZ4/Snappy/Deflate in hardware | Not LLM-direct; helps data pipelines |
| RAS Engine | Predictive failure detection | Important at scale: catches failing memory before crash |
| TEE-I/O confidential computing | Encrypted GPU-to-GPU data | First GPU to protect model IP during multi-tenant serving |
One vendor claim to treat with skepticism: NVIDIA's "30× faster real-time trillion-param inference vs H100" for GB200 NVL72 is from a specific workload (1.8T MoE, FTL=5s) and only achievable inside the NVL72 domain. On a 8×B200 HGX, the speedup over 8×H100 is more like 5–8× for typical 70B-class workloads. Marketing numbers are real but not universally applicable.
2.3 AMD Instinct line-up (CDNA 3 / 4)¶
Verified against AMD's MI300X spec sheet via Wikipedia cross-reference.9
| GPU | Architecture | VRAM | HBM bw | FP16 Tensor (sparse) | FP4 Tensor | TDP |
|---|---|---|---|---|---|---|
| MI300X | CDNA 3 | 192 GB HBM3 | 5.3 TB/s | 2,614.9 TFLOPS | (no native FP4) | 750W |
| MI325X | CDNA 3 | 256 GB HBM3e | 6.0 TB/s | similar | — | ~750W |
| MI350X | CDNA 4 | 288 GB HBM3e | 8.0 TB/s | 4,613.8 TFLOPS | yes (up to 9.2 PFLOPS) | 1000W |
| MI355X | CDNA 4 | 288 GB HBM3e | 8.0 TB/s | 5,033.2 TFLOPS | 9.2 PFLOPS | 1400W |
The MI300X's killer feature is the 192 GB HBM3. That's why it became the de-facto "run a 70B model in FP16 on one GPU" chip in 2024 — the H100's 80 GB couldn't. The trade-off: ROCm software maturity still trails CUDA by ~6 months. vLLM runs on ROCm but feature parity lags.
CDNA 4 (MI350X, June 2025) is AMD's first accelerator with native FP4 — and on the MI355X, that's 9.2 PFLOPS of FP4 (sparse). Same conversation as Blackwell B200 on raw compute; software ecosystem question remains.
2.4 The interconnect constraint¶
LLM serving has two distinct network planes:
| Plane | Within node | Between nodes |
|---|---|---|
| Use case | Tensor-parallel, pipeline-parallel at small scale | Pipeline-parallel, data-parallel, MoE-expert routing at large scale |
| Bandwidth needed | 600 GB/s+ for TP8, 900 GB/s+ for TP16+ | 200–400 Gbps per GPU typical (NDR400 IB) |
| Technology | NVLink, NVSwitch, Infinity Fabric | NDR400 InfiniBand, Spectrum-X 800 GbE, RoCE |
The hard rule: tensor-parallel only works within a single NVLink domain. If you need 16 GPUs in one TP group, they must be in one server (or one NVL72 rack). Crossing to InfiniBand forces pipeline-parallel or data-parallel. A "pool of GPUs" is therefore not uniform — see §7 for the practical impact.
Hopper's DGX GH200 supported 256 H100s in a single NVLink domain (57.6 TB/s all-to-all). Blackwell NVL72 does 72 B200s in one domain with 130 TB/s. Rubin is targeting 576 GPUs in one NVLink domain.
3. Virtualization layer: passing GPUs to VMs¶
3.1 GPU passthrough (VFIO/IOMMU)¶
The hypervisor exposes the PCIe device to the guest; the guest loads the NVIDIA driver directly; CUDA calls run as if on bare metal. Highest-performance GPU virtualization option. Standard for enterprise LLM VMs.
Five gotchas that will bite you:
- Reset bug. NVIDIA consumer GeForce cards do not support function-level reset (FLR) on most PCIe root complexes. After VM shutdown, the GPU is stuck in a bad state and the host can't reclaim it. Workarounds: vendor-reset kernel module for older cards, or H100/A100 data center SKUs which do support reset. For Hopper/Blackwell data center parts this is a non-issue; for any GeForce/RTX card in passthrough, it is.
- MIG + passthrough is unsupported. MIG instances are hardware partitions; you can't pass a single MIG instance to a VM via VFIO. If you need MIG isolation, configure it at the host level (Kubernetes device plugin MIG mode) and expose to a container, not a VM.
- vGPU vs passthrough. vGPU (NVIDIA's licensed product, §3.2) supports MIG-like time-slicing with hypervisor integration, and can give a fraction of a MIG to a VM. For LLM inference in a multi-tenant cloud, this is the standard play.
- Memory-mapped I/O regions. Modern GPUs have BARs > 4 GB. You need UEFI/BIOS with
Above 4G Decodingenabled, and the kernel booted withiommu=on. Some Hyper-V and older VMware versions don't support 64-bit BARs. - Confidential computing on GPUs is a 2025+ story. Hopper introduced TEE-mode; Blackwell added TEE-I/O (encryption between GPUs). For VMs this means the guest can use the GPU without the hypervisor seeing plaintext, but the implementation only works on bare metal (no hypervisor in the data path) with specific driver versions.6
3.2 The six ways to share a GPU¶
| Mechanism | Isolation | Perf overhead | LLM use case | Licensing |
|---|---|---|---|---|
| Passthrough (VFIO) | Full — VM has the whole GPU | 0% | Dedicated LLM serving VM; high-perf training | None |
| MIG (Multi-Instance GPU) | Hardware-isolated partition | ~2-5% | Multi-tenant inference with QoS | Free (on supported SKUs) |
| vGPU (licensed) | Hardware+software partition | ~5-10% | Enterprise VDI + AI; CSP per-GPU-hour pricing | Per-GPU/year subscription |
| Time-slicing (CUDA) | None — SM time-multiplexed | Variable, up to 50% under contention | Dev/test, batch inference with low utilization | Free |
| CUDA MPS | Process-level parallelism | ~5% | Multi-process serving where each process is one model | Free |
| SR-IOV | Hardware-isolated virtual functions | Near-zero | AMD MI300X supports it; NVIDIA does not | Free (AMD); not available on NVIDIA |
3.3 The MIG profile table that matters¶
Verified against NVIDIA's MIG tech page (2026-06-16).78
| GPU | Smallest profile | Mid | Large | Largest (1× full) | Notes |
|---|---|---|---|---|---|
| A100 40GB | 1g.5gb | 2g.10gb | 3g.20gb | 40 GB (no MIG) | Original MIG; smallest profile has only 5 GB |
| A100 80GB | 1g.10gb | 3g.40gb | 4g.40gb | 80 GB | Doubled MIG slice size from 40GB variant |
| L40S | — | — | — | 48 GB (no MIG) | No MIG support. Use time-slicing or vGPU instead |
| H100 SXM | 1g.10gb | 3g.40gb | 4g.40gb | 80 GB (no MIG) | 2nd-gen MIG, lower overhead than A100 |
| H100 NVL | 1g.12gb | 3g.48gb | 4g.48gb | 94 GB | Slightly larger mem per instance |
| HGX B200 | 1g.21gb | 4g.90gb | 2g.90gb | 180 GB | 7×21 / 4×45 / 2×90 / 1×180 GB |
| HGX B300 (Ultra) | 1g.32gb | 4g.135gb | 2g.135gb | 270 GB | 7×32 / 4×67 / 2×135 / 1×270 GB |
| RTX PRO 6000 BSE | 1g.24gb | 2g.48gb | 4g.96gb | 96 GB | Up to 4 instances (not 7) — Blackwell adds a 4g profile |
| GB200 NVL72 | 1g.23gb | 4g.93gb | 2g.93gb | 186 GB | 7×23 / 4×46 / 2×93 / 1×186 GB |
The "g" suffix is the compute slice; the GB suffix is the memory slice. You can't mix 1g and 3g on the same GPU unless using mig.config to specify a heterogeneous layout (supported on A100+).
For LLM inference: the 1g.10gb profile on H100 is useless for production LLM. Even a 7B model in FP16 with KV cache wants ~20 GB. The 3g.40gb profile is the practical minimum for serving a 7B/13B model with reasonable batch. The 4g.40gb profile is the workhorse for multi-tenant LLM serving.
A common mistake: enabling MIG on H100 and trying to use 1g.10gb for Llama-7B. You'll OOM on KV cache within seconds under any real load.
3.4 Bare metal vs VM for LLM serving¶
Most production LLM serving shops run bare metal: - Latency: no hypervisor context-switch overhead - Full memory: VM ballooning or KSM can interfere with CUDA's huge-page allocation - MIG is easier to configure at the host - vGPU license cost: ~$1,000+ per GPU per year
VMs are common in: - Enterprise on-prem where IT mandates virtualization - Multi-tenant clouds where each tenant must be in its own VM (security/compliance) - GPU-sharing scenarios where vGPU's licensing model is more flexible than MIG - Mainstream enterprise deployments on L40S or RTX PRO 6000 — both have first-class vGPU support and are the de-facto "VDI + AI" cards for non-cloud deployments2122
3.5 GPUDirect RDMA (for multi-node training)¶
NCCL uses GPUDirect RDMA to send GPU memory directly to a remote NIC without bouncing through host CPU. Requires:
- RDMA-capable NIC (ConnectX-6/7/8, BlueField-3)
- Peer-to-peer driver (nvidia-peermem, Mellanox peer memory)
- NCCL with
NCCL_IB_HCAandNCCL_SOCKET_IFNAMEproperly set - InfiniBand or RoCE fabric
In K8s this needs Multus CNI to attach the RDMA NIC as a secondary interface, plus SR-IOV CNI or host-device CNI. The classic gotcha: NCCL on a default K8s pod cannot see IB devices — the IB userspace drivers must be in the container image AND the pod needs access to the device files. This is one of the top reasons "training on K8s is hard."
4. Container layer: what nvidia.com/gpu: 1 actually means¶
4.1 The OCI hook chain¶
When you run a container with --gpus all (Docker) or nvidia.com/gpu: 1 (K8s):
- NVIDIA Container Runtime (
nvidia-container-runtime) intercepts the container create request. It's an OCI runtime, not a high-level runtime. - The runtime invokes the prestart hook
nvidia-container-cli. nvidia-container-cliqueries GPU(s) on the host via NVML, looks up the requested devices, generates a CDI (Container Device Interface) spec or a set of bind mounts + env vars.- The container is created with:
- NVIDIA driver files bind-mounted from the host (
/usr/lib/x86_64-linux-gnu/libcuda.so.*, etc.) - CUDA libraries injected
- GPU device files passed through (
/dev/nvidia0,/dev/nvidiactl,/dev/nvidia-uvm,/dev/nvidia-uvm-tools) NVIDIA_VISIBLE_DEVICESset in env
Inside the container, the process sees a normal Linux system with a working CUDA stack. It cannot tell it isn't bare metal.
Source: NVIDIA device plugin README and Container Toolkit install guide.1011
4.2 Two ways to expose devices¶
Legacy NVIDIA_VISIBLE_DEVICES env var: - The runtime sets NVIDIA_VISIBLE_DEVICES=0,1 in the container - The runtime generates a CDI spec at runtime that includes the corresponding devices - Same as the --gpus device=0,1 Docker syntax
CDI (Container Device Interface) — newer, CNCF-incubating: - The operator runs nvidia-ctk cdi generate on the host to produce a CDI spec file in /etc/cdi/ - The container runtime reads the CDI spec and applies it - More structured, supports any device (not just NVIDIA), the direction the K8s ecosystem is moving
The k8s-device-plugin v0.19.x supports both. For new deployments, the recommendation is CDI — but legacy mode still works.12
4.3 What you need on the host¶
For a container to use a GPU, the host must have:
- NVIDIA kernel driver (
nvidia.ko,nvidia-uvm.ko,nvidia-modeset.ko) - NVIDIA userspace driver (libcuda.so, libnvidia-*.so)
- nvidia-container-toolkit (provides the OCI hook)
- containerd/CRI-O/Docker configured to use
nvidia-container-runtime(either as default or via RuntimeClass) - The GPU device files (
/dev/nvidia*)
If you build the host with a custom AMI that bakes all this in, you're done. If you want a generic OS image and let K8s manage it, you want the GPU Operator (§5.2).
5. Kubernetes layer: the practical reality¶
5.1 The device plugin model (legacy, still dominant in 2026)¶
The nvidia-device-plugin (k8s-device-plugin) runs as a DaemonSet on GPU nodes.10 Latest: v0.19.2 (released 2026-05-27).
Flow: 1. Plugin queries nvidia-smi on startup to count GPUs (and MIG instances if MIG mode is enabled) 2. Registers GPUs with kubelet as extended resources: nvidia.com/gpu=N (or nvidia.com/mig-1g.5gb=N) 3. Pods request GPUs with resources.limits.nvidia.com/gpu: 1 4. Kubelet calls the plugin's Allocate RPC during admission 5. Kubelet passes device IDs to the container runtime, which invokes nvidia-container-cli with NVIDIA_VISIBLE_DEVICES=<those ids>
What it does NOT do well: - Health checking: the plugin only knows "GPU was there at registration time." If a GPU dies, the pod keeps running with a missing device. - Cleanup: if a pod is killed ungracefully, the GPU may stay "allocated" until the kubelet restarts the plugin. - Heterogeneous allocation: nvidia.com/gpu: 2 works, but you can't say "give me 80GB of memory and 200 GB/s of bandwidth from any of these 3 GPU types."
DRA (§5.3) was designed to address these gaps.
5.2 GPU Operator: the full stack¶
If you want the "just works" path, install the GPU Operator. Latest: v26.3.2 (released 2026-05-29).13
It manages the entire stack as Kubernetes objects:
| Component | Version (in Operator 26.3.2) | What it does |
|---|---|---|
| NVIDIA Driver | (driver container per K8s version) | The kernel-mode driver, in a DaemonSet |
| NVIDIA Container Toolkit | v1.19.1 | OCI hook + CDI generator |
| NVIDIA Device Plugin | v0.19.2 | Advertises nvidia.com/gpu resources |
| GPU Feature Discovery | v0.19.2 | Labels nodes with GPU type, count, MIG profile |
| MIG Manager | v0.14.2 | Configures MIG partitions on Ampere+ GPUs |
| DCGM Exporter | v4.5.3-4.8.2 | Prometheus metrics on port 9400 |
| Node Feature Discovery | (NFD) | Detects CPU/memory/kernel features |
| (optional) KubeVirt | — | For VM workloads on GPU nodes |
What's new in v26.3.2 (verified against release notes): - Kubernetes 1.36 support added - NRI Plugin support for CRI-O 1.34+ - DCGM Exporter can include pod labels/UIDs in metrics (high-cardinality risk: set podLabelAllowlistRegex!) - Custom annotations on DCGM Exporter DaemonSet - DRA driver is on the roadmap, not yet integrated
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install --wait --generate-name \
-n gpu-operator --create-namespace \
nvidia/gpu-operator \
--set driver.enabled=true
Why the GPU Operator is required for Karpenter GPU nodes: a Karpenter-provisioned p5.48xlarge is, at boot, a stock AWS AMI with no NVIDIA driver, no container toolkit, no device plugin. The pod requesting nvidia.com/gpu: 1 will be stuck Pending forever because the node has no nvidia.com/gpu extended resource to advertise. The Operator's driver DaemonSet installs the matching nvidia.ko for the node's kernel, the device plugin starts, and within ~3–5 minutes the node advertises nvidia.com/gpu: 8.
Skip the Operator only if you're using a custom AMI with the driver pre-baked (AWS DLAMI, GCP Deep Learning VM) AND you install the device plugin DaemonSet yourself.
5.3 DRA (Dynamic Resource Allocation): the future¶
KEP-3094 introduced DRA as a generalized replacement for the device plugin model. Key primitives:
ResourceClaim— a namespaced handle to allocated devices. The pod references it; the scheduler gives it to the pod.ResourceClaimTemplate— a template for creating claims dynamically per pod.ResourceSlice— a cluster-scoped object describing a pool of devices. DRA drivers create and manage these.DeviceClass— a cluster-scoped object defining a class of device (e.g., "consumer GPU", "H100 with at least 80GB").
Kubernetes 1.36 status (verified against the DRA docs 2026-06-16):14
| Feature | Feature gate | Default | K8s version |
|---|---|---|---|
| Core DRA (ResourceClaim, ResourceClaimTemplate, ResourceSlice, DeviceClass) | DRAControllerAndWorkload | Beta (default-on) | 1.32 (graduated) |
| Workload claims | DRAWorkloadResourceClaims | Beta (default-on) | 1.32 |
| Admin access | DRAAdminAccess | Beta (default-on) | 1.35 |
| Extended resources | DRAExtendedResource | Beta (default-on) | 1.34 |
| Partitionable devices | DRAPartitionableDevices | Beta (default-on) | 1.35 |
| Consumable capacity (MIG-like shared counters) | DRAConsumableCapacity | Beta (default-on) | 1.36 |
| Device binding conditions | DRADeviceBindingConditions | Beta (default-on) | 1.36 |
| Device taints | DRADeviceTaints | Beta (default-on) | 1.34 |
| Node allocatable resources | DRANodeAllocatableResources | Alpha (disabled by default) | 1.36 |
Bottom line for 1.36: the LLM-relevant DRA features (partitionable devices, consumable capacity, device binding conditions) are all beta and default-on. The alpha leftovers (node allocatable resources, device metadata in containers, list type attributes) are for advanced cases.
Critical caveat — the 1.36.2 fix: K8s 1.36.0/1 had a critical double-allocation bug in DRA (#139211) affecting drivers using SharedCounters + DRAConsumableCapacity. Could cause workload failures, device conflicts, crashes, or data loss. If you use DRA, run on 1.36.2+ (released 2026-06-12).15
The NVIDIA DRA Driver for GPUs (latest: v0.4.0, released 2026-05-15) implements two sub-plugins:16
- GPU kubelet plugin — handles GPU allocation. Currently experimental, not yet officially supported. Helm chart leaves it disabled by default. Use only for exploration.
- ComputeDomain kubelet plugin — manages Multi-Node NVLink (MNNVL) across pods. Officially supported. Wires IMEX (Inter-Memory Exchange) daemons, domains, and channels under the hood. This is the K8s-native orchestration of NVL72-style domains — what you need to use a 72-GPU NVLink domain as a single scheduling unit for trillion-param models.
5.4 GPU sharing in K8s: three modes¶
Mode 1: Exclusive (the default)
Plugin gives the pod one entire GPU. Best for memory-bandwidth-bound decode, high-throughput training.
Mode 2: Time-slicing (free, no isolation)
# ConfigMap: nvidia-device-plugin-config
data:
config.yaml: |
version: v1
sharing:
timeSlicing:
renameByDefault: false
failRequestsGreaterThanOne: false
resources:
- name: nvidia.com/gpu
replicas: 4 # advertise each H100 as 4 GPUs
With replicas: 4 on 8-GPU p5.48xlarge, you can run 32 vLLM pods on the same hardware. Caveat: no isolation. If two pods both try to do FP16 matmul, they contend for SM cycles. Throughput degrades 30-50% under contention. Works for batch=1 inference, fails for sustained high-batch throughput.
The 30B-A3B-at-128K trap: each pod needs ~70 GB of GPU memory. 4× replicas of a 30B-A3B pod on one H100 = 280 GB demanded, more than 80 GB available. Time-slicing is for small models (7B-class) or short contexts. Don't try to host 30B-A3B in 4 time-sliced replicas on one H100.
Mode 3: MIG (hardware isolation, A100/H100 only)
# ClusterPolicy for GPU Operator
apiVersion: nvidia.com/v1
kind: ClusterPolicy
metadata:
name: gpu-cluster-policy
spec:
migManager:
enabled: true
mig:
strategy: mixed # resources become nvidia.com/mig-1g.5gb etc.
With strategy: mixed, you get resources like nvidia.com/mig-3g.40gb (3/7 of an H100) that pods can request. MIG reconfigures take 30–60 seconds (GPU goes offline briefly) — MIG is for stable partitioning, not dynamic multi-tenancy. Right answer for SLA-bound multi-tenant inference.
5.5 The driver-upgrade gotcha¶
The GPU Operator manages the kernel driver. When you upgrade (e.g., to pick up a security fix):
- Operator cordons the node
- Drains running GPU pods (respects PodDisruptionBudgets)
- Restarts the driver pod (kernel module reload)
- Restarts the device plugin, MIG manager, etc.
- Uncordons
This disrupts running GPU pods. Watch the nvidia.com/gpu-driver-upgrade-state node label — value upgrade-done means the node is past the upgrade; upgrade-in-progress is the time window where the node has no GPU to allocate. If you cordon a node manually while the operator is already upgrading, the operator will uncordon and proceed — don't race it.
The pattern that avoids the disruption: upgrade via node replacement, not in-place. Karpenter with a new GPU NodePool spins up a node with the new driver, drains the old one, terminates it. Application sees a brief connection blip, not a pod restart.
5.6 Observability: the must-have metrics¶
The DCGM Exporter (latest: 4.5.3-4.8.2, released 2026-05-07) runs as a sidecar on GPU nodes, exposing Prometheus metrics on port 9400.17 Install via GPU Operator (it manages DCGM Exporter as part of the stack).
| Metric | What it tells you | Alert if |
|---|---|---|
DCGM_FI_DEV_GPU_UTIL | SM utilization % | Sustained >95% = throughput ceiling |
DCGM_FI_DEV_FB_USED / FB_FREE | Framebuffer (VRAM) used/free in MB | FB_FREE < 1024 (1 GB) = OOM risk |
DCGM_FI_DEV_GPU_TEMP | GPU temp in °C | >85°C = throttling imminent |
DCGM_FI_DEV_POWER_USAGE | Current power draw in W | Sustained at TDP = thermal issue |
DCGM_FI_DEV_ECC_DBE_VOL_TOTAL | Double-bit ECC errors (cumulative) | >0 = GPU needs replacement |
DCGM_FI_DEV_XID_ERRORS | XID error codes (driver-reported) | Any nonzero = investigate |
6. Terminology clarification: "passthrough" means different things¶
When a post says "GPU passthrough," which one does it mean?
| Context | What "passthrough" means | When you see it |
|---|---|---|
| KVM/QEMU/VMware | GPU bypasses hypervisor, bound to VM via vfio-pci instead of nvidia.ko. Requires IOMMU. | Virtualization-layer concept. Not relevant to K8s pods directly. |
| K8s | Pod requests nvidia.com/gpu: 1 → pod gets exclusive access to one physical GPU. The container sees the GPU via nvidia-container-runtime mounting the device files. | The K8s default. What people usually mean by "GPU passthrough" in a K8s context. |
"Do I need to set GPU passthrough?" No — you don't "set" it. nvidia.com/gpu: 1 in the pod spec is passthrough. The system needs: NVIDIA driver on the node, NVIDIA Container Toolkit as containerd runtime, and the k8s-device-plugin DaemonSet advertising the resource. GPU Operator bundles all three plus MIG manager, DCGM exporter, feature discovery, and the DRA driver.
7. Multi-GPU pooling for large LLMs¶
This is the core question. The answer has three layers: hardware constraint → software stack → workload pattern.
7.1 The fundamental hardware constraint¶
NVLink topology is not uniform. On a single 8-GPU HGX H100 baseboard: - 8 GPUs in a fully connected NVLink Switch fabric (900 GB/s all-to-all) - They can do tensor-parallel efficiently up to 8 GPUs
To go to 16 GPUs for one model: - You need a second server with NVLink bridge (rare) OR - Accept pipeline-parallel across InfiniBand (slower but works) OR - Scale out to a GH200/NVL72 domain (much more expensive)
In practice: most production LLM deployments never put more than 8 GPUs in one tensor-parallel group. Beyond that, pipeline-parallel or data-parallel takes over.
7.2 The workload patterns¶
| Pattern | Use case | GPU count per model | Interconnect | Memory math |
|---|---|---|---|---|
| Single-GPU inference | Models ≤ 13B FP16, ≤ 7B INT8 | 1 | n/a | weights + KV cache on 1 GPU |
| Tensor-parallel (TP) inference | 30B-70B models, low-latency serving | 2-8 in one node | NVLink (intra-node) | weights split across GPUs, KV cache replicated per rank |
| Pipeline-parallel (PP) inference | 100B+ models that don't fit in one node's aggregate VRAM | 8-72+ | NVLink intra-node, InfiniBand inter-node | weights split by layer across stages; KV cache stays per stage |
| Data-parallel (DP) inference | High-throughput batch serving, fine-tuning | 1 GPU per replica, many replicas | any | full model per replica; replicas independent |
| Expert-parallel (EP) | MoE models (Mixtral, Qwen3-MoE) | many GPUs, each holds a subset of experts | NVLink preferred | experts distributed; all-to-all on each forward pass |
| Sequence-parallel (SP) | Very long context (128k+ tokens) | paired with TP/PP | n/a | sequences sharded across sequence dim; ortho to TP/PP |
For inference, TP is the king of latency — but it has the most expensive inter-GPU bandwidth requirements. For throughput-oriented serving (batch APIs, high QPS), DP wins on cost-per-token. For training, you typically combine: TP for memory + compute efficiency within a node, PP across nodes, DP for further scaling.
7.3 The memory math (worked example)¶
For a 70B model in FP16 (FP16 = 2 bytes per parameter, the standard precision for serving): - Weights: 70B × 2 bytes = 140 GB - Doesn't fit on a single 80 GB H100
TP2 across 2× H100 (80 GB each): (TP2 = tensor-parallel across 2 GPUs) - Weights: 70 GB per GPU - KV cache per token (Llama-70B arch): 2 × 80 layers × 64 heads × 128 head_dim × 2 bytes = ~2.6 MB/token18 (KV cache = the running memory of attention, see Glossary) - For 8k context, 32 concurrent users: 256k tokens × 2.6 MB = ~665 MB per GPU for KV cache - Per-GPU: 70 GB + 665 MB ≈ 71 GB ✓ (fits in 80 GB)
TP4 across 4× H100 (80 GB each): - Weights: 35 GB per GPU - KV cache: same ~665 MB per GPU - Per-GPU: 35.7 GB ✓ (leaves room for activations and batch)
TP72 in a GB200 NVL72 (one rack): - A 1.8T MoE model (the GB200 NVL72's benchmark target) can use TP=72 in one domain — first time this is possible at full bandwidth
Sources: vLLM's prefix caching docs for KV cache block management; HuggingFace model memory anatomy for the bytes-per-param math.1819
7.4 The K8s primitives for "GPU pool"¶
There are three abstractions to understand:
- GPU Operator — gives you GPUs-as-a-resource on nodes. Static pool.
- Karpenter / Cluster Autoscaler — adds/removes nodes based on pending GPU pods. Dynamic pool.
- DRA + ComputeDomain — the future. Lets you say "give me 16 GPUs in one NVLink domain" and the scheduler finds them.
For LLM workloads specifically:
- Single-tenant, predictable load: Static pool of GPU nodes with the GPU Operator. Don't bother with auto-scaling. Add capacity by adding nodes.
- Bursty inference load: Karpenter with GPU NodePool. New nodes are vanilla AMI; GPU Operator installs the driver on them. vLLM pods start. Use
karpenter.sh/v1NodePool +karpenter.k8s.aws/v1EC2NodeClass. - Multi-tenant, MIG-partitioned: GPU Operator with MIG mode enabled. Each pod gets a MIG instance. Kueue for fair scheduling.
- Large models across nodes: PipelineParallel with vLLM v0.23.0 or TensorRT-LLM. Need InfiniBand. Need NCCL env vars baked into the pod.
7.5 The Kubeflow Trainer piece (for training)¶
If you're training LLMs on K8s, Kubeflow Trainer (latest: v2.2.0, released 2026-03-20) is the de-facto orchestrator. It provides:
TrainJobCRD — declare a distributed training job- PyTorch Runtime, MPI Runtime, JAX Runtime — pick the framework
JobSetandLeaderWorkerSetintegration — for gang scheduling- Kueue integration — for topology-aware scheduling
- Distributed data cache — streams training data to GPU nodes without copying through CPU
For multi-node training, the canonical setup is: - Kubeflow Trainer with PyTorch Runtime - Each worker pod has: - GPU requests (via device plugin or DRA) - RDMA device request (via SR-IOV CNI + sriov-device-plugin) - Env vars: NCCL_IB_HCA=mlx5, NCCL_SOCKET_IFNAME=eth0, NCCL_DEBUG=INFO - Shared memory volume (/dev/shm) sized large enough for DDP - The NCCL debug volume mounted so you can read /tmp/nccl_log after the job
8. Decision framework¶
8.1 "Which GPU do I buy?"¶
| If you need... | Buy |
|---|---|
| ≤ 7B model, single-GPU inference, absolute lowest cost | L40S (48 GB GDDR6, no MIG) or A10G (24 GB) |
| ≤ 13B model, single-GPU inference, mainstream enterprise | L40S (48 GB GDDR6) — air-cooled 4U, no MIG, vGPU-supported |
| 13B-30B model, single GPU, 96 GB with Blackwell features | RTX PRO 6000 BSE (96 GB GDDR7) — 4 MIG instances, no NVLink |
| 30B-70B inference, FP16, single GPU | H100 NVL (94 GB) or H200 (141 GB) |
| 70B inference, single GPU with room to spare | H200 (141 GB) |
| 70B inference, single GPU on a budget | A100 80GB SXM (80 GB HBM2e, MIG-capable) — still in production fleets |
| Frontier model training, 8 GPUs in one TP group | HGX H100/H200 baseboard |
| Trillion-param inference in a single scheduling unit | GB200 NVL72 rack |
| 192 GB in one GPU for AMD-side, ROCm OK | MI300X |
| Frontier AMD-side, 288 GB HBM3e, FP4 native | MI355X |
8.2 "How do I share a GPU?"¶
| If you need... | Use |
|---|---|
| Maximum throughput per GPU | Exclusive nvidia.com/gpu: 1 |
| More pods than GPUs, low batch, can tolerate latency variance | Time-slicing (only for small models; works on all NVIDIA SKUs) |
| Hard isolation between tenants, A100/H100/H200/B200/RTX PRO 6000, stable partitioning | MIG (L40S not supported) |
| Multi-tenant with variable model sizes / SLAs, K8s 1.36.2+ | DRA |
| Dedicated VM with full GPU | VFIO passthrough (any NVIDIA SKU) |
| Multi-tenant VM with per-VM GPU share | vGPU (licensed; L40S, A100, RTX PRO 6000 all supported) |
8.3 "How do I run multi-GPU inference?"¶
| Model size | Pattern | Why |
|---|---|---|
| ≤ 13B | Single-GPU (tp=1) | Fits, lowest latency |
| 13B-70B | TP2 or TP4 within one node | NVLink bandwidth, no InfiniBand needed |
| 70B-200B | TP8 within one node, or TP8 + PP2 across two nodes | Use full NVL8 domain |
| 200B-500B | TP8 + PP across multiple nodes | InfiniBand for inter-stage |
| 500B+ | MoE expert-parallel + PP, requires NVL72-class NVLink domain | Per-expert routing needs high bandwidth |
| MoE (Qwen3-Coder-480B-A35B etc.) | EP + TP for routing + compute | All-to-all bandwidth is the bottleneck |
8.4 "How do I provision GPU nodes on K8s?"¶
| If you... | Use |
|---|---|
| Want it to "just work" | NVIDIA GPU Operator (single Helm chart, full stack) |
| Use a pre-baked AMI (AWS DLAMI, GCP Deep Learning VM) | Skip the Operator, install device plugin DaemonSet manually |
| Use Karpenter for dynamic provisioning | GPU Operator first, then Karpenter, then vLLM. Deploy order matters — Karpenter's karpenter.k8s.aws/instance-gpu-name selector only works once GPU Feature Discovery has run on the new node. |
| Need per-node resource health + auto-remediation | DRA + DRAResourceHealth (K8s 1.36.2+) |
9. Best practices distilled¶
- For production LLM serving on Hopper/Blackwell: use the GPU Operator. Don't roll your own driver+toolkit+plugin stack. The operational pain of upgrading drivers in a vanilla cluster is not worth it.
- For inference, default to TP2 or TP4 within a node. TP8 is sometimes needed for very large models, but the latency improvement of going from TP4 to TP8 is small relative to the cost. TP16+ is almost always wrong unless you're in a single NVLink domain (NVL72).
- For multi-tenant inference, use MIG on H100/H200/B200. Time-slicing is a footgun — when one tenant pushes SMs to 100%, the others tank. MIG gives you hard isolation.
- For training, use Kubeflow Trainer with PyTorch Runtime. Don't try to roll your own multi-node job controller. Kueue for topology-aware scheduling.
- For very large models (200B+): plan your NVLink topology before buying. If you need TP16, you need NVL72 (or wait for Rubin). Don't assume "we have 64 GPUs, we can serve a 200B model" — it depends on the interconnect.
- Always run DCGM Exporter and alert on the right metrics. ECC errors >0, temperature >85°C sustained, framebuffer <1 GB free.
- MIG profile selection is workload-driven. Don't use 1g.10gb for LLMs. The smallest profile you should consider for production LLM is 3g.40gb on H100.
- DRA is the future but not yet the default. As of K8s 1.36, the basic DRA primitives are beta+enabled-by-default. The NVIDIA DRA driver is at v0.4.0. Most production clusters are still on the device plugin model in 2026. Plan a migration, but don't block on it. And never run DRA on K8s 1.36.0 or 1.36.1 — the double-allocation bug is a footgun.
- For multi-node training, NCCL is the hidden landmine. Bake the env vars, the device files, the IB driver, and the shared memory volume into your pod spec. Don't try to make it "just work" — be explicit.
- For AMD MI300X/MI350X: validated for inference (vLLM ROCm build works), and AMD has the 192GB / 288GB advantage for single-GPU fitting of large models. Software maturity still trails NVIDIA; budget for ROCm debugging time.
10. Gotchas and "this will bite you" list¶
- Vendor reset for consumer GPUs (§3.1) — if you try to use GeForce in production, plan for this.
- MIG + VM passthrough is unsupported — MIG is a host-level concept.
- 1g MIG profile is too small for LLMs (§3.3).
- Default K8s pods can't see IB devices (§3.5) — needs Multus + SR-IOV CNI.
- GPU Operator upgrades disrupt running pods (§5.5) — schedule maintenance windows or use node replacement.
nvidia.com/gpuresource is integer-counted — no fractional allocation (use MIG for that).- DRA
DRANodeAllocatableResourcesis alpha in 1.36 — don't rely on it yet. - DRA device plugin is not yet officially supported for basic GPU allocation — NVIDIA explicitly says "experimental, not yet officially supported" in their v0.4.0 README. ComputeDomain is officially supported.
- CDI adoption is uneven —
containerd≥ 1.7,CRI-O≥ 1.24. Older versions still use the legacyNVIDIA_VISIBLE_DEVICESpath. - ROCm vs CUDA parity — when comparing AMD MI300X to H100, don't assume feature parity in the serving stack. vLLM ROCm builds lag CUDA by ~6 months.
- Blackwell requires specific driver versions — CUDA 12.8+ for B200, 12.9+ for B300. Older CUDA will fail to load.
- "FP4 is good enough" is still an open research question. NVFP4 has accuracy trade-offs that depend on the model. Don't deploy FP4 in production without measuring on your workload.
- Time-slicing + 30B-A3B at 128K context won't fit — 4× replicas of a 30B-A3B pod on one H100 demand 280GB, more than 80GB available. Time-slicing is for small models or short contexts.
Summary¶
- Physical: LLM workloads are memory-bandwidth-bound during decode and topology-bound when multi-GPU. HBM3e + NVLink bandwidth are the metrics that matter, not raw TFLOPS. H200 (141 GB, 4.8 TB/s) is the workhorse for 70B single-GPU inference. B200/B300 + NVL72 unlock trillion-param at rack scale.
- VM: Bare metal for production LLM serving (latency, MIG, license cost). VMs for multi-tenant cloud or compliance-bound enterprise. The 1g MIG profile is too small for LLMs — use 3g or 4g minimum.
- Container:
nvidia.com/gpu: 1IS the K8s-level "passthrough" — there is nothing to "set."nvidia-container-runtimemounts the device files;nvidia-ctk cdi generateis the modern path (CDI). GPU Operator bundles all of it. - K8s: Device plugin (v0.19.2) is the legacy default. DRA is the future — beta in K8s 1.36, but use 1.36.2+ to avoid the double-allocation bug. NVIDIA DRA driver v0.4.0 supports ComputeDomain (MNNVL) officially; GPU allocation plugin is experimental.
- Multi-GPU: TP2/TP4 within a node is the latency sweet spot. TP8 maxes out a single NVL8. Beyond 8 GPUs, switch to PP+IB or NVL72-scale. MoE = expert-parallel + all-to-all bandwidth is the constraint.
- Operations: DCGM Exporter for metrics (
DCGM_FI_DEV_GPU_UTIL,DCGM_FI_DEV_FB_FREE,DCGM_FI_DEV_XID_ERRORS). GPU Operator upgrades disrupt pods — replace nodes via Karpenter, don't upgrade in place.
Versions referenced (verified 2026-06-16)¶
| Component | Version | Released | Source |
|---|---|---|---|
| Kubernetes | 1.36.2 | 2026-06-12 | (referenced in K8s docs) |
| NVIDIA GPU Operator | v26.3.2 | 2026-05-29 | GitHub API |
| NVIDIA k8s-device-plugin | v0.19.2 | 2026-05-27 | GitHub API |
| DCGM Exporter | 4.5.3-4.8.2 | 2026-05-07 | GitHub API |
| NVIDIA DRA Driver for GPUs | v0.4.0 | 2026-05-15 | GitHub API |
| Kubeflow Trainer | v2.2.0 | 2026-03-20 | GitHub API |
| Karpenter | v1.13.0 | 2026-06-10 | (in ecosystem bank) |
| vLLM | v0.23.0 | 2026-06-15 | (in ecosystem bank) |
| AMD MI300X | (CDNA 3) | 2023 | AMD spec |
| AMD MI355X | (CDNA 4) | 2025 | AMD spec |
| NVIDIA A100 80GB SXM | (Ampere) | 2020 | NVIDIA spec |
| NVIDIA L40S | (Ada Lovelace) | 2023 | NVIDIA spec |
| NVIDIA RTX PRO 6000 BSE | (Blackwell) | 2026 | NVIDIA spec |
Confidence & gaps¶
- Strong primary-source support: every version in the table, every MIG profile size, every DCGM metric, all 4 layers' tooling. K8s 1.36 DRA status verified against the K8s docs feature-gate table.
- Sources disagreed on: the vGPU license cost (industry-typical, ~$1K+/GPU/year, but I couldn't pin a current price). Marked as "industry-typical" in §3.4.
- Couldn't verify / illustrative: vLLM ROCm feature-parity delta (anecdotal community reports; not pinned to a primary source). K8s 1.36.0 release date — the knowledge bank says "April 2026" approximately; I cite 1.36.2 (2026-06-12) and feature status which is what the docs confirm.
- Vendor marketing claims flagged: NVIDIA's "30× faster real-time trillion-param inference" is for a specific workload (1.8T MoE, FTL=5s) on the NVL72 domain — not universally applicable. Marked as such in §2.2.
Questions or discussion? Connect on LinkedIn, X or reach out via email.
-
NVIDIA, H100 GPU product page (markdown mirror) — 80 GB SXM / 94 GB NVL, NVLink 900 GB/s / 600 GB/s, FP8 3,958 TFLOPS sparse. ↩
-
NVIDIA, H200 GPU product page (markdown mirror) — 141 GB HBM3e, 4.8 TB/s bandwidth, 1.4× H100 bandwidth. ↩
-
NVIDIA, Blackwell architecture page — 208B transistors, TSMC 4NP, 10 TB/s chip-to-chip, 2nd-gen Transformer Engine, FP4, 5th-gen NVLink. ↩↩
-
NVIDIA, GB200 NVL72 product page (markdown mirror) — 72 Blackwell GPUs, 13.4 TB HBM3e, 130 TB/s NVLink, 1,440 PFLOPS FP4 sparse. ↩
-
NVIDIA, HGX platform page — HGX B200/B300/Rubin specs, NVLink 5 Switch, 1.8 TB/s GPU-to-GPU. ↩
-
NVIDIA, Confidential Computing — TEE mode on Hopper, TEE-I/O on Blackwell. ↩
-
NVIDIA, Multi-Instance GPU technology page — up to 7 instances, sizes per Hopper/Blackwell, dynamic reconfiguration. ↩
-
NVIDIA, MIG User Guide — full profile tables, CUDA container integration, Kubernetes scheduling. ↩
-
AMD Instinct, MI300X accelerator spec (Wikipedia cross-referenced to AMD spec sheet) — CDNA 3, 192 GB HBM3, 5.3 TB/s, 1,307 TFLOPS FP16 sparse 2,614.9. MI355X (CDNA 4) 288 GB HBM3e, 8 TB/s, 9.2 PFLOPS FP4. ↩
-
NVIDIA, k8s-device-plugin README (v0.19.2) — DaemonSet that exposes
nvidia.com/gpu, supports legacy + CDI, time-slicing + MPS. ↩↩ -
NVIDIA, Container Toolkit install guide — OCI hook,
nvidia-container-cli, containerd/CRI-O/Docker config. ↩ -
CNCF TAG, Container Device Interface (CDI) spec — CNCF-incubating. Supported in containerd ≥ 1.7, CRI-O ≥ 1.24. ↩
-
NVIDIA, GPU Operator v26.3.2 release notes — K8s 1.36 support, NRI plugin for CRI-O 1.34+, DRA on roadmap, pod labels in DCGM metrics. ↩
-
Kubernetes, Dynamic Resource Allocation docs — feature-gate status per K8s 1.36: DRA core GA-equivalent, partitionable devices + consumable capacity + binding conditions all beta default-on in 1.36. ↩
-
Kubernetes, CHANGELOG-1.36 + PR #139211 — DRA double-allocation bugfix in 1.36.2. ↩
-
kubernetes-sigs, DRA Driver for NVIDIA GPUs README (v0.4.0) — ComputeDomain (MNNVL) officially supported; GPU allocation plugin experimental. ↩
-
NVIDIA, dcgm-exporter README — port 9400, Prometheus metrics; Helm chart bundled in GPU Operator. ↩
-
vLLM, Automatic Prefix Caching docs (source) — block-based KV cache management, prefix hashing; rendered at https://docs.vllm.ai/en/latest/design/automatic_prefix_caching.html. ↩↩
-
HuggingFace, Model Memory Anatomy — bytes-per-param math for weights/gradients/optimizer/activations. ↩
-
NVIDIA, A100 Tensor Core GPU product page (markdown mirror) — Ampere, 80 GB HBM2e SXM @ 2.04 TB/s, 1,248 TOPS INT8 sparse, 600 GB/s NVLink, 7× MIG at 10 GB each. ↩
-
NVIDIA, L40S GPU product page (markdown mirror) — Ada Lovelace, 48 GB GDDR6 @ 864 GB/s, 1,466 TFLOPS FP8 sparse, 350W, no MIG, no NVLink, vGPU-supported. ↩↩
-
NVIDIA, RTX PRO 6000 Blackwell Server Edition product page (markdown mirror) — Blackwell, 96 GB GDDR7 @ 1.6 TB/s, 4 PFLOPS FP4 sparse, 600W, up to 4 MIG instances, no NVLink, PCIe Gen5. ↩↩
Discussion
Have thoughts on this post? Share them below — questions, corrections, or your own experience are all welcome.