Topology-Aware Scheduling
Topology-Aware Scheduling
Topology-aware scheduling places related Pods in a hardware domain with the network bandwidth they require. On an NVLink-optimized cluster, NVCF can place a multi-node function inside one GPU clique instead of spreading its Pods across slower links.
The scheduling path has four layers:
- The NVIDIA GPU DRA driver labels nodes with
nvidia.com/gpu.clique, identifying a particular NVLink partition. - KAI Scheduler reads a cluster-scoped
Topologyand places a gang in the requested domain. - Grove maps its workload hierarchy to the KAI topology through a
ClusterTopologyBinding. - Dynamo uses Grove for placement of frontend, prefill, decode, and other inference services.
See the NVIDIA GPU DRA ComputeDomain guide, KAI topology guide, Grove topology guide, and Dynamo topology guide for component-level details.
Helm functions can also use the legacy
dra.nvcf.nvidia.io partition annotation.
That path uses Kubernetes Pod affinity and is best-effort without KAI Scheduler
or Grove topology-aware scheduling. Use the KAI or Grove mechanisms on this
page when clique placement must be coordinated for the complete workload.
Prerequisites
- Install the NVIDIA GPU DRA driver.
- Request a full node of GPUs for each GPU-enabled Pod in your Helm chart. The GPU DRA driver currently supports one GPU-enabled Pod per node in this mode.
See NVLink-optimized clusters for cluster registration and GPU request requirements.
Use KAI Scheduler only
Enable KAI Scheduler in the compute plane stack during installation:
Topology levels are ordered from the widest domain to the narrowest domain. The compute plane automatically creates this KAI resource on installation:
Enabling addons.topologyAwareScheduling without
addons.kaiScheduler.enabled stops Helmfile rendering with an error.
The Topology name will always be nvcf-mnnvl-topology for MNNVL scheduling,
with the nvidia.com/gpu.clique node label for placement.
When using a KAI PodGang or topology annotations, ensure this name is used.
Example: place a StatefulSet in one GPU clique
Add the KAI topology annotations to the StatefulSet object:
KAI waits until all replicas fit in one value of
nvidia.com/gpu.clique. This is also a gang-scheduling request. See
Gang Scheduling for atomic placement behavior and
Grove or Dynamo workloads.
Creating a Topology does not change workloads that do not opt in.
Use Grove and/or Dynamo
Enable the complete scheduling stack during compute stack installation when functions use Grove or Dynamo:
The topologyAwareScheduling toggle enables topology handling in Grove and
automatically creates a binding for each configured KAI topology on installation:
See the Grove automatic MNNVL guide for more details.
The ClusterTopologyBinding name will always be nvcf-mnnvl-topology-binding for MNNVL scheduling,
with the gpuclique domain and nvidia.com/gpu.clique key for placement.
When using Grove PodClique* or Dynamo DynamoGraphDeployment* family types with topology constraints,
ensure these constants are used.
Example: place a Grove workload in one GPU clique
Grove workload authors use the portable gpuclique domain from the generated
binding instead of the cluster’s node label:
Grove translates gpuclique to nvidia.com/gpu.clique and sends the
constraint to KAI. Child PodClique or PodCliqueScalingGroup constraints
can select the same or a narrower domain. See the
Grove topology constraint rules.
Example: place an entire DynamoGraphDeployment in one GPU clique
This DynamoGraphDeployment will create Grove pod cliques for GPU and frontend workers
that get scheduled in a single gpuclique domain:
In general Dynamo creates Grove resources from a DynamoGraphDeployment, which Grove
and KAI place. Before adding
topology constraints to a DynamoGraphDeployment, see the
topology-aware scheduling guide for Dynamo 1.2.1
to check the workload fields and topology resources expected by the compute
plane stack’s pinned operator.
Verify topology resources (Cluster admins only)
Confirm that nodes have GPU clique labels:
Confirm that the KAI topology exists:
When Grove is enabled, confirm that its binding exists:
If Pods remain Pending, verify that one clique has enough free nodes for the
entire gang. Then inspect the Pod and scheduler events: