File size: 1,306 Bytes
e1acc15 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | """Explicit solo-card leases for isolated TP2 adapter evaluation. No production pair."""
from __future__ import annotations
import fcntl
import os
from pathlib import Path
from .safety import GPU, SOLO_B, assert_gpu_lease
def require_evaluation_lease(emulated: bool) -> None:
if emulated:
assert_gpu_lease()
return
if os.environ.get("CUDA_VISIBLE_DEVICES") != GPU+","+SOLO_B or os.environ.get("D2_ADAPTER_EVAL") != "1":
raise RuntimeError("TP2 adapter evaluation permits only both named solos in order with explicit evaluation flag")
for fd, suffix in ((8, "240876ad"), (9, "bc62df2a")):
path = Path.home()/f"dsv41-offload/locks/gpu-{suffix}.lock"
held, expected = os.fstat(fd), path.stat()
if (held.st_dev, held.st_ino) != (expected.st_dev, expected.st_ino):
raise RuntimeError("adapter evaluation did not inherit the correct solo flock")
with path.open("a") as probe:
try:
fcntl.flock(probe, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError:
pass
else:
fcntl.flock(probe, fcntl.LOCK_UN)
raise RuntimeError("adapter evaluation solo flock was not already held")
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|