Diffusers documentation
Metal Performance Shaders (MPS)
Metal Performance Shaders (MPS)
Пайплайны с бейджем
указывают на то, что модель может использовать бэкенд MPS на устройствах с чипами Apple silicon для более быстрого вывода. Вы можете создать Pull Request, чтобы добавить этот бейд к пайплайнам, где он отсутствует.
🤗 Diffusers совместим с Apple silicon (чипы M1/M2) с использованием устройства PyTorch mps, которое использует фреймворк Metal для задействования GPU на устройствах MacOS. Вам потребуется:
- Компьютер macOS с аппаратной платформой Apple silicon (M1/M2)
- macOS 12.6 или более поздняя версия (рекомендуется 13.0 или более поздняя)
- arm64-версия Python
- PyTorch 2.0 (рекомендуется) или 1.13 (минимальная поддерживаемая версия для
mps)
Бэкенд mps использует интерфейс .to() PyTorch для перемещения конвейера Stable Diffusion на ваше устройство M1 или 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]
imageБэкенд mps в PyTorch не поддерживает размеры NDArray, превышающие
2**32. Если вы столкнулись с этой проблемой, пожалуйста, создайте Issue, чтобы мы могли провести расследование.
Если вы используете PyTorch 1.13, вам необходимо «прогреть» конвейер дополнительным одноразовым проходом. Это временное решение для проблемы, при которой первый проход инференса дает результаты, слегка отличающиеся от последующих. Этот проход нужно выполнить только один раз, а после одного шага инференса результат можно отбросить.
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() для вашего пайплайна:
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 ГБ ОЗУ.
Пакетный вывод
Генерация нескольких промптов в одном батче может приводить к сбоям или нестабильной работе. Если это происходит, попробуйте использовать итерации вместо батчинга.
Update on GitHub