lunes, 30 de diciembre de 2019

Configurar gráficos híbridos en Linux Ubuntu 18.04/20.04 LTS con NVIDIA Prime

NVIDIA Prime es la solución privativa para GNU/Linux proporcionado por Nvidia para administrar portátiles fabricados con gráficos dedicados Nvidia.
Los gráficos híbridos que se encuentran en computadoras portátiles son de mucha utilidad al momento de utilizar programas de renderizado o simplemente al jugar, sobre todo por la posibilidad de utilizar la gráfica dedicada y contar con el software necesario para su gestión.

En la publicación anterior "Configurar gráficos híbridos en Linux Ubuntu 18.04 LTS con PRIME", se menciona que existe una solución de código abierto para portátiles con gráficas dedicadas (Nvidia): PRIME. Es en el escenario de PRIME donde nos encontramos con problemas de rendimiento en GPUs Nvidia (en AMD es todo lo contrario), por lo que Nvidia Prime es la mejor opción si se quiere utilizar la gráfica dedicada a todo su potencial.

Nvidia Prime se encuentra muy bien implementada en GNU/Linux (presenta algunos errores, eso es innegable, pero en general va bien) bajo un esquema de "Selección-Fija" (funciona igual que el conocido "Modo Fijo" que encontramos en gráficas AMD) en portátiles sin un multiplexor de hardware.

Como ya se sabe, al igual que su contra parte "AMD Enduro", Nvidia cuenta con "Nvidia Optimus". El segundo se encuentra muy bien establecido en el sistema operativo privativo (Windows), pero no se contaba con una implementación oficial y a la par en GNU/Linux, hasta hace unos pocos meses.
NOTA: Esta publicación es válida para portátiles con gráficos híbridos equipados con un dGPU Nvidia, comúnmente llamado "Nvidia Optimus".
NOTA: No confundir "PRIME" con "NVIDIA Prime", este último funciona únicamente con dGPUs Nvidia y bajo "Drivers Privativos".
NOTA: Esta publicación es exclusiva para Nvidia Prime; por lo tanto, se deja de lado el Proyecto "Bumblebee". Además, el segundo se encuentra desactualizado.
ADVERTENCIA: Si tienen CPUs nuevos (para esta fecha) como por ejemplo Ryzen 7 3750H (con gráfica integrada), utilicen una versión actualizada del kernel (5.3 en adelante para estos Ryzen); caso contrario, el driver del iGPU iniciará y por lo tanto no será posible el uso de "Nvidia Prime".
ADVERTENCIA: Se recomienda desactivar el "Arranque seguro (Secure boot)" en el BIOS/UEFI del portátil para evitar problemas con los drivers de Nvidia .

Terminanda la breve introducción, en esta publicación se responderán las siguientes preguntas:
  1. ¿Cómo funciona la "Selección-Fija" de Nvidia Prime en GNU/Linux?
  2. ¿Es necesario contar con un multiplexor de hardware para utilizar la "Selección-Fija"?
  3. ¿Cómo funciona la implementación "Bajo-demanda" de Nvidia Prime en GNU/Linux?
Empezaremos con los 02 modos de trabajo que nos ofrece NVIDIA Prime:

I. NVIDIA Prime: Selección-Fija (Emulación del Modo Fijo)
Esta es la solución que fue implementada en el 2013 (Drivers 319.12) para utilizar gráficas dedicadas Nvidia junto con integradas Intel.
Al pensar en "Selección-Fija", inmediatamente surge la idea de un multiplexor (MUX) de hardware, que tiene la función de comunicar la salida (o salidas) de pantalla con el iGPU o dGPU mediante una señal que habilitará el cambio por hardware. Esto es lo que se conoce como el "Modo Fijo" y permite utilizar el iGPU o dGPU como principal sin depender del secundario.
Implementación de multiplexores conectando el iGPU y dGPU a las diversas salidas (pantallas). Así se fabricaban los portátiles antiguamente.
Implementación de multiplexores (resumido) conectando el iGPU y dGPU a la salida (pantalla). Esto permite alternar (mediante una señal) el cambio del iGPU o dGPU mediante hardware.
La implementación del "Modo Fijo" es válida únicamente para equipos con un MUX y no es posible utilizarla en la mayoría de portátiles actuales donde la nueva idea es conectar únicamente el iGPU a la pantalla y utilizar el dGPU (complemento) para renderizar contenido. Es aquí donde Nvidia propuso una "Selección-Fija" emulada para utilizar el dGPU: NVIDIA Prime.

