Getting started¶
Accessing the cluster¶
SSH into the jumphost and use kubectl. Admin credentials are pre-configured at:
k9s and helm are also available out of the box. Verify access with:
You should see the service node (control plane) and your GPU workers in Ready status. Confirm the GPUs are schedulable:
Each worker should report 8.
Working from your own machine
You can copy the kubeconfig to your workstation and replace the server address with an SSH tunnel through the jumphost:
Running your first job: NCCL all_reduce test¶
A pre-configured example job is available on the jumphost. It runs an NCCL all_reduce_perf benchmark across 2 nodes — the standard way to verify that the cluster's InfiniBand networking is healthy. The example is rendered for your cluster's hardware (including the correct NCCL_IB_PKEY setting — see InfiniBand and NCCL configuration). A full-cluster variant that spans every worker node is provided alongside it.
Submit the job:
$ kubectl create -f /home/ubuntu/verda_k8s_all_reduce_perf_2_nodes.yml
mpijob.kubeflow.org/nccl-test-2n-wcq4s created
Check pod status:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nccl-test-2n-8cnbc-launcher-przrf 0/1 Completed 4 30m
Downloading the container image on all workers may take a few minutes on first run.
View the results:
$ kubectl logs -f nccl-test-2n-8cnbc-launcher-przrf | tail -10
4294967296 1073741824 float sum -1 9230.25 465.31 872.46 0 9221.35 465.76 873.31 0
8589934592 2147483648 float sum -1 18376.5 467.44 876.45 0 18337.6 468.43 878.31 0
# Out of bounds values : 0 OK
# Avg bus bandwidth : 827.441
#
# Collective test concluded: all_reduce_perf
#
=== NCCL test completed ===
Understanding the output: the key metric is Avg bus bandwidth — how fast GPUs collectively communicate across the InfiniBand fabric. A healthy cluster reaches 800+ GB/s for large message sizes. Significantly lower numbers may indicate a network issue (bad cable, misconfigured IB port, or a wrong P_Key). The #wrong columns should read 0 — anything else indicates data corruption and warrants a support ticket.
Monitoring jobs¶
Use standard kubectl commands to monitor your workloads:
# List all pods and their status
kubectl get pods
# Follow logs from a specific pod
kubectl logs -f <pod-name>
# Describe a pod for detailed status and events
kubectl describe pod <pod-name>
# List all MPIJobs
kubectl get mpijobs
# Live resource usage (served by the pre-installed metrics-server)
kubectl top nodes
kubectl top pods
For cluster-level dashboards, health checks and the Kubernetes Dashboard web UI, see Observability.
Container registry¶
Your container images are pulled by containerd on the worker nodes. It is recommended to use authenticated access when pulling images.
Verda provides a managed container registry — see Container Registries for setup instructions. To pull from a private registry, create a pull secret and reference it in your pod specs:
kubectl create secret docker-registry my-registry \
--docker-server=vccr.io \
--docker-username=<user> \
--docker-password=<token>
For quick experimentation, public images from NVIDIA NGC (nvcr.io/nvidia/...) and Docker Hub can also be used.
Next steps¶
- Running multi-node workloads — write your own MPIJobs and PyTorch training jobs.
- Job queueing (Kueue) — queue and prioritize work instead of hand-scheduling it.
- Storage — pick the right volume type for datasets, caches and checkpoints.