¿Qué es Google Jax? Todo lo que necesitas saber

toadmin. ru

Google Jax o justo después de la ejecución es una plataforma desarrollada por Google para acelerar las tareas de aprendizaje automático.

Puede pensarlo como una biblioteca para Python que ayuda a acelerar la ejecución de la tarea, la computación científica, las transformaciones de funciones, el aprendizaje profundo, las redes neuronales y más.

Acerca de Google Jax

El paquete informático más fundamental en Python es el paquete Numpy, que tiene todas las funciones, como agregación, operaciones vectoriales, álgebra lineal, matrices N-dimensionales y manipulación de matriz, así como muchas otras funciones avanzadas.

¿Qué pasaría si pudiéramos acelerar más los cálculos realizados con Numpy, especialmente para enormes conjuntos de datos?

¿Tenemos algo que podría funcionar igualmente bien en diferentes tipos de procesadores, como GPU o TPU, sin ningún cambio de código?

¿Qué tal si el sistema pudiera realizar transformaciones de funciones compuestas de manera automática y eficiente?

Google Jax es una biblioteca (o marco, como dice Wikipedia) que hace exactamente eso y probablemente mucho más. Fue creado para optimizar el rendimiento y realizar eficientemente el aprendizaje automático (ML) y las tareas de aprendizaje profundo. Google Jax proporciona las siguientes características de transformación que lo hacen único de otras bibliotecas de aprendizaje automático y ayudan en la informática científica avanzada para el aprendizaje profundo y las redes neuronales:

  • Diferenciación automática
  • Vectorización automática
  • Paralelización automática
  • Compilación justo a tiempo (JIT)

Características únicas de Google Jax

Todas las transformaciones usan XLA (álgebra lineal acelerada) para mejorar el rendimiento y optimizar la memoria. XLA es un mecanismo de compilador que optimiza el área temática, que realiza álgebra lineal y acelera modelos de flujo tensor.¡El uso de XLA en la parte superior de su código Python no requiere cambios significativos en el código!

Veamos cada una de estas características en detalle.

Características de Google Jax.

Google Jax viene con importantes funciones de transformación constituyente para mejorar el rendimiento y realizar tareas de aprendizaje profundo de manera más eficiente. Por ejemplo, autodiferenciación para obtener el gradiente de una función y encontrar derivados de cualquier orden. Del mismo modo, la autoparalización y el JIT para ejecutar múltiples tareas en paralelo. Estas transformaciones son clave para aplicaciones como robótica, juegos e incluso investigación.

Una función de transformación compuesta es una función pura que transforma un conjunto de datos en otra forma. Se llaman componentes porque son autónomos (es decir, estas funciones son independientes del resto del programa) y sin estado (es decir, la misma entrada siempre produce el mismo resultado).

En la ecuación anterior, F (x) es la función original a la que se aplica la transformación. Y (x) es la función resultante después de aplicar la transformación.

Por ejemplo, si tiene una función llamada ‘Total_bill_amt’ y desea el resultado como una transformación funcional, simplemente puede usar la transformación deseada, por ejemplo, gradiente (Grad):

Al transformar funciones numéricas utilizando funciones como Grad (), podemos obtener fácilmente sus derivados de orden superior que podemos usar ampliamente en algoritmos de optimización de aprendizaje profundo como el descenso de gradiente, lo que hace que los algoritmos sean más rápidos y eficientes. Del mismo modo, usando jit (), podemos compilar programas de Python justo en el tiempo (perezoso).

№1. Diferenciación automática

Python usa Autograd para diferenciar automáticamente entre el código Numpy y el propio código de Python. JAX utiliza una versión modificada de Autograd (es decir, Grad) y combina XLA (álgebra lineal acelerada) para realizar una diferenciación automática y una búsqueda derivada de cualquier orden para GPU (procesadores gráficos) y TPU (procesadores tensores)].

Una nota rápida sobre TPU, GPU y CPU: la CPU o la unidad de procesamiento central maneja todas las operaciones en una computadora. Una GPU es un procesador adicional que aumenta la potencia de procesamiento y realiza operaciones de alto rendimiento. TPU es un poderoso dispositivo diseñado específicamente para cargas de trabajo complejas y pesadas, como inteligencia artificial y algoritmos de aprendizaje profundo.

En el mismo espíritu que la función Autograd, que puede diferenciar entre bucles, recursiones, transiciones, etc., Jax usa la función Grad () para gradientes de modo inverso (propagación de la espalda). Además, podemos diferenciar la función en cualquier orden utilizando Grad:

Grad (Grad (Grad (Grad (sin θ))) (1. 0)

Autodiferenciación de orden superior

Como mencionamos anteriormente, Grad es bastante útil para encontrar las derivadas parciales de una función. Podemos usar la derivada parcial para calcular el descenso de gradiente de la función de costo con respecto a los parámetros de la red neuronal en el aprendizaje profundo para minimizar la pérdida.

Calculando la derivada parcial

Supongamos que una función tiene varias variables x, y y z. Encontrar la derivada de una variable cuando las otras variables son constantes se llama derivado parcial. Supongamos que tenemos una función,

F (x, y, z) = x + 2y + z2

Un ejemplo que muestra la derivada parcial

La derivada parcial de x será ∂f/∂x, lo que nos dice cómo la función cambia para una variable cuando los demás son constantes. Si hacemos esto a mano, tenemos que escribir un programa para diferenciarlo, aplicarlo a cada variable y luego calcular el descenso de gradiente. Esto se convertiría en un esfuerzo complicado y lento para múltiples variables.

La autodiferenciación descompone una función en un conjunto de operaciones elementales como +, -, *, / o sin, cos, TAN, EXP, etc., y luego aplica una regla de cadena para calcular el derivado. Podemos hacer esto en modo hacia adelante o hacia atrás.

¡No es así! Todos estos cálculos ocurren tan rápido (bueno, piense en un millón de cálculos como los anteriores y el tiempo que puede tomar!). A XLA le importa la velocidad y el rendimiento.

№ 2. Álgebra lineal acelerada

Tomemos la ecuación anterior. Sin XLA, el cálculo requeriría tres (o más) núcleos, donde cada núcleo realizaría una tarea más pequeña. Por ejemplo,

Ядро k1 ->x * 2y (multiplicación)

k2 ->x * 2y + z (adición)

Si un XLA realiza la misma tarea, un solo núcleo se encarga de todas las operaciones intermedias al combinarlas. Los resultados intermedios de las operaciones elementales se transmiten en lugar de almacenarse en la memoria, ahorrar memoria y aumentar la velocidad.

№3. Compilación oportuna

Jax utiliza internamente el compilador XLA para mejorar la velocidad de ejecución. XLA puede aumentar la velocidad de CPU, GPU y TPU. Todo esto es posible con la ayuda de la ejecución de JIT del código. Para utilizar esto, podemos usar JIT a través de importación:

Desde jax import jit def my_function (x): ............ algunas líneas de código my_function_jit = jit (my_function)

Otra forma es decorar el JIT por encima de la definición de función:

@jit def my_function (x): ............ algunas líneas de código

Este código es mucho más rápido porque la transformación devolverá una versión compilada del código a la persona que llama, en lugar del intérprete de Python. Esto es especialmente útil para entradas vectoriales, como matrices y matrices.

Lo mismo es cierto para todas las funciones de Python existentes. Por ejemplo, las funciones del paquete Numpy. En este caso, debemos importar jax. numpy como jnp, no como numpy:

importar jax importar jax. numpy como jnp x = jnp. array([[1, 2, 3, 4], [5, 6, 7, 8]])

Una vez que haga esto, un objeto de matriz JAX básico llamado DeviceArray reemplazará la matriz NumPy estándar. DeviceArray es perezoso: los valores se almacenan en el acelerador hasta que se necesitan. Esto también significa que el programa JAX no espera a que los resultados se devuelvan al programa que llama (Python), luego del envío asíncrono.

№4. Vectorización automática (vmap)

En un mundo típico de aprendizaje automático, tenemos conjuntos de datos con un millón o más puntos de datos. Lo más probable es que realicemos algún cálculo o manipulación en cada uno o en la mayoría de estos puntos de datos, ¡lo cual consume mucho tiempo y requiere mucha memoria! Por ejemplo, si quisiera encontrar el cuadrado de cada punto de datos en un conjunto de datos, lo primero que pensaría es crear un bucle y tomar el cuadrado uno por uno: ¡ahhh!

Si creamos estos puntos como vectores, podemos crear todos los cuadrados a la vez realizando manipulaciones de vectores o matrices en los puntos de datos usando nuestro NumPy favorito. Y si su programa pudiera hacer esto automáticamente, ¿puede pedir algo más?¡Eso es exactamente lo que hace JAX! Puede vectorizar automáticamente todos sus puntos de datos para que pueda realizar fácilmente cualquier operación en ellos, haciendo que sus algoritmos sean mucho más rápidos y eficientes.

JAX usa la función vmap para la vectorización automática. Considere la siguiente matriz:

x = jnp. matriz([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) y = jnp. cuadrado(x)

Al hacer lo anterior, el método Square se ejecutará para cada punto de la matriz. Pero si haces lo siguiente:

vmap(jnp. cuadrado(x))

El método cuadrado se ejecutará solo una vez porque los puntos de datos ahora se vectorizan automáticamente usando el método vmap antes de ejecutar la función, y los bucles van al nivel elemental de operaciones, lo que da como resultado una multiplicación de matrices en lugar de una multiplicación escalar, lo que proporciona un mejor rendimiento..

№ 5. Programación SPMD (pmap)

SPMD, o programar un solo programa con múltiples datos, es importante en el contexto del aprendizaje profundo, a menudo aplica las mismas funciones a diferentes conjuntos de datos que residen en múltiples GPU o TPU. Jax tiene una función de bomba que le permite ejecutar programación paralela en múltiples GPU o cualquier pedal de gas. Al igual que JIT, XLA compilará los programas que usan PMAP y se ejecutarán simultáneamente en todos los sistemas. Esta paralelización automática funciona para cálculos hacia adelante y hacia atrás.

Cómo funciona PMAP

También podemos aplicar múltiples transformaciones a la vez en cualquier orden para cualquier función, por ejemplo:

PMAP (VMAP (VMAP (JIT (Grad (F (x)))))

Transformaciones compuestas múltiples

Limitaciones de Google Jax

Los desarrolladores de Google Jax han pensado bien en acelerar los algoritmos de aprendizaje profundo al introducir todas estas impresionantes transformaciones. Las funciones y paquetes informáticos científicos son similares a Numpy, por lo que no tiene que preocuparse por la curva de aprendizaje. Sin embargo, Jax tiene las siguientes limitaciones:

  • Google Jax todavía se encuentra en las primeras etapas del desarrollo, y aunque su objetivo principal es optimizar el rendimiento, no ofrece mucha ventaja para la informática de la CPU. Numpy funciona mejor, y usar Jax solo puede aumentar la sobrecarga.
  • Jax todavía está en la investigación o en la etapa temprana y necesita más ajuste para alcanzar los estándares de infraestructura de marcos como TensorFlow, que están más establecidos y tienen modelos más predefinidos, proyectos de código abierto y tutoriales.
  • Jax actualmente no es compatible con el sistema operativo Windows: necesitará una máquina virtual para ejecutarla.
  • Jax solo funciona con funciones puras que no tienen efectos secundarios. Para las funciones con efectos secundarios, Jax puede no ser la mejor opción.

Cómo instalar Jax en su entorno Python

Si tiene instalado Python en su sistema y desea ejecutar Jax en su computadora local (CPU), use los siguientes comandos:

PIP Instal l-Upgrade PIP Instal l-Upgrade "Jax [CPU]"

Si desea ejecutar Google Jax en una GPU o TPU, siga las instrucciones en la página Jax Github. Para configurar Python, visite la página oficial de descargas de Python.

Producción

Google Jax es excelente para escribir algoritmos eficientes de aprendizaje profundo, robótica y investigación. A pesar de sus limitaciones, se usa ampliamente con otros marcos como Haiku, Listra y muchos otros. Podrá apreciar lo que hace Jax cuando ejecute programas y vea la diferencia en el tiempo de ejecución del código con y sin JAX. Puede comenzar leyendo la documentación oficial de Google Jax, que es bastante completa.