Skip to content

Epic: DC — Comprehensive UAT + dynamic, CI-managed GPU clusters #1264

Description

@njhensley

Summary

Make AICR's real-hardware UAT comprehensive and contention-safe by time-sharing the
single per-cloud reservation across a day/night operating model. Introduce a
simple day/night scheduler + capacity request/queue broker that arbitrates the
scarce reservation-backed GPU time (replacing today's AWS hard-fail-on-busy): night
runs a main-first, time-boxed version matrix — the training and inference CUJ on
AWS and GCP for main + the previous N stable AICR releases — sequentially per cloud;
morning hands each freed reservation to a long-lived daytime human-access
deployment
(one training cluster on one cloud, one inference cluster on the other,
for human use outside CI); day is untouched-by-CI human use; evening tears the
daytime deployment down — an enforced cleanup boundary — before the next night
batch. Make the per-run cluster shape per intent (training vs inference) from the
same reservation, and version-parameterize the install (released aicr/validator
images at version X for each release row, main at tip) so the matrix is
cross-version regression. Wire the existing CUJ2 inference assets into the UAT runner
at CUJ1 parity, broaden CLI-boundary coverage (query, diff, evidence verify/publish, real-cluster snapshot, more bundle deployers), and drive resolvable
recipes across the dynamic clusters (and KWOK where hardware-independent) so the matrix
fills out beyond the two launch recipes. Every UAT run emits an ADR-007 evidence bundle
handed to the TestGrid epic's TestGrid ingestion (authenticating as the TestGrid epic's
dedicated write-only publish SA, never the shared UAT actuator SA); the
dynamic-clusters epic does not write the bucket, and the daytime human-access clusters
emit no bundle and produce no column. Launch is phased: training-kubeflow on both
clouds first (eks/h100-ubuntu, gke/h100-cos), inference-dynamo once DC3
lands. Designed for more reservations, clouds, and accelerators to come (and eventually
both daytime flavors per cloud). Cost governance is deferred (the only variable cost is
the CPU/system node pool — autoscaled on GCP, fixed on AWS).

Children

Epic acceptance criteria

  1. The single per-cloud reservation is time-shared on a day/night cycle: the
    nightly batch runs a main-first, time-boxed version matrix sequentially
    per cloud (provision→CUJ→evidence→publish→teardown→next); the morning handoff
    grants the daytime human-access lease; the evening teardown is enforced and the
    nightly batch refuses to start (pre-batch guard) against an un-torn-down daytime
    cluster rather than racing the reservation.
  2. Two UAT runs contending for the same reservation (AWS cron + a human AWS
    workflow_dispatch, or two requesters sharing a future shared reservation)
    queue rather than one hard-failing; a third contender is explicitly
    reported as superseded (not silently cancelled); the reservation set is
    data-driven (adding a row needs no broker code change).
  3. training-kubeflow runs end-to-end on real hardware on AWS H100
    (eks/h100-ubuntu) and GCP H100 (gke/h100-cos) at launch, and
    inference-dynamo runs end-to-end on both once DC3 lands, each emitting a
    signed ADR-007 evidence bundle whose criteria map to the correct per-cloud
    TestGrid coordinate.
  4. query, diff, evidence verify/publish, real-cluster snapshot, and at
    least one additional bundle deployer beyond helmfile are exercised by
    real-or-simulated tests that emit a CTRF/JUnit-shaped result (the end-to-end
    "appears as a TestGrid column" check depends on the TestGrid epic TG2/TG5).
  5. At least the full set of resolvable launch-scope recipes (and KWOK-coverable
    recipes) run through a matrix that produces per-recipe results keyed by overlay
    metadata.name, one column per run, across the AICR-version axis (main +
    the previous N stable releases, time-boxed and main-first; each release row
    installs the released aicr/validator images at that version and tags its
    bundle/column aicr_version).
  6. At the morning handoff, one training (one cloud) + one inference (other cloud)
    long-lived deployment come up for human use outside CI (DC8); the inference one
    serves a reachable OpenAI-compatible endpoint; access is shared out-of-band; the
    daytime clusters emit no evidence bundle and produce no TestGrid column; both are
    torn down before the nightly batch.
  7. The Azure stub has a recorded revive-or-retire decision (implemented, DC7), and the
    orphaned tests/chainsaw/snapshot/deploy-agent test (plus its stale README
    cross-reference) is wired or removed.
  8. make qualify green on every child; any child touching Go packages clears the
    75% coverage floor (.settings.yaml:107); docs updated in the same PR as
    behavior; no new required merge-gate check that depends on GPUs.

Out of scope (deferred — see Deferred)

Cost governance / budget caps; a standing broker service (vs lease + GH
concurrency); MI300/B200/GB200 shapes at launch (data rows added when capacity
exists); per-PR GPU runs as a required gate; both daytime flavors (training +
inference) on a single cloud during the working day
(one reservation per cloud
cannot hold a daytime cluster and run the nightly batch at once — needs more infra);
more than the bounded N stable releases on the version axis (time-box drops the
oldest first); alerting on UAT regressions (dropped — the regression signal is
TestGrid itself, per the recipe-quality epic brief).


Staged from docs/design/011-uat-dynamic-clusters.md.

Metadata

Metadata

Assignees

Type

Fields

No fields configured for Epic.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions