Ciencia 28 enero 2021

Durante los últimos tres años, Nvidia ha estado fabricando chips gráficos que cuentan con núcleos adicionales, más allá de los normales que se usan para los sombreadores. Estas unidades misteriosas, conocidas como núcleos tensores, se pueden encontrar en miles de PC de escritorio, portátiles, estaciones de trabajo y centros de datos de todo el mundo. Pero, ¿qué son exactamente y para qué se utilizan? ¿Realmente los necesita en una tarjeta gráfica?

Hoy explicaremos qué es un tensor y cómo se utilizan los núcleos tensoriales en el mundo de los gráficos y el aprendizaje profundo.

Es hora de una lección rápida de matemáticas
Para comprender exactamente qué hacen los núcleos tensoriales y para qué se pueden usar, primero debemos cubrir exactamente qué son los tensores. Los microprocesadores, independientemente de su forma, realizan operaciones matemáticas (sumar, multiplicar, etc.) en números.

A veces, estos números deben agruparse porque tienen algún significado entre sí. Por ejemplo, cuando un chip está procesando datos para renderizar gráficos, puede estar tratando con valores enteros únicos (como +2 o +115) para un factor de escala, o un grupo de números de coma flotante (+0.1, -0.5, + 0.6) para las coordinaciones de un punto en el espacio 3D. En el caso de este último, la posición de la ubicación requiere los tres datos.

Un tensor es un objeto matemático que describe la relación entre otros objetos matemáticos que están todos vinculados entre sí.

Un tensor es un objeto matemático que describe la relación entre otros objetos matemáticos que están todos vinculados entre sí. Por lo general, se muestran como una matriz de números, donde la dimensión de la matriz se puede ver como se muestra a continuación.

El tipo de tensor más simple que puede obtener tendría cero dimensiones y consistiría en un solo valor; otro nombre para esto es una cantidad escalar. A medida que comenzamos a aumentar el número de dimensiones, podemos encontrarnos con otras estructuras matemáticas comunes:

1 dimensión = vector
2 dimensiones = matriz
Estrictamente hablando, un escalar es un tensor 0 x 0, un vector es 1 x 0 y una matriz es 1 x 1, pero en aras de la simplicidad y cómo se relaciona con los núcleos tensoriales en un procesador gráfico, solo trataremos con tensores en forma de matrices.

Una de las operaciones matemáticas más importantes que se realizan con matrices es una multiplicación (o producto).

El cálculo de producto matricial “simple” consiste en una pila completa de pequeñas multiplicaciones y adiciones. Dado que todas las CPU del mercado actual pueden realizar ambas operaciones, significa que cualquier computadora de escritorio, computadora portátil o tablet puede manejar tensores básicos.

Sin embargo, el ejemplo anterior contiene 64 multiplicaciones y 48 sumas; cada producto pequeño da como resultado un valor que debe almacenarse en algún lugar, antes de que pueda acumularse con los otros 3 productos pequeños, antes de que el valor final del tensor pueda almacenarse en algún lugar. Entonces, aunque las multiplicaciones de matrices son matemáticamente sencillas, son computacionalmente intensivas: se deben usar muchos registros y la caché debe hacer frente a muchas lecturas y escrituras.

Las CPU de AMD e Intel han ofrecido varias extensiones a lo largo de los años (MMX, SSE, ahora AVX; todas son SIMD, datos múltiples de una sola instrucción) que permiten al procesador manejar muchos números de coma flotante al mismo tiempo; exactamente lo que necesitan las multiplicaciones de matrices.

Pero hay un tipo específico de procesador que está especialmente diseñado para manejar operaciones SIMD: unidades de procesamiento de gráficos (GPU).

Tensor Cores in Consumer GPUs (GeForce RTX)

Pero, ¿qué pasa si tienes una tarjeta gráfica Nvidia GeForce RTX y no eres un astrofísico que resuelve problemas con variedades de Riemann, o experimentas con las profundidades de las redes neuronales convolucionales …? ¿De qué te sirven los núcleos tensoriales?

En su mayor parte, no se usan para renderizar, codificar o decodificar videos normales, lo que puede parecer que ha desperdiciado su dinero en una función inútil. Sin embargo, Nvidia incorporó núcleos tensoriales a sus productos de consumo en 2018 (Turing GeForce RTX) mientras presentaba DLSS – Deep Learning Super Sampling.

En la primera versión de Nvidia de la tecnología, se analizaron juegos seleccionados, ejecutándolos a bajas resoluciones, altas resoluciones, con y sin anti-aliasing. Todos estos modos generaron una gran cantidad de imágenes que se introdujeron en sus propias supercomputadoras, que utilizaron una red neuronal para determinar la mejor manera de convertir una imagen de 1080p en una perfecta de mayor resolución.

Hay que decir que DLSS 1.0 no fue genial, con detalles que a menudo se pierden o brillan de manera extraña en algunos lugares. En realidad, tampoco usó los núcleos tensores en su tarjeta gráfica (que se hizo en la red de Nvidia) y cada juego compatible con DLSS requirió su propio examen por parte de Nvidia para generar el algoritmo de ampliación.

Cuando salió la versión 2.0 a principios de 2020, se habían realizado algunas mejoras importantes. El más notable de los cuales fue que las supercomputadoras de Nvidia solo se usaron para crear un algoritmo de escalamiento general: en la nueva iteración de DLSS, los datos del marco renderizado se usarían para procesar los píxeles (a través de los núcleos tensoriales de su GPU) usando el modelo neuronal .

Seguimos impresionados por lo que DLSS 2.0 puede lograr, pero por ahora muy pocos juegos lo admiten, solo 12 en total, en el momento de escribir este artículo. Sin embargo, más desarrolladores están buscando implementarlo en sus versiones futuras, y por buenas razones.

Se pueden encontrar grandes ganancias en el rendimiento, haciendo cualquier tipo de mejora, por lo que puede apostar su último dólar a que DLSS continuará evolucionando.