ComputeDomain abstraction, which presents IMEX channels as allocatable container resources through DRA.
Provision ComputeDomains
AComputeDomain defines a logical container for a set of Nodes that are permitted to share an IMEX channel allocation. You create a ComputeDomain in your namespace, and the controller generates a corresponding ResourceClaimTemplate that workloads can reference to obtain access to a shared channel.
Each independent workload should use its own
ComputeDomain. Deploying multiple workloads into a single ComputeDomain works, but it may result in unintended memory sharing between them.[COMPUTE-DOMAIN-NAME] with a name for the ComputeDomain, and replace [NAMESPACE] with the namespace of the workload that will use it.
ResourceClaimTemplate contains the same name and namespace.
Claim IMEX channels from a ComputeDomain
AComputeDomain follows the workload, and its Node membership depends on where Pods land. This means the validity of the resulting IMEX domain depends on scheduling. If Pods spread across Nodes that aren’t physically connected through NVLink, the workload may not function as expected. For this reason, workloads should always include affinity rules to constrain Pods to Nodes within the same rack.
To claim an IMEX channel, add a resourceClaims entry to your Pod specification that references the ResourceClaimTemplate for your rack. Each container that needs IMEX access must also declare the claim under resources.claims.
Minimal example
Replace
[TEMPLATE-NAME] with the name of the channel defined in your ComputeDomain, and replace [IMAGE] with your workload’s container image.Multi-node example: MPIJob across a full GB200 rack
For full-rack distributed workloads, the following example schedules an MPIJob across all Nodes of a GB200 rack using DRA IMEX.This example requires the MPI Operator installed in your cluster.
slotsPerWorker: 4matches the 4 GPUs per Node on GB200 NVL72 systems.replicas: 18covers all Nodes in a single GB200 rack.- The
topologyKey: nvidia.com/gpu.cliqueaffinity ensures all worker Pods land on Nodes within the same NVLink partition, as identified by GPU Feature Discovery. - Replace
[IMEX-CHANNEL-TEMPLATE-NAME]with thespec.channel.resourceClaimTemplate.namevalue from yourComputeDomain.
Verify resource allocation
After submitting a workload, verify thatResourceClaims are in allocated,reserved state by listing them in your namespace. Replace [NAMESPACE] with the namespace of your workload:
- The
ComputeDomainfor your rack is active:kubectl get computedomain -A. - The
resourceClaimTemplateNamein your Pod spec exactly matches an availableResourceClaimTemplate. - All Pods are scheduled on Nodes within the same
nvidia.com/gpu.cliquedomain.
Troubleshoot IMEX
When IMEX is unhealthy, multi-node NVLink workloads stop responding at initialization or fail to import shared memory. Common symptoms:-
NCCL fails during initialization with a warning that MNNVL is available but not working. NCCL probes the fabric at startup by allocating memory with a fabric handle, then exporting and importing that handle with
cuMemExportToShareableHandleandcuMemImportFromShareableHandle. Whichever step fails determines the message:The first means the Pod never received a channel device. Start with Confirm the IMEX channel reached the Pod. The second means the channel is present but the fabric handle couldn’t cross Nodes, so start with Read the fabric health status. - NCCL stops responding at initialization with no progress past communicator setup. This isn’t an NCCL bug: NCCL is waiting on an NVLink memory fabric that was never established.
- The GPU fabric health status reports an active fault condition. See Read the fabric health status.
Read the fabric health status
SettingNCCL_DEBUG only adds logging and doesn’t change collective behavior. Run the workload with NCCL debug logging enabled by prefixing your normal launch command with the debug environment variables. Replace [WORKLOAD-COMMAND] with the command you use to start the workload:
state is the fabric registration state. 3 means registration completed. A value of 1 (not started) or 2 (in progress) means the GPU hasn’t finished joining the fabric. Retry after the Node settles, and treat a persistent non-3 state as a platform issue.
healthMask is a packed bitfield, not a count of healthy links. It holds six independent fields, and the polarity isn’t uniform across them, so comparing the whole mask against a single expected number gets the diagnosis backwards. Decode it field by field instead:
decode_health_mask.py
healthMask value from your log line:
0x11aa on a driver that reports all six fields, or 0xaa on one that reports only the first four.
An unreported field reads as
0, so a low value such as 0x2 or 0x0 reflects limited driver reporting rather than a degraded fabric.Fabric section of nvidia-smi -q reports the same information in labeled form. Check Status: Success alongside State: Completed, because NVML reports the two separately and a GPU can finish registration while carrying a failed status. For the full field definitions, see NVIDIA’s NVML fabric definitions.
Confirm all Pods share one NVLink domain
Cross-Node NVLink memory access works only when every Pod in the job lands on Nodes in the same NVLink domain. Show both placement labels for your GPU Nodes. This command is read-only and safe to run:ds.coreweave.com/nvlink.domain is a globally unique rack identifier, such as DH4-016-US-EAST-02A. Every Pod in the job must show the same value. A job split across two values is split across two racks, and on CoreWeave NVL72 deployments there’s no NVLink path between them.
nvidia.com/gpu.clique identifies the NVLink partition within a domain, and it’s the label to use as a Pod affinity topologyKey. On CKS full-rack deployments, the default partition spans the whole domain, so on a healthy fabric the two labels change together. Check both: Nodes that share a nvlink.domain value but report different gpu.clique values indicate a partitioned fabric, which is a fault to report rather than a scheduling mistake. Use gpu.clique for scheduling and nvlink.domain to identify which physical rack your workload is running on. For the affinity mechanics, see Claim IMEX channels from a ComputeDomain.
A Pod whose
schedulerName is a SUNK Pod Scheduler has its placement decided by Slurm, so podAffinity, podAntiAffinity, and topologySpreadConstraints have no effect and a topologyKey silently does nothing. Node affinity still applies. See Known limitations. Pods that use the default kube-scheduler are unaffected. To place Slurm jobs rather than Pods, see Topology and block scheduling in Slurm, which builds its topology from the same ds.coreweave.com/nvlink.domain label.Confirm the IMEX channel reached the Pod
Co-location alone doesn’t enable cross-Node NVLink. The Pod also needs an IMEX channel device, which the platform injects when the Pod holds aResourceClaim against a ComputeDomain. Check inside a running GPU Pod. This command is read-only and safe to run. Replace [NAMESPACE] and [POD-NAME] with the namespace and name of the Pod you’re checking:
channel0. If the directory is missing or empty, no channel was allocated, and every multi-node NVLink operation in that Pod will fail regardless of fabric health. Check the claim wiring next. If the claim is allocated and the directory is still empty, the channel wasn’t injected on the platform side, which is a fault to report rather than something to fix in your manifest.
Confirm the ComputeDomain and ResourceClaim are bound
Inspect theComputeDomain, its ResourceClaim, and the Pod together. These commands are read-only and safe to run:
ComputeDomain exists in the workload’s namespace, that a ResourceClaim derived from its ResourceClaimTemplate is allocated and reserved for your Pods, and that the Pod spec references that claim. A Pod that starts successfully without a claim will run. It just won’t have NVLink across Nodes.
Values that look wrong but are expected
Before treating a value as an error, rule out these expected results:nNodes 1in NCCL logs. NCCL treats an entire NVLink domain as a single virtual node, so a job running across all 18 Nodes of a GB200 or GB300 NVL rack reportsnNodes 1. This is the correct value and confirms MNNVL is working, not that only one Node joined. NCCL counts NVLink domains here rather than physical hosts, so a job spanning two racks reports more than one node.healthMask 0x0or another low value. This usually means the driver reports few or none of the health conditions. Decode the individual fields before concluding anything.- A single Pod restart or reschedule. Placement can change on reschedule. Re-verify Pod placement and
ComputeDomainstate before suspecting hardware.
When to open a support ticket
Open a ticket when any of the following hold after you’ve worked through the checks above:- Decoding
healthMaskreports any field as a fault, orstatestays below3, on a job whose Pods all share one NVLink domain. /dev/nvidia-caps-imex-channels/is empty or missing even though the Pod holds an allocatedResourceClaimagainst aComputeDomain.- The failure persists after rescheduling the workload onto a fresh set of Nodes in the same domain.
- The rack was recently delivered and hasn’t yet completed a successful multi-node NVLink job.
- The full
MNNVLlog line for each affected GPU, with thestateandhealthMaskvalues verbatim. - The affected Node names with their
ds.coreweave.com/nvlink.domainandnvidia.com/gpu.cliquelabel values. - The output of the
ComputeDomainandResourceClaimchecks, and thels /dev/nvidia-caps-imex-channels/result. - The job manifest, including the Pod affinity rules and the claim reference.
- The time the workload last succeeded, if it ever did.