View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Temas
  • Todos los videos
  • Información

Más videos

  • Información
  • Resumen
  • Transcripción
  • Código
  • Comienza a usar MLX para el chip de Apple

    MLX es una estructura de matriz flexible y eficiente para computación numérica y aprendizaje automático en el chip de Apple. Exploraremos funcionalidades principales que incluyen memoria unificada, evaluación perezosa y transformaciones de funciones. Analizaremos técnicas más avanzadas para crear y acelerar modelos de aprendizaje automático en las plataformas de Apple con las API Swift y Python.

    Capítulos

    • 0:00 - Introducción
    • 1:15 - Descripción de MLX
    • 4:21 - Funcionalidades principales
    • 10:15 - Acelerar MLX
    • 17:30 - MLX Swift

    Recursos

    • MLX
    • MLX LM - Python API
    • MLX Examples
    • MLX Explore - Python API
    • MLX Framework
    • MLX Llama Inference
    • MLX Swift
    • MLX Swift Examples
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Explora grandes modelos de lenguaje en el chip de Apple con MLX
  • Buscar este video…

    Hola, soy Awni. Hoy tengo el placer de presentarte MLX. MLX es una estructura de arreglo de código abierto diseñada específicamente para el chip de Apple. Se usa para realizar desde cálculos básicos hasta aprendizaje automático en dispositivos Apple. Ideal para generar texto con modelos de lenguaje grandes, generar imágenes, audio o videos con los últimos modelos. Puedes usarlo para entrenar, ajustar o personalizar los modelos de aprendizaje automático desde la Mac. Te contaré un poco sobre qué es MLX y dónde es útil. También cubriré los conceptos básicos del uso de MLX en Python, la instalación y las operaciones de arreglo. Después, te contaré algunas de las funciones clave que diferencian a MLX de otras estructuras. Veremos algunas de las herramientas de MLX para hacer que el aprendizaje automático sea más rápido en el chip de Apple.

    En la última sección, te presentaré brevemente MLX Swift y te mostraré cómo empezar a utilizarlo. Vamos a sumergirnos en una introducción a MLX. MLX se creó desde cero para ser rápido en el chip de Apple, donde puede ejecutarse en el CPU o acelerarse en el GPU. Puedes utilizar MLX para muchísimas aplicaciones, desde operaciones de pequeña escala hasta de gran escala. Está diseñado para ser fácil de usar y flexible, sin comprometer la velocidad ni la eficiencia.

    MLX tiene una API central que sigue de cerca a NumPy. A menudo, puedes usarlo como reemplazo directo para acelerar la mayoría de los cálculos numéricos. MLX también tiene todas las herramientas necesarias para el aprendizaje automático. Las API de alto nivel son similares a PyTorch y JAX. Si conoces alguna de esas estructuras, MLX te resultará familiar y será aún más fácil de usar. Puedes usar MLX para un aprendizaje automático más avanzado directamente en el dispositivo. Por ejemplo, LM Studio, una popular app para generar texto con grandes modelos de lenguaje directo en Mac, usa MLX.

    Puedes utilizar el paquete MLX LM, creado sobre MLX, para generar texto y ajustar modelos de miles de parámetros. Para obtener más información, consulta la sesión “Explore large language models on Apple silicon with MLX”. MLX tiene una API de Python con todas las funciones, que resulta útil para la creación rápida de prototipos. También tiene una API en Swift, que incluye todos los paquetes para crear y optimizar redes neuronales. MLX también tiene API en C++ y C. Puedes usar MLX en uno de estos lenguajes para ejecutar los modelos de aprendizaje automático en el chip de Apple. El software MLX es de código abierto y cuenta con una licencia MIT permisiva. El software principal está disponible en GitHub, junto con ejemplos y paquetes creados con API de Python y Swift. MLX también tiene una comunidad activa de creadores de modelos en Hugging Face. Muchos modelos recientes ya están en el Hugging Face de la comunidad MLX, y cada día se cargan nuevos modelos. La forma más fácil de comenzar a usar MLX en Python es instalarlo desde PyPi. Solo debes ejecutar una línea en la terminal, pip3 install mlx. MLX es fácil de usar. Para empezar a realizar cálculos en arreglos, solo abre un archivo Python e importa MLX. Luego, puedes crear algunos arreglos y realizar operaciones básicas en ellos. Por ejemplo, sumemos dos arreglos de enteros.

    También puedes ver fácilmente la información sobre un arreglo, como su forma y el tipo de datos. La API de Python MLX es similar a NumPy. Las operaciones normalmente tienen los mismos nombres y firmas, y se comportan de la misma manera. Si vienes de NumPy o una estructura similar, MLX te resultará familiar y será fácil comenzar a usarlo. Ahora que ya sabes qué es MLX, dónde es útil y algunos conceptos básicos, veamos las funciones clave. Memoria unificada, evaluación perezosa, transformación de funciones y paquetes para optimizar redes neuronales. MLX está diseñado para aprovechar lo mejor del chip de Apple. Esto incluye un nuevo modelo de programación específico para la memoria unificada.

    La mayoría de los sistemas para el aprendizaje automático tienen un GPU discreto con memoria independiente. El chip de Apple, en cambio, tiene una arquitectura de memoria unificada. Esto significa que el CPU y el GPU comparten la misma memoria física.

    Para trabajar con memoria unificada, MLX es diferente de lo que quizá conozcas de las estructuras tradicionales. El cálculo sigue a los datos en las estructuras tradicionales. El cálculo se realiza en el CPU si el arreglo está en la memoria del CPU. El cálculo se realiza en el GPU si el arreglo está en la memoria del GPU.

    En MLX, los arreglos se asignan en la memoria unificada. Nunca necesitarás copiarlos en ningún lugar para usarlos en todos los dispositivos compatibles.

    En cambio, para ejecutar una operación en un dispositivo, debes especificar el dispositivo para la operación en sí. Por ejemplo, aquí estamos sumando a y b en el GPU y multiplicando a y b en el CPU. Estas operaciones incluso pueden ejecutarse en paralelo y MLX administrará automáticamente las dependencias. Otra función clave de MLX es el cálculo perezoso. Para que MLX sea lo más eficiente posible, cuenta con un motor de ejecución perezosa.

    Cuando se llama a una operación como una suma en dos arreglos, no se produce ningún cálculo real. Sino que se crea un gráfico de cálculo, como este.

    El arreglo C aún no se calculó. Solo se calcula si realmente necesitas usarlo. Por ejemplo, imprimir C o convertir C desde MLX a una lista de Python forzará su cálculo. Puedes forzar explícitamente la evaluación del gráfico usando mx.eval. El cálculo perezoso tiene varias ventajas. Al disociar la construcción y la ejecución del gráfico, MLX puede realizar acciones antes de calcular resultados. Con el cálculo perezoso solo pagas por lo que usas. La transformación de funciones es otra de las funciones clave de MLX. Lo elevan de una estructura de arreglo rápido a una herramienta mucho más potente.

    Las transformaciones de funciones son transformaciones que toman funciones de entrada y devuelven otras de salida.

    MLX tiene varias transformaciones de funciones. Por lo general, entran en una de dos categorías. Las transformaciones para la diferenciación automática o transformaciones para optimizar gráficos de cálculo. Por ejemplo, puedes usar una transformación de función para el cálculo automático del gradiente de una función.

    Supongamos que tienes una función básica que calcula el seno de su entrada. Para tomar el gradiente de esta función, puedes usar la transformación de función mx.grad. La salida de mx.grad es una nueva función que, cuando la llamas en un arreglo, te da la derivada. Las transformaciones de funciones son componibles arbitrariamente. Puedes tomar la segunda derivada solo usando mx.grad en la salida de mx.grad.

    El resultado es otra función que, cuando se llama en un arreglo, proporciona la segunda derivada del signo.

    MLX tiene dos paquetes de nivel superior para facilitar las acciones con redes neuronales.

    El primero es mlx.nn, una biblioteca modular que se utiliza para construir redes neuronales. El segundo es mlx.optimizers, una biblioteca de algoritmos de optimización comunes. Los dos paquetes pueden usarse independientemente o también pueden integrarse perfectamente entre sí.

    El paquete mlx.nn tiene toda la funcionalidad que necesitas para construir redes neuronales. nn.module es la clase base principal de la que heredan todas las capas y contenedores. Expone métodos útiles para acceder a parámetros, cargar parámetros, guardar parámetros y mucho más.

    La biblioteca nn también viene con un conjunto de capas estándar listas para usar, pero también puedes crearlas.

    Las funciones de pérdida y los métodos de inicialización comunes se incluyen en los subpaquetes nn.losses y nn.init.

    Veamos cómo se puede construir una red neuronal multicapa simple con mlx.nn.

    El primer paso es crear una clase personalizada que herede de nn.Module. En este caso, utilizaremos una red neuronal simple de una capa oculta. Creamos las capas lineales dentro del método de inicialización del módulo. Luego implementamos la función de llamada, que calcula la salida del módulo en la entrada dada. La función de llamada llama a la primera capa lineal, aplica la función de activación relu y llama a la segunda capa. El paquete de red neuronal de nivel superior está diseñado para parecerse a estructuras de aprendizaje automático.

    Comparemos la implementación del modelo MLX con la misma implementación en PyTorch. Son casi idénticos, con solo dos pequeñas diferencias en la función que calcula la salida. Si ya creaste modelos en PyTorch, cambiar a MLX debería ser muy sencillo. Ahora veamos el uso de MLX para que las cargas de trabajo de aprendizaje automático sean lo más eficientes posible. Empezaré mostrándote cómo compilar funciones para acelerarlas. Luego, hablaré del subpaquete mx.fast y una API para agregar tus Metal Kernels personalizados. Después de eso, mostraré cómo usar la cuantificación para reducir el uso de memoria y acelerar la ejecución. Por último, mostraré cómo usar MLX para distribuir un cálculo entre muchas máquinas. Casi todos los cálculos realistas de MLX constarán de funciones que realizan varias operaciones en arreglos. Una forma sencilla de hacer que funciones como esa sean más rápidas es con la transformación de mx.compile. Supongamos que tienes una función que realiza algunas operaciones elemento por elemento, como la función GELU. El gráfico de cálculo de esta función tiene varios nodos. Cada uno de estos nodos corresponde a un lanzamiento de kernel de GPU separado.

    La compilación del gráfico utiliza todos estos núcleos separados en un único núcleo fusionado. Esto puede ahorrar ancho de banda de memoria y sobrecarga de ejecución de gráficos y lograr un cálculo más eficiente.

    Usar mx.compile es tan fácil como decorar la función con la transformación de función mx.compile. Para operaciones más complejas, es probable que puedan ejecutarse más rápido usando mx.fast. Por ejemplo, muchos de los componentes básicos de un modelo de transformador usan operaciones en mx.fast. Estos incluyen codificaciones posicionales, capas de normalización y atención de producto puntual de escala. Las operaciones en mx.fast son más especializadas y están altamente optimizadas para ser lo más rápidas posible. También son altamente configurables, por lo que pueden acelerar muchas variaciones de un cálculo determinado. La operación de atención escalada por producto puede tomar una máscara opcional como entrada. La máscara puede ser aditiva, booleana o una cadena que indica el tipo de máscara. Veamos más de cerca a la norma RMS, que es una de las operaciones en mx.fast. La norma RMS se utiliza en casi todos los modelos de lenguaje grandes basados en transformadores modernos. Una implementación básica que usa operaciones MLX da como resultado un gráfico de cálculo grande.

    Pero podemos reemplazar toda la implementación con una sola llamada a mx.fast.rms_norm. El código es más simple, el gráfico de cálculo solo tiene un único nodo y el cálculo en sí será mucho más rápido.

    MLX tiene una API para agregar Metal Kernel personalizados para cuando convenga una implementación más personalizada. Escribes el kernel personalizado y MLX hace el resto, incluida la compilación y la ejecución justo a tiempo. Estos kernels están escritos en Metal, que es un lenguaje y API de Apple para ejecutar funciones en los GPU de Apple. Al construir el kernel, se pasa una cadena fuente de código Metal, así como información sobre las entradas y salidas.

    Se llama al kernel especificando el tamaño de la cuadrícula y las formas y tipos de la salida. MLX trata la llamada al kernel de la misma manera que cualquier otra operación. Crea un nodo en el gráfico de cálculo y se realiza su evaluación de forma perezosa.

    Otra herramienta de nuestro kit de herramientas es la cuantificación. Los modelos grandes necesitan mucha memoria y mucho ancho de banda de memoria para ser rápidos. La precisión necesaria para el entrenamiento es mucho mayor que para la inferencia para casi la misma calidad. Reducir la precisión te permite colocar modelos más grandes en la memoria y ejecutarlos más rápido.

    Si el modelo está en precisión de punto flotante de 32 bits, primero puedes reducir los requisitos de memoria a la mitad. Si 16 bits son demasiados, MLX tiene rutinas integradas para cuantificar arreglos para que sean aún más pequeños. Por ejemplo, puedes cuantificar usando 4 bits por elemento para reducir más los requisitos de memoria.

    Para cuantificar una matriz, usa mx.quantize. Especifica el número de bits a usar por elemento y el tamaño del grupo. Este determina la cantidad de elementos en la matriz cuantificada que comparten un valor de escala y punto cero. Cuanto más pequeños sean los bits y mayor el tamaño del grupo, más pequeño y rápido será el resultado. MLX tiene varias opciones de bits y tamaños de grupos para brindarte la mayor flexibilidad posible.

    Puedes multiplicar vectores o matrices de entrada no cuantificada utilizando mx.quantized_matmul.

    Usa mx.dequantize para recuperar una aproximación a la entrada original.

    MLX.mn también tiene una utilidad práctica para cuantificar un módulo en un solo comando. Digamos que tienes un modelo que es una pila de una capa de incrustación más varias capas lineales. Puedes cuantificar el modelo con nn.quantize. El comando de cuantificación acepta una devolución de llamada opcional para que tengas un control más preciso.

    En modelos de lenguaje grandes, la cuantificación reduce mucho el uso de memoria y aumenta los tokens por segundo. A veces, una sola máquina no es suficiente. Por ejemplo, es posible que desees generar texto con un modelo grande que no cabe en la memoria. O puede que estés realizando tareas fáciles de paralelizar y pueden ser mucho más rápidas si se usan varias máquinas.

    MLX viene de fábrica con la capacidad de ejecutar cálculos arbitrarios en varias máquinas. Las máquinas se pueden conectar a través de Ethernet o Thunderbolt.

    Usa el subpaquete mx.distributed para distribuir cálculos entre varias máquinas. El mx.distributed es principalmente un conjunto de operaciones de comunicación.

    Por ejemplo, all_Sum agrega los arreglos de entrada de todas las máquinas. La salida de all_Sum es la entrada sumada, que es la misma para cada máquina. Veamos cómo sumar un arreglo en varias máquinas. Inicia el backend distribuido con mx.distributed.init. Este paso es opcional, pero debes hacerlo si necesitas acceder al grupo de comunicación. El grupo de comunicación tiene información útil adjunta, como número total de procesos e índice de proceso actual.

    Crea un arreglo con un solo valor en cada proceso y llama a mx.distributed.all_sum para sumar los arreglos.

    MLX tiene un iniciador práctico para ejecutar un programa MLX en varias máquinas. Para ejecutar un programa en 4 máquinas, utiliza mlx.launch con las 4 direcciones IP del host. Hasta ahora, solo estuvimos usando MLX en Python. En muchos casos, es posible que prefieras la facilidad y flexibilidad de Python. En otros casos, es posible que prefieras Swift. Por esa razón, MLX tiene una API completa en Swift. Está creada con base en Metal y funciona muy bien en macOS, iOS, iPadOS, visionOS y más. Comenzar a utilizar MLX en Swift es tan fácil como agregarlo como un paquete al proyecto Xcode. Haz clic en el proyecto y, a continuación, en el signo más en la pestaña de dependencias del paquete. Luego, ingresa la URL del repositorio GitHub de MLX Swift y haz clic en Add Package. Eso es todo lo que se necesita para comenzar a crear con MLX Swift. Para facilitar la transición entre Python y Swift, las API de ambos son intencionalmente similares. A continuación, se muestra una comparación lado a lado de un fragmento de código Python y su contraparte MLX Swift. Crear arreglos, realizar operaciones e inspeccionar metadatos es casi lo mismo en Swift que en Python. Todas las funciones principales de MLX en Python se aplican igualmente a MLX Swift. Vimos una descripción general amplia de muchas de las funciones clave de MLX. Consulta el sitio web de MLX para obtener más información sobre la estructura. Las API de Python y Swift tienen un repositorio de ejemplos, que contiene muchos ejemplos de aprendizaje automático. Estos ejemplos son una gran forma de aprender sobre MLX y excelentes puntos de partida para desarrollar con MLX. Gracias por acompañarnos. Nos entusiasma ver lo que crearás con MLX.

    • 3:48 - Basics

      import mlx.core as mx
      
      # Make an array
      a = mx.array([1, 2, 3])
      
      # Make another array
      b = mx.array([4, 5, 6])
      
      # Do an operation
      c = a + b
      
      # Access information about the array
      shape = c.shape
      dtype = c.dtype
      
      print(f"Result c: {c}")
      print(f"Shape: {shape}")
      print(f"Data type: {dtype}")
    • 5:31 - Unified memory

      import mlx.core as mx
      
      a = mx.array([1, 2, 3])
      b = mx.array([4, 5, 6])
      
      c = mx.add(a, b, stream=mx.gpu)
      d = mx.multiply(a, b, stream=mx.cpu)
      
      print(f"c computed on the GPU: {c}")
      print(f"d computed on the CPU: {d}")
    • 6:20 - Lazy computation

      import mlx.core as mx
      
      # Make an array
      a = mx.array([1, 2, 3])
      
      # Make another array
      b = mx.array([4, 5, 6])
      
      # Do an operation
      c = a + b
      
      # Evaluates c before printing it
      print(c)
      
      # Also evaluates c
      c_list = c.tolist()
      
      # Also evaluates c
      mx.eval(c)
      
      print(f"Evaluate c by converting to list: {c_list}")
      print(f"Evaluate c using print: {c}")
      print(f"Evaluate c using mx.eval(): {c}")
    • 7:32 - Function transformation

      import mlx.core as mx
      
      def sin(x):
          return mx.sin(x)
      
      dfdx = mx.grad(sin)
      
      def sin(x):
          return mx.sin(x)
      
      d2fdx2 = mx.grad(mx.grad(mx.sin))
      
      # Computes the second derivative of sine at 1.0
      d2fdx2(mx.array(1.0))
    • 9:16 - Neural Networks in MLX

      import mlx.core as mx
      import mlx.nn as nn
      import mlx.optimizers as optim
      
      class MLP(nn.Module):
          """A simple MLP."""
      
          def __init__(self, dim, h_dim):
              super().__init__()
              self.linear1 = nn.Linear(dim, h_dim)
              self.linear2 = nn.Linear(h_dim, dim)
      
          def __call__(self, x):
              x = self.linear1(x)
              x = nn.relu(x)
              x = self.linear2(x)
              return x
    • 9:57 - MLX and PyTorch

      # MLX version
      import mlx.core as mx
      import mlx.nn as nn
      import mlx.optimizers as optim
      
      class MLP(nn.Module):
          """A simple MLP."""
      
          def __init__(self, dim, h_dim):
              super().__init__()
              self.linear1 = nn.Linear(dim, h_dim)
              self.linear2 = nn.Linear(h_dim, dim)
      
          def __call__(self, x):
              x = self.linear1(x)
              x = nn.relu(x)
              x = self.linear2(x)
              return x
      
      # PyTorch version
      import torch
      import torch.nn as nn
      import torch.optim as optim
      
      class MLP(nn.Module):
          """A simple MLP."""
      
          def __init__(self, dim, h_dim):
              super().__init__()
              self.linear1 = nn.Linear(dim, h_dim)
              self.linear2 = nn.Linear(h_dim, dim)
      
          def forward(self, x):
              x = self.linear1(x)
              x = x.relu()
              x = self.linear2(x)
              return x
    • 11:35 - Compiling MLX functions

      import mlx.core as mx
      import math
      
      def gelu(x):
          return x * (1 + mx.erf(x / math.sqrt(2))) / 2
      
      @mx.compile
      def compiled_gelu(x):
          return x * (1 + mx.erf(x / math.sqrt(2))) / 2
      
      x = mx.random.normal(shape=(4,))
      
      out = gelu(x)
      compiled_out = compiled_gelu(x)
      print(f"gelu:          {out}")
      print(f"compiled gelu: {compiled_out}")
    • 12:32 - MLX Fast package

      import mlx.core as mx
      import time
      
      def rms_norm(x, weight, eps=1e-5):
          y = x.astype(mx.float32)
          y = y * mx.rsqrt(mx.mean(
              mx.square(y), 
              axis=-1, 
              keepdims=True,
          ) + eps)
          return (weight * y).astype(x.dtype)
      
      batch_size = 8192
      feature_dim = 4096
      iterations = 1000
      
      x = mx.random.normal([batch_size, feature_dim])
      weight = mx.ones(feature_dim)
      bias = mx.zeros(feature_dim)
      
      start_time = time.perf_counter()
      for _ in range(iterations):
          y = rms_norm(x, weight, eps=1e-5)
          mx.eval(y)
      rms_norm_time = time.perf_counter() - start_time
      print(f"rms_norm execution: {gelu_time:0.4f} sec")
      
      start_time = time.perf_counter()
      for _ in range(iterations):
          mx.eval(mx.fast.rms_norm(x, weight, eps=1e-5))
      fast_rms_norm_time = time.perf_counter() - start_time
      print(f"mx.fast.rms_norm execution: {compiled_gelu_time:0.4f} sec")
      
      print(f"mx.fast.rms_norm speedup: {rms_norm_time/fast_rms_norm_time:0.2f}x")
    • 13:30 - Custom Metal kernel

      import mlx.core as mx
      
      # Build the kernel
      source = """
          uint elem = thread_position_in_grid.x;
          out[elem] = metal::exp(inp[elem]);
      """
      kernel = mx.fast.metal_kernel(
          name="myexp",
          input_names=["inp"],
          output_names=["out"],
          source=source,
      )
      
      # Call the kernel on a sample input
      x = mx.array([1.0, 2.0, 3.0])
      out = kernel(
          inputs=[x],
          grid=(x.size, 1, 1),
          threadgroup=(256, 1, 1),
          output_shapes=[x.shape],
          output_dtypes=[x.dtype],
      )[0]
      print(out)
    • 14:41 - Quantization

      import mlx.core as mx
      
      x = mx.random.normal([1024])
      weight = mx.random.normal([1024, 1024])
      
      quantized_weight, scales, biases = mx.quantize(
              weight, bits=4, group_size=32,
      )
      
      y = mx.quantized_matmul(
          x,
          quantized_weight,
          scales=scales,
          biases=biases,
          bits=4,
          group_size=32,
      )
      
      w_orig = mx.dequantize(
          quantized_weight,
          scales=scales,
          biases=biases,
          bits=4,
          group_size=32,
      )
    • 15:23 - Quantized models

      import mlx.nn as nn
      
      model = nn.Sequential(
          nn.Embedding(100, 32),
          nn.Linear(32, 32),
          nn.Linear(32, 32),
          nn.Linear(32, 1),
      )
      
      print(model)
      
      nn.quantize(
          model,
          bits=4,
          group_size=32,
      )
      
      print(model)
    • 16:50 - Distributed

      import mlx.core as mx
      
      group = mx.distributed.init()
      
      world_size = group.size()
      rank = group.rank()
      
      x = mx.array([1.0])
      
      x_sum = mx.distributed.all_sum(x)
      
      print(x_sum)
    • 17:20 - Distributed launcher

      mlx.launch --hosts ip1, ip2, ip3, ip4 my_script.py
    • 18:20 - MLX Swift

      // Swift
      import MLX
      
      // Make an array
      let a = MLXArray([1, 2, 3])
      
      // Make another array
      let b = MLXArray([1, 2, 3])
      
      // Do an operation
      let c = a + b
      
      // Access information about the array
      let shape = c.shape
      let dtype = c.dtype
      
      // Print results
      print("a: \(a)")
      print("b: \(b)")
      print("c = a + b: \(c)")
      print("shape: \(shape)")
      print("dtype: \(dtype)")
    • 0:00 - Introducción
    • MLX es una estructura matriz de código abierto diseñada específicamente para Apple Chip. Permite realizar tareas de aprendizaje automático eficientes y ejecutar grandes modelos de lenguaje en el dispositivo usando Python y Swift.

    • 1:15 - Descripción de MLX
    • Esta estructura de aprendizaje automático de alto rendimiento está optimizado para Apple Chip, lo que permite realizar cálculos numéricos rápidos y tareas de aprendizaje automático en CPU y GPU. Tiene una API central NumPy-like y la API superior es similar a PyTorch y JAX. Úsalo en apps como LM Studio para la generación de texto en el dispositivo con grandes modelos de lenguaje. MLX también tiene API en Python, Swift, C++ y C. MLX es de código abierto bajo licencia MIT y tiene una comunidad activa en Hugging Face.

    • 4:21 - Funcionalidades principales
    • MLX es increíblemente eficiente porque está diseñado para Apple Chip y aprovecha su arquitectura de memoria unificada. Compartir memoria entre la CPU y la GPU elimina la necesidad de copiar datos, las operaciones simplemente especifican el dispositivo deseado. En lugar de ejecutar inmediatamente un cálculo, MLX crea gráficos de cálculo que se ejecutan solo cuando se necesita un resultado. Con las transformaciones de funciones, MLX puede tomar funciones como entrada y devolver nuevas funciones, lo que facilita la diferenciación automática y otras optimizaciones. MLX incluye paquetes de nivel superior para construir y entrenar redes neuronales, así como operaciones comunes de aprendizaje automático. Estos paquetes son modulares y están diseñados para ser similares a estructuras populares como PyTorch, lo que le facilita a los desarrolladores cambiarlos.

    • 10:15 - Acelerar MLX
    • Las compilaciones de funciones con 'mx.compile' fusionan múltiples lanzamientos de kernel de GPU en uno solo, esto reduce el ancho de banda de memoria y la sobrecarga de ejecución. Para operaciones más complejas, el subpaquete 'mx.fast' proporciona implementaciones especializadas y altamente ajustadas de operaciones comunes de aprendizaje automático, como mecanismos de atención y normas RMS. MLX permite la cuantificación para una inferencia más rápida y eficiente con menos sobrecarga de memoria, esto reduce la precisión sin afectar excesivamente la calidad. Los cálculos a gran escala pueden utilizar el subpaquete 'mx.distributed' para distribuir el trabajo entre varias máquinas.

    • 17:30 - MLX Swift
    • Para un desarrollo perfecto en las plataformas de Apple en Xcode, MLX también ofrece una API Swift con las mismas mejoras en eficiencia. Visita el sitio web de MLX o descarga los repositorios de muestra para comenzar y obtener más información.

Developer Footer

  • Videos
  • WWDC25
  • Comienza a usar MLX para el chip de Apple
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines