NVIDIA GPU Workloads on Kubernetes — Part 8: The AI Platform & Application Layer

Part 8 of the Falcon AI workbook series. Everything through Part 7 was infrastructure — DaemonSets, drivers, validation. This post is where the cluster stops being “a bunch of GPUs” and becomes a self-service platform Falcon AI’s ML engineers can actually use without ever touching kubeadm.

Prerequisite

You’ve completed Part 7: all five test-job rungs passed on the Falcon AI cluster (CUDA VectorAdd through vLLM inference). GPUs are proven end to end.

Recap: where Falcon AI stands

RoleCountHostnamesStatus after Part 7
Management (control plane)3mgmt-01, mgmt-02, mgmt-03Ready, tainted NoSchedule
GPU worker2gpu-wk-01, gpu-wk-02Ready, validated end to end with real workloads

Two layers, one important distinction

Everything in Parts 4–7 ran as DaemonSets — one pod per node, infrastructure-owned, invisible to end users. Everything in this post runs as Deployments/StatefulSets — normal, scalable application workloads that happen to schedule GPU pods on Falcon AI’s behalf. This distinction matters because it changes who’s responsible for what:

Everything below reads nvidia.com/gpu as an ordinary Kubernetes resource request — none of it needs to know or care that a GPU Operator exists underneath. That separation of concerns is the entire point of the six parts we’ve done so far.

What Falcon AI actually needs from this layer

ComponentRoleWhy Falcon AI needs it
KubeflowML platform — notebooks, pipelines, experiment orchestrationSelf-service entry point for ML engineers, so they’re not filing tickets to you for every job
KServeModel servingStandardized way to deploy trained models as inference endpoints (builds on the vLLM smoke test from Part 7)
RayDistributed compute frameworkFalcon AI’s data preprocessing and hyperparameter sweeps run better distributed than single-node
MPI OperatorRuns MPI-based distributed jobsThis is what actually wraps the multi-node NCCL test from Part 7 into a real, repeatable training job spec
Volcano / KueueBatch scheduling, quota & queuingWith only 2 GPU nodes (16 GPUs total) today, Falcon AI needs fair-share scheduling once multiple teams compete for capacity
Argo WorkflowsWorkflow/pipeline engineChains preprocessing → training → evaluation → registration as one pipeline

Not installing yet, but worth knowing exists: MLflow (experiment tracking), Triton Inference Server (alternative/complement to vLLM for non-LLM models), Airflow (data pipelines), MinIO/Ceph (S3-compatible object storage for datasets and checkpoints — Falcon AI will need this before real training runs, covered when we set up Storage properly).

Step 1 — Install Kubeflow (on mgmt-01)

Kubeflow is a large distribution; for a first install we use the lightweight manifest set rather than the full platform:

git clone https://github.com/kubeflow/manifests.git
cd manifests
while ! kubectl apply -k example; do echo "Retrying, CRDs still establishing..."; sleep 10; done
kubectl get pods -n kubeflow

Pass criteria: central dashboard, pipeline, and notebook controller pods Running.

Step 2 — Install KServe (on mgmt-01)

bash

kubectl apply -f https://github.com/kserve/kserve/releases/download/v0.13.0/kserve.yaml
kubectl get pods -n kserve

Quick validation using an InferenceService — the KServe-native way to do what we did manually with vLLM in Part 7:

yaml

# opt125m-inferenceservice.yaml
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: opt125m
  namespace: inference-test
spec:
  predictor:
    model:
      modelFormat:
        name: huggingface
      args: ["--model_name=opt-125m", "--model_id=facebook/opt-125m"]
      resources:
        limits:
          nvidia.com/gpu: 1

kubectl apply -f opt125m-inferenceservice.yaml
kubectl get inferenceservice -n inference-test

Pass criteria: READY: True, with a URL Falcon AI’s application team can hit directly — no more manual kubectl exec/port-forward like Part 7.

Step 3 — Install Ray (on mgmt-01)

helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
helm install kuberay-operator kuberay/kuberay-operator --namespace ray-system --create-namespace
kubectl get pods -n ray-system

Step 4 — Install the MPI Operator (on mgmt-01)

kubectl apply -f https://raw.githubusercontent.com/kubeflow/mpi-operator/master/deploy/v2beta1/mpi-operator.yaml
kubectl get pods -n mpi-operator

This is what lets us formalize the multi-node NCCL test from Part 7 into an MPIJob:

yaml

# nccl-mpijob.yaml
apiVersion: kubeflow.org/v2beta1
kind: MPIJob
metadata:
  name: nccl-allreduce-test
spec:
  slotsPerWorker: 8
  runPolicy:
    cleanPodPolicy: Running
  mpiReplicaSpecs:
    Launcher:
      replicas: 1
      template:
        spec:
          containers:
          - name: launcher
            image: nvcr.io/nvidia/pytorch:24.01-py3
            command: ["mpirun", "--allow-run-as-root", "-np", "16",
                      "nccl-tests/build/all_reduce_perf", "-b", "8M", "-e", "128M"]
    Worker:
      replicas: 2
      template:
        spec:
          containers:
          - name: worker
            image: nvcr.io/nvidia/pytorch:24.01-py3
            resources:
              limits:
                nvidia.com/gpu: 8

kubectl apply -f nccl-mpijob.yaml
kubectl logs -f -l training.kubeflow.org/job-name=nccl-allreduce-test,training.kubeflow.org/replica-type=launcher

Pass criteria: same output as Part 7’s manual NCCL test, but now launched declaratively and repeatably across both gpu-wk-01 and gpu-wk-02 — the MPI Operator handles worker coordination automatically instead of you exec-ing into pods by hand.

Step 5 — Install Volcano (batch scheduling)

With only 16 GPUs across 2 nodes, once more than one Falcon AI team submits jobs simultaneously, the default Kubernetes scheduler’s lack of gang scheduling and fair-share queuing becomes a real problem — a large job can partially schedule, stall waiting for the rest of its pods, and block smaller jobs behind it.

kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml
kubectl get pods -n volcano-system

Where we are

✅ Kubeflow, KServe, Ray, MPI Operator, and Volcano installed on top of the validated infrastructure layer ✅ Re-implemented Part 7’s manual NCCL test as a declarative, repeatable MPIJob ✅ Re-implemented Part 7’s manual vLLM test as a KServe InferenceService ✅ Falcon AI’s ML engineers can now submit training and inference workloads without touching cluster internals


Next in the series: Part 9 — Observability Stack for GPU Clusters, wiring Prometheus, DCGM, Grafana, Loki, and Tempo into a full-stack view of everything we’ve built — cluster, nodes, GPUs, network, and now these application-layer workloads too.

One Comment

Add a Comment

Your email address will not be published. Required fields are marked *