Skip to content

ci(uat): enroll azure-h100 inference in nightly batch#1776

Merged
mchmarny merged 3 commits into
NVIDIA:mainfrom
njhensley:ci/azure-nightly-inference
Jul 17, 2026
Merged

ci(uat): enroll azure-h100 inference in nightly batch#1776
mchmarny merged 3 commits into
NVIDIA:mainfrom
njhensley:ci/azure-nightly-inference

Conversation

@njhensley

@njhensley njhensley commented Jul 15, 2026

Copy link
Copy Markdown
Member

Summary

Enroll azure-h100 for training + inference in the nightly UAT batch, and add a data-driven nightly-intent-min-versions gate so an intent that only became supported at a given release is not run on the releases that predate it (which would produce a permanently-red cell rather than a regression signal).

Motivation / Context

Azure inference was held out of the nightly batch pending an AKS ND H100 v5 inference-perf deficit. That deficit is fixed on main by nvidia-tuned 0.3.2 (#1767), but the fix is not in any release tag yetv0.17.0 and older pin 0.3.1. With previous_n=1 the nightly batch runs main + the newest release, so naively enrolling inference would run a predictably-red v0.17.0 Azure inference cell every night. As more versions/platforms land, this "release predates support" case recurs — hence a formal minimum-version expression rather than a one-off.

Related: #1644 (serve CUJ), #1767 (perf fix)

Type of Change

  • New feature (non-breaking change that adds functionality)
  • Build/CI/tooling

Component(s) Affected

  • Docs/examples (docs/, examples/)
  • Other: UAT reservation registry + broker (infra/uat, pkg/uatbroker, tools/uat-broker), nightly controller

Implementation Notes

nightly-intent-min-versions — a per-intent map on the reservation row:

nightly-intent-min-versions:
  inference: v0.18.0
  • main is never gated (built from source, carries the newest fixes → always runs every listed intent). Only release cells are gated: a tag below an intent's minimum is dropped for that intent (semver; tag >= min runs).
  • The gate is resolved in the scheduleuat-broker schedule attaches each cell's eligible intents — so the nightly controller dispatches a cell's own intents with no semver logic in workflow bash.
  • Validate fails closed on a gate for an unrun/unknown intent or a non-semver value.
  • Pointing the floor at a not-yet-tagged release is intentional and self-resolving: until it ships, the intent runs on main only (green), then the release enrolls automatically.

Verified against the real registry (no v0.18.0 tag exists today): azure main runs training+inference; v0.17.0/v0.16.0 run training only; aws-h100/gcp-h100 unaffected.

Testing

go test -race ./pkg/uatbroker/... ./tools/uat-broker/...   # ok — 96.4% / 91.8%
golangci-lint run -c .golangci.yaml ./pkg/uatbroker/... ./tools/uat-broker/...  # 0 issues
yamllint infra/uat/reservations.yaml .github/workflows/uat-nightly-batch.yaml   # clean

New tests: EligibleNightlyIntents (main/at/above/below/ungated/unparseable), ExpandSchedule gate flow-through, per-cell intents via the tool, and registry validation (unrun/unknown intent, non-semver, valid).

Risk Assessment

  • Low — Additive registry field + a localized controller loop change; ungated reservations (AWS/GCP) are byte-for-byte unchanged in behavior. Reversible via a one-line registry edit.

Rollout notes: Removing the nightly-intent-min-versions block restores unconditional per-intent runs. No migration.

Checklist

  • Tests pass locally (make test with -race)
  • Linter passes (make lint)
  • I did not skip/disable tests to make CI green
  • I added/updated tests for new functionality
  • I updated docs if user-facing behavior changed
  • Changes follow existing patterns in the codebase
  • Commits are cryptographically signed (git commit -S)

@njhensley
njhensley requested a review from a team as a code owner July 15, 2026 23:52
@njhensley njhensley added the theme/ci-dx CI pipelines, developer experience, and build tooling label Jul 15, 2026
@njhensley
njhensley requested a review from a team as a code owner July 15, 2026 23:52
@njhensley njhensley self-assigned this Jul 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Nightly UAT scheduling now supports per-intent minimum release-version gates. Reservation models and registry validation enforce valid gates, schedule cells carry eligible intents, and the nightly workflow skips fully gated release cells. Azure H100 now runs training and inference nightly, with inference gated at v0.18.0. The CLI resolves selected reservations from the registry, and tests and documentation reflect the updated behavior.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Suggested labels: area/tests, area/cli

Suggested reviewers: mchmarny

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: enrolling azure-h100 inference in the nightly UAT batch.
Description check ✅ Passed The description is directly related to the changeset and accurately describes the nightly enrollment and min-version gating work.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/contributor/uat.md`:
- Around line 61-67: Update the heading at the section around the nightly
reservation table to replace the stale “both clouds” wording with “all three
clouds” or “all nightly-enrolled reservations,” matching the AWS, GCP, and Azure
coverage described by the table.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 58efd560-d5b1-42c9-9555-10da2d082446

📥 Commits

Reviewing files that changed from the base of the PR and between 7e54fca and 63e198e.

📒 Files selected for processing (3)
  • docs/contributor/uat.md
  • infra/uat/reservations.yaml
  • pkg/uatbroker/registry_test.go

Comment thread docs/contributor/uat.md Outdated

@mchmarny mchmarny left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The enrollment mechanism is straightforward, but its acceptance prerequisites are not met. The main inference run is not green end-to-end, and the newly scheduled v0.17.0 inference cell predates the required tuning fix. Both block merge despite the required CI gate passing.

@mchmarny mchmarny left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inline details for the blocking request-changes review above.

@mchmarny mchmarny left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inline evidence for the blocking review.

nightly-intents: [training]
# joined after a green manual intent=inference dispatch, matching the
# AWS/GCP rows which run both.
nightly-intents: [training, inference]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

blocker: The prerequisite stated above is not met. Run 29125390442 was a training run, and the latest manual Azure inference run (29448415427) finished in failure at evidence verification. This enrollment therefore adds a predictably red nightly main cell. Keep inference unenrolled until a full provision → validate → verify → teardown run succeeds, and link that run here.

Comment thread docs/contributor/uat.md
### Nightly intent cadence (both intents, both clouds)

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):
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):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

blocker: The nightly controller defaults to previous_n=1, so this also enables the v0.17.0 inference cell. That release pins nvidia-tuned 0.3.1; the Azure performance fix arrived in 0.3.2 after v0.17.0. Exclude unsupported release cells for this reservation/intent or demonstrate a green v0.17.0 inference run before enrolling it.

@njhensley
njhensley force-pushed the ci/azure-nightly-inference branch from 63e198e to 1d7e8a5 Compare July 16, 2026 16:50
@njhensley njhensley added theme/recipes Recipe expansion, overlays, mixins, and component registry and removed theme/recipes Recipe expansion, overlays, mixins, and component registry labels Jul 16, 2026
@njhensley

Copy link
Copy Markdown
Member Author

Pushed a revision that addresses the review.

@mchmarny's blocker B (v0.17.0 predates the fix) — resolved by mechanism. Rather than a one-off exclusion, added a data-driven nightly-intent-min-versions gate on the reservation row:

nightly-intent-min-versions:
  inference: v0.18.0   # nvidia-tuned 0.3.2 (#1767) is on main, not yet in a release tag

main is never gated (carries the fix); release cells below the floor drop the intent. Verified end-to-end on the real registry: today azure runs inference on main only (green), v0.17.0/v0.16.0 are skipped, and the gate auto-enrolls the first release that ships with 0.3.2. AWS/GCP are unchanged. The gate resolves in uat-broker schedule (no semver in workflow bash); Validate fails closed on a bad gate.

CodeRabbit — heading fix applied ("both clouds" → "all three clouds").

Still open — blocker A (green end-to-end acceptance run). The perf constraint is now green on main, but the acceptance run (29448415427) failed at the verify (evidence-bundle-verification) step — separate from perf. Since nightly Azure inference now only runs on main (perf-green) until v0.18.0, the recurring red-cell risk is gone, but I'll defer to you on whether a clean manual intent=inference run (or root-causing that verify failure) is required before merge.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pkg/uatbroker/registry_test.go`:
- Around line 638-640: Update the committed-registry test entry for azure-h100
in the registry assertion to require the v0.18.0 minimum for IntentInference,
while preserving the existing IntentTraining requirement and inference intent.

In `@tools/uat-broker/README.md`:
- Around line 75-84: Add a brief note to the `schedule --previous-n 2` README
example indicating that entries for other reservations are omitted for brevity,
while preserving the shown `azure-h100` output and command.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: faad136f-c731-4121-bd83-1c2880062f7d

📥 Commits

Reviewing files that changed from the base of the PR and between 63e198e and 1d7e8a5.

📒 Files selected for processing (12)
  • .github/workflows/uat-nightly-batch.yaml
  • docs/contributor/uat.md
  • infra/uat/reservations.yaml
  • pkg/uatbroker/doc.go
  • pkg/uatbroker/model.go
  • pkg/uatbroker/registry.go
  • pkg/uatbroker/registry_test.go
  • pkg/uatbroker/schedule.go
  • pkg/uatbroker/schedule_test.go
  • tools/uat-broker/README.md
  • tools/uat-broker/main.go
  • tools/uat-broker/main_test.go

Comment thread pkg/uatbroker/registry_test.go
Comment on lines 75 to 84
```sh
git tag -l 'v*' | uat-broker schedule --previous-n 2
# {
# "aws-h100": [
# { "reservation": "aws-h100", "aicr_version": "", "is_main": true },
# { "reservation": "aws-h100", "aicr_version": "v2.0.0", "is_main": false },
# { "reservation": "aws-h100", "aicr_version": "v1.10.0", "is_main": false }
# ],
# "gcp-h100": [ ... ]
# "azure-h100": [
# { "reservation": "azure-h100", "aicr_version": "", "is_main": true, "intents": ["training","inference"] },
# { "reservation": "azure-h100", "aicr_version": "v2.0.0", "is_main": false, "intents": ["training","inference"] },
# { "reservation": "azure-h100", "aicr_version": "v0.17.0", "is_main": false, "intents": ["training"] }
# ]
# }
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Clarify the truncated multi-reservation example.

The example runs schedule --previous-n 2 with no --reservations filter, so the real output would include every registry row (aws-h100, gcp-h100, azure-h100) as top-level keys — but only azure-h100 is shown. Add a short note that other reservations' entries are omitted for brevity, so readers don't mistake this for the full output shape.

📝 Proposed clarification
 ```sh
 git tag -l 'v*' | uat-broker schedule --previous-n 2
-# {
+# { # (other reservations' entries omitted here for brevity)
 #   "azure-h100": [
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
```sh
git tag -l 'v*' | uat-broker schedule --previous-n 2
# {
# "aws-h100": [
# { "reservation": "aws-h100", "aicr_version": "", "is_main": true },
# { "reservation": "aws-h100", "aicr_version": "v2.0.0", "is_main": false },
# { "reservation": "aws-h100", "aicr_version": "v1.10.0", "is_main": false }
# ],
# "gcp-h100": [ ... ]
# "azure-h100": [
# { "reservation": "azure-h100", "aicr_version": "", "is_main": true, "intents": ["training","inference"] },
# { "reservation": "azure-h100", "aicr_version": "v2.0.0", "is_main": false, "intents": ["training","inference"] },
# { "reservation": "azure-h100", "aicr_version": "v0.17.0", "is_main": false, "intents": ["training"] }
# ]
# }
```
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/uat-broker/README.md` around lines 75 - 84, Add a brief note to the
`schedule --previous-n 2` README example indicating that entries for other
reservations are omitted for brevity, while preserving the shown `azure-h100`
output and command.

@njhensley

Copy link
Copy Markdown
Member Author

Update on blocker A (green end-to-end acceptance run): it is not an issue with this PR — it's a separate main-wide evidence-verify regression, now tracked as #1793.

The Azure inference acceptance runs (and every other @ main UAT cell — AWS, GCP, azure, training and inference) fail at UAT - verifymaterialize-bundle: pulled artifact does not contain a recognizable summary bundle. Perf/validate/sign/push all pass; only the evidence-bundle pull-back fails. @ v0.17.0 cells pass, and the only evidence/OCI change since v0.17.0 is #1758, so the regression is there. Details + root-cause narrowing in #1793.

This PR touches nothing in the evidence path, so its correctness is independent. Leaving it open pending #1793 — once main verify is green again, a manual intent=inference acceptance run can satisfy blocker A. Blocker B (v0.17.0 perpetual red) is resolved here by the nightly-intent-min-versions gate.

@njhensley
njhensley requested a review from mchmarny July 16, 2026 20:54
mchmarny
mchmarny previously approved these changes Jul 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@njhensley this PR now has merge conflicts with main. Please rebase to resolve them.

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, NVIDIA#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>
@njhensley
njhensley force-pushed the ci/azure-nightly-inference branch from 497fcb8 to 6fff9f1 Compare July 16, 2026 21:06

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
pkg/uatbroker/registry_test.go (1)

639-641: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Pin the Azure inference minimum in the committed-registry guard.

Requiring the inference intent without asserting NightlyIntentMinVersions[IntentInference] == "v0.18.0" allows the release safety gate to be removed unnoticed.

Proposed assertion
 		got := res.NightlyIntentsOrDefault()
 		if !slices.Equal(got, want) {
 			t.Errorf("committed registry nightly-intents[%q] = %v, want %v", name, got, want)
 		}
+		if name == "azure-h100" &&
+			res.NightlyIntentMinVersions[IntentInference] != "v0.18.0" {
+			t.Errorf("azure inference minimum = %q, want v0.18.0",
+				res.NightlyIntentMinVersions[IntentInference])
+		}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/uatbroker/registry_test.go` around lines 639 - 641, Update the
committed-registry guard for the "azure-h100" entry to assert that
NightlyIntentMinVersions[IntentInference] remains exactly "v0.18.0", while
preserving its existing IntentTraining and IntentInference requirements.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@infra/uat/reservations.yaml`:
- Around line 108-110: Keep Azure inference unenrolled in
infra/uat/reservations.yaml until the complete provision, validation,
evidence-verification, and teardown acceptance flow succeeds; remove or replace
the unsupported green inference claim there. Also update docs/contributor/uat.md
to remove the claim that main-only inference coverage is green until that
acceptance run passes.

---

Duplicate comments:
In `@pkg/uatbroker/registry_test.go`:
- Around line 639-641: Update the committed-registry guard for the "azure-h100"
entry to assert that NightlyIntentMinVersions[IntentInference] remains exactly
"v0.18.0", while preserving its existing IntentTraining and IntentInference
requirements.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 9bda8457-7985-484d-af02-c6ab873e9757

📥 Commits

Reviewing files that changed from the base of the PR and between 1d7e8a5 and 6fff9f1.

📒 Files selected for processing (12)
  • .github/workflows/uat-nightly-batch.yaml
  • docs/contributor/uat.md
  • infra/uat/reservations.yaml
  • pkg/uatbroker/doc.go
  • pkg/uatbroker/model.go
  • pkg/uatbroker/registry.go
  • pkg/uatbroker/registry_test.go
  • pkg/uatbroker/schedule.go
  • pkg/uatbroker/schedule_test.go
  • tools/uat-broker/README.md
  • tools/uat-broker/main.go
  • tools/uat-broker/main_test.go

Comment on lines +108 to +110
# joined after a green manual intent=inference dispatch, matching the
# AWS/GCP rows which run both.
nightly-intents: [training, inference]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Azure inference still lacks a clean end-to-end acceptance run.

The v0.18.0 floor fixes unsupported release cells, but it does not gate main; the PR objectives report that the latest inference run failed evidence verification.

  • infra/uat/reservations.yaml#L108-L110: keep inference unenrolled until provision → validation → evidence verification → teardown succeeds, and replace the unsupported “green” claim.
  • docs/contributor/uat.md#L73-L82: remove the claim that main-only inference coverage is green until that acceptance run passes.
📍 Affects 2 files
  • infra/uat/reservations.yaml#L108-L110 (this comment)
  • docs/contributor/uat.md#L73-L82
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@infra/uat/reservations.yaml` around lines 108 - 110, Keep Azure inference
unenrolled in infra/uat/reservations.yaml until the complete provision,
validation, evidence-verification, and teardown acceptance flow succeeds; remove
or replace the unsupported green inference claim there. Also update
docs/contributor/uat.md to remove the claim that main-only inference coverage is
green until that acceptance run passes.

@mchmarny
mchmarny merged commit 1ba9d8e into NVIDIA:main Jul 17, 2026
38 checks passed
@njhensley
njhensley deleted the ci/azure-nightly-inference branch July 17, 2026 19:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/ci area/docs area/infra needs-rebase size/L theme/ci-dx CI pipelines, developer experience, and build tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants