You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ci(uat): gate nightly intents by minimum release; enroll azure inference
Add nightly-intent-min-versions to the UAT reservation registry: a
per-intent minimum AICR release that gates RELEASE cells of the nightly
version matrix. The tip-of-main cell always runs every listed intent; a
release cell drops any intent whose minimum version is newer than the tag
(semver). This generalizes the informal 'a released version that predates
a platform is a premature cell' guidance into checked config, so a release
that predates an intent's support is skipped instead of running a
permanently-red cell.
The gate is resolved in the schedule — uat-broker attaches each cell's
eligible intents — so the nightly controller dispatches a cell's own
intents with no per-version semver logic in workflow bash. Validate
rejects a gate on an unrun/unknown intent or a non-semver value.
Enroll azure-h100 for [training, inference] with inference gated to
v0.18.0: the AKS ND H100 v5 perf fix (nvidia-tuned 0.3.2, #1767) is on
main but not yet in a release tag (v0.17.0 pins 0.3.1). Today only main
runs Azure inference nightly (green); older releases are skipped and the
gated release enrolls automatically once it ships.
Signed-off-by: Nathan Hensley <nhensley@nvidia.com>
Copy file name to clipboardExpand all lines: docs/contributor/uat.md
+14-3Lines changed: 14 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -56,20 +56,31 @@ In both cases the signed evidence bundle is emitted by the earlier conformance s
56
56
57
57
An unrecognized `intent` (or a missing sibling config) fails closed in the pipeline's `Validate inputs` step before any provisioning.
58
58
59
-
### Nightly intent cadence (both intents, both clouds)
59
+
### Nightly intent cadence (both intents, all three clouds)
60
60
61
-
The single nightly cron (`uat-nightly-batch.yaml`, `0 4 * * *`) runs **both intents on every nightly-enrolled reservation**, so training *and* inference are exercised nightly on AWS and GCP, and training on Azure (`azure-h100` enrolls `[training]` only until a manual inference run goes green — see the table below). (Note: an inference cell currently provisions and validates the inference platform; the `phase_serve` serving-CUJ step itself remains disabled in both cloud workflows pending #1644, so nightly runs do not yet execute the serving request path.) The set of intents per reservation is data — the `nightly-intents` list in `infra/uat/reservations.yaml` (absent defaults to `[training]`; an explicit empty list `[]` opts the reservation out of the nightly batch entirely — bring-up mode, manual dispatch only):
61
+
The single nightly cron (`uat-nightly-batch.yaml`, `0 4 * * *`) runs **both intents on every nightly-enrolled reservation**, so training *and* inference are exercised nightly on AWS, GCP, and Azure (see the table below). (Note: an inference cell currently provisions and validates the inference platform; the `phase_serve` serving-CUJ step itself remains disabled in both cloud workflows pending #1644, so nightly runs do not yet execute the serving request path.) The set of intents per reservation is data — the `nightly-intents` list in `infra/uat/reservations.yaml` (absent defaults to `[training]`; an explicit empty list `[]` opts the reservation out of the nightly batch entirely — bring-up mode, manual dispatch only):
|`azure-h100`| Azure |`[training]`|`phase_train`(inference joins after a green manual `intent=inference` run) |
67
+
|`azure-h100`| Azure |`[training, inference]`|`phase_train`+ `phase_serve` (serve step disabled pending #1644); inference gated to `>= v0.18.0` via `nightly-intent-min-versions` (see **Cost / tuning** below) |
68
68
69
69
**How it stays contention-free — serialize, don't add a second cron.** The intents are folded into the existing [version matrix](#the-version-matrix) as extra cells rather than a second scheduled job. The controller's drive loop is **version outer / intent inner**: for each version it dispatches one intent's full provision→CUJ→teardown cell (inference cells currently run provision→validate→teardown; the serve CUJ is disabled pending #1644), waits for it (`gh run watch`), then dispatches the next — all through the *same* per-reservation lease. So the intents serialize naturally, and because `main` runs every intent before any release cell, a time-box drop only ever sheds the oldest *release* cells (never `main`'s inference). This is the deliberate DC3 cadence decision: **never schedule two daily crons against one reservation** — the lease is a single-slot queue (one in-progress + one pending), so a second cron plus an occasional human dispatch on the same reservation is a routine three-contender case whose loser is silently [superseded](#how-queuing-works-the-reservation-lease). One cron dispatching serialized cells sidesteps that entirely.
70
70
71
71
**Cost / tuning.** Listing both intents roughly **doubles a reservation's nightly cell count** (each version now runs two full cluster lifecycles). If the batch [time-box](#the-version-matrix) is exceeded the oldest cells are dropped first, so `main`+freshest always land; tune `previous_n` (fewer release versions) or `deadline_offset_hours` to fit the window. A released version that predates a platform (e.g. `dynamo`) fails its inference cell's recipe resolution as a genuine regression signal — drop `previous_n` if that coverage is premature. Changing which intents a reservation runs is a registry edit — no workflow change; the `uatbroker` committed-registry test pins the launch set.
72
72
73
+
**Gating an intent to a minimum release — `nightly-intent-min-versions`.** When an intent only became *supported* on a reservation at a particular release — a fix or platform that older releases lack — running it on the pre-support releases produces a permanently-red cell, not a regression signal. Express the floor per intent in the registry row:
74
+
75
+
```yaml
76
+
- name: azure-h100
77
+
nightly-intents: [training, inference]
78
+
nightly-intent-min-versions:
79
+
inference: v0.18.0 # first release that carries the AKS perf fix (#1767)
80
+
```
81
+
82
+
Semantics: **`main` is never gated** (it is built from source and carries the newest fixes, so it always runs every listed intent); a **release** cell drops any intent whose minimum version is newer than the tag (semver; a tag `>=` the minimum runs). The gate lives in the schedule (`uat-broker schedule` attaches each cell's eligible `intents`), so the controller simply never dispatches a gated `(version × intent)` — no per-version workflow logic. Pointing the floor at a **not-yet-tagged** release is intentional and self-resolving: until that release ships, the intent runs on **`main` only** (green, continuous coverage of the fix), and the release enrolls automatically once it exists. `Validate` rejects a floor for an intent the row does not run, or a non-semver value. Bump the floor if the real first-fixed tag differs — an over-low floor surfaces as a visible red (safe), an over-high floor silently skips a good release (bump down).
83
+
73
84
## Cluster lifecycles
74
85
75
86
The `lifecycle` input selects one of three cluster lifecycles, all sharing the reservation lease:
0 commit comments