domingo, 3 de septiembre de 2023

Todo lo que debes saber sobre el DLSS de NVIDIA

Si bien las tarjetas gráficas de NVIDIA han tomado el sufijo RTX en honor al Ray Tracing, la realidad es que ha sido el DLSS el caballo de batalla de la compañía de Jensen Huang. Es por ello que os hemos preparado un extenso artículo para explicaros su funcionamiento y evolución a través de sus diferentes versiones, desde la versión 1.0 hasta la última de todas, la 3.5.

Todo lo que hace una IA se ha convertido en un ente mágico, casi divino. Esto provoca que cualquier cosa que haya sido creada utilizando una red neural, sea del tipo que sea, no se entienda bien y aparezcan ciertos mitos. Es por ello que en vez de limitarnos a escribir sobre el DLSS hemos decidido ir más allá y hemos decidido hacer un artículo donde una vez lo hayáis leído no os parecerá algo sobrenatural o difícil de entender.

¿Qué es el DLSS?

Dentro del DLSS existen una serie de algoritmos basados en Deep Learning que principalmente permiten obtener una versión de una imagen a mayor resolución. La clave es generar el fotograma a una resolución menor, para luego aplicar dicho algoritmo y obtener una versión del mismo frame con mayor cantidad de píxeles de manera muy rápida. ¿El objetivo? Tener imágenes a alta resolución en un tiempo menor que generando la imagen a la misma resolución de salida. Todo ello supone un ahorro en ancho de banda y potencia de cálculo, y permite que los juegos que estamos reproduciendo se ejecuten a una mayor tasa de frames por segundo. Sin embargo, hemos de partir del hecho que NVIDIA, cuyo mercado principal es la IA, ha centrado el diseño de este algoritmo a dicha disciplina.

Pero, ¿por qué existe el DLSS?

Independientemente del videojuego en 3D que estemos jugando en cada momento, y que esté reproduciendo nuestra tarjeta gráfica, todos ellos siguen un proceso para generar cada uno de los fotogramas que ves en pantalla sucediendo a gran velocidad delante de tus ojos. La parte más costosa en cuanto a computación, es decir, que requiere más potencia de tu GPU, es el periodo en que ha de calcular el valor de color de los píxeles en pantalla, dado que los ha de procesar uno por uno.

Por ejemplo, no es lo mismo renderizar una escena en Full HD (1.920 x 1.080 píxeles) que hacerlo en 4K (3.840 x 2.160 píxeles), ya que vamos a necesitar:

  • 4 veces más potencia de cálculo en total en 4K que en Full HD.
  • Un aumento en el mismo grado del ancho de banda.
  • Una cantidad de memoria también 4 veces más grande para almacenar ciertos mapas de texturas y búferes de imagen

La existencia del DLSS, por tanto, no se ve motivada por una falta de potencia de las GPU, sino por la existencia de un cuello de botella en lo que a la velocidad de la memoria se refiere. Y es que a día de hoy, todos los modelos existentes se ven limitados en dicho aspecto, lo que fuerza a buscar alternativas, en este caso el llamado aprendizaje profundo, con tal de conseguir ese rendimiento provocado por el cuello de botella que es la VRAM a día de hoy.

Convolutional Autoencoders

Para entender lo que es el DLSS hemos de partir de un concepto del mundo de la inteligencia artificial que son los Convolutional Autoencoders. Estos son una herramienta muy utilizada en el mundo de la inteligencia artificial, pero especialmente en una disciplina llamada visión por computador, y es que tal y como veremos después, el DLSS realiza la reconstrucción de la imagen a partir de la observación.

¿Y cómo funcionan un Convolutional Autoencoder?, vamos a usar un ejemplo que no tiene nada que con el DLSS de NVIDIA, excepto en una cosa, la toma de una imagen. Cuando tú haces una foto con tu teléfono móvil, lo que hace el dispositivo no es almacenar la información tal como la ha capturado, sino que genera una versión que ocupa menos espacio en un formato de archivo concreto que luego podrás visualizar desde el terminal. El caso es que esa misma imagen, cuando tú la veas a tus ojos, la vas a ver totalmente igual que cuando la tomaste.

