"""Minimal public command line for prompting Nucleus Resynthesis Release 188.""" from __future__ import annotations import argparse import fcntl import os import subprocess from collections.abc import Iterator, Sequence from contextlib import contextmanager from pathlib import Path from typing import Final, Protocol, TextIO import torch _LAB_GPU_LOCK_ROOT: Final[Path] = Path("/tmp") _BENCHMARK_GPU_LOCK_ROOT: Final[Path] = Path( "/tmp/nnf_benchmark_gpu_locks" ) _MINIMUM_GPU_HEADROOM_BYTES: Final[int] = 48 * 1024**3 class _ReleaseSolveModel(Protocol): def solve(self, prompt: str) -> str: """Return the model-owned decoded response for one prompt.""" def _nvidia_identity_rows_boundary() -> tuple[tuple[str, int], ...]: """Read physical GPU UUIDs at the external host-discovery boundary.""" try: completed = subprocess.run( ( "nvidia-smi", "--query-gpu=index,uuid", "--format=csv,noheader,nounits", ), check=True, capture_output=True, text=True, ) except (FileNotFoundError, subprocess.SubprocessError): return () rows: list[tuple[str, int]] = [] for line in completed.stdout.splitlines(): fields = tuple(part.strip() for part in line.split(",", maxsplit=1)) if len(fields) != 2 or not fields[0].isdigit() or not fields[1]: continue rows.append((fields[1], int(fields[0]))) return tuple(rows) def _visible_physical_gpu_indices_boundary( device_count: int, ) -> tuple[int, ...]: """Map process-local CUDA ordinals to physical lock-file identities.""" visible_text = os.environ.get("CUDA_VISIBLE_DEVICES") if visible_text is None: return tuple(range(device_count)) visible_tokens = tuple( token.strip() for token in visible_text.split(",") if token.strip() ) if ( not visible_tokens or visible_tokens == ("-1",) or len(visible_tokens) != device_count ): return () identity_rows = ( () if all(token.isdigit() for token in visible_tokens) else _nvidia_identity_rows_boundary() ) physical_indices: list[int] = [] for token in visible_tokens: if token.isdigit(): physical_indices.append(int(token)) continue matches = tuple( physical_index for uuid, physical_index in identity_rows if uuid == token or uuid.startswith(token) ) if len(matches) != 1: return () physical_indices.append(matches[0]) if len(set(physical_indices)) != len(physical_indices): return () return tuple(physical_indices) def _try_acquire_gpu_locks_boundary( physical_index: int, ) -> tuple[TextIO, TextIO] | None: """Acquire both standard exclusive GPU locks without waiting.""" _LAB_GPU_LOCK_ROOT.mkdir(parents=True, exist_ok=True) _BENCHMARK_GPU_LOCK_ROOT.mkdir(parents=True, exist_ok=True) paths = ( _LAB_GPU_LOCK_ROOT / f"nnf_gpu_{physical_index}.lock", _BENCHMARK_GPU_LOCK_ROOT / f"gpu_{physical_index}.lock", ) handles: list[TextIO] = [] try: for path in paths: handle = path.open("a+", encoding="utf-8") try: fcntl.flock( handle.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB, ) except BlockingIOError: handle.close() return None handles.append(handle) finally: if len(handles) != len(paths): for cleanup_handle in reversed(handles): fcntl.flock(cleanup_handle.fileno(), fcntl.LOCK_UN) cleanup_handle.close() return handles[0], handles[1] def _release_gpu_locks_boundary(handles: tuple[TextIO, TextIO]) -> None: for handle in reversed(handles): fcntl.flock(handle.fileno(), fcntl.LOCK_UN) handle.close() @contextmanager def _release_compute_lane_boundary( *, minimum_free_bytes: int = _MINIMUM_GPU_HEADROOM_BYTES, ) -> Iterator[torch.device]: """Hold one clean GPU lane for load and solve, or fall back to CPU.""" if isinstance(minimum_free_bytes, bool) or minimum_free_bytes < 1: raise ValueError("Release 188 minimum GPU headroom must be positive") if not torch.cuda.is_available(): yield torch.device("cpu") return device_count = torch.cuda.device_count() physical_indices = _visible_physical_gpu_indices_boundary(device_count) if len(physical_indices) != device_count: yield torch.device("cpu") return candidates = tuple( sorted( ( ( torch.cuda.mem_get_info(local_index)[0], physical_index, local_index, ) for local_index, physical_index in enumerate(physical_indices) ), reverse=True, ) ) for observed_free_bytes, physical_index, local_index in candidates: if observed_free_bytes < minimum_free_bytes: continue handles = _try_acquire_gpu_locks_boundary(physical_index) if handles is None: continue try: free_bytes_after_lock = torch.cuda.mem_get_info(local_index)[0] if free_bytes_after_lock < minimum_free_bytes: continue torch.cuda.set_device(local_index) yield torch.device("cuda", local_index) return finally: _release_gpu_locks_boundary(handles) yield torch.device("cpu") def _load_release_model_boundary( release_path: Path, *, device: torch.device, ) -> _ReleaseSolveModel: from resynthesis.release_model import load_release_188_model return load_release_188_model(release_path, device=device) def _parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="resynthesis", description="Prompt Nucleus Resynthesis Release 188.", ) commands = parser.add_subparsers(dest="command", required=True) solve = commands.add_parser( "solve", help="Generate one model-owned response.", ) solve.add_argument( "--release", required=True, type=Path, help="Path to runtime/model.json.", ) solve.add_argument("prompt", help="Prompt text.") return parser def main(argv: Sequence[str] | None = None) -> int: """Run the minimal inference-only Release 188 command surface.""" arguments = _parser().parse_args(argv) if arguments.command != "solve": raise RuntimeError("Release 188 command dispatch differs") release_path = arguments.release prompt = arguments.prompt if not isinstance(release_path, Path) or not isinstance(prompt, str): raise RuntimeError("Release 188 solve arguments are malformed") with _release_compute_lane_boundary() as device: model = _load_release_model_boundary( release_path, device=device, ) response = model.solve(prompt) print(response) return 0 if __name__ == "__main__": raise SystemExit(main())