@@ -46,7 +46,6 @@ if [[ "${AVAILABILITY}" == "false" ]]; then
4646fi
4747rm -f " ${SCENARIO_ROOT} /tools/check-aws-availability/check-aws-availability"
4848
49-
5049kops-acquire-latest
5150
5251# Cluster Configuration
@@ -97,18 +96,33 @@ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/downloa
9796echo " Installing cert-manager..."
9897kubectl apply --server-side -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.2/cert-manager.yaml
9998
100- # Setup helm repo for NVIDIA GPU Operator and DRA Driver
99+ # Setup helm repos for monitoring and NVIDIA components
101100helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
101+ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
102+ helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
102103helm repo update
103104
105+ # Prometheus Stack (kube-prometheus-stack)
106+ # Provides Prometheus, Grafana, Alertmanager, and ServiceMonitor CRDs
107+ # Must be installed before dcgm-exporter so ServiceMonitor CRDs are available
108+ echo " Installing kube-prometheus-stack..."
109+ helm upgrade -i kube-prometheus-stack \
110+ oci://ghcr.io/prometheus-community/charts/kube-prometheus-stack \
111+ --namespace monitoring \
112+ --create-namespace \
113+ --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
114+ --set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
115+ --wait
116+
104117# NVIDIA GPU Operator
105118# Manages the full NVIDIA stack: kernel driver, container toolkit, device plugin.
106119# The driver is installed into /run/nvidia/driver on each node.
107120helm upgrade -i nvidia-gpu-operator --wait \
108- -n gpu-operator --create-namespace \
109- nvidia/gpu-operator \
110- --version=v25.10.1 \
111- --wait
121+ -n gpu-operator --create-namespace \
122+ nvidia/gpu-operator \
123+ --version=v25.10.1 \
124+ --set dcgmExporter.enabled=false \
125+ --wait
112126
113127PATH=" $( pwd) :$PATH "
114128export PATH
@@ -117,7 +131,7 @@ export PATH
117131# Uses the driver installed by GPU Operator at /run/nvidia/driver (the default).
118132echo " Installing NVIDIA DRA Driver..."
119133
120- cat > values.yaml << EOF
134+ cat > values.yaml << EOF
121135# The driver daemonset needs a toleration for the nvidia.com/gpu taint
122136kubeletPlugin:
123137 tolerations:
@@ -127,15 +141,38 @@ kubeletPlugin:
127141EOF
128142
129143helm upgrade -i nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
130- --version=" 25.12.0" \
131- --create-namespace \
132- --namespace nvidia-dra-driver-gpu \
133- --set resources.gpus.enabled=true \
134- --set nvidiaDriverRoot=/run/nvidia/driver \
135- --set gpuResourcesEnabledOverride=true \
136- -f values.yaml \
137- --wait
144+ --version=" 25.12.0" \
145+ --create-namespace \
146+ --namespace nvidia-dra-driver-gpu \
147+ --set resources.gpus.enabled=true \
148+ --set nvidiaDriverRoot=/run/nvidia/driver \
149+ --set gpuResourcesEnabledOverride=true \
150+ -f values.yaml \
151+ --wait
152+
153+ # NVIDIA DCGM Exporter
154+ # Exports GPU metrics to Prometheus for monitoring GPU utilization, memory, temperature, etc.
155+ echo " Installing NVIDIA DCGM Exporter..."
156+
157+ cat > dcgm-exporter-values.yaml << EOF
158+ # Tolerations to run on GPU nodes with nvidia.com/gpu taint
159+ tolerations:
160+ - key: nvidia.com/gpu
161+ operator: Exists
162+ effect: NoSchedule
163+
164+ # ServiceMonitor for Prometheus integration
165+ serviceMonitor:
166+ enabled: true
167+ interval: 15s
168+ additionalLabels:
169+ release: kube-prometheus-stack
170+ EOF
138171
172+ helm upgrade -i dcgm-exporter gpu-helm-charts/dcgm-exporter \
173+ --namespace monitoring \
174+ -f dcgm-exporter-values.yaml \
175+ --wait
139176
140177# KubeRay
141178echo " Installing KubeRay Operator..."
@@ -145,7 +182,6 @@ kubectl apply --server-side -k "github.com/ray-project/kuberay/ray-operator/conf
145182echo " Installing Kueue..."
146183kubectl apply --server-side -f https://github.com/kubernetes-sigs/kueue/releases/download/v0.14.8/manifests.yaml
147184
148-
149185echo " ----------------------------------------------------------------"
150186echo " Verifying Cluster and Components"
151187echo " ----------------------------------------------------------------"
@@ -166,6 +202,16 @@ kubectl rollout status deployment -n kuberay-system kuberay-operator --timeout=5
166202echo " Verifying Gateway API..."
167203kubectl get gatewayclass || echo " Warning: GatewayClass not found"
168204
205+ echo " Verifying Prometheus Stack..."
206+ kubectl rollout status deployment -n monitoring kube-prometheus-stack-operator --timeout=5m || echo " Warning: Prometheus Operator not ready yet"
207+ kubectl rollout status statefulset -n monitoring prometheus-kube-prometheus-stack-prometheus --timeout=5m || echo " Warning: Prometheus not ready yet"
208+
209+ echo " Verifying DCGM Exporter..."
210+ kubectl rollout status daemonset -n monitoring dcgm-exporter --timeout=5m || echo " Warning: DCGM Exporter not ready yet"
211+
212+ echo " Verifying ServiceMonitor for DCGM..."
213+ kubectl get servicemonitor -n monitoring dcgm-exporter || echo " Warning: DCGM ServiceMonitor not found"
214+
169215echo " Verifying Allocatable GPUs..."
170216# Wait a bit for nodes to report resources
171217sleep 30
@@ -216,6 +262,28 @@ echo "Waiting for Sample Workload to Complete..."
216262kubectl wait --for=condition=complete job/test-gpu-pod --timeout=5m || true
217263kubectl logs job/test-gpu-pod || echo " Failed to get logs"
218264
265+ echo " Verifying GPU Metrics in Prometheus..."
266+ # Wait for DCGM exporter to start collecting metrics
267+ # Query Prometheus for DCGM GPU metrics with retries
268+ PROM_POD=$( kubectl get pods -n monitoring -l app.kubernetes.io/name=prometheus -o jsonpath=' {.items[0].metadata.name}' )
269+ if [ -n " ${PROM_POD} " ]; then
270+ echo " Querying Prometheus for DCGM_FI_DEV_GPU_UTIL metric (retrying up to 5 times)..."
271+ for i in {1..5}; do
272+ echo " Attempt $i ..."
273+ METRICS=$( kubectl exec -n monitoring " ${PROM_POD} " -c prometheus -- \
274+ wget -qO- ' http://localhost:9090/api/v1/query?query=DCGM_FI_DEV_GPU_UTIL' 2> /dev/null)
275+ if echo " ${METRICS} " | grep -q " result" ; then
276+ echo " Successfully retrieved GPU metrics:"
277+ echo " ${METRICS} " | head -c 500
278+ break
279+ fi
280+ echo " Metrics not yet available, waiting 20s..."
281+ sleep 20
282+ done
283+ else
284+ echo " Warning: Prometheus pod not found"
285+ fi
286+
219287echo " AI Conformance Environment Setup Complete."
220288
221289# Now run the actual AI conformance tests
0 commit comments