¿Qué es Google JAX? Todo lo que necesitas saber
Google JAX o Jboca Adespués de Execution es un marco desarrollado por Google para acelerar las tareas de aprendizaje automático.
Puede considerarlo una biblioteca para Python, que ayuda a una ejecución de tareas más rápida, computación científica, transformaciones de funciones, aprendizaje profundo, redes neuronales y mucho más.
Acerca de Google JAX
El paquete de computación más fundamental en Python es el paquete NumPy que tiene todas las funciones como agregaciones, operaciones vectoriales, álgebra lineal, arreglos n-dimensionales y manipulaciones de matrices, y muchas otras funciones avanzadas.
¿Qué pasaría si pudiéramos acelerar aún más los cálculos realizados con NumPy, especialmente para grandes conjuntos de datos?
¿Tenemos algo que podría funcionar igual?ally bien en diferentes tipos de process¿O como una GPU o TPU, sin ningún cambio de código?
¿Qué tal si el sistema pudiera realizar compo?sable transformaciones de funciones automáticasally ¿Y más eficientemente?
Google JAX es una biblioteca (o marco, como dice Wikipedia) que hace exactamente eso y quizás mucho más. Fue creado para optimizar el rendimiento y realizar de manera eficiente 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 ML y ayudan en el cálculo científico avanzado 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)

Todas las transformaciones utilizan XLA (Accelerated Álgebra lineal) para un mayor rendimiento y optimización de la memoria. XLA es un motor compilador de optimización específico de dominio que realiza álgebra lineal y aceleración.ates Modelos TensorFlow. ¡Usar XLA encima de su código Python no requiere cambios de código significativos!
Exploremos en detalle cada una de estas características.
Características de Google JAX
Google JAX viene con importantes componentessable funciones de transformación para mejorar el rendimiento y realizar tareas de aprendizaje profundo de manera más eficiente. Por ejemplo, diferenciación automática para obtener el gradiente de una función y encontrar derivadas de cualquier orden. De manera similar, paralelización automática y JIT para realizar múltiples tareas en paralelo. Estas transformaciones son clave para aplicaciones como la robótica, los juegos e incluso la investigación.
A hacersable función de transformación es un puro Función que transforma un conjunto de datos en otra forma. se llaman composable ya que son self-contenido (es decir, estas funciones no tienen dependencias con el resto del programa) y son statemenos (es decir, la misma entrada siempre dará como resultado la misma salida).
Y(x) = T: (f(x))
En la ecuación anterior, f(x) es la función original sobre la que se aplica una 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 que el resultado sea una transformación de función, simplemente puede usar la transformación que desee, digamos gradiente (grad):
grad_total_bill = grad(total_bill_amt)
Al transformar funciones numéricas usando funciones como grad(), podemos obtener fácilmente su derivada de orden superior.ates, que podemos usar ampliamente en algoritmos de optimización de aprendizaje profundo como el descenso de gradiente, haciendo así que los algoritmos sean más rápidos y eficientes. De manera similar, al usar jit(), podemos compilar programas Python justo a tiempo (perezosamente).
#1. Diferenciación automática
Python usa la función autograd para automatizarally diferenteate NumPy y código Python nativo. JAX utiliza una versión modificada de autograd (es decir, grad) y combina XLA (Accelerated Álgebra lineal) para realizar diferenciación automática y encontrar derivacionesates de cualquier orden para GPU (Gráfico ProcessUnidades de ing) y TPU (Tensor ProcessUnidades de cálculo).]
Nota rápida sobre TPU, GPU y CPU: CPU o central Processing Unit gestiona todas las operaciones en el ordenador. GPU es un adicional processo que mejore la potencia informática y ejecute operaciones de alto nivel. TPU es una poderosa unidad específicaally desarrollado para cargas de trabajo complejas y pesadas como IA y algoritmos de aprendizaje profundo.
En la misma línea que la función autograd, que puede diferenciarseate a través de bucles, recursiones, ramas, etc., JAX usa la función grad() para revgradientes en modo de borrado (atráspropagation). Además, podemos diferenciarate una función para cualquier orden usando grad:
grado(grado(grado(sen θ))) (1.0)
Diferenciación automática de orden superior
Como mencionamos antes, grad es bastante útil para encontrar las derivadas parciales de una función. Podemos usar una derivada parcial para calcularate el descenso de gradiente de una función de costo con respecto a los parámetros de la red neuronal en el aprendizaje profundo para minimizar las pérdidas.
Cálculo de derivadas parciales
Supongamos que una función tiene múltiples variables, x, y y z. Encontrar la derivada de una variable manteniendo las otras variables constantes se llama derivada parcial. Supongamos que tenemos una función,
f(x,y,z) = x + 2y + z2
Ejemplo para mostrar derivada parcial
La derivada parcial de x será ∂f/∂x, que nos dice cómo cambia una función para una variable cuando otras son constantes. Si realizamos este manually, debemos escribir un programa para diferenciarate, aplíquelo para cada variable y luego calculeate el descenso del gradiente. Esto se convertiría en un asunto complejo y que consumiría mucho tiempo debido a múltiples variables.
La diferenciación automática divide la función en un conjunto de operaciones elementales, como +, -, *, / o sin, cos, tan, exp, etc., y luego aplica la regla de la cadena para calcularate la derivada. Podemos hacer esto tanto en avance como revmodo erse.

