Repository navigation
GPU de AMD sin nvidia-smi: uso, memoria y temperatura por sysfs - #15
Conversation
La consulta sólo sabía de nvidia-smi; en una máquina con Radeon la tarjeta GPU no salía nunca. Ahora si nvidia-smi no responde se lee /sys/class/drm: uso (gpu_busy_percent), VRAM (mem_info_vram_*) y temperatura (hwmon) de la tarjeta con más memoria —la discreta—, y el nombre comercial sale de /usr/share/hwdata/pci.ids. Sin procesos nuevos: sysfs se lee cada muestra y nvidia-smi sigue preguntándose una vez de cada dos, como antes.
Con la lectura de AMD, el bucle solo tocaba `ultimoGpu` cuando llegaba algo, así que una lectura fallida dejaba dentro la muestra anterior. Antes pasaba lo contrario —`ultimoGpu = gpu()` se quedaba vacío— y la tarjeta se paraba. Repetir un dato viejo es peor que no dar ninguno: la gráfica sigue avanzando con una línea plana y parece viva. Pasa de verdad con NVIDIA: en una rolling, actualizar el driver sin reiniciar deja a nvidia-smi fallando hasta el reinicio, y el panel habría seguido enseñando el último uso y la última temperatura durante horas. Y lo mismo con una AMD a la que se le escapa una lectura. Ahora una lectura fallida deja la GPU vacía, como antes, y la vuelta siguiente vuelve a preguntar. Lo demás queda igual: NVIDIA una vuelta de cada dos, AMD cada vuelta y solo si no hay NVIDIA, y en un equipo con las dos manda la NVIDIA en cuanto contesta. Probado con un sysfs de mentira —integrada y discreta, un conector y un nodo render que no son tarjetas, y un pci.ids con el mismo id de dispositivo bajo otros vendedores— y con un guion de fallos: una NVIDIA que falla cuatro vueltas, una AMD que falla dos y un híbrido cuya NVIDIA tarda en despertar. Con el cambio anterior las dos primeras repetían la muestra vieja; ahora salen vacías y vuelven cuando vuelve la tarjeta.
|
¡Gracias, Øyvind! La lectura por sysfs está muy bien pensada: descartar la tarjeta que no publica He añadido un commit encima (505fb90) antes de fusionar. Con el cambio, el bucle solo tocaba Lo probé con un sysfs de mentira (integrada y discreta, un conector y un nodo render que no son tarjetas, y un pci.ids con el mismo id de dispositivo bajo otros vendedores) y con un guion de fallos. La lectura de AMD sale exacta —nombre, uso, temperatura y VRAM—, el nombre cae a «Radeon» sin pci.ids, y en un equipo híbrido manda la NVIDIA en cuanto despierta. En una máquina con RTX 2060 la muestra real sale igual que antes. Lo fusiono en cuanto pase la Action. |
El problema
La tarjeta de GPU del panel Sistema sólo aparecía con NVIDIA:
tools/sistema.pypreguntaba exclusivamente anvidia-smi, así que en una máquina con Radeon —aunque tenga dos, como la mía— la GPU no salía nunca y el hueco quedaba vacío.La solución
Si
nvidia-smino responde, se lee el kernel por sysfs, que en amdgpu publica todo lo que la tarjeta ya enseña:gpu_busy_percent→ uso (y sirve de puerta: una tarjeta sin él se descarta, que un cero inventado no entre como dato)mem_info_vram_used/mem_info_vram_total→ VRAM, en MiB como daba nvidia-smihwmon/temp1_input→ temperaturaDe varias tarjetas se elige la de más VRAM (la discreta; la integrada comparte memoria y su total es un cacho del sistema). El nombre comercial sale de
/usr/share/hwdata/pci.ids—que da1002:73dfy no dice nada a un humano—, resuelto una vez por modelo y cacheado; si la base no está, cae a «Radeon» sin romper nada.Sin procesos nuevos: sysfs se lee cada muestra porque no cuesta nada, y
nvidia-smisigue preguntándose una vez de cada dos, como antes. Si la máquina tiene las dos marcas, manda la NVIDIA y sysfs no se consulta.Verificación
En una máquina con amdgpu (Radeon RX 6700 XT-class + iGPU Raphael):
La tarjeta de GPU aparece con su gráfica, temperatura y VRAM, igual que la de NVIDIA. Un
python3 tools/sistema.pya mano imprime el bloquegpuen cada línea.