跳到正文
NVIDIA Technical Blog:Agentic AI / Generative AI·· 1 天前AI 评分45

NVIDIA AICR 集成 k8s-aibom,为 GPU 平台提供运行时 AI 资产清单

Validating GPU Platforms with Runtime AI Inventory via the NVIDIA DSX AI Factory

AI 导读

NVIDIA AI Cluster Runtime(AICR)新增经过验证的 AIBOM 组件,集成 Google 开源的 k8s-aibom,用于追踪 Kubernetes 集群上实际运行的 AI 工作负载。

正文 · 原文

As teams deploy and scale AI workloads using NVIDIA Dynamo, Kubeflow, or Slurm, tracking what actually runs requires visibility beyond the platform configuration captured in a recipe. Application teams define and update these workloads independently of the platform recipe, so a reproducible deployment bundle alone cannot establish which workload artifacts are running on each node. Mutable image tags like :latest add another layer of complexity. Two nodes can end up running different code under identical tags, and a node that pulls next week may retrieve an image that was not covered by an earlier security review.

NVIDIA AI Cluster Runtime (AICR), an open source modular component of the NVIDIA DSX AI Factory Platform, now includes a qualified AI bill of materials (AIBOM) component to close that gap. An open source project created by Google, k8s-aibom tracks AI workloads running on Kubernetes. Two stock recipes select k8s-aibom by default: h100-gke-cos-inference and h100-gke-cos-inference-dynamo. Other GKE recipes can opt in during generation with --runtime-inventory enabled. Recipes selecting it can opt out with --runtime-inventory disabled.

AICR turns known-good GPU platform configurations into version-locked recipes and reproducible deployment bundles. Each recipe records the desired configuration for one hardware, cloud, OS, and intent combination: its components, version pins, values, constraints, deployment ordering, and validation expectations. AICR generates reproducible deployment artifacts from fixed recipe, catalog, and bundle inputs. Bundles include checksums; signing is optional through aicr bundle --attest.

Qualification with k8s-aibom is a specific claim, not a rubber stamp. AICR binds the exact upstream source, chart, CRDs, and digest-pinned controller image as one tested set, verifies provenance against Google’s expected build identity, reviews rendered RBAC and security defaults, and exercises installation, upgrade, health, and uninstall on the deployment paths it tested.

This blog will enable you to configure your Kubernetes runtime using AICR to provide a validated, performant configuration for your cluster.

The figure shows software, power and cooling efficiency, and physical infrastructure as one platform, plus simulation tools used to plan it. The platform software components comprise the DSX OS stack that are used to build and operate AI factories.
Figure 1. NVIDIA DSX brings together the technologies needed to design, build and operate AI factories

Two ends of the same problem

AICR and k8s-aibom look at different parts of the AI infrastructure lifecycle. AICR helps platform teams generate and validate known-good configurations for GPU-accelerated Kubernetes. It works at the runtime deployment layer: drivers, operators, kernels, Kubernetes components, deployment configuration.

k8s-aibom looks higher up the stack and later in the lifecycle of the cluster. It watches Kubernetes workload and pod APIs and emits a CycloneDX 1.6 AIBOM for each recognized AI workload. Coverage is bounded: Only supported workload kinds carrying a recognized AI signal are inventoried. Coverage includes native Dynamo graphs, NIMService, LeaderWorkerSet, DisaggregatedSet, and CronJob resources. Tracked child workloads are combined into their owner’s AIBOM.

AICR answersk8s-aibom answers
Is the GPU infrastructure built from a known and validated configuration?What AI assets are actually running on that infrastructure?
Table 1. The value at each level of the stack.

One provides control and reproducibility of the configuration for GPU-accelerated Kubernetes, while the other adds workload discovery and traceability in that cluster. Concretely, AIBOM helps you:

  • Find unregistered or shadow AI workloads in namespaces selected for reporting
  • Identify models, inference runtimes, agents, and RAG components
  • Track external AI APIs and vector databases
  • Detect changes or drift in AI dependencies
  • Support security reviews, incident response, and compliance audits

Both projects arrived at this from opposite sides of the same problem, and recognized it as such. AICR records qualified deployment intent and evaluates it against a cluster at a point in time. k8s-aibom observes supported AI workloads and records what it found, including how confidently each attribute was determined. Neither view is sufficient for AI governance on its own, and the boundary between them is exactly where accountability is missing today.