Es no ¡eso! Todos estos cálculos ocurren muy rápido (bueno, ¡piense en un millón de cálculos similares a los anteriores y el tiempo que puede tomar!). XLA se encarga de la velocidad y el rendimiento.
#2. Aceleradorated Álgebra lineal
tomemos la prevecuación iosa. Sin XLA, el cálculo necesitará tres (o más) núcleos, donde cada núcleo realizará una tarea más pequeña. Por ejemplo,
Núcleo k1 –> x * 2y (multiplicación)
k2 –> x * 2y + z (suma)
k3 –> Reducción
Si el XLA realiza la misma tarea, un solo núcleo se encarga de todos los trámites intermedios.ate operaciones fusionándolas. el intermedioate Los resultados de operaciones elementales se transmiten en lugar de almacenarlos en la memoria, lo que ahorra memoria y mejora la velocidad.
#3. Compilación justo a tiempo
JAX internally utiliza el compilador XLA para aumentar la velocidad de ejecución. XLA puede aumentar la velocidad de CPU, GPU y TPU. Todo esto es posible mediante la ejecución de código JIT. Para usar esto, podemos usar jit mediante importación:
from jax import jit
def my_function(x):
…………some lines of code
my_function_jit = jit(my_function)
Otra forma es decorando jit sobre la definición de la función:
@jit
def my_function(x):
…………some lines of code
Este código es mucho más rápido porque la transformación devolverá la versión compilada del código a la persona que llama en lugar de usar el intérprete de Python. Esto es particularmente útil para entradas de vectores, como arreglos y matrices.
Lo mismo es cierto para todas las funciones de python existentes. Por ejemplo, funciones del paquete NumPy. En este caso, deberíamos importar jax.numpy como jnp en lugar de NumPy:
import jax
import jax.numpy as jnp
x = jnp.array([[1,2,3,4], [5,6,7,8]])
Una vez que haga esto, el objeto de matriz JAX principal llamado DeviceArray reemplaza la matriz NumPy estándar. DeviceArray es vago: los valores se mantienen en el acelerador hasta que se necesitan. Esto también significa que el programa JAX no espera a que los resultados regresen al programa que realiza la llamada (Python), siguiendo así unsyncDespacho cronoso.
#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 algunos cálculos o manipulaciones en cada uno o la mayoría de estos puntos de datos, ¡lo cual es una tarea que consume mucho tiempo y memoria! Por ejemplo, si desea encontrar el square de cada uno de los puntos de datos en el conjunto de datos, lo primero que pensaría es crear un bucle y tomar el square uno por uno - ¡argh!
si creamosate estos puntos como vectores, podríamos hacer todo lo squares de una sola vez realizando manipulaciones vectoriales o matriciales en los puntos de datos con nuestro NumPy favorito. Y si su programa pudiera hacer esto automáticamenteally –¿Se 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, lo que hace 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.array([1,2,3,4,5,6,7,8,9,10])
y = jnp.square(x)
Al hacer exactamente lo anterior, el square El método se ejecutará para cada punto en la matriz. Pero si haces lo siguiente:
vmap(jnp.square(x))
El método square se ejecutará solo una vez porque los puntos de datos ahora se vectorizan automáticamenteally Se utiliza el método vmap antes de ejecutar la función, y el bucle se lleva al nivel elemental de operación, lo que da como resultado una multiplicación matricial en lugar de una multiplicación escalar, lo que proporciona un mejor rendimiento.
#5. Programación SPMD (pmap)
SPMD – o SIngle Pprograma Multiple DLa programación de datos es esencial en contextos de aprendizaje profundo: a menudo se aplican las mismas funciones en diferentes conjuntos de datos que residen en múltiples GPU o TPU. JAX tiene una función llamada pump, que permite la programación paralela en múltiples GPU o cualquier acelerador. Al igual que JIT, los programas que utilizan pmap serán compilados por XLA y ejecutados simultáneamente.neogeneralmente en todos los sistemas. Esta paralelización automática funciona tanto para avance como para revcálculos breves.

