from __future__ import annotations import asyncio import logging from config import settings logger = logging.getLogger(__name__) async def get_gpu_info() -> dict | None: """Run nvidia-smi and parse GPU info.""" try: proc = await asyncio.create_subprocess_exec( settings.nvidia_smi_path, "--query-gpu=utilization.gpu,temperature.gpu,memory.used,memory.total,power.draw,name", "--format=csv,noheader,nounits", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=5.0) if proc.returncode != 0: logger.debug("nvidia-smi failed: %s", stderr.decode()) return None line = stdout.decode().strip().split("\n")[0] parts = [p.strip() for p in line.split(",")] if len(parts) < 6: return None return { "utilization": int(parts[0]), "temperature": int(parts[1]), "vram_used": int(parts[2]), "vram_total": int(parts[3]), "power_draw": float(parts[4]), "name": parts[5], } except (FileNotFoundError, asyncio.TimeoutError): return None