Skip to content

GPU de AMD sin nvidia-smi: uso, memoria y temperatura por sysfs - #15

Merged
k4ditano merged 2 commits into
k4ditano:mainfrom
roysland:gpu-amd-sysfs
Sep 10, 2026
Merged

k4ditano merged 2 commits into
k4ditano:mainfrom
roysland:gpu-amd-sysfs

Conversation

@roysland

@roysland roysland commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

El problema

La tarjeta de GPU del panel Sistema sólo aparecía con NVIDIA: tools/sistema.py preguntaba exclusivamente a nvidia-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-smi no 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-smi
  • hwmon/temp1_input → temperatura

De 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 da 1002:73df y 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-smi sigue 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):

gpu: {"nombre": "Radeon RX 6700/6700 XT/6750 XT / 6800M/6850M XT", "uso": 30, "temp": 49.0, "memUsada": 7776, "memTotal": 12272}

La tarjeta de GPU aparece con su gráfica, temperatura y VRAM, igual que la de NVIDIA. Un python3 tools/sistema.py a mano imprime el bloque gpu en cada línea.

roysland and others added 2 commits September 6, 2026 22:30
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.
@k4ditano

Copy link
Copy Markdown
Owner

¡Gracias, Øyvind! La lectura por sysfs está muy bien pensada: descartar la tarjeta que no publica gpu_busy_percent y quedarse con la de más VRAM es justo lo que hacía falta.

He añadido un commit encima (505fb90) antes de fusionar. Con el cambio, el bucle solo tocaba ultimoGpu cuando llegaba algo, así que una lectura fallida dejaba dentro la muestra anterior, y la gráfica seguía avanzando con una línea plana que parecía viva. En NVIDIA pasa de verdad: al actualizar el driver sin reiniciar, nvidia-smi falla hasta el reinicio. Antes de este PR la tarjeta se quedaba quieta, y así vuelve a ser: una lectura fallida deja la GPU vacía y la vuelta siguiente pregunta otra vez. Lo demás no cambia.

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.

@k4ditano
k4ditano merged commit 5b1406c into k4ditano:main Sep 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants