Skip to content

Commit 6c9c564

Browse files
committed
test(uat): tighten serve GPU claim assert and clarify rollout comments
Count nvidia.com/gpu limits across worker containers so two containers each claiming 1 GPU cannot pass as "exactly one". Drop the AWS/Azure "lockstep with uat-gcp" wording now that only GCP runs the serve step. Signed-off-by: Rohit Rajani <rorajani@nvidia.com>
1 parent 7b418aa commit 6c9c564

4 files changed

Lines changed: 32 additions & 36 deletions

File tree

.github/workflows/uat-aws.yaml

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -813,18 +813,15 @@ jobs:
813813
RUN_ID: ${{ github.run_id }}
814814
run: ./tests/uat/aws/run train "${TEST_CONFIG}"
815815

816-
# STILL DISABLED (step commented out below), but the root cause is now
817-
# addressed: phase_serve selects the GPU pool for both graph components, so
818-
# the Frontend no longer cold-pulls the ~12GB vllm-runtime image on a
819-
# small CPU-pool node and wedges in ContainerCreating past the 30m
820-
# readiness budget. uat-gcp.yaml re-enables its step first (#1644 tracks
821-
# the GKE x inference cell); this one stays commented until that lane
822-
# demonstrates a served completion — re-enable then, and restore the Serve
823-
# summary row below to `${{ steps.serve.outcome }}`. Until then the
824-
# inference STACK (dynamo + KAI scheduler + DRA driver) is still stood up
825-
# and validated by prep/install/conformance/verify; only the
826-
# served-workload run is skipped (the Serve summary row is a static
827-
# `disabled`). Kept in lockstep with uat-gcp.yaml. Tracked by #1644.
816+
# STILL DISABLED (step commented out below). phase_serve already selects the
817+
# GPU pool for both graph components (#1644), so the Frontend no longer
818+
# cold-pulls the ~12GB vllm-runtime image on a small CPU-pool node. Only
819+
# uat-gcp.yaml re-enables the serve *step* for now (GKE x inference is what
820+
# #1644 tracks); re-enable this one after that lane has a served completion,
821+
# and restore the Serve summary row below to `${{ steps.serve.outcome }}`.
822+
# Until then the inference STACK (dynamo + KAI scheduler + DRA driver) is
823+
# still stood up and validated by prep/install/conformance/verify; only the
824+
# served-workload run is skipped (Serve summary row is a static `disabled`).
828825
#
829826
# - name: UAT - serve (DynamoGraphDeployment + endpoint)
830827
# id: serve

.github/workflows/uat-azure.yaml

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -797,18 +797,15 @@ jobs:
797797
RUN_ID: ${{ github.run_id }}
798798
run: ./tests/uat/azure/run train "${TEST_CONFIG}"
799799

800-
# STILL DISABLED (step commented out below), but the root cause is now
801-
# addressed: phase_serve selects the GPU pool for both graph components, so
802-
# the Frontend no longer cold-pulls the ~12GB vllm-runtime image on a
803-
# small CPU-pool node and wedges in ContainerCreating past the 30m
804-
# readiness budget. uat-gcp.yaml re-enables its step first (#1644 tracks
805-
# the GKE x inference cell); this one stays commented until that lane
806-
# demonstrates a served completion — re-enable then, and restore the Serve
807-
# summary row below to `${{ steps.serve.outcome }}`. Until then the
808-
# inference STACK (dynamo + KAI scheduler + DRA driver) is still stood up
809-
# and validated by prep/install/conformance/verify; only the
810-
# served-workload run is skipped (the Serve summary row is a static
811-
# `disabled`). Kept in lockstep with uat-gcp.yaml. Tracked by #1644.
800+
# STILL DISABLED (step commented out below). phase_serve already selects the
801+
# GPU pool for both graph components (#1644), so the Frontend no longer
802+
# cold-pulls the ~12GB vllm-runtime image on a small CPU-pool node. Only
803+
# uat-gcp.yaml re-enables the serve *step* for now (GKE x inference is what
804+
# #1644 tracks); re-enable this one after that lane has a served completion,
805+
# and restore the Serve summary row below to `${{ steps.serve.outcome }}`.
806+
# Until then the inference STACK (dynamo + KAI scheduler + DRA driver) is
807+
# still stood up and validated by prep/install/conformance/verify; only the
808+
# served-workload run is skipped (Serve summary row is a static `disabled`).
812809
#
813810
# - name: UAT - serve (DynamoGraphDeployment + endpoint)
814811
# id: serve

.github/workflows/uat-gcp.yaml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -694,13 +694,12 @@ jobs:
694694
RUN_ID: ${{ github.run_id }}
695695
run: ./tests/uat/gcp/run train "${TEST_CONFIG}"
696696

697-
# RE-ENABLED (#1644). It was disabled because the Frontend cold-pulled the
698-
# ~12GB vllm-runtime image on a CPU-pool node and wedged in
699-
# ContainerCreating past the readiness budget; phase_serve now selects the
700-
# GPU pool for both graph components, whose a3-megagpu-8g class pulls that
701-
# image in a fraction of the budget. GCP goes first because #1644 tracks
702-
# the GKE x inference cell specifically; aws/azure stay commented until
703-
# this lane demonstrates a served completion.
697+
# Live in the GCP inference phase chain (#1644). Was disabled because the
698+
# Frontend cold-pulled the ~12GB vllm-runtime image on a CPU-pool node and
699+
# wedged in ContainerCreating past the readiness budget; phase_serve now
700+
# selects the GPU pool for both graph components, whose a3-megagpu-8g class
701+
# pulls that image in a fraction of the budget. AWS/Azure serve steps stay
702+
# commented until this lane demonstrates a served completion.
704703
- name: UAT - serve (DynamoGraphDeployment + endpoint)
705704
id: serve
706705
if: steps.conformance.outcome == 'success' && inputs.intent == 'inference'

tests/uat/serve_manifest_test.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,19 +124,22 @@ func TestServeGraphGPUPlacement(t *testing.T) {
124124
})
125125

126126
// Guards the blast radius of the pin: the worker's GPU request is the reason
127-
// the pool exists, and the placement edit sits directly above it.
127+
// the pool exists, and the placement edit sits directly above it. Count
128+
// claims across containers — two containers each declaring nvidia.com/gpu: 1
129+
// would request two GPUs, not "exactly one".
128130
t.Run("worker still requests exactly one GPU", func(t *testing.T) {
129-
var found bool
131+
claims := 0
130132
for _, c := range worker.PodTemplate.Spec.Containers {
131133
if q, ok := c.Resources.Limits[gpuResource]; ok {
132-
found = true
134+
claims++
133135
if fmt.Sprint(q) != "1" {
134136
t.Errorf("worker container %q %s limit = %v, want 1", c.Name, gpuResource, q)
135137
}
136138
}
137139
}
138-
if !found {
139-
t.Errorf("no worker container requests %s; the served graph would run on CPU", gpuResource)
140+
if claims != 1 {
141+
t.Errorf("worker declares %d %s limit(s) across containers, want exactly 1",
142+
claims, gpuResource)
140143
}
141144
})
142145
}

0 commit comments

Comments
 (0)