Skip to content

Commit 497fcb8

Browse files
authored
Merge branch 'main' into ci/azure-nightly-inference
2 parents 1d7e8a5 + f0e2273 commit 497fcb8

32 files changed

Lines changed: 974 additions & 106 deletions

.github/actions/aicr-build/build-validator-images.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ for phase in ${PHASES//,/ }; do
4545
exit 1
4646
fi
4747
docker build -t "ko.local/aicr-validators/${phase}:latest" -f - . <<DOCKERFILE
48-
FROM gcr.io/distroless/static-debian12:nonroot
48+
FROM nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69
4949
COPY dist/validator/${phase} /${phase}
5050
COPY validators/${phase}/testdata /app/testdata
5151
WORKDIR /app
52-
USER nonroot
52+
USER nvs
5353
ENTRYPOINT ["/${phase}"]
5454
DOCKERFILE
5555
timeout 600 kind load docker-image "ko.local/aicr-validators/${phase}:latest" --name "${KIND_CLUSTER_NAME}" || {

.github/actions/e2e/action.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,12 @@ runs:
8787
done
8888
for phase in deployment performance conformance; do
8989
docker build -t "localhost:5001/aicr-validators/${phase}:latest" -f - . <<DOCKERFILE
90-
FROM gcr.io/distroless/static-debian12:nonroot
90+
FROM nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69
9191
COPY dist/validator/${phase} /${phase}
9292
COPY validators/${phase}/testdata /app/testdata
9393
COPY dist/validator/chainsaw /usr/local/bin/chainsaw
9494
WORKDIR /app
95-
USER nonroot
95+
USER nvs
9696
ENTRYPOINT ["/${phase}"]
9797
DOCKERFILE
9898
docker push "localhost:5001/aicr-validators/${phase}:latest"

.github/workflows/vuln-scan-images.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ jobs:
9292
env:
9393
GOFLAGS: -mod=vendor
9494
KO_DOCKER_REPO: ghcr.io/nvidia/aicrd
95-
KO_DEFAULTBASEIMAGE: gcr.io/distroless/static:nonroot
95+
# Base image inherited from .ko.yaml (nvcr.io/nvidia/distroless/static),
96+
# same as the aicr build above.
9697
run: |
9798
set -euo pipefail
9899
ko build ./cmd/aicrd \

.goreleaser.yaml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,11 @@ kos:
166166
build: aicr
167167
repositories:
168168
- ghcr.io/nvidia/aicr
169-
# No base_image: ko uses its default static, distroless base
170-
# (cgr.dev/chainguard/static). The aicr CLI/agent is pure Go and discovers
171-
# the GPU SKU driver-free via NFD/PCI, so it no longer needs nvidia-smi or
172-
# the CUDA base image (and its CVE surface).
169+
# NVIDIA's static distroless base (replaces ko's chainguard default). The
170+
# aicr CLI/agent is pure Go and discovers the GPU SKU driver-free via
171+
# NFD/PCI, so it no longer needs nvidia-smi or the CUDA base image (and its
172+
# CVE surface).
173+
base_image: nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69
173174
platforms:
174175
- linux/amd64
175176
- linux/arm64
@@ -185,10 +186,11 @@ kos:
185186
build: aicrd
186187
repositories:
187188
- ghcr.io/nvidia/aicrd
188-
# No base_image: aicrd intentionally uses ko's default static, distroless
189-
# base (cgr.dev/chainguard/static), same as aicr above. It runs as the
190-
# nonroot user 65532 by default, preserving the security posture of the
191-
# previous gcr.io/distroless/static:nonroot base (also UID 65532).
189+
# NVIDIA's static distroless base, same as aicr above. ko stamps its default
190+
# nonroot user (UID 65532) numerically, preserving the unprivileged security
191+
# posture of the previous gcr.io/distroless/static:nonroot base (also UID
192+
# 65532); the base image's own nvs (UID 1000) account is unused here.
193+
base_image: nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69
192194
platforms:
193195
- linux/amd64
194196
- linux/arm64

.ko.yaml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
# No defaultBaseImage: the aicr CLI/agent is a pure-Go binary that discovers
16-
# the GPU SKU driver-free via NFD/PCI, so it no longer needs nvidia-smi or the
17-
# CUDA base (and its recurring CVE surface). With no override, ko uses its
18-
# default static, distroless base image (cgr.dev/chainguard/static).
15+
# The aicr CLI/agent is a pure-Go binary that discovers the GPU SKU driver-free
16+
# via NFD/PCI, so it needs neither nvidia-smi nor the CUDA base (and its
17+
# recurring CVE surface). It runs on NVIDIA's own static distroless base rather
18+
# than ko's default (cgr.dev/chainguard/static). ko still stamps its default
19+
# nonroot user (UID 65532) numerically, so it runs unprivileged regardless of
20+
# the base image's own nvs (UID 1000) account. This defaultBaseImage applies to
21+
# `ko build` CLI invocations (e.g. the vuln-scan workflow); goreleaser's kos
22+
# entries pin the same image explicitly via base_image.
23+
defaultBaseImage: nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69

.settings.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,9 @@ testing:
173173
gpu_operator_chart_version: 'v25.10.1'
174174
# Base image for the CI smoke-test snapshot-agent image. The agent binary is
175175
# static Go and detects GPUs driver-free via NFD/PCI, so it no longer needs a
176-
# CUDA base / nvidia-smi. Matches ko's default static base for the aicr image.
177-
snapshot_agent_base_image: 'cgr.dev/chainguard/static:latest'
176+
# CUDA base / nvidia-smi. Matches the NVIDIA static distroless base used for
177+
# the aicr image (see .ko.yaml).
178+
snapshot_agent_base_image: 'nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69'
178179

179180
# Component test harness configuration
180181
# Used by tools/component-test/ scripts to validate individual components

RELEASING.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,16 @@ Published to GitHub Container Registry (`ghcr.io/nvidia/`):
172172

173173
| Image | Base | Description |
174174
|-------|------|-------------|
175-
| `aicr` | `nvcr.io/nvidia/cuda:13.1.0-runtime-ubuntu24.04` | CLI with CUDA runtime |
176-
| `aicrd` | `gcr.io/distroless/static:nonroot` | Minimal API server |
175+
| `aicr` | `nvcr.io/nvidia/distroless/static:v4.0.0` | Pure-Go CLI/agent (driver-free GPU discovery) |
176+
| `aicrd` | `nvcr.io/nvidia/distroless/static:v4.0.0` | Minimal API server |
177177

178178
Published to GitHub Container Registry (`ghcr.io/nvidia/aicr-validators/`):
179179

180180
| Image | Base | Description |
181181
|-------|------|-------------|
182-
| `deployment` | `gcr.io/distroless/static-debian12:nonroot` | Deployment validator |
183-
| `performance` | `gcr.io/distroless/static-debian12:nonroot` | Performance validator |
184-
| `conformance` | `gcr.io/distroless/static-debian12:nonroot` | Conformance validator |
182+
| `deployment` | `nvcr.io/nvidia/distroless/static:v4.0.0` | Deployment validator |
183+
| `performance` | `nvcr.io/nvidia/distroless/static:v4.0.0` | Performance validator |
184+
| `conformance` | `nvcr.io/nvidia/distroless/static:v4.0.0` | Conformance validator |
185185
| `aiperf-bench` | `python:3.12-slim` | AIPerf benchmark runner |
186186

187187
Stable releases promote `vX.Y.Z` and `latest`; prereleases promote their

cmd/gate/Dockerfile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ RUN CGO_ENABLED=0 go build -trimpath \
4646
-ldflags="-s -w -extldflags '-static' -X main.version=${VERSION}" \
4747
-o /out/gate ./cmd/gate
4848

49-
FROM gcr.io/distroless/static-debian12:nonroot
49+
FROM nvcr.io/nvidia/distroless/static:v4.0.0@sha256:d90158b69e250d2018f32622b5c622925202ee97224a990a54b63811cb1e3d69
5050

5151
COPY --from=builder /out/gate /gate
5252
COPY --from=chainsaw /ko-app/chainsaw /usr/local/bin/chainsaw
@@ -56,5 +56,7 @@ COPY --from=chainsaw /ko-app/chainsaw /usr/local/bin/chainsaw
5656
# points here; see cmd/gate/main.go (defaultChainsawConfig).
5757
COPY cmd/gate/chainsaw-config.yaml /etc/chainsaw/config.yaml
5858

59-
USER nonroot
59+
# nvs (UID 1000) is the sole nonroot user shipped in the NVIDIA distroless
60+
# static base; it has no "nonroot"/65532 user like the previous distroless bases.
61+
USER nvs
6062
ENTRYPOINT ["/gate"]

demos/cuj1-slinky-slurm.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Pick the row that matches your cluster. Each resolves to a slurm leaf with at le
3131

3232
| Cloud | Command | Leaf overlay |
3333
| -------- | ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------- |
34+
| **AKS** | `aicr recipe --service aks --accelerator h100 --intent training --os ubuntu --platform slurm -o recipe.yaml` | `h100-aks-ubuntu-training-slurm` |
3435
| **EKS** | `aicr recipe --service eks --accelerator h100 --intent training --os ubuntu --platform slurm -o recipe.yaml` | `h100-eks-ubuntu-training-slurm` |
3536
| **GKE** | `aicr recipe --service gke --accelerator h100 --intent training --os cos --platform slurm -o recipe.yaml` | `h100-gke-cos-training-slurm` |
3637
| **Kind** | `aicr recipe --service kind --accelerator h100 --intent training --platform slurm -o recipe.yaml` | `h100-kind-training-slurm` (CPU-only NodeSet; no GPU GRES) |
@@ -112,6 +113,27 @@ GKE system nodes should **not** carry custom taints (konnectivity and other mana
112113

113114
Optional: `--accelerated-node-toleration nvidia.com/gpu=present:NoSchedule` (harmless if that taint is absent).
114115

116+
### AKS (system + cpu + gpu pools; CriticalAddonsOnly + GPU taint)
117+
118+
Example layout: 3× `system` (`CriticalAddonsOnly=true:NoSchedule`), 1× `cpuworker1` (untainted), 2× `gpuworker1` (`nvidia.com/gpu=present:NoSchedule`). Operator on **system**; controller / login / restapi on **cpuworker1**; slurmd on **gpuworker1**.
119+
120+
```shell
121+
aicr bundle \
122+
--recipe recipe.yaml \
123+
--deployer helm \
124+
--system-node-selector agentpool=system \
125+
--system-node-toleration CriticalAddonsOnly=true:NoSchedule \
126+
--accelerated-node-selector agentpool=gpuworker1 \
127+
--accelerated-node-toleration nvidia.com/gpu=present:NoSchedule \
128+
--set slinkyslurm:nodesets.slinky.replicas=2 \
129+
--set-json 'slinkyslurm:controller.podSpec={"nodeSelector":{"agentpool":"cpuworker1"}}' \
130+
--set-json 'slinkyslurm:restapi.podSpec={"nodeSelector":{"agentpool":"cpuworker1"}}' \
131+
--set-json 'slinkyslurm:loginsets.slinky.podSpec={"nodeSelector":{"agentpool":"cpuworker1"}}' \
132+
--output bundle
133+
```
134+
135+
AKS ships `managed-csi` as the default StorageClass; omit `--storage-class` unless you need a non-default class.
136+
115137
### Kind (CPU-only smoke / CI)
116138

117139
No GPU pools or taints; omit accelerated flags unless your Kind config adds them.

docs/integrator/recipe-development.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ For example, `--platform slurm` leaves inline three `componentRefs`:
121121

122122
- `slinky-slurm-operator-crds` — SchedMD Slinky CRDs
123123
- `slinky-slurm-operator` — the operator and admission webhook
124-
- `slinky-slurm` — the Slinky-managed Slurm cluster instance (Controller / LoginSet / NodeSet / RestApi), with leaf-specific `overrides` (e.g. H100 GRES wiring on the `nodesets.slinky` map)
124+
- `slinky-slurm` — the Slinky-managed Slurm cluster instance (Controller / LoginSet / NodeSet / RestApi), with leaf-specific `overrides` (e.g. GPU GRES wiring on `nodesets.slinky` and `controller.extraConfMap`)
125125

126126
This is the same shape `dynamo-platform` uses across the `*-inference-dynamo` leaves. See `recipes/overlays/h100-eks-ubuntu-training-slurm.yaml` for the full example.
127127

0 commit comments

Comments
 (0)