Using AICR with k8s-aibom

These examples reflect AICR v1.2.0 and its catalog, which pins k8s-aibom 1.6.2. Use a CLI build matching this catalog to reproduce the examples.

Start with a Google Kubernetes Engine (GKE) cluster running Kubernetes 1.32 or later, with NVIDIA H100 GPU nodes using Container-Optimized OS and GKE-managed drivers and device plugins. The following workflow generates a recipe, renders it into a bundle, deploys it, and validates the result. Nothing is hand-assembled and nothing is tuned by hand.

With the same AICR version, catalog, and generation inputs, recipe resolution produces the same configuration. The last step checks the cluster against it. That is the half AICR brings to this pairing: a validated GPU platform quickly and repeatably. k8s-aibom then keeps inventorying supported AI workloads.

Generate the recipe

aicr recipe \
  --service gke \
  --accelerator h100 \
  --os cos \
  --intent inference \
  --output recipe.yaml

The new k8s-aibom component is selected as part of the recipe, not bolted on afterward. You can query any resolved value without generating a file:

aicr query \
  --service gke --accelerator h100 --os cos --intent inference \
  --selector components.k8s-aibom.version
# 1.6.2

Bundle and deploy

Create a deployment bundle with the default Helm deployer. Replace the example node selectors with labels present on your system and GPU node pools:

aicr bundle \
  --recipe recipe.yaml \
  --system-node-selector nodeGroup=system-pool \
  --accelerated-node-selector nodeGroup=gpu-worker \
  --output ./bundles

The bundle is one directory per component, ordered by the dependency graph, each carrying its values, checksums, and install script. AICR supports a number of deployers via --deployer flag, including helmfile, flux, and argocd.

Verify the generated bundle, then install it:

(cd ./bundles && aicr verify . && chmod +x deploy.sh && ./deploy.sh)

Once deployed, the k8s-aibom controller runs in the k8s-aibom-system namespace. AICR uses the main chart’s CRDs rather than the companion k8s-aibom-crds chart. Helm bundles include a CRD apply step; Flux and Argo CD handle updates through their controllers. Helmfile, Terraform, and Fleet require the documented manual CRD update when the transition calls for it. Check the installed storage version:

kubectl get crd aiboms.aibom.k8saibom.dev \
  -o jsonpath='{.spec.versions[?(@.storage==true)].name}'
# v1beta1

Validate

aicr snapshot --output snapshot.yaml
aicr validate --recipe recipe.yaml --snapshot snapshot.yaml \
  --phase deployment --phase conformance

The k8s-aibom health check runs as part of the deployment phase. It requires the controller deployment to be available, the cluster-scoped AIBOMControllerConfig to report a current Ready=True, and both CRDs to report the storage version the pinned chart expects. A matching storage version does not prove the full CRD schema is current. During upgrades, also verify the target schema and check for Degraded=True with reason SchemaPredatesController; see health and readiness.

Opt a namespace in

Inventory is opt-in per namespace. The label controls which namespaces emit AIBOM records; it does not narrow what the controller reads. Informers still cache workload and pod specs cluster-wide, including container arguments and inline environment values. No sink and no secret access are configured by default, so nothing leaves the cluster without an explicit decision.

kubectl create namespace prod-jobs
kubectl label namespace prod-jobs aibom.k8saibom.dev/enabled=true

Run an inference workload

Supported workloads carrying a recognized AI signal are inventoried automatically when their namespace opts in. For a simple demonstration, here is a vLLM deployment serving Qwen. Note that it pulls vllm/vllm-openai:latest rather than a digest, which is not an uncommon pattern in some environments. The nvidia-h100-mega-80gb selector and toleration must match your GPU pool’s labels and taints:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-qwen
  namespace: prod-jobs
spec:
  replicas: 1
  selector:
    matchLabels: {app: vllm-qwen}
  template:
    metadata:
      labels: {app: vllm-qwen}
    spec:
      # Adjust to match your GPU node pool's taints and labels.
      tolerations:
        - key: dedicated
          operator: Equal
          value: gpu-workload
          effect: NoSchedule
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-h100-mega-80gb
      containers:
        - name: vllm
          image: vllm/vllm-openai:latest
          args: ["--model", "Qwen/Qwen2.5-0.5B-Instruct",
                 "--max-model-len", "4096",
                 "--gpu-memory-utilization", "0.30"]
          ports:
            - containerPort: 8000
          resources:
            limits:
              nvidia.com/gpu: "1"
          volumeMounts:
            - {name: shm, mountPath: /dev/shm}
      volumes:
        - name: shm
          emptyDir: {medium: Memory, sizeLimit: 2Gi}