En otras palabras, cualquier portátil con gráfica dedicada Nvidia (soportada por drivers) puede acceder a la "Selección-Fija" sin necesidad de contar con un multiplexor.

Bajo este esquema, Nvidia Prime utiliza la representación "Output" que permite al dGPU ser utilizado como única fuente de renderizado usando la salida del iGPU para realizar una emulación como si de una PC de escritorio se tratase. De esta manera, es posible obtener un "Modo Fijo" en portátiles que no tienen un MUX.

Las ventajas de esta implementación son:
  1. Máximo rendimiento en aplicaciones de renderizado.
  2. Mayor control y personalización al seleccionar el GPU a utilizar.
  3. Cuenta con un software de gestión gráfica: "NVIDIA X Server Settings".
  4. Posibilidad de utilizar el puerto HDMI/DisplayPort si este último se encuentra conectado únicamente al dGPU.
Las desventajas son:
  1. Menor duración de la batería (por utilizar más tiempo el dGPU).
  2. Cerrar sesión o reiniciar para cambiar de GPU.
  3. Problemas en escritorios (KDE Plasma, Gnome, etc.) que únicamente pueden ser solucionados por Nvidia al ser un driver privativo.

II. NVIDIA Prime: Bajo-Demanda (Optimus oficial) [PRIME Render Offload]
Es la implementación oficial de "Nvidia Optimus" en GNU/Linux. Utiliza "PRIME Render Offload" (tener una pantalla X renderizada por una GPU, pero elegir ciertas aplicaciones dentro de esa pantalla X para que se muestren en una GPU diferente) y fue añadida a "Nvidia Prime" con los drivers 435.17 (2019). Funciona de forma muy similar a su contra parte de código abierto: PRIME.
Su característica principal es la renderización de ciertas aplicaciones en el dGPU mientras son mostradas en el iGPU, que es el que se encuentra conectado a la pantalla. En otras palabras, el dGPU descarga (offload) su contenido en el iGPU.

Esquema de Nvidia Optimus (NVIDIA Prime: Bajo-Demanda). No existen multiplexores. Se utiliza el iGPU, dGPU inactivo.
Esquema de Nvidia Optimus (NVIDIA Prime: Bajo-Demanda). No existen multiplexores. Se utiliza el iGPU, dGPU renderizando y descargando contenido en iGPU.
Esta implementación es compatible con OpenGL, GLX y Vulkan. EGL aún no se encuentra admitido.
Imagen referencial de NVIDIA Settings, se muestra la capacidad "On-Demand".

Los requisitos para utilizar la selección "Bajo-Demanda" son:
  1. Nvidia driver 435.17 o superior
  2. X.Org X server 1.20 compatible (PPA para Ubuntu 18.04 o 19.04) - Arch Linux ya incluye el X.Org 1.20.6-1 compatible.
  3. Configurar manualmente el X Server.
Aún cumpliendo los requisitos anteriores, para poder utilizar esta nueva implementación no sólo basta con seleccionar la opción "On-Demand", es necesario iniciar las aplicaciones deseadas con una combinación de "variables de entorno" (Similar al prefijo "DRI_PRIME=1" en su contraparte "PRIME") como prefijos. Esto se puede realizar editando el lanzador de la aplicación o ingresando a un terminal e inicializando el programa con comandos.

Las ventajas de esta implementación son:
  1. Mayor duración de la batería.
  2. Utilización inmediata del dGPU.
  3. Menores o nulos problemas en escritorios (KDE Plasma, Gnome, etc.).
