# Metal Performance Shaders (MPS)

> [!TIP]
> Пайплайны с бейджем MPS указывают на то, что модель может использовать бэкенд MPS на устройствах с чипами Apple silicon для более быстрого вывода. Вы можете создать [Pull Request](https://github.com/huggingface/diffusers/compare), чтобы добавить этот бейд к пайплайнам, где он отсутствует.

🤗 Diffusers совместим с Apple silicon (чипы M1/M2) с использованием устройства PyTorch [`mps`](https://pytorch.org/docs/stable/notes/mps.html), которое использует фреймворк Metal для задействования GPU на устройствах MacOS. Вам потребуется:

- Компьютер macOS с аппаратной платформой Apple silicon (M1/M2)
- macOS 12.6 или более поздняя версия (рекомендуется 13.0 или более поздняя)
- arm64-версия Python
- [PyTorch 2.0](https://pytorch.org/get-started/locally/) (рекомендуется) или 1.13 (минимальная поддерживаемая версия для `mps`)

Бэкенд `mps` использует интерфейс `.to()` PyTorch для перемещения конвейера Stable Diffusion на ваше устройство M1 или 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]
> Бэкенд [mps](https://pytorch.org/docs/stable/notes/mps.html) в PyTorch не поддерживает размеры NDArray, превышающие `2**32`. Если вы столкнулись с этой проблемой, пожалуйста, создайте [Issue](https://github.com/huggingface/diffusers/issues/new/choose), чтобы мы могли провести расследование.

Если вы используете **PyTorch 1.13**, вам необходимо «прогреть» конвейер дополнительным одноразовым проходом. Это временное решение для проблемы, при которой первый проход инференса дает результаты, слегка отличающиеся от последующих. Этот проход нужно выполнить только один раз, а после одного шага инференса результат можно отбросить.

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

## Устранение неполадок

В этом разделе перечислены некоторые типичные проблемы при использовании бэкенда `mps` и способы их решения.

### Слайсинг внимания

Производительность M1/M2 очень чувствительна к нагрузке на память. При её превышении система автоматически использует подкачку, что значительно снижает производительность.

Чтобы предотвратить это, мы рекомендуем использовать *attention slicing* для снижения нагрузки на память во время инференса и предотвращения свопинга. Это особенно актуально, если на вашем компьютере менее 64 ГБ системной ОЗУ или если вы генерируете изображения в нестандартных разрешениях, превышающих 512×512 пикселей. Вызовите функцию [enable_attention_slicing()](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline.enable_attention_slicing) для вашего пайплайна:

```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 выполняет дорогостоящую операцию внимания в несколько шагов, а не за один раз. Обычно это улучшает производительность примерно на 20% на компьютерах без универсальной памяти, однако мы наблюдали *более высокую производительность* на большинстве компьютеров с Apple silicon, если у вас менее 64 ГБ ОЗУ.

### Пакетный вывод

Генерация нескольких промптов в одном батче может приводить к сбоям или нестабильной работе. Если это происходит, попробуйте использовать итерации вместо батчинга.