Save this manifest as vllm-qwen.yaml, then create the workload:

kubectl apply -f vllm-qwen.yaml

See the inventory

After applying the workload, you can track the inventory:

kubectl -n prod-jobs get aiboms.aibom.k8saibom.dev

Example output:

NAME                        WORKLOAD     NAME        CATEGORY    RUNTIME   READY   AGE
apps-deployment-vllm-qwen   Deployment   vllm-qwen   inference   vllm      True    28m

The controller automatically classified the workload category and serving runtime. One boundary worth knowing: The record is built from the workload spec, so an AIBOM can exist before any pod is running. AIBOM can appear and report Ready=True while the pod is still pulling its image. An AIBOM tells you what was declared and, once a Pod exists, what it resolved to. It does not prove successful scheduling or execution.

Check the status conditions:

kubectl -n prod-jobs get aibom apps-deployment-vllm-qwen \
  -o jsonpath='{range .status.conditions[*]}{.type}={.status} {end}'
# Ready=True Synced=True SinkFailed=False Stale=False

Verify the AIBOM

The document is stored inline on the resource when it is small enough, with a published SHA-256 over the canonical bytes:

kubectl -n prod-jobs get aibom apps-deployment-vllm-qwen -o json > aibom.json
jq -r '.status.bomDocument.inline.data' aibom.json | base64 -d > bom.json

jq -r '.status.bomDocument.sha256' aibom.json
shasum -a 256 bom.json | awk '{print $1}'

Here’s where it all comes together:

jq -r '.components[] | "\(.type)\t\(.name)"' bom.json

The response should look something like this:

application              vllm
container                vllm/vllm-openai
machine-learning-model   Qwen/Qwen2.5-0.5B-Instruct

A conventional SBOM tells you which image is running. An AIBOM tells you which model is serving and which runtime is serving it. Attributes carry one of four confidence tiers—declared, inferred, unresolved, or verified—along with an evidence locator, so reviewers can see how each claim was reached.

Resource impact

Upstream measured k8s-aibom v1.6.1 on GKE with NVIDIA Dynamo and AICR’s configuration. The test used CPU-only nodes with workload pods remaining pending, so these figures describe controller inventory overhead:

  • Approximately four API-server requests per minute during a 15-min steady-state observation window
  • Average controller CPU usage of 2.2 millicores
  • Controller memory working set of 28 to 34 MiB
  • One AIBOM regeneration when the tested workload’s image tag changed

What comes next

The integration deliberately stops short of a few things, each its own decision rather than an oversight.

Signed runtime observations: The runtime AIBOM is written as a Kubernetes resource, but the observation itself is unsigned. Signing would make captured observations tamper-evident; it would not prove every workload declaration true or establish successful execution. The canonical bytes and published SHA-256 shown above make signing tractable.

Connecting verified provenance: k8s-aibom can verify Sigstore signatures on model claims against operator-configured trust roots, enforce signer-identity constraints, check Rekor inclusion, and assign qualifying claims the verified confidence tier. AICR leaves this verification disabled by default. AICR can also produce transparency-logged bundle attestations when signing is enabled; connecting that platform provenance to runtime AI inventory remains future integration work.

Intent and observed workloads: An AICR recipe describes deployment intent. A runtime AIBOM records observed workload specifications and available pod-status evidence. Correlating them requires shared artifact identities, freshness rules, and mapping between infrastructure and workload coverage. That comparison remains future integration work; an AIBOM does not establish successful execution or complete cluster conformance.

AICR is available at NVIDIA/aicr. k8s-aibom is available at GoogleCloudPlatform/k8s-aibom. Both are open source. If you run GPU workloads on Kubernetes, this integration adds an inventory of recognized AI workloads and evidence showing how each attribute was determined.

来源:NVIDIA Technical Blog:Agentic AI / Generative AI · developer.nvidia.com