Skip to content

Missing DRA metrics in case of dynamically created MIG devices #714

Description

@guptaNswati

Description

dcgm-exporter:4.6.0-4.8.3 cannot attribute metrics to pods using Dynamic MIG devices allocated by dra-driver-nvidia-gpu.

In case of Dynamically created MIG devices, NVIDIA DRA ResourceSlices only contain an abstract device (which has ParentUUID and Profile), not the live MIG UUID and GI created during device preparation. The exporter currently requires that MIG UUID to resolve the GI key and therefore drops the mapping. https://github.com/NVIDIA/dcgm-exporter/blob/main/internal/pkg/transformation/kubernetes.go#L758

I think we missed addressing it properly earlier #664 (comment)

kubectl logs "$DCGM_POD" -n nvidia-gpu-operator --since=5m -c nvidia-dcgm-exporter | grep DRA
time=2026-07-23T18:57:37.605Z level=DEBUG msg="Skipping DRA MIG mapping without MIG UUID" parentUUID=GPU-a15aaed3-d4e7-dde0-adcd-4432a8caf752
time=2026-07-23T18:57:37.605Z level=DEBUG msg="Completed toDeviceToPodsDRA transformation" totalMappings=0 deviceToPodsMap=map[]
time=2026-07-23T18:57:37.606Z level=DEBUG msg="Device to pod mapping for DRA: map[]"

An example ResourceSlice entry of an abstract mig device that can be created when a claim requests it:

  "name": "gpu-0-mig-1g12gb-19-0",
  "attributes": {
    "uuid": null,
    "parentUUID": {
      "string": "GPU-a15aaed3-d4e7-dde0-adcd-4432a8caf752"
    },
    "profile": {
      "string": "1g.12gb"
    },
    "type": {
      "string": "mig"
    }
  },
  "capacity": {
    "memory": {
      "value": "11904Mi"
    }
  },
  "consumesCounters": [
    {
      "counterSet": "gpu-0-counter-set",
      "counters": {
        "copy-engines": {
          "value": "1"
        },
        "decoders": {
          "value": "1"
        },
        "encoders": {
          "value": "0"
        },
        "jpeg-engines": {
          "value": "1"
        },
        "memory": {
          "value": "11904Mi"
        },
        "memory-slice-0": {
          "value": "1"
        },
        "multiprocessors": {
          "value": "16"
        },
        "ofa-engines": {
          "value": "0"
        }
      }
    }
  ]
}

Claim with allocated device

status:
  allocation:
    allocationTimestamp: "2026-07-23T18:55:23Z"
    devices:
      results:
      - device: gpu-0-mig-1g12gb-19-0
        driver: gpu.nvidia.com
        pool: lego-cg1-qct-046
        request: mig
    nodeSelector:
      nodeSelectorTerms:
      - matchFields:
        - key: metadata.name
          operator: In
          values:
          - lego-cg1-qct-046
  reservedFor:
  - name: dcgm-dynamic-mig

The ResourceSlice intentionally has no live MIG UUID or GI ID. These identities exist only after the dra plugin creates the partition during ResourceClaim preparation.

The ResourceClaim also has no concrete identity, just the device name instatus.devices.

For Static MIG, exporter maps MIG UUID → parent UUID + GI ID + CI ID via GetMIGDeviceInfoByID()
but for Dynamic MIG, we need a new mapping something like: parent UUID + profile ID + placement → live GI ID

Using only parentUUID + profile would not be safe because multiple live instances with the same profile may exist at different placements.

Potential fixes:
Option 1 (DCGM only change) Parse device-name:

  • Parse profile and placement start from the allocated DRA device name. The device name encodes:
    gpu-0-mig-1g12gb-19-0
    └─ placement start: 0
    └──── profile ID: 19
    https://github.com/kubernetes-sigs/dra-driver-nvidia-gpu/blob/main/cmd/gpu-kubelet-plugin/mig.go#L113
  • Enumerate live MIG devices under parentUUID through NVML.
  • Inspect each device's GI profile ID and placement.
  • Match exactly parentUUID + profileID + placementStart.
  • Use the resulting runtime GI ID with the existing GetGPUInstanceIdentifier() path.

No change is needed for Static MIG where if MIG UUID present use GetMIGDeviceInfoByID()

Any issue on relying on parsing the device-name?

Option 2 (DRA change): Should we add placementStart in the ResourceSlice attributes as we already have the profile. With profileID + placementStart, dcgm wont have to parse the device-name.

Option 3 (DRA change): Concrete identity in ResourceClaim device status
After creating the MIG device, the DRA driver could populate ResourceClaim.status.devices[].data with MIGUUID, GI or CI. This may require additional cleanup on the driver side during tear down.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions