Skip to content

Commit ac5d370

Browse files
committed
[fix.dirac.λ.D9+] GPU pods require the runtime class that owns device injection
WHY: Kueue can reserve nvidia.com/gpu successfully while a Pod still lacks NVIDIA device injection unless the configured runtime class is selected. Bind GPU requests to the nvidia RuntimeClass and lock the behavior with a manifest-level test. A real admitted Job then completed on the RTX 5080 and reported driver 595.84.
1 parent 774818c commit ac5d370

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

‎backend/executors/kubernetes_kueue.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ def _job_manifest(self, name: str, config_map: str,
267267
"dirac.io/attempt-id": request["attempt_id"],
268268
}},
269269
"spec": {
270+
**({"runtimeClassName": "nvidia"} if resources["gpus"] else {}),
270271
"restartPolicy": "Never",
271272
"serviceAccountName": self.config.service_account,
272273
"automountServiceAccountToken": False,

‎backend/tests/test_kubernetes_kueue_adapter.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,22 @@ def test_image_allowlist_and_sensitive_env_fail_closed(self):
8585
reserved["environment"] = {"DIRAC_EXECUTION_REQUEST": "/tmp/escape"}
8686
self.assertEqual(self.adapter.admit(reserved).code, "RESERVED_ENVIRONMENT")
8787

88+
def test_gpu_job_uses_nvidia_runtime_class_and_extended_resource(self):
89+
request = copy.deepcopy(self.request)
90+
request["resource_request"].update({
91+
"gpus": 1,
92+
"gpu_arch": ["blackwell"],
93+
"gpu_memory_bytes_min": 1,
94+
})
95+
self.adapter.submit(request)
96+
manifests = [json.loads(body) for command, body in self.runner.calls
97+
if command[1:3] == ("apply", "--server-side")]
98+
pod_spec = manifests[1]["spec"]["template"]["spec"]
99+
self.assertEqual(pod_spec["runtimeClassName"], "nvidia")
100+
resources = pod_spec["containers"][0]["resources"]
101+
self.assertEqual(resources["requests"]["nvidia.com/gpu"], "1")
102+
self.assertEqual(resources["limits"]["nvidia.com/gpu"], "1")
103+
88104
def test_state_mapping_cancel_and_events(self):
89105
allocation = "dirac-motif/dirac-00000000000040008000000000000004"
90106
self.runner.job["spec"]["suspend"] = False

0 commit comments

Comments
 (0)