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

Acelerando la llegada de la energ铆a de fusi贸n con IA y accesibilidad

El Centro de Ciencia del Plasma y Fusi贸n del MIT recibir谩 apoyo del Departamento de Energ铆a para mejorar el acceso a ...

Inteligencia Artificial

Aprendamos IA juntos - Bolet铆n de la Comunidad Towards AI #3

Buenos d铆as, entusiastas de la IA! Estoy emocionado de compartir el episodio de podcast de esta semana, en el que cha...

Inteligencia Artificial

Destacar el texto mientras se est谩 hablando utilizando Amazon Polly

Amazon Polly es un servicio que convierte texto en habla realista. Permite el desarrollo de una amplia gama de aplica...

Ciencia de Datos

Lo que aprend铆 al llevar la Ingenier铆a de Prompt al l铆mite

Pas茅 los 煤ltimos dos meses construyendo una aplicaci贸n impulsada por un modelo de lenguaje grande (LLM). Fue una expe...

Inteligencia Artificial

La FAA aprueba el sistema de aeronaves no tripuladas m谩s grande de los Estados Unidos.

La Administraci贸n Federal de Aviaci贸n de los Estados Unidos aprob贸 la operaci贸n comercial de los rociadores agr铆colas...