¿Cómo soluciono el error "NVRM: GPU 0000:01:00.0: GPU has fallen off the bus." en Ubuntu 20.04LTS?

Reunido en la Confederación General del Trabajo, Juan Perón expone sobre los peligros que supone una desconsideración humana sobre los factores ecológicos en su evolución, toda vez que explica cómo solucionar el problema del cuelgue de la gráficas 3D de las placas de video nVidia en Ubuntu.

(...)
Frente al imperativo de la evolución, nosotros debemos pensar que quizás antes del año 2000 - en el que se doblará la actual población de la tierra y disminuirá a la mitad la materia prima para seguir viviendo - se va a tener que producir indefectiblemente la integración universal. Es decir, que los hombres se pongan de acuerdo en la defensa total de la tierra, y en la utilización de la tierra como hermanos y no como enemigos unos de otros.

Además de eso será necesario que se satisfaga la solución a esa superpoblación. Cuando en la tierra ha habido superpoblación - porque eso se ha producido ya en algunas regiones, ya que obedece no al número de habitantes solamente, sino a la desproporción entre el número de habitantes y los medios de subsistencia - las soluciones han sido siempre de dos naturalizas.

Uno es la supresión biológica, es decir matar gente, de lo que se encargan las guerras, las pestes y el hambre, que es la enfermedad que más mata en la tierra. El otro es el reordenamiento geopolítico, que permite una mayor producción y una mejor distribución de los medios de subsistencia.

Si el hombre - en esto que resta hasta ese momento del año 2000 y comienzos del siglo XXI - no ha resuelto el problema por la vía geopolítica produciendo más y distribuyendo con mayor justicia lo que el hombre necesita para subsistir, no quedará otro remedio que lanzar en masa la bomba atómica, que también puede ser una solución si la insensatez de los hombres no ha utilizado el camino constructivo y se ha decidido por el destructivo.

Nuestro sistema opera por designio - a todas las luces similar. Veamos un ejemplo, los cuales suelen explicarlo todo.
En mi sistema dispongo de una placa madre ESC H57H-Mus, cuya electrónica principal sirve de base para un microprocesador Intel i7, 16 GB de memoria RAM, y varios discos de estado sólido que utilizo como almacenamiento. Este equipo no es ya lo más moderno que dispone la técnica, pero al satisfacer mis necesidades computacionales, lo he mantenido remozado como corresponde, por ejemplo con una adaptadora de video nVidia GTX 750 Ti. A este hardware veterano he instalado nuevo software, de excelencia, el Ubuntu Mate 20.04LTS.

Lamentablemente, las nuevas iteraciones del Kernel Linux hacen amplio uso de excelentes condiciones de suspensión y ahorro energético para varios subsistemas (sonido, video, etcétera). Estas características nuevas del software, sin embargo, no son tratadas de forma reticente por la veterana placa madre, y suelen presentar errores bajo diferentes situaciones.

En particular, utilizo el el controlador de video nVidia 440.10 x64 junto con el Kernel 5.4.0-42-generic de Ubuntu Mate. Bajo condiciones de uso de escritorio y aplicaciones 3D con sonido, el sistema gráfico se interrumpe y congela, sin que se cuelgue todo el sistema. Esto se produce sobre todo al utilizar durante un tiempo aplicaciones de escritorio con sonido y efectos de video tridimensional. En tales casos no podremos utilizar el escritorio, y la única forma de recuperar control es resetear el sistema.

Afortunadamenet, al no colgarse completamente, si el sistema cuenta con un servicio SSH será posible ingresar al mismo desde otro equipo en la red, y así será posible realizar algunos chequeos de lo que ha causado el error. Mediante el comando dmesg podremos revisar el status del sistema, y encontramos el siguiente error: "GPU 0000:01:00.0: GPU has fallen off the bus" ("la Unidad de Procesamiento gráfico xxx se ha desconectado del bus").

[26959.161910] NVRM: GPU at PCI:0000:01:00: GPU-2f0e77b9-a938-5e53-1b55-f5b4ab0ad918
[26959.161922] NVRM: Xid (PCI:0000:01:00): 79, pid=1373, GPU has fallen off the bus.
[26959.161929] NVRM: GPU 0000:01:00.0: GPU has fallen off the bus.
[26959.161948] NVRM: A GPU crash dump has been created. If possible, please run
               NVRM: nvidia-bug-report.sh as root to collect this data before
               NVRM: the NVIDIA kernel module is unloaded.

