# Metal Performance Shaders (MPS)

> [!TIP]
> Los pipelines con la insignia badge indican que un 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](https://github.com/huggingface/diffusers/compare) para agregar esta insignia a los pipelines que la estén faltando.

🤗 Diffusers es compatible con Apple silicon (chips M1/M2) usando el dispositivo [`mps`](https://pytorch.org/docs/stable/notes/mps.html) de PyTorch, que utiliza el framework Metal para aprovechar la GPU en dispositivos MacOS. Necesitará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](https://pytorch.org/get-started/locally/) (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:

```python
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]
image
```

> [!WARNING]
> El backend [mps](https://pytorch.org/docs/stable/notes/mps.html) de PyTorch no admite tamaños de NDArray mayores que `2**32`. Abra un [Issue](https://github.com/huggingface/diffusers/issues/new/choose) 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.

```diff
  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()](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline.enable_attention_slicing) en tu pipeline:

```py
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.

