"""Consulta informacion de GPUs NVIDIA via nvidia-smi.""" from __future__ import annotations import csv import subprocess def gpu_info() -> list[dict]: """Devuelve informacion de todas las GPUs NVIDIA detectadas por nvidia-smi. Consulta nvidia-smi via subprocess. Si nvidia-smi no esta disponible o falla, devuelve lista vacia sin lanzar excepcion. Returns: Lista de dicts, uno por GPU, con claves: index (int): indice de la GPU (0, 1, ...). name (str): nombre del modelo (ej. "NVIDIA GeForce RTX 4090"). vram_total_mb (int): memoria total en MB. vram_free_mb (int): memoria libre en MB. driver_version (str): version del driver NVIDIA. cuda_version (str): version maxima de CUDA soportada por el driver. Lista vacia si nvidia-smi no esta disponible. """ try: result = subprocess.run( [ "nvidia-smi", "--query-gpu=index,name,memory.total,memory.free,driver_version,compute_cap", "--format=csv,noheader,nounits", ], capture_output=True, text=True, timeout=10, ) except FileNotFoundError: return [] except subprocess.TimeoutExpired: return [] except OSError: return [] if result.returncode != 0: return [] gpus = [] reader = csv.reader(result.stdout.strip().splitlines()) for row in reader: if len(row) < 5: continue try: index = int(row[0].strip()) name = row[1].strip() vram_total_mb = int(row[2].strip()) vram_free_mb = int(row[3].strip()) driver_version = row[4].strip() # compute_cap (ej. "8.9") como aproximacion de cuda_version soportada cuda_version = row[5].strip() if len(row) > 5 else "" except (ValueError, IndexError): continue gpus.append( { "index": index, "name": name, "vram_total_mb": vram_total_mb, "vram_free_mb": vram_free_mb, "driver_version": driver_version, "cuda_version": cuda_version, } ) return gpus