Diffusers documentation
Metal Performance Shaders (MPS)
Metal Performance Shaders (MPS)
Los pipelines con la insignia
indican que el modelo puede aprovechar el backend MPS en dispositivos con silicio de Apple para una inferencia más rápida. Siéntase libre de abrir un Pull Request para añadir esta insignia a los pipelines que la falten.
🤗 Diffusers es compatible con Apple silicon (chips M1/M2) usando el dispositivo mps de PyTorch, que utiliza el framework Metal para aprovechar la GPU en dispositivos MacOS. Deberás tener:
- Equipo macOS con hardware Apple silicon (M1/M2)
- macOS 12.6 o posterior (se recomienda 13.0 o posterior)
- versión arm64 de Python
- PyTorch 2.0 (recomendado) o 1.13 (versión mínima compatible con
mps)
El backend mps utiliza la interfaz .to() de PyTorch para mover el pipeline de Stable Diffusion a tu dispositivo M1 o M2:
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5")
pipe = pipe.to("mps")
# Recommended if your computer has < 64 GB of RAM
pipe.enable_attention_slicing()
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
imageEl backend mps de PyTorch no admite tamaños de NDArray mayores que
2**32. Abra un Issue si se encuentra con este problema para que podamos investigarlo.
Si estás usando PyTorch 1.13, necesitas “preparar” el pipeline con un paso adicional de una sola vez. Esto es una solución temporal para un problema en el que el primer paso de inferencia produce resultados ligeramente diferentes a los pasos posteriores. Solo necesitas realizar este paso una vez, y después de un solo paso de inferencia puedes descartar el resultado.
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5").to("mps")
pipe.enable_attention_slicing()
prompt = "a photo of an astronaut riding a horse on mars"
# First-time "warmup" pass if PyTorch version is 1.13
+ _ = pipe(prompt, num_inference_steps=1)
# Results match those from the CPU device after the warmup pass.
image = pipe(prompt).images[0]Solución de problemas
Esta sección enumera algunos problemas comunes al usar el backend mps y cómo resolverlos.
Rebanado de atención
El rendimiento de M1/M2 es muy sensible a la presión de memoria. Cuando esto ocurre, el sistema realiza intercambios automáticamente si es necesario, lo que degrada significativamente el rendimiento.
Para evitar que esto ocurra, recomendamos attention slicing para reducir la presión de memoria durante la inferencia y evitar el intercambio. Esto es especialmente relevante si tu computadora tiene menos de 64 GB de RAM de sistema, o si generas imágenes en resoluciones no estándar mayores a 512×512 píxeles. Llama a la función enable_attention_slicing() en tu pipeline:
from diffusers import DiffusionPipeline
import torch
pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16", use_safetensors=True).to("mps")
pipeline.enable_attention_slicing()Attention slicing realiza la operación de atención costosa en varios pasos en lugar de todo de una vez. Generalmente mejora el rendimiento en un ~20% en computadoras sin memoria universal, pero hemos observado un mejor rendimiento en la mayoría de las computadoras con Apple silicon, a menos que tengan 64 GB de RAM o más.
Inferencia por lotes
Generar varios prompts en un lote puede provocar un error o un funcionamiento poco fiable. Si este es el caso, intente iterar en lugar de usar lotes.
Update on GitHub