GKE generated AICR GB300 recipies - #1985
Conversation
Introduces authoritative Google Kubernetes Engine (GKE) cloud provider recipe overlays, component defaults, and simulated KWOK node profiles for Google Cloud's upcoming A4X-Max (NVIDIA GB300 NVL72) bare metal platform. All manifests are generated programmatically from internal GKE Version Vector compatibility registries and GCE hardware compute specifications. Key Architectural Decisions & GKE Tuning: - GKE Managed RDMA & GDRCopy Networking: On GKE A4/A4X/A5X clusters, high-speed inter-node multi-GPU communication utilizes GPU Operator with GDRCopy enabled (`gdrcopy: enabled: true`) across GCP native multi-NIC optical rails. When node pools operate under GKE Managed RDMA (`--gpudirect-strategy=rdma`), GKE natively automates the installation and lifecycle of Google InfiniBand (gIB) plugins and NCCL tuners (`/usr/local/gib/`). Standalone networking installer DaemonSets (`gke-nccl-roce` or `gke-nccl-tcpxo`) are intentionally bypassed in overlays to prevent overriding GKE managed networking. - GKE COS Host Driver Alignment: On Container-Optimized OS (COS), NVIDIA drivers are natively mounted at `/home/kubernetes/bin/nvidia`. GPU Operator is configured with `driver.enabled: false` to instruct the operator not to deploy containerized driver daemonsets over managed host installations. - Workload Tuning Overlays: Configures Kubeflow distributed training leaves with GDRCopy acceleration (`NCCL_NET_GDR_LEVEL: 5`, `NCCL_DEBUG: INFO`), and Dynamo inference platforms parameterically matched to ARM64 host topologies and DRA release gates (`K8s.server.version: >= 1.34`). - Validation Alignment: Adopts deployment phase checks with GPU Operator v25.10+ version floors and suppresses static NCCL performance hard gates pending runtime RoCE testbed characterization. Signed-off-by: Adel Abouchaev <adelab@google.com>
|
Welcome to AICR, @rawsocket! Thanks for your first pull request. Before review, please ensure:
A maintainer will review this soon. |
📝 WalkthroughWalkthroughAdds GB300 support for GKE COS inference and training. The change adds KWOK node profiles, tuning metadata, NCCL RoCE values, base recipes, Dynamo and Kubeflow overlays, and generated recipe coverage expectations. Estimated code review effort: 4 (Complex) | ~45 minutes Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
recipes/components/gke-nccl-roce/values.yaml (1)
1-41: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick winRegister and wire
gke-nccl-roce, or remove it.
recipes/components/gke-nccl-roce/values.yamlhas no registry entry orcomponentRefsconsumer. GB300 overlays explicitly bypass standalone networking installers in favor of GKE Managed RDMA.If this component is retained, add its registry and recipe wiring. Then run
make bom-docsand commitdocs/user/container-images.md.🤖 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 `@recipes/components/gke-nccl-roce/values.yaml` around lines 1 - 41, Either remove the unused gke-nccl-roce component, or register it in the component registry and wire it through a recipe consumer using componentRefs. If retained, update the generated container image documentation by running make bom-docs and include the resulting docs/user/container-images.md changes.Source: Coding guidelines
🤖 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 `@kwok/profiles/gke/a4x-maxgpu-4g-metal.yaml`:
- Around line 25-31: Update the gpu.memory value in the NVIDIA-GB300 profile
from 245760 to 285696 MiB per GPU, keeping the existing product, count, and
driver settings unchanged.
In `@recipes/overlays/gb300-gke-cos-inference-dynamo.yaml`:
- Around line 77-79: Update the Deployment.gpu-operator.version constraint in
the overlay’s constraints section from the outdated v24.6.0 floor to the
required >= v25.10.0 floor.
In `@recipes/overlays/gb300-gke-cos-inference.yaml`:
- Around line 54-64: Change the intent override in the nodewright-customizations
block from multiNodeTraining to inference so it matches this recipe’s
criteria.intent and selects the correct inference tuning profile; leave the
service, accelerator, and dependencyRefs values unchanged.
---
Outside diff comments:
In `@recipes/components/gke-nccl-roce/values.yaml`:
- Around line 1-41: Either remove the unused gke-nccl-roce component, or
register it in the component registry and wire it through a recipe consumer
using componentRefs. If retained, update the generated container image
documentation by running make bom-docs and include the resulting
docs/user/container-images.md changes.
🪄 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: 1cfd0cc4-f2e2-40ba-a596-fc5819707e01
📒 Files selected for processing (10)
docs/integrator/components/nodewright.mdkwok/profiles/gke/a4x-maxgpu-4g-metal.yamlkwok/profiles/gke/system-n2.yamlpkg/recipe/testdata/coverage_golden.yamlpkg/tuning/compute_test.gorecipes/components/gke-nccl-roce/values.yamlrecipes/overlays/gb300-gke-cos-inference-dynamo.yamlrecipes/overlays/gb300-gke-cos-inference.yamlrecipes/overlays/gb300-gke-cos-training-kubeflow.yamlrecipes/overlays/gb300-gke-cos-training.yaml
Recipe evidence checkOther affected recipes without evidence yet: 4These recipes are affected by this PR but carry no committed evidence pointer, so there is
This gate is warning-only and never blocks merge. See ADR-007 for the trust model. |
There was a problem hiding this comment.
Welcome to AICR. The mechanical parts of adding an accelerator to this repo are easy to get wrong and you got them right. coverage_golden.yaml is correctly regenerated, pkg/tuning/compute_test.go and docs/integrator/components/nodewright.md are updated in step, and the inheritance chain (gb300-gke-cos-{training,inference} -> -kubeflow/-dynamo) matches how the b200 family is laid out. go test ./pkg/recipe/... ./pkg/tuning/... passes clean at this head.
The three blockers are all in the same category — config that ships to users and looks right but does the wrong thing — rather than anything structural. Each is a small fix.
Scope validated: all 10 changed files read at be8b984; recipe resolution run locally for the gb300 dynamo/inference/training paths; pkg/recipe + pkg/tuning tests run; apply-nodes.sh profile selection traced against this PR's own Tier 2 CI logs.
CI: Tier 1 / oke-ol-training (argocd-git) and the dependent KWOK Test Summary are red, but that is infrastructure, not your change — the log shows curl: (35) Recv failure: Connection reset by peer followed by Error: repo argo not found while adding the Argo CD Helm repo, in an OKE lane this PR does not touch. A re-run should clear it. The PR is also currently BEHIND main and will need a rebase.
Findings inline. Happy to re-review as soon as you have pushed.
yuanchen8911
left a comment
There was a problem hiding this comment.
Reviewed at be8b984 with recipe resolution run locally, the pinned tuning package pulled from ghcr.io, and image manifests verified against registry APIs.
Change requests
-
NodeWright tuning cannot work as configured: nvidia-tuning-gke:0.1.2 contains only gb200/ and h100/ profiles, and its prepare script rejects
accelerator: gb300before intent is read, failing Skyhook tuning on every GB300 node. Either ship withenabled: falseor reuse the gb200 profile — maintainer question in the nodewright thread. -
gb300-gke-cos-inference-dynamo sets
Deployment.gpu-operator.versionto>= v24.6.0, which replaces (not tightens) the parent's>= v25.10.0on merge. GB300 support shipped in v25.10 — drop the constraint or set>= v25.10.0. -
The new GKE KWOK profiles are never selected: apply-nodes.sh still maps gke/gb300 to eks/p5-h100, and this PR's Tier 2 CI logs show the GB300 lanes ran on amd64 H100 nodes. Wire them in or remove them. Also set
gpu.memoryto 285696 MiB (Google lists 279 GB per GPU; 245760 encodes only 240 GB). -
The Kubeflow
runtime.image/runtime.envoverrides are consumed by nothing, the proposed 25.01-py3-arm64 tag does not exist on nvcr.io (404), and the manifest's hardcoded pytorch/pytorch digest is amd64-only — it cannot run on A4X Max's arm64 hosts. Parameterize the manifest image and pin a multi-arch CUDA 13 digest (NVIDIA PyTorch 25.08+).
Cleanup (config that reads as functional but is not)
- Drop
gdrcopy.enabled: true(inert without an operator-managed driver; values-gke-cos.yaml documents gdrcopy as unsupported on COS), the deaddriver.versionpin, anddriver.nvidiaDriverRoot(not a gpu-operator key). - Drop the dynamo leaf's
engine.cudaVersion/engine.arch(chart 1.2.1 does not consume them); document instead that GB300 requires the CUDA 13 runtime variants (vllm-runtime:1.2.1-cuda13 is published multi-arch). - Correct the Managed RDMA comments: A4X Max additionally requires the asapd-lite DaemonSet, mrdma.google.com resource claims, and ComputeDomain/IMEX setup — document these as external provisioning prerequisites.
- Remove unreachable gke-nccl-roce/values.yaml (no registry entry, no consumer); add the Apache header to the four files missing it.
Branch is behind main with a merge commit — please rebase onto origin/main and squash to a single signed/DCO commit.
apply-nodes.sh::get_profiles silently fell back to eks/p5-h100.yaml for any unknown service+accelerator. NVIDIA#1985 showed the failure mode: GB300 GKE lanes reported green while running amd64 H100 nodes. Replace the hardcoded map with label-driven discovery in kwok/scripts/lib/profile-select.sh (match metadata.labels {provider,nodeType,accelerator}). Adding a profile is now a YAML file, no bash edit. Layered fail-closed: - Direct (apply-nodes.sh, make kwok-e2e): full diagnostic, exit 1. - Batch (run-all-recipes.sh): explicit invocations — every CI matrix cell — fail on unmapped SKIP; implicit get_recipes() still SKIPs for local make kwok-test-all. - CI discovery (kwok-recipes.yaml classify): unmapped recipes never enter the matrix; malformed overlay YAML aborts classify; workflow_dispatch on an unmapped recipe fails at classify. Selector tightened: reject booleans/integers in criteria (yq's // alternative was falsy-swallowing false); malformed profile YAML is fatal; ambiguous match returns rc=1, genuine no-match returns PROFILE_SELECT_RC_NO_MATCH (rc=2) so batch can distinguish "no profile yet" from "broken tree". Tests wired into the discover job's script-tests step (profile-select_test.sh: 22 cases; run-all-recipes_test.sh: 2 cases proving explicit unmapped cannot be passed). kwok/README.md updated. Fixes NVIDIA#1997 Signed-off-by: framsouza <fram.souza14@gmail.com>
|
Still blocked on three functional issues at
The previous KWOK profile-selection blocker is resolved by current Focused local recipe/tuning/profile tests pass. Current-head CI is now running. |
|
Will come back to it at a later time. All the changes suggested here are implemented. |
Summary
Recipes for GB300.
Motivation / Context
Updating the AICR repo with validate versions.
Type of Change
Component(s) Affected
pkg/recipe)Implementation Notes
GB300 recipes generated with up to date component versions.
Testing
# Commands run (prefer `make qualify` for non-trivial changes) make qualifyRisk Assessment
Checklist
make testwith-race)make lint)git commit -S) — GPG signing info