feat(recipes): add l40-any accelerator overlay - #2366
Conversation
|
Welcome to AICR, @ntheanh201! Thanks for your first pull request. Before review, please ensure:
A maintainer will review this soon. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Enterprise Run ID: 📒 Files selected for processing (4)
Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review. 📝 WalkthroughWalkthroughThe change adds the Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This adds the missing L40 recipe overlay so valid L40 queries resolve without changing existing recipes or code paths; no actionable merge-blocking risk remains after normal checks and review. Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Recipe evidence checkNo leaf overlays affected by this PR. This gate is warning-only and never blocks merge. |
`l40` is a registered accelerator type, but no overlay provides it, so any query carrying `accelerator=l40` fails to resolve. This is reachable from a live cluster: `aicr snapshot` on an L40 node detects `accelerator: l40` from `nodeTopology.label.nvidia.com/gpu.product`, and the snapshot-driven `aicr recipe --snapshot` then fails with `no recipe provides accelerator 'l40'`. Add the criteria-wildcard overlay, mirroring `l40s-any`. L40 is the same Ada Lovelace generation as L40S and tracks the same gpu-operator support timeline, so it carries the same deployment-phase floor: the four standard checks plus a `gpu-operator >= v24.6.0` pin matching the A100/H100/H200/L40S baseline. Goldens regenerated deliberately with AICR_UPDATE_GOLDEN=1 (catalog parity, coverage matrix, stock render). The change is additive: one new leaf, and no existing leaf hash moved. Signed-off-by: The Anh Nguyen <ntheanh201@gmail.com>
2555634 to
f004691
Compare
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
njhensley
left a comment
There was a problem hiding this comment.
▎ Method: 3 persona passes (recipe-domain, data-integrity/goldens, docs/contract-drift), each finding independently confirmed or refuted by a senior meta-reviewer against the resolved code. Line links pinned to head f004691b.
▎ Tier legend: 🔴 Blocker · 🟠 Major · 🟡 Minor · 🔵 Nitpick · ✅ Confirmed non-issue
Overall assessment — Approve
Clean, well-scoped, data-only change: a faithful mirror of l40s-any that closes a real gap (l40 is a registered accelerator but no overlay provided it, so criteria(accelerator=l40) errored). Confirmed the motivating error is fixed — the bare accelerator=l40 query now resolves — and that the change is purely additive with no existing leaf hash moved. Nothing here can break CI or ship a bad artifact. One optional doc nitpick (below); otherwise ready to merge.
The one substantive persona concern — that l40 having no concrete leaves would leave intent-qualified queries broken — did not survive adversarial verification (see non-issues).
🔵 Nitpick — docs/user/recipe-health.md missing the new l40-any row
(Not inline — recipe-health.md isn't in this PR's diff.) The matrix enumerates every overlay (a100-any, h200-any, l40s-any all have rows); the new l40-any leaf is resolvable but has no row, so the committed doc is momentarily stale relative to the catalog. Non-blocking: recipe-health.md is regenerated hermetically by recipe-health-refresh.yaml (make recipe-health-docs) weekly and is not a PR-time merge gate, so a scheduled PR will add the row (predictably | l40-any | — | l40 | — | — | — | pass | R:0 D:4 P:0 C:0 | pending |). You disclosed this in the checklist. Optional: run make recipe-health-docs to include it now for immediate parity, or let the bot handle it.
✅ Confirmed non-issues (checked and cleared)
- Intent-qualified
l40resolution (persona-flagged, refuted). With no concretel40leaves, would--accelerator l40 --intent trainingstill error? Refuted empirically against the embedded catalog:service=eks, accelerator=l40, intent=trainingresolves successfully (overlays[base monitoring-hpa l40-any eks eks-training]) — service/intent overlays are accelerator-agnostic and compose with the floor, so no per-accelerator concrete leaf is needed. The only failing case,--accelerator l40 --intent trainingwith no service, returns the identical genericintent 'training' requires additional criteriaerror thatl40s(which has concrete leaves) returns — a universal "intent needs a service" guard, not anl40gap. The PR's motivating error was the barecriteria(accelerator=l40)query, which now succeeds. - Goldens additive-only.
catalog_parityandstock_rendereach +1 hash line,coverage+2 lines, inserted in correct sorted position; no existing leaf hash moved (verified against the upstream merge-basede6514b13, not the stale local forkorigin/main). - BOM unaffected. Overlay uses
base: basewith nocomponentRefs, adds no images;registry.yamluntouched, soTestCommittedBOMVersionsMatchRegistryscope is unchanged. - No enum/contract drift.
l40(pre-existing value) is already co-listed withl40sin README, OpenAPI (all enum blocks), cli-reference, api-reference, recipe.md,doc.go,recipe.go, and the bug-report issue template. >= v24.6.0floor is defensible. L40 is the same Ada Lovelace generation as L40S; family-baseline floor matching A100/H100/H200/L40S. The comment ("4 standard checks plus the version pin") matches the 4-entry checks list; the referencedcriteria-wildcard-overlaysanchor exists.- Tests pass.
go test ./pkg/recipe/... ./pkg/bundler/green; goldens self-consistent.
Summary
| Tier | Count | Items |
|---|---|---|
| 🔴 Blocker | 0 | — |
| 🟠 Major | 0 | — |
| 🟡 Minor | 0 | — |
| 🔵 Nitpick | 1 | recipe-health.md row (bot-covered, optional) |
Recommendation: Approve. Nothing to fix before merge; the one nitpick is optional and the weekly refresh bot will add the row.
|
@ntheanh201 this PR now has merge conflicts with |
Summary
Adds the missing
l40-anycriteria-wildcard overlay.l40is already a registered accelerator type, but no overlay provides it, so any query carryingaccelerator=l40fails to resolve.Motivation / Context
The gap is reachable from a live cluster, not just from explicit flags.
aicr snapshoton an L40 node detectsaccelerator: l40fromnodeTopology.label.nvidia.com/gpu.product, but the snapshot-drivenaicr recipe --snapshotthen fails:The accelerator type itself is valid —
--accelerator foobaris rejected at parse time withinvalid accelerator type, while--accelerator l40parses and fails only at resolution.README.mdalso lists L40 under supported accelerators, so the catalog and the docs currently disagree.Fixes: #TBD
Related: N/A
Type of Change
Component(s) Affected
pkg/recipe)pkg/bundler,pkg/component/*) — golden only, no code changerecipes/overlays/Implementation Notes
Mirrors
l40s-any. L40 is the same Ada Lovelace generation as L40S and tracks the same gpu-operator support timeline, so it carries the same deployment-phase floor: the four standard checks plusDeployment.gpu-operator.version >= v24.6.0, matching the A100/H100/H200/L40S baseline. Concrete leaves can tighten it later.Three goldens were regenerated deliberately with
AICR_UPDATE_GOLDEN=1— catalog parity, coverage matrix, and stock render. The change is purely additive: one new leaf, no existing leaf hash moved.Consistent with its
*-anypeers, this leaf declares no conformance or performance checks (R:0 D:4 P:0 C:0).Testing
Also verified against real L40 hardware — a 2-node bare-metal cluster, K8s v1.35.3,
NVIDIA L40, driver580.173.02, gpu-operatorv26.3.0:Two deployment checks did not evaluate on that cluster, both for environmental reasons unrelated to this overlay:
check-nvidia-smi→Skip:IsNodeGpuBusyreports the node busy because a resident production pod holds a GPU. The check requires a node with zero GPU-requesting pods.expected-resources→ timeout: the cluster has no AICR bundle deployed, so 7 of the recipe's 11 declared components are absent and the poll never converges.As a control, the already-merged
l40s-anyrecipe was run against the same cluster with the same flags and produced identical outcomes —operator-healthpassed,gpu-operator-versionpassed,check-nvidia-smiskipped,expected-resourcestimed out, with the same messages. Both non-passing checks are therefore properties of this environment, not of the new overlay.Note:
make qualifywas not run in full — it needs the complete pinned toolchain (Docker, goreleaser, e2e). The targeted suites above cover the changed surface; the three golden tests are what gate a new leaf.Risk Assessment
Rollout notes: Data-only. No code paths change. Queries that previously errored on
accelerator=l40now resolve; no existing recipe is affected.Checklist
make testwith-race) — rango test ./pkg/recipe/... ./pkg/bundler/; fullmake qualifynot run (see Testing)make lint) — ranmake lint-yamlandmake licensedocs/user/recipe-health.mdis bot-regenerated and was intentionally left out; happy to include it if preferredgit commit -S)