También podríamos ejecutar el programa de reporte de bugs, con:

sudo ./usr/bin/nvidia-bug-report.sh

El problema de desconexión microtemporal de la GPU del resto del bus de control se debe a la funcionalidad de ahorro energético. Esta es capaz de pone en espera o"StandBy" a los clientes gráficos, pero el bus gráfico de la placa madre no lo vuelve a encender con la prontitud suficiente y provoca el cuelgue gráfico.

Para solucionar el problema, necesitaremos activar el Modo Persistencia. El Modo Persistencia es un control interno que activa ("Enabled") o desactiva ("Disabled") esta operatoria en la GPU de nuestra placa de video. Cuando el Modo de Persistencia está activado, el controlador nVidia permanecerá cargado en memoria incluso cuando no existan programas activos que lo usen (tal como el servidor gráfico X11, escritorios gráficos, o el programa nvidia-smi). Lograremos así disminuir la latencia de carga del controlador asociada con la ejecución de varias aplicaciones gráficas tridimensionales dependientes del mismo.

Para verificar el estado actual del Modo de Persistencia de nuestro controlador nVidia e, abrimos una terminal con Ctrl+Alt+t e ingresamos el siguiente Comando de Organización:

sudo /usr/bin/nvidia-smi -q | grep -i Persistence

...el sistema nos devolverá el estado del mismo, que en este caso debería ser Disabled, por "desactivado":

Persistence Mode  : Disabled

Para activar el Modo de Persistencia desde la línea de comandos, podremos ingresar lo siguiente:

sudo /usr/bin/nvidia-smi -pm 1

Nuestro GNU con Linux nos solicitará nuestra contraseña para hacerlo efectivo. Conforme la hayamos ingresado, debería activarse, lo cual quedará indicado con el siguiente mensaje:

Enabled persistence mode for GPU 00000000:01:00.0.
All done.

El problema de esta solución radica en que su acción sólo será temporal, y se revertirá toda vez que reiniciemos nuestro sistema. Nuestro Movimiento es uno que debe propender a lograr soluciones permanentes para los problemas de los argentinos. Por tal motivo, si quisiéramos que el Modo de Persistencia sea realmente persistente en el tiempo, podríamos hacer que este comando que lo active se ejecute automáticamente toda vez que se inicie el sistema, y antes de comenzar el despliegue gráfico. Como ventaja añadida, esto no requerirá que se ingrese la contraseña de Conductor.

Para ello es necesario activar y usar el método tradicional de autoejecución en GNU, el fichero /etc/rc.local. Este se encuentra desactivado en Ubuntu 18.04LTS y superiores, pero podrán activarlo siguiendo estos pasos generales que os he indicado.

Una vez realizado dicho procedimiento, quedará presente el fichero rc.local, y por lo tanto podremos editarlo para que cumpla esta tarea fundamental a fin de que no se cuelgue nuestro video nVidia. Podremos hacerlo ingresando el siguiente comando:

sudo nano /etc/rc.local

...lo cual abrirá el editor GNU Nano con el fichero /etc/rc.local. Debemos pegamos las siguientes líneas antes de la última línea del archivo, la cual debe ser siempre "exit 0":

## Agregado para activar el modo de persistencia
## del controlador NVIDIA.
/usr/bin/nvidia-smi -pm 1

Guardamos con Ctrl+o y salimos del editor con Ctrl+x. Le asignamos permisos de ejecución con:

sudo chmod +x /etc/rc.local

...y finalmente reiniciamos el sistema con:

sudo reboot

A la vuelta, hemos de comprobar que el Modo Persistencia esté activado. Para ello ingresamos nuevamente:

/usr/bin/nvidia-smi -q | grep -i Persistence

...a lo cual ahora el sistema debería devolvernos:

Persistence Mode  : Enabled

Y ya no se debería colgar más la instancia gráfica, a coste de un lógico mayor consumo de recursos computacionales por parte de las aplicaciones gráficas no cerradas que hagan uso de nuestra GPU en Linux.