-
Notifications
You must be signed in to change notification settings - Fork 90
docs(user): document the machine type each accelerator criterion targets #2380
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
4f78a6c
f9a5d90
25b0c7a
a7486d8
7d12eff
e42e972
d48a78f
3f0ee2e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -466,6 +466,13 @@ Generate recipes using direct system parameters: | |
| | `--data` | | string | External data directory to overlay on embedded data (see [External Data](#external-data-directory)) | | ||
| | `--criteria-strict` | | bool | Reject criteria values not in the embedded OSS catalog; ignores values registered from `--data`. Also honored via `AICR_CRITERIA_STRICT=1` or `spec.recipe.criteriaStrict: true` in `--config`. Intended for OSS CI gates. | | ||
|
|
||
| **Accelerator values name a GPU model, not a machine type.** A provider | ||
| usually offers several machine types for the same GPU, and the machine type — | ||
| not the GPU — determines the fabric, the NIC count, and which components a | ||
| recipe can use. `--accelerator h100` therefore does not, on its own, say which | ||
| node shape the resolved recipe targets. See | ||
| [Qualified Machine Types](#qualified-machine-types) below. | ||
|
|
||
| > **Service / Accelerator / OS / Intent / Platform value listings above are the OSS-embedded set.** When `--data` registers additional values (e.g., undisclosed providers, proprietary platforms), the CLI admits them at runtime through the criteria registry — see [Data Extension](../integrator/data-extension.md). `--criteria-strict` restores the OSS-only set regardless of what `--data` contributes. | ||
|
|
||
| **Examples:** | ||
|
|
@@ -510,6 +517,60 @@ proceeds for compatibility. Use a current snapshot before deployment when you | |
| need conflict detection. See | ||
| [Conflict detection requires snapshot evidence](slinky-slurm-accounting.md#conflict-detection-requires-snapshot-evidence). | ||
|
|
||
| #### Qualified Machine Types | ||
|
|
||
| Each recipe is qualified against a specific node shape. Criteria resolution | ||
| does not reject another machine type of the same GPU model — there is no axis | ||
| to reject it on — so a recipe always resolves. What differs by family is what | ||
| happens afterwards: on some, deployment validation fails; on others it succeeds | ||
| and only the performance gates are affected. | ||
|
|
||
| | Accelerator | Service / intent | Qualified machine type | On other shapes of the same GPU | | ||
| |---|---|---|---| | ||
| | `h100` | `gke`, `training` | `a3-megagpu-8g` | **Components do not schedule.** The GPUDirect-TCPXO DaemonSets pin node affinity to `cloud.google.com/gke-accelerator: nvidia-h100-mega-80gb`, so on `a3-highgpu-*` / `a3-edgegpu-8g` nothing rolls out and the deployment health check fails. AICR ships no GPUDirect-TCPX component for the shapes that need one — tracked in [#2290](https://github.com/NVIDIA/aicr/issues/2290). | | ||
| | `h100` | `gke`, `inference` | not machine-type-bound (`dynamo` floors calibrated on `a3-megagpu-8g`) | Deploys. The inference lineage carries no `gke-nccl-tcpxo` component, so the hard failure above does not apply. Plain `inference` declares no performance gates at all; the `dynamo` variant adds floors calibrated on the 8-GPU node, so smaller shapes such as `a3-highgpu-1g/2g/4g` can false-fail there. | | ||
| | `h100` | `eks` | `p5.48xlarge` (8× H100 SXM, 32× EFA) | Deploys, but performance floors are calibrated on the full node; smaller shapes such as `p5.4xlarge` can false-fail a healthy run. | | ||
| | `h100` | `aks` | `Standard_ND96isr_H100_v5` (8× H100 SXM, InfiniBand) | **Deployment fails on the non-IB NCads shapes.** The AKS chain wires `network-operator` with a NicClusterPolicy unconditionally, so the deployment-phase `expected-resources` check runs an RDMA-fabric readiness gate that fails closed. `Standard_NC80adis_H100_v5` (2 GPUs) and `Standard_NC40ads_H100_v5` (1 GPU) are PCIe H100 with no InfiniBand, so they never advertise the shared RDMA resource and the gate fails before any performance gate runs. Opt out at bundle time with `--set networkoperator:enabled=false`. | | ||
| | `gb200` | `eks` | `p6e-gb200.36xlarge` (4 GPUs per K8s node) | Deploys; floors are sized for this shape and are themselves provisional pending production NVL72 data. | | ||
| | `a100` | `gke` | the whole `a2` family (`a2-highgpu-*`, `a2-ultragpu-*`) | Family-level by construction, not per-shape: GPUDirect-TCPXO targets H100 `a3-megagpu-8g`, so the `gke-nccl-tcpxo` component is inapplicable to every `a2` shape and is intentionally omitted. No shape in the family carries a machine-type-bound component. | | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 Nitpick — The Fix: Optional: lowercase
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Made both lowercase in 3f0ee2e. Since the column names machine-type families rather than marketing series, the lowercase identifier form ( |
||
| | `b200` | `gke` | the `a4` family — **specific machine type not recorded** | No separate NCCL plugin installer; multi-node NCCL comes from GPU Operator `gdrcopy` plus GKE `a4`'s GCP-managed multi-NIC, so nothing here is machine-type-bound. The overlay records a production reference cluster but no machine type, so this row cannot name one. | | ||
|
|
||
| A row that names no intent applies to every intent for that accelerator and | ||
| service. Where a row names a family rather than a machine type, the entry is a | ||
| family-level statement — either because no component in that family binds to a | ||
| machine type, or because the specific shape is not recorded in-repo. The row | ||
| says which. | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
|
|
||
| Two distinct failure modes are worth separating: | ||
|
|
||
| - **Component-level (hard).** Two families fail deployment outright, by | ||
| different mechanisms. The GKE H100 **training** lineage pins artifacts to a | ||
| machine type — `h100-gke-cos-training` and the leaves inheriting it — so on a | ||
| non-matching shape the DaemonSets have nowhere to land and a Chainsaw health | ||
| check fails. The AKS H100 **training** lineage instead wires an RDMA fabric | ||
| unconditionally, and a Go readiness gate in the deployment phase fails closed | ||
| when no node advertises the shared RDMA resource — which is every non-IB | ||
| NCads shape. Neither is a degradation; both stop the deployment phase. | ||
| - **Performance-gate (soft).** Elsewhere the recipe deploys normally, but the | ||
| NCCL and inference floors are fixed absolute values calibrated on full, | ||
| high-bandwidth nodes. They are not normalized for GPU count or fabric class, | ||
| so a smaller shape can fail a gate while being perfectly healthy. This is the | ||
| EKS and GB200 case; on AKS the deployment gate above bites first. See | ||
| [Validation › Node-shape assumption](./validation.md). Normalizing these | ||
| floors per GPU or per fabric class was considered and declined | ||
| ([#1256](https://github.com/NVIDIA/aicr/issues/1256), | ||
| [#1254](https://github.com/NVIDIA/aicr/issues/1254), both closed as not | ||
| planned) — the floors are deliberately fixed absolute full-node values, so | ||
| running a qualified shape is the supported way to pass them. | ||
|
|
||
| The table lists the accelerator/service pairs that have a qualified shape; | ||
| a pair or a shape absent from it is **undocumented rather than known-broken**. | ||
| It has not been qualified, and the criteria model has no axis that would | ||
| distinguish it from one that has. | ||
| Whether AICR should gain one — finer-grained accelerator values, a machine-type | ||
| axis, or a fabric class — is tracked in | ||
| [#2377](https://github.com/NVIDIA/aicr/issues/2377). | ||
|
|
||
| #### Snapshot Mode | ||
|
|
||
| Generate recipes from captured snapshots: | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -44,8 +44,10 @@ spec: | |
| # enabled, combined with GKE A4's native multi-NIC infrastructure | ||
| # managed by GCP. The `gke-nccl-tcpxo` component is intentionally | ||
| # omitted because its DaemonSets pin to `cloud.google.com/gke- | ||
| # accelerator: nvidia-h100-mega-80gb` (a3-megagpu / H100) and a | ||
| # different transport (TCPX), so they would not run on A4 nodes. | ||
| # accelerator: nvidia-h100-mega-80gb` (a3-megagpu / H100) and carry a | ||
| # transport A4 does not use (GPUDirect-TCPXO), so they would not run on A4 | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 Nitpick — The prior-round P4 fix lowercased the doc table to Fix: Optional. Defensible as-is (uppercase A4 = series name in prose; lowercase a4 = machine-type family in code font). Align only if doc↔overlay parity is the goal. |
||
| # nodes. (TCPXO is the a3-megagpu transport; TCPX is the separate | ||
| # a3-highgpu/edge one. Neither applies here.) | ||
| - name: gpu-operator | ||
| type: Helm | ||
| dependencyRefs: | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,6 +21,20 @@ spec: | |
| # Inherits from aks-training recipe (AKS + training settings) | ||
| base: aks-training | ||
|
|
||
| # Machine type: qualified on Standard_ND96isr_H100_v5 (8x H100 SXM). These | ||
| # criteria carry no machine-type axis, so they also match the smaller NCads | ||
| # H100 shapes (Standard_NC80adis_H100_v5 = 2 GPUs, Standard_NC40ads_H100_v5 = | ||
| # 1 GPU). Those do NOT merely under-perform: the aks base wires | ||
| # network-operator with a NicClusterPolicy unconditionally, so the | ||
| # deployment-phase expected-resources check runs verifyRDMAFabricReady, which | ||
| # fails closed when no node advertises the shared RDMA resource. NCads are | ||
| # PCIe H100 with no InfiniBand, so deployment fails before the performance | ||
| # floors below are ever evaluated. Opt out with | ||
| # `--set networkoperator:enabled=false`. | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟠 Major — Same incorrect opt-out in the overlay comment Mirror of the cli-reference.md:533 finding: Fix: Point at |
||
| # | ||
| # On the qualified shape the floors still apply, and they are fixed absolute | ||
| # full-node values. Normalizing them was declined (#1256, #1254 — both closed | ||
| # not-planned); the qualified shape is the supported way to pass them. | ||
| criteria: | ||
| service: aks | ||
| accelerator: h100 | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🟠 Major — The
--set networkoperator:enabled=falseopt-out does not disable the gate it's offered againstThe row ends "Opt out at bundle time with
--set networkoperator:enabled=false" — but that is anaicr bundle-only flag, and the hard-fail it's meant to bypass fires duringaicr validate.aicr validatehas no--setflag (pkg/cli/validate.go:391-587) — passing it is an unknown-flag error. Neither doesaicr recipe.ctx.ValidationInput.ComponentRefsfrom the recipe unmodified (validators/deployment/expected_resources.go:212, filtered byIsEnabled()), andIsEnabled()only flips when the ComponentRef's ownOverrides["enabled"]is false (pkg/recipe/metadata.go:190).bundle --setwrites into the bundler's value-override pipeline for the generated Helm output; it never rewrites the recipe thatvalidatere-reads, and the two commands share no state.Blast radius: A user on a non-IB NCads cluster who follows this still eats the full RDMA-readiness-gate timeout and hard-fails. If they bundle without network-operator and then validate the unchanged recipe, validate fails just as hard. The doc implies a one-line escape hatch that does not exist as a CLI flag.
Fix: Replace the bundle-time sentence (here and in the overlay comment) with recipe/overlay-level guidance: disable the
network-operatorcomponentRef itself —overrides.enabled: false(or reference an overlay/mixin that omits the NicClusterPolicy manifest). That is whatenabledComponentRefs/recipeDeclaresRDMAFabrichonor before the gate arms.