Pues bien, el DLSS funciona igual, pero usa el Convolutional Autoencoder para hacer que la imagen se vea mejor, es decir, tenga más píxeles o más resolución, pero sin destruir la calidad de la misma. Sin embargo, hemos de aclarar que desconocemos como es dicho algoritmo, ya que es totalmente propietario y NVIDIA nunca ha liberado el código. Es más, por no saber, no sabemos si es el mismo en cada versión e incluso en cada título con soporte para el mismo que ha salido en el mercado.

¿Cómo funciona el DLSS?

Una vez hemos entendido lo que es el DLSS y que este no deja de ser un algoritmo del tipo CAE, entonces solo nos toca explicar el proceso:

  • Codificación: el CAE/DLSS toma el último fotograma generado y que se encuentra almacenado en la memoria de vídeo para codificarlo en una versión comprimida con la que poder trabajar más fácilmente.
  • Compresión de características: gracias a las capacidades de visión por computador, el DLSS toma las características más importantes de cada frame para poder hacer una reconstrucción. Pensad en ello a cómo un pintor o ilustrador decide plasmar una escena en un lienzo o papel. El trabajo del CAE en este caso es no solo aprender el proceso, sino también a detectar los errores visuales del mismo y corregirlos.
  • Decodificación: una vez el DLSS ha observado y aprendido de la imagen y sus características, decide hacer una versión de la imagen con más píxeles, empleando para ello la información obtenida en la etapa anterior.

Eso sí, hemos de partir del hecho que el CAE para el DLSS depende del volumen de datos que tenga, cuanta más información mejor, por lo que no es recomendable renderizar un frame a muy baja resolución de forma interna, ya que la carencia informativa puede terminar por generar una imagen de muy mala calidad

Tensor Cores

Uno de los motivos por los cuales DLSS solo se puede ejecutar en las tarjetas RTX de NVIDIA, y no modelos anteriores, es por la inclusión de los Tensor Cores. Y si bien en general los CAE no están diseñados en exclusiva para ejecutarse en este tipo de unidades de cálculo, hay una serie de operaciones con matrices en todo el proceso que pueden verse aceleradas 10 o 100 veces más rápido con estas unidades. Es decir, los Tensor Cores aceleran operaciones con matrices como las multiplicaciones entre estas, las cuales son una pieza fundamental en un CAE. No solo eso, sino que aceleran otras partes del proceso como la retropropagación y permiten procesar una mayor cantidad de información de un golpe.

Pero, especialmente, está el hecho que tienen una gran potencia de cálculo, y es importante por un motivo. En un videojuego, cada frame se ha de generar desde cero, al DLSS se le deja un espacio de entre 1 y 3 ms para realizar todo su proceso de aumento de resolución de la imagen. No obstante, con las diferentes versiones que han ido apareciendo hasta ahora se han ido añadiendo mejoras, pero todas ellas basadas en el uso de Convolutional Autoencoders funcionando en Tensor Cores o unidades más especializadas para tareas concretas, pero que toman el funcionamiento de un CAE.

DLSS 2.0

El despegue en popularidad del DLSS se dio con su versión 2.0, el cual añadió el empleo de la información de frames anteriores para tener un set de datos más completo. Lo que hace esta versión respecto a la original es cambiar el algoritmo para añadir lo que son los vectores de movimiento para conocer la posición de cada objeto en cada frame. Esto le permite complementar la información visual necesaria durante el proceso de compresión de características y mejorar la calidad visual respecto al DLSS.

Sin embargo, esto tiene un problema, el hecho de que al completar la información con el frame anterior, esto entra en contraposición con el cálculo de la iluminación que es diferente en cada frame por la distinta posición de la cámara, especialmente con el Ray Tracing, de ahí las mejoras añadidas en el DLSS 3.5 en este sentido, las cuales existen para solucionar las limitaciones con la versión 2.0 del algoritmo.

En la actualidad, es la versión más ampliamente disponible en los juegos. El motivo no es otro que su versión mejorada, el DLSS 3.0, solo funciona en las gráficas de la serie RTX 40. Por otro lado, cualquier GPU RTX es compatible con todos los beneficios que trae el DLSS 2.0.

DLSS 3.0

