Diffusers documentation

Metal Performance Shaders (MPS)

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Metal Performance Shaders (MPS)

Pipelines com o selo MPS indicam que o modelo pode aproveitar o backend MPS em dispositivos com Apple silicon para uma inferência mais rápida. Sinta-se à vontade para abrir um Pull Request para adicionar esse selo aos pipelines que estão faltando.

🤗 O Diffusers é compatível com Apple silicon (chips M1/M2) usando o dispositivo mps do PyTorch, que utiliza o framework Metal para aproveitar a GPU em dispositivos MacOS. Você precisará ter:

  • computador macOS com hardware Apple silicon (M1/M2)
  • macOS 12.6 ou posterior (13.0 ou posterior recomendado)
  • versão arm64 do Python
  • PyTorch 2.0 (recomendado) ou 1.13 (versão mínima suportada para mps)

O backend mps usa a interface .to() do PyTorch para mover o pipeline Stable Diffusion para o seu dispositivo M1 ou 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

O backend mps do PyTorch não suporta tamanhos de NDArray maiores que 2**32. Abra um Issue se você encontrar esse problema para que possamos investigar.

Se você estiver usando PyTorch 1.13, é necessário “preparar” o pipeline com uma passagem adicional única. Este é um contorno temporário para um problema em que a primeira passagem de inferência produz resultados ligeiramente diferentes dos das passagens subsequentes. Você só precisa fazer essa passagem uma vez, e após apenas um passo de inferência, pode descartar o 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]

Solução de problemas

Esta seção lista alguns problemas comuns ao usar o backend mps e como resolvê-los.

Fatiamento de atenção

O desempenho do M1/M2 é muito sensível à pressão de memória. Quando isso ocorre, o sistema troca automaticamente para a memória virtual se necessário, o que degrada significativamente o desempenho.

Para evitar que isso aconteça, recomendamos o attention slicing para reduzir a pressão de memória durante a inferência e evitar a troca de memória (swapping). Isso é especialmente relevante se o seu computador tiver menos de 64GB de RAM de sistema, ou se você gerar imagens em resoluções não padrão maiores que 512×512 pixels. Chame a função enable_attention_slicing() no seu 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()

O fatiamento de atenção executa a operação de atenção, que é custosa, em várias etapas em vez de tudo de uma vez. Ele geralmente melhora o desempenho em ~20% em computadores sem memória universal, mas observamos melhor desempenho na maioria dos computadores com Apple silicon, a menos que você tenha 64GB de RAM ou mais.

Inferência em lote

Gerar múltiplos prompts em um lote pode causar falhas ou não funcionar de forma confiável. Se esse for o caso, tente iterar em vez de usar lotes.

Update on GitHub