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
feat(validator): data-driven NCCL benchmark runtime for --data recipes
Add the nccl-benchmark-runtime-ref performance constraint: a recipe ships a
Kubeflow TrainingRuntime as a file in its --data tree (at the same
validators/performance/testdata/{accelerator}/{service}/runtime.yaml layout
the embedded templates use) and references it. This closes the gap the
nccl-benchmark-profile escape hatch (#1719) left open — a private
service+accelerator introduced only via --data, whose fabric matches no
embedded template, can now be NCCL-performance-certified keyed on its own
criteria with no compiled applicability entry.
The orchestrator (resolveBenchmarkRuntimeRef, called from ValidatePhases/
ValidatePhase) reads the referenced file through the recipe DataProvider and
lowers its content into an nccl-benchmark-runtime carrier constraint that
rides to the pod via the existing ValidationInput ConfigMap. The in-pod
validator renders it in place of a baked-in template, bypasses the compiled
supportedNCCLCombinations gate, and skips all service-specific fabric
plumbing (EFA/TCPXO/RDMA discovery, GB200-NVreg/GKE-TCPXO preflights, RoCE
claim, NVLS/IMEX) — the supplied runtime owns its fabric.
Trust-bounded to a TrainingRuntime GVR with forced name/namespace; fails
closed on a malformed/traversal ref, missing/empty file, unresolved ref
reaching the pod, or a non-TrainingRuntime carrier. Mutually exclusive with
nccl-benchmark-profile.
Fixes#1792
Signed-off-by: Nathan Hensley <nhensley@nvidia.com>
Copy file name to clipboardExpand all lines: docs/user/validation.md
+118-4Lines changed: 118 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,9 +52,12 @@ ones) that match the target fabric:
52
52
|`nccl-all-reduce-bw-nvls`| NVLS (MNNVL across an NVL72 IMEX domain) | GB200 + EKS, and GB200 + OKE. Asserts the NVLS communicator actually initialized — catches silent fallback to EFA (EKS) or Socket (OKE) when the IMEX domain is misconfigured. |
53
53
54
54
The applicability column is the *default*, derived from the recipe's
55
-
`criteria`. A recipe whose criteria fall outside it can opt into one of these
56
-
benchmarks explicitly — see
57
-
[Opting external recipes into a benchmark profile](#opting-external-recipes-into-a-benchmark-profile).
55
+
`criteria`. A recipe whose criteria fall outside it can still run these
56
+
benchmarks explicitly — either by
57
+
[borrowing an embedded benchmark profile](#opting-external-recipes-into-a-benchmark-profile)
58
+
whose fabric matches its hardware, or, for a private service whose fabric
59
+
matches no embedded template, by
60
+
[supplying its own benchmark runtime](#supplying-a-benchmark-runtime-for-a-private-service).
58
61
59
62
The `-net` check defaults to the AWS EFA fabric. On a ConnectX **RoCE** cluster
60
63
(e.g. DGXC GB300 `p6e-gb300r`), set `AICR_NCCL_FABRIC=roce` in the `aicr
@@ -180,6 +183,114 @@ check with a message naming the profile. When a profile is set it wins over
180
183
criteria-derived applicability, and the pass/fail thresholds stay in the
181
184
same-named check constraints as always.
182
185
186
+
### Supplying a benchmark runtime for a private service
187
+
188
+
A profile only helps when an **embedded** template already matches the
189
+
cluster's hardware and fabric. A private service introduced entirely through
190
+
`--data`— a `criteria.service` (and possibly `criteria.accelerator`) the
191
+
validator ships no template for, with a fabric that reuses none of the
192
+
embedded ones — has no compiled pair to point a profile at. Such a recipe
193
+
supplies the benchmark itself: it ships a Kubeflow `TrainingRuntime` as a file
194
+
in its `--data` tree and references it with the `nccl-benchmark-runtime-ref`
195
+
performance constraint (a bare `{accelerator}/{service}` value). `aicr validate`
196
+
reads that file and gates the benchmark keyed on the recipe's **own** criteria,
197
+
with no compiled applicability entry required.
198
+
199
+
Lay the runtime out **exactly where the embedded templates live**, so it is a
200
+
drop-in for upstreaming later:
201
+
202
+
```text
203
+
mydata/ # your --data directory
204
+
├── overlays/
205
+
│ └── mycloud-training.yaml # the recipe overlay (below)
206
+
└── validators/performance/testdata/
207
+
└── gb200/mycloud/runtime.yaml # the TrainingRuntime, real file
it into AICR is a copy: move the file into the repo, add the accelerator/service
290
+
tuple to the compiled `supportedNCCLCombinations` matrix, and drop the
291
+
`nccl-benchmark-runtime-ref`constraint — the benchmark then runs from the
292
+
recipe's plain criteria like any other embedded one.
293
+
183
294
## Inference performance validation
184
295
185
296
Inference performance runs the `inference-perf` check — deploys a
@@ -776,8 +887,11 @@ Common reasons and their cause:
776
887
| `no inference-throughput or inference-ttft-p99 constraint in recipe` | `stdout` | Check was invoked but recipe is missing the matching constraints | Re-generate the recipe or add the constraints |
777
888
| `dynamo-platform not in recipe components` | `stdout` | Inference check selected but `dynamo-platform` absent from `componentRefs` | Use `--platform dynamo` when generating the recipe |
778
889
| `DynamoGraphDeployment CRD not installed` | `stdout` | Recipe declares `dynamo-platform` but the operator is not deployed | Run `aicr bundle` + `./deploy.sh` first, or wait for bootstrap to complete |
779
-
| `requires Service + Accelerator to be implemented` | `stdout` | The recipe's `criteria` are outside the NCCL benchmark's default applicability (e.g. a service registered via `--data`) | Add an `nccl-benchmark-profile` constraint — see [Opting external recipes into a benchmark profile](#opting-external-recipes-into-a-benchmark-profile) |
890
+
| `requires Service + Accelerator to be implemented` | `stdout` | The recipe's `criteria` are outside the NCCL benchmark's default applicability (e.g. a service registered via `--data`) | Add an `nccl-benchmark-profile` constraint — see [Opting external recipes into a benchmark profile](#opting-external-recipes-into-a-benchmark-profile) — or, if no embedded template fits, an `nccl-benchmark-runtime-ref` constraint — see [Supplying a benchmark runtime for a private service](#supplying-a-benchmark-runtime-for-a-private-service) |
780
891
| `benchmark profile … does not implement the … NCCL variant` | `stdout` | The declared `nccl-benchmark-profile` is valid but has no template for this check variant | Drop the non-applicable check from `validation.performance.checks`, or pick a profile that implements it |
892
+
| `failed to resolve nccl-benchmark-runtime-ref=… expected … in the --data tree` | `stderr` | The referenced runtime file is missing from `--data` (or `--data` wasn't passed) | Place the `TrainingRuntime` at `validators/performance/testdata/{accelerator}/{service}/runtime.yaml` in your `--data` dir — see [Supplying a benchmark runtime for a private service](#supplying-a-benchmark-runtime-for-a-private-service) |
893
+
| `nccl-benchmark-runtime … must be a … TrainingRuntime … must declare a "node" replicatedJob` | `stdout` | The referenced file is not a Kubeflow `trainer.kubeflow.org/v1alpha1` `TrainingRuntime`, or lacks the `node` replicatedJob | Fix the runtime file to be a valid `TrainingRuntime` with a `node` replicatedJob |
894
+
| `nccl-benchmark-runtime and nccl-benchmark-profile are mutually exclusive` | `stdout` | The recipe declares both escape hatches at once | Keep only one: borrow an embedded profile **or** supply your own runtime |
781
895
| `skipped - no-cluster mode` | `message` | `--no-cluster` was passed — the runner short-circuits every phase before dispatching any Job | Remove the flag to run behavioral checks |
782
896
| `skipped due to previous phase failure` | `message` | `--fail-fast` was set and an earlier phase failed, so subsequent phases were skipped | Fix the earlier phase first, or drop `--fail-fast` to run all phases regardless |
0 commit comments