La tercera versión del DLSS de NVIDIA se presentó junto a las RTX 40. La principal característica integrada fue la generación de frames adicionales de forma automática. El truco consiste en utilizar la posición de los objetos en los diferentes frames como referencia para poder predecir la posición de fotogramas adicionales que ocurran entre medio de dos ya existentes, interpolación, o se generen como un fotograma nuevo, extrapolación. Para ello no solo se basan en los vectores de movimiento introducidos en el DLSS 2.0, sino que hacen uso de una nueva pieza de hardware que facilita la implementación de los mismos y acelera la ejecución del algoritmo.

La clave en el DLSS 3 son los llamados Optical Flow Accelerator, una pieza de hardware que se encuentra en las RTX 40 y que libera a las unidades SIMD/CUDA y a los Tensor Cores de tener que realizar el proceso de cálculo de los vectores de movimiento, lo que deja libre su capacidad de procesamiento para otras tareas. Claro está, que el hecho de utilizar esta unidad, exclusiva de los RTX 40, hace que la generación de fotogramas solo se pueda usar en dicha generación de tarjetas gráficas.

Input Lag

Uno de los temas más polémicos relacionados con la generación de fotogramas en el DLSS 3 es que añade input lag. El motivo de ello es simple, al añadir fotogramas de más, se retrasa la aparición del frame generado a partir de la acción del jugador. Si bien la tasa de frames aumenta, hemos de partir del hecho que estos no están atados al motor del juego, por lo que el tiempo entre que por ejemplo pulsamos un botón y vemos al personaje saltar sigue siendo el mismo que sin el DLSS 3. Es decir, no tienes las ventajas de ejecutar un juego a 120 FPS si los generas con el DLSS 3. Si el motor gráfico está funcionando realmente a 60 FPS, ese será el tiempo en que tardará el juego en reaccionar.

DLSS 3.5

Pese a que el DLSS 3.5 pueda parecer una mejora menor sobre su anterior versión, pero no es el caso. Se ha de tener en cuenta que esta versión se ha creado no para generar fotogramas de más, aumentar la resolución o más cosas, sino para solucionar el problema de la información incorrecta provocada por el uso de los datos de los frames anteriores en escenas generadas con Ray Tracing. Esto es un paso más a tener escenas generadas puramente por trazado de rayos, sin ningún tipo de rasterización de por medio y reduciendo el coste computacional al máximo.

En el modelo actual de Ray Tracing híbrido lo que se hace es dejar que la escena se genere de forma normal para la iluminación directa Para la indirecta, se indican explícitamente qué rayos saldrán de forma indirecta de los objetos y a cuáles afectará. Pues bien, la idea de NVIDIA de cara al futuro es que la información que se utiliza para generar el búfer en diferido para calcular la iluminación directa sea procesada por el DLSS 3.5. Es decir, que los rayos primarios se vean calculados y generados de forma automática por el CAE.

La idea es sencilla, reducir el coste computacional sobre el rasterizado y acelerar la parte del cálculo de la iluminación directa de la escena, al mismo tiempo, que esto permite un cálculo más preciso de los efectos de luz indirectos como sombras, reflejos y muchos otros. El objetivo al fin y al cabo es el mismo de siempre, el de reducir el coste temporal por fotograma, pero esta vez mucho más centrado al trazado de rayos.

RTX Remix

Una de las capacidades que tienen que ver con el DLSS 3.5 y que NVIDIA no ha promocionado tiene que ver con la plataforma de Modding RTX Remix, donde el sistema a partir de conocer la colocación de las fuentes de luz de la escena y la distribución de objetos del nivel puede generar la iluminación directa de la escena a través de trazado de rayos, y con un coste muy bajo. El motivo de ello es que dicho proceso no lo realiza haciendo el cálculo del Ray Tracing píxel por píxel, sino aprendiendo una serie de patrones para luego en el CAE simular la luz directa de la escena sobre los objetos.

Debido a que el proceso de calcular la luz directa del renderizado en diferido es un postprocesado sobre una imagen ya generada que funciona en paralelo a la generación de la escena principal, es posible reemplazar su funcionamiento y darle otra vida a nivel visual a los juegos. Sin embargo, su implementación se está llevando por el momento con juegos relativamente antiguos como Portal o Half-Life 2, con unos requisitos técnicos bastante altos, pero que resultan un avance respecto al Quake 2 RTX de la anterior generación.

Saludos.

No hay comentarios:

Publicar un comentario

Por favor sé respetuoso/a y escribe adecuadamente. Gracias.