Usando la Difusión Estable con Core ML en Apple Silicon

'Difusión Estable con Core ML en Apple Silicon'

¡Gracias a los ingenieros de Apple, ahora puedes ejecutar Stable Diffusion en Apple Silicon utilizando Core ML!

Este repositorio de Apple proporciona scripts de conversión y código de inferencia basado en 🧨 Diffusers, ¡y nos encanta! Para facilitarlo lo máximo posible, convertimos los pesos nosotros mismos y colocamos las versiones de los modelos en Core ML en el Hugging Face Hub.

Actualización: algunas semanas después de escribir esta publicación, creamos una aplicación nativa en Swift que puedes usar para ejecutar Stable Diffusion sin esfuerzo en tu propio hardware. Lanzamos una aplicación en la Mac App Store, así como el código fuente para permitir que otros proyectos lo usen.

El resto de esta publicación te guiará sobre cómo usar los pesos convertidos en tu propio código o convertir pesos adicionales por ti mismo.

Puntos de control disponibles

Los puntos de control oficiales de Stable Diffusion ya están convertidos y listos para usar:

  • Stable Diffusion v1.4: original convertido
  • Stable Diffusion v1.5: original convertido
  • Stable Diffusion v2 base: original convertido
  • Stable Diffusion v2.1 base: original convertido

Core ML admite todas las unidades de cómputo disponibles en tu dispositivo: CPU, GPU y Apple’s Neural Engine (NE). También es posible que Core ML ejecute diferentes partes del modelo en diferentes dispositivos para maximizar el rendimiento.

Existen varias variantes de cada modelo que pueden ofrecer un rendimiento diferente según el hardware que uses. Te recomendamos que las pruebes y te quedes con la que funcione mejor en tu sistema. Sigue leyendo para obtener más detalles.

Notas sobre el rendimiento

Hay varias variantes por modelo:

  • Atención “Original” vs “split_einsum”. Estas son dos implementaciones alternativas de los bloques de atención críticos. split_einsum fue introducido anteriormente por Apple y es compatible con todas las unidades de cómputo (CPU, GPU y Apple’s Neural Engine). original, por otro lado, solo es compatible con CPU y GPU. Sin embargo, original puede ser más rápido que split_einsum en algunos dispositivos, ¡así que compruébalo!
  • Modelos “ML Packages” vs “Compiled”. El primero es adecuado para inferencia en Python, mientras que la versión compiled es requerida para código Swift. Los modelos compiled en el Hub dividen los pesos del modelo UNet grande en varios archivos para ser compatibles con dispositivos iOS e iPadOS. Esto corresponde a la opción de conversión --chunk-unet.

En el momento de escribir esto, obtuvimos los mejores resultados en mi MacBook Pro (M1 Max, 32 núcleos de GPU, 64 GB) usando la siguiente combinación:

  • Atención original.
  • Todas las unidades de cómputo all (consultar la siguiente sección para obtener más detalles).
  • macOS Ventura 13.1 Beta 4 (22C5059b).

Con estos valores, se tardó 18 segundos en generar una imagen con la versión de Core ML de Stable Diffusion v1.4 🤯.

⚠️ Nota

Se introdujeron varias mejoras en Core ML en macOS Ventura 13.1 y son requeridas por la implementación de Apple. Es posible que obtengas imágenes en negro, y los tiempos serán mucho más lentos, si utilizas versiones anteriores de macOS.

Cada repositorio de modelos está organizado en una estructura de árbol que proporciona estas diferentes variantes:

coreml-stable-diffusion-v1-4
├── README.md
├── original
│   ├── compiled
│   └── packages
└── split_einsum
    ├── compiled
    └── packages

Puedes descargar y utilizar la variante que necesites como se muestra a continuación.

Inferencia de Core ML en Python

Prerrequisitos

pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion

Descargar los puntos de control del modelo

Para ejecutar inferencia en Python, debes usar una de las versiones almacenadas en las carpetas packages, ya que las compiladas solo son compatibles con Swift. Puedes elegir si quieres usar los estilos de atención original o split_einsum.

Así es como descargarías la variante de atención original desde el Hub:

from huggingface_hub import snapshot_download
from pathlib import Path

repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/packages"

model_path = Path("./models") / (repo_id.split("/")[-1] + "_" + variant.replace("/", "_"))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"Modelo descargado en {model_path}")

El código anterior colocará la instantánea del modelo descargado dentro de un directorio llamado models.

Inferencia