También podemos aplicar múltiples transformaciones de una sola vez en cualquier orden en cualquier función como:
pmap(vmap(jit(graduado(f(x)))))
composición múltiplesable transformaciones
Limitaciones de Google JAX
Los desarrolladores de Google JAX han pensado bien en acelerar deep learning algoritmos mientras presenta todas estas impresionantes transformaciones. Las funciones y los paquetes de computación científica están en la línea de NumPy, por lo que no tiene que preocuparse por la curva de aprendizaje. Sin embargo, JAX tiene las siguientes limitaciones:
- Google JAX aún se encuentra en las primeras etapas de desarrollo y, aunque su objetivo principal es la optimización del rendimiento, no brinda muchos beneficios para la computación de la CPU. NumPy parece funcionar mejor, y el uso de JAX solo puede aumentar la sobrecarga.
- JAX aún se encuentra en su investigación o en sus primeras etapas y necesita más ajustes para alcanzar los estándares de infraestructura de marcos como TensorFlow, que están más establecidos y tienen más modelos predefinidos, proyectos de código abierto y herramientas de aprendizaje.aterial
- Por ahora, JAX no soporta Windows Sistema operativo: necesitarías una máquina virtual para que funcione.
- JAX funciona solo en funciones puras, las que no tienen efectos secundarios. Para funciones con efectos secundarios, JAX puede no ser una buena opción.
Cómo instalar JAX en su entorno de Python
Si tiene una configuración de python en su sistema y desea ejecutar JAX en su máquina local (CPU), use los siguientes comandos:
pip install --upgrade pip
pip install --upgrade "jax[cpu]"
Si desea ejecutar Google JAX en una GPU o TPU, siga las instrucciones proporcionadas en GitHubJAX página. Para configurar Python, visite el descargas oficiales de python .
Para Concluir
Google JAX es excelente para escribir algoritmos eficientes de aprendizaje profundo, robótica e investigación. A pesar de las limitaciones, se utiliza ampliamente con otros frameworks como Haiku, Flax y muchos más. Podrás apreciarate qué hace JAX cuando ejecuta programas y ve las diferencias de tiempo al ejecutar código con y sin JAX. Puedes empezar leyendo el documentación oficial de Google JAX, que es bastante completo.