Production readiness checklist¶
Run this against your own GPU platform. Every line maps to something you did today; the link is where.
Nodes¶
- AMI is pinned (
al2023@v<date>), and there is a written procedure for upgrading it — 2.2 - The NodePool allows ≥ 4 instance types across ≥ 2 families if it uses Spot — 2.2
- On-Demand fallback is allowed and there is quota for it — 2.2, quota
-
limits.nvidia.com/gpuis set on every GPU NodePool — 2.2 -
consolidationPolicy: WhenEmpty(notWhenEmptyOrUnderutilized) for inference pools, with a deliberateconsolidateAfter— 2.2, 5.2 - Disruption budgets sized to the fleet — 5.2
-
expireAfteris a value someone chose, and workloads survive it — Module 3 - Root volume sized and throughput-provisioned for your largest image — 2.2
- GPU nodes are tainted; only GPU workloads tolerate — 2.2
Drivers and the Operator¶
-
driver.enabled=falseandtoolkit.enabled=falseon EKS NVIDIA AMIs — 2.3 - CDI mode is a decision (
cdi.enabled), not a default you inherited — 2.3 - Container images' CUDA version ≤ the AMI driver's supported CUDA — 2.4
- Operator and device-plugin versions are pinned in Helm — 2.3
-
nvidia-cuda-validatorpasses on every new node (alert on ClusterPolicy state ≠ready) — 2.4
Sharing¶
- Sharing config lives in a versioned ConfigMap with named keys; changes are new keys + relabel — 3.2
- Shared and exclusive nodes are separate NodePools with template labels; workloads select by tier — 3.4
-
failRequestsGreaterThanOne: trueon time-sliced pools — 3.2 - Latency-SLO workloads select the unshared product name (never
-SHARED) — 3.2 - No
privileged: truefor tenant workloads on GPU nodes — 3.3
Serving¶
- startupProbe with
failureThreshold × periodSeconds≥ worst-case cold start — 4.2 -
/dev/shmis a memory-backedemptyDir, sized, counted in the memory limit — 4.2 -
--served-model-namedecouples clients and dashboards from the model path — 4.2 -
RollingUpdatewithmaxUnavailable: 0;terminationGracePeriodSeconds≥ longest generation — 4.2 - A PodDisruptionBudget and ≥ 2 replicas for anything user-facing on Spot — Module 3
- Weights are not downloaded on the critical path for models > 10 GB — 4.6
- Images are pre-pulled or cached in-region (ECR pull-through) — 3.1, 4.6
Autoscaling¶
- Scaling signal is in-flight requests, queue depth, or KV-cache usage — never CPU — 4.5
- Exactly one autoscaler per Deployment (KEDA owns the HPA) — 4.5
-
maxReplicaCountand NodePoollimitsagree with each other and with quota — 4.5 - Scale-down stabilisation long enough that a replica which finished cold-starting after the burst still serves before it's removed (we used 5 min against a ~9 min cold start; production is usually 10–15) — 4.5
- There is a documented answer to "what happens on a Spot reclaim at 3 a.m.?" — 4.6
Observability and cost¶
- dcgm-exporter scraped on every GPU node; the DCGM dashboard is live — 5.1
- vLLM (or your server) scraped per pod — 4.1
- The idle-GPU alert (
avg_over_time(DCGM_FI_DEV_GPU_UTIL[30m]) < 5with a pod scheduled) pages someone — 5.2 -
DCGM_FI_DEV_XID_ERRORS > 0pages someone — Module 5 - Every GPU pod carries an owner/team label, enforced by admission policy — 5.2
- Monthly GPU spend and fleet-average utilisation are on a dashboard someone looks at — Module 5
- There is a teardown discipline for dev clusters (
make workshop-downor equivalent) — Clean up