Una vez que hayas descargado una instantánea del modelo, la forma más sencilla de realizar inferencia sería utilizar el script de Python de Apple.

python -m python_coreml_stable_diffusion.pipeline --prompt "una foto de un astronauta montando un caballo en Marte" -i models/coreml-stable-diffusion-v1-4_original_packages -o </ruta/de/salida/imagen> --compute-unit ALL --seed 93

<directorio-de-mlpackages-de-salida> debe apuntar al punto de control que descargaste en el paso anterior, y --compute-unit indica el hardware que deseas permitir para la inferencia. Debe ser una de las siguientes opciones: ALL, CPU_AND_GPU, CPU_ONLY, CPU_AND_NE. También puedes proporcionar una ruta de salida opcional y una semilla para la reproducibilidad.

El script de inferencia asume la versión original del modelo Stable Diffusion, almacenada en el Hub como CompVis/stable-diffusion-v1-4. Si utilizas otro modelo, debes especificar su ID del Hub en la línea de comandos de inferencia, utilizando la opción --model-version. Esto funciona tanto para modelos ya admitidos como para modelos personalizados que hayas entrenado o ajustado.

Para Stable Diffusion 1.5 (ID del Hub: runwayml/stable-diffusion-v1-5):

python -m python_coreml_stable_diffusion.pipeline --prompt "una foto de un astronauta montando un caballo en Marte" --compute-unit ALL -o salida --seed 93 -i models/coreml-stable-diffusion-v1-5_original_packages --model-version runwayml/stable-diffusion-v1-5

Para Stable Diffusion 2 base (ID del Hub: stabilityai/stable-diffusion-2-base):

python -m python_coreml_stable_diffusion.pipeline --prompt "una foto de un astronauta montando un caballo en Marte" --compute-unit ALL -o salida --seed 93 -i models/coreml-stable-diffusion-2-base_original_packages --model-version stabilityai/stable-diffusion-2-base

Inferencia de Core ML en Swift

La inferencia en Swift es ligeramente más rápida que en Python, porque los modelos ya están compilados en el formato mlmodelc. Esto se notará al iniciar la aplicación cuando se cargue el modelo, pero no debería ser notable si se ejecutan varias generaciones posteriormente.

Descarga

Para ejecutar inferencia en Swift en tu Mac, necesitas una de las versiones de punto de control compiladas. Te recomendamos que las descargues localmente utilizando código de Python similar al que mostramos anteriormente, pero utilizando una de las variantes compiladas:

from huggingface_hub import snapshot_download
from pathlib import Path

repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/compiled"

model_path = Path("./models") / (repo_id.split("/")[-1] + "_" + variant.replace("/", "_"))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"Modelo descargado en {model_path}")

Inferencia

Para ejecutar inferencia, clona el repositorio de Apple:

git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion

Luego, utiliza la herramienta de línea de comandos de Apple utilizando las facilidades de Swift Package Manager:

swift run StableDiffusionSample --resource-path models/coreml-stable-diffusion-v1-4_original_compiled --compute-units all "una foto de un astronauta montando un caballo en marte"

Tienes que especificar en --resource-path uno de los puntos de control descargados en el paso anterior, así que asegúrate de que contenga paquetes Core ML compilados con la extensión .mlmodelc. El --compute-units debe ser uno de estos valores: all, cpuOnly, cpuAndGPU, cpuAndNeuralEngine.

Para más detalles, consulta las instrucciones en el repositorio de Apple.

Trae tu propio modelo

Si has creado tus propios modelos compatibles con Stable Diffusion (por ejemplo, si has utilizado Dreambooth, Inversión textual o ajuste fino), entonces debes convertir los modelos tú mismo. Afortunadamente, Apple proporciona un script de conversión que te permite hacerlo.

Para esta tarea, te recomendamos seguir estas instrucciones.

Siguientes pasos

Estamos muy entusiasmados con las oportunidades que esto ofrece y estamos ansiosos por ver lo que la comunidad puede crear a partir de aquí. Algunas ideas potenciales son:

  • Aplicaciones nativas de alta calidad para Mac, iPhone e iPad.
  • Traer programadores adicionales a Swift, para una inferencia aún más rápida.
  • Pipelines y tareas adicionales.
  • Explorar técnicas de cuantificación y optimizaciones adicionales.

¡Esperamos con ansias ver lo que creas!

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Tres formas en que la IA generativa puede reforzar la ciberseguridad

Los analistas humanos ya no pueden defenderse de manera efectiva ante la creciente velocidad y complejidad de los ata...