Las desventajas son:
  1. Menor rendimiento comparado con la "Selección-Fija".
  2. Posibles incompatibilidades con aplicaciones (al igual que PRIME).
  3. No hay un control directo del dGPU.
  4. Imposibilidad de utilizar el puerto HDMI/DisplayPort si este último se encuentra conectado únicamente al dGPU.
  5. Problemas adicionales al ser nueva implementación.

III. ¿Cómo utilizar de forma nativa NVIDIA-Prime: Selección-Fija?
Existen varias formas de seleccionar el GPU a utilizar (tanto de forma nativa como por aplicaciones diseñadas por terceros). En esta sección sólo se enseñan los métodos disponibles de una instalación limpia.

Método 1 (gráfico):
[1]. Ingresar a "NVIDIA X Server Settings".
Nvidia Settings. El GPU seleccionado es Intel, por ese motivo se muestran pocas opciones.
[2]. En la pestaña "PRIME Profiles" seleccionar una opción:
       -NVIDIA (Performance Mode)
       -Intel (Power Saving Mode)
[3]. Ingresar la contraseña del sistema.
Es necesario ingresar la contraseña porque "prime-select" necesita realizar cambios con altos privilegios.
[4]. Cerrar e iniciar la sesión.
[5]. Ingresar a "NVIDIA X Server Settings" y verificar el cambio de GPU.
NVIDIA Settings en acción.
Nvidia Settings con todas las opciones desbloqueadas. El GPU seleccionado es NVIDIA.
Nvidia Settings muestra la información del GPU GTX 1050Ti.
En caso de realizar el proceso inverso, seleccionar el iGPU Intel.
NOTA: Nvidia Settings mostrará todas las opciones disponibles cuando el dGPU Nvidia sea el activo.
NOTA: Como pueden observar, las capturas anteriores son de mi portátil DELL 7567 con una GTX 1050 Ti. Este portátil no cuenta con un Multiplexor que permita el cambio de GPUs; sin embargo, esto demuestra que es posible utilizar la implementación "Selección-Fija" en este tipo de equipos (al menos en GNU/Linux).

Método 2 (comandos):
[1]. Ingresar a un terminal.
[2.1]. Escribir el siguiente comando para seleccionar el iGPU:
  1. sudo prime-select intel
[2.2]. Escribir el siguiente comando para seleccionar el dGPU Nvidia:
  1. sudo prime-select nvidia
"prime-select" en acción.
[3]. Ingresar la contraseña del sistema.
[4]. Cerrar e iniciar la sesión.
[5]. Ingresar a un terminal y escribir el siguiente comando para verificar el cambio de GPU (devolverá: "intel" o "nvidia"):
  1. prime-select query
"prime-select query"
IV. ¿Cómo utilizar de forma nativa NVIDIA Prime: Bajo-Demanda?
Como esta nueva implementación se basa en variables de entorno, se utilizará el terminal para este fin. Antes de ello, se necesita tener conocimiento de las variables de entorno a utilizar:

Para Vulkan:
  1. __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only

Para OpenGL (GLX):
  1. __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia

Existen más variables de entorno (Referencia 2), pero estas son las necesarias.
Ahora, el método para ejecutar una aplicación en el dGPU Nvidia es el siguiente:
[1]. Ingresar a un terminal.
[2]. Escribir el siguiente comando:
  1. sudo prime-select on-demand
[3]. Ingresar la contraseña del sistema.
[4]. Cerrar e iniciar la sesión.
[5]. Ingresar a un terminal y escribir la variable de entorno necesaria, seguido del nombre del programa (En este ejemplo se ejecuta glxgears, que es una aplicación OpenGL):
  1. __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxgears

Renderizando en el dGPU y monitorizando con MangoHud.
Si la aplicación es dependiente de Steam, lo más fácil es utilizar la interfaz gráfica para agregar los prefijos necesarios seguidos del comando %command%:
[1]. Abrir Steam.
[2]. Ingresar a las "Propiedades" del juego.
[3]. Clic en "DEFINIR PARÁMETROS DE LANZAMIENTO"
[4]. Ingresar uno de los siguientes comandos (para OpenGL o Vulkan):
  1. __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%
  2. __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only %command%
Configurando Left 4 Dead 2 nativo para Linux (OpenGL).

Configurando Resident Evil 2 Remake (DXVK). Se agregó el prefijo "mangohud", este comando es opcional y sirve para mostrar las estadísticas del dGPU (siempre y cuando lo tengan instalado).

Jugando Resident Evil 2 Remake en Linux mediante DXVK con Nvidia Prime On-Demand.
[5]. Aceptamos y cerramos la ventana "Propiedades".
[6]. Ejecutamos el juego normalmente.

De esta manera, se utiliza únicamente el dGPU en la aplicación ejecutada, dejando la renderización del escritorio y otras aplicaciones al iGPU.

V. ¿Cómo utilizar NVIDIA Prime con "Monitor PRIME App Indicator"? [OPCIONAL - En estado de pruebas]
Existen muchos indicadores y apps desarrolladas por terceros, como es el caso de:
  1. PRIME Indicator Plus.
  2. Optimus-manager.
  3. otros.
Estas aplicaciones facilitan en gran medida la administración de los gráficos híbridos.
Como recomendación, elegiría "Optimus-manager", pero solo es compatible con Nvidia Prime, dejando sin soporte a PRIME. Por esto último, se deja de lado los drivers de código abierto "nouveau".
Es por ello que recomiendo "Monitor PRIME App Indicator", esta App utiliza GTK, Python y está pensada para utilizar tanto PRIME (Intel+AMD, AMD+AMD, Intel+Nvidia) como NVIDIA Prime (Intel+Nvidia).

Al ejecutar la aplicación, esta deduce si se encuentra en PRIME o Nvidia Prime. Si detecta el uso de "NVIDIA Prime", es posible seleccionar el iGPU o dGPU Nvidia. También, la aplicación detecta si la implementación "Bajo-Demanda" (NVIDIA Optimus) se encuentra disponible; caso contrario, el menú se encontrará deshabilitado. Además, se puede acceder a "NVIDIA Settings" y "NVIDIA SMI".
Menú principal de "Monitor PRIME App Indicator". Izquierda: Menú para PRIME. Derecha: Menú para NVIDIA Prime.
Es capaz de identificar y mostrar el GPU renderizador además de los procesos asociados al GPU dedicado (tanto en PRIME como en NVIDIA Prime On-Demand):
Notificación mostrando el GPU Renderizador.
PID y Nombre de procesos renderizados en el dGPU.
Finalmente, esta aplicación necesita de unos drivers funcionales para trabajar correctamente. En resumen, es una aplicación que reúne las opciones básicas de gráficos híbridos en un solo lugar. No olvidar que se encuentra en estado de prueba y es propensa a errores.
Más información y enlace de descarga: GitHub

Y es todo por hoy, ahora ya pueden gestionar sus gráficos dedicados Nvidia con Nvidia Prime.

REFERENCIAS
3. "PRIME".

Palabras finales
Hola a todos, aquí quantum-phy (Néstor).
Si que pasó más de un año desde la última publicación xD. Mi ausencia (en cuanto a las publicaciones) se debe a mi nuevo ritmo de vida, ahora tengo menos tiempo que antes para publicar contenido (aunque como estamos en época de fiestas, me di esta semana para mejorar el código del App indicator y traer este post). Además, no tuve al blog abandonado como parece, estuve mejorando la redacción, añadiendo imágenes nuevas y vídeos al contenido de GNU/Linux.

Iniciemos con las críticas, comentarios y alabanzas:
Nvidia Prime es un mal necesario. Así de simple. Si Nvidia dedicara más esfuerzo a desarrollar drivers para Linux (sobre todo para gráficos híbridos), toda la comunidad estaría satisfecha. El motivo de esta crítica es porque la primera implementación de Nvidia Prime fue en el 2013 (3 años después que en Windows), y fue una implementación distinta a lo que proponía Optimus (aunque, siendo sincero, la implementación selectiva me gusta más xD) y desde entonces Nvidia declaraba que "No tenía pensado dar soporte a Optimus en Linux". Tuvo que pasar 6 años (concretamente en agosto del 2019) para tener una verdadera implementación de "Nvidia Optimus" (si lo comparamos con el lanzamiento en Windows, son casi 10 años de diferencia).
Esta nueva implementación se encuentra verde; por tal motivo, aún no se libera de forma nativa para todo el público (se necesita una versión de xorg-server parcheada para este fin y realizar algunas modificaciones en X-Server para su funcionamiento); aunque en Arch Linux, se encuentra presente una versión de xorg-server (1.20.6-1) parcheada, lista para funcionar.
Además, uno creería que el dGPU se apagaría al no ser utilizado, esto es cierto con gráficas Turing (las más actuales del mercado), pero con gráficas anteriores (por ejemplo Pascal) no es así. Esperemos que el "inconveniente" sea solucionado.
En cuanto al funcionamiento: En la web de Phoronix, se reportaron pérdidas de rendimiento en "On-Demand" para CS:Source. En "prime-select nvidia" se alcanzaban ~100 fps y en "prime-select on-demand" se alcanzaban 65-67 fps. Por lo tanto, no recomiendo el uso de esta implementación hasta que se solucionen la mayoría de los problemas.
Dejando de lado las críticas negativas, esta implementación es bienvenida y un acierto positivo en temas de productividad ya que el ecosistema Linux está en continuo crecimiento.

Seguro se preguntarán, ¿Por qué no hablas sobre "Bumblebee"?. La respuesta es sencilla, porque se encuentra desactualizado. Para el que no lo sepa, Bumblebee es un proyecto desarrollado por la comunidad para admitir la implementación "Nvidia Optimus" en los gráficos híbridos antes del lanzamiento de Nvidia Prime. Este proyecto fue la salvación para muchos portátiles que sufrían de problemas por no contar con soporte oficial. En verdad, estoy impresionado con Bumblebee.

Como aclaración, "Nvidia Optimus" y "AMD Enduro" en Windows se basan en "Perfiles de Aplicación"; es decir, una base de datos es la encargada de decidir si una aplicación se ejecuta en el iGPU o dGPU (en algunos casos, un desarrollador puede programar su aplicación para que se ejecute en una gráfica dedicada, ignorando los perfiles de Optimus o Enduro). Así que es mentira que "AMD Enduro" y "Nvidia Optimus" deciden "inteligentemente" qué aplicaciones se ejecutan en el GPU disponible ya que los "Perfiles de Aplicación" son una base de datos acumulada a lo largo de tiempo por un grupo de personas.

"Nvidia Optimus" y "AMD Enduro" en GNU/Linux carecen de esta base base de datos, nosotros somos los que decidimos qué aplicaciones se ejecutan en el dGPU. Así que al final, es la misma implementación sólo que en un sistema operativo distinto. Por lo tanto, es correcto llamar "Nvidia Optimus" a "Nvidia Prime On-Demand". Bajo esta premisa, Bumblebee también debería ser considerado como "Optimus", pero al ser independiente de la marca (y sobre todo por su forma de trabajar), queda descartado.

Respecto a "Monitor PRIME App Indicator", tengan en cuenta que se encuentra en "beta". Lo comparto con ustedes para que tengan una alternativa a lo que otras guías sobre "Nvidia Prime" siempre dicen y recomiendan. Ustedes son libres de utilizar otras herramientas, no hay ningún problema :D Lo mejor es utilizar lo que funciona.

Finalmente (después del testamento), gracias por llegar hasta esta parte, escribo todo esto para ayudar en lo que pueda y porque me apasiona la informática. Hasta la siguiente publicación y que tengan un "Próspero año Nuevo 2020 lleno de éxitos".

Espero que esta info sea de ayuda.
Un saludo.

Estado

=======================================
Recomiendo este post donde se recopila mucho contenido útil y en español para jugar en Linux.
-¿Jugar en Linux?, están locos estos pingüinos

[Linux] ¿Fidelity FX Super Resolution (FSR) en cualquier juego?
- Pruebas en el canal de YouTube

[Linux] GalliumToggle publicado en GitHub.
=======================================

quantum-phy (NestorBase11)

Videos Destacados

Entradas recientes