Diffusers documentation
Metal Performance Shaders (MPS)
Metal Performance Shaders (MPS)
Les pipelines portant le badge
indiquent qu’un modèle peut tirer parti du backend MPS sur les appareils Apple silicon pour une inférence plus rapide. N’hésitez pas à ouvrir une Pull Request pour ajouter ce badge aux pipelines qui en sont dépourvus.
🤗 Diffusers est compatible avec les puces Apple silicon (M1/M2) en utilisant le dispositif PyTorch mps, qui exploite le framework Metal pour tirer parti du GPU sur les appareils MacOS. Vous devez disposer de :
- ordinateur macOS avec un matériel Apple silicon (M1/M2)
- macOS 12.6 ou version ultérieure (13.0 ou version ultérieure recommandée)
- version arm64 de Python
- PyTorch 2.0 (recommandé) ou 1.13 (version minimale prise en charge pour
mps)
Le backend mps utilise l’interface .to() de PyTorch pour déplacer le pipeline Stable Diffusion sur votre appareil 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]
imageLe backend mps de PyTorch ne prend pas en charge les tailles NDArray supérieures à
2**32. Veuillez ouvrir un Issue si vous rencontrez ce problème afin que nous puissions l'investiguer.
Si vous utilisez PyTorch 1.13, vous devez « amorcer » le pipeline avec un passage supplémentaire unique. Il s’agit d’une solution temporaire à un problème pour lequel le premier passage d’inférence produit des résultats légèrement différents des suivants. Vous n’avez besoin d’effectuer ce passage qu’une seule fois, et après une seule étape d’inférence, vous pouvez jeter le résultat.
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]Dépannage
Cette section répertorie certains problèmes courants liés à l'utilisation du backend mps et comment les résoudre.
Découpage de l'attention
Les performances des M1/M2 sont très sensibles à la pression mémoire. Lorsque cela se produit, le système effectue automatiquement un échange (swap) si nécessaire, ce qui dégrade considérablement les performances.
Pour éviter que cela se produise, nous recommandons le attention slicing afin de réduire la pression sur la mémoire pendant l'inférence et d'empêcher l'utilisation du swap. Cela est particulièrement pertinent si votre ordinateur dispose de moins de 64 Go de RAM système, ou si vous générez des images à des résolutions non standard supérieures à 512×512 pixels. Appelez la fonction enable_attention_slicing() sur votre 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()L’attention slicing exécute l’opération coûteuse d’attention en plusieurs étapes plutôt que d’un seul coup. Elle améliore généralement les performances d’environ 20 % sur les ordinateurs sans mémoire unifiée, mais nous avons observé de meilleures performances sur la plupart des ordinateurs Apple silicon, à moins que vous ne disposiez de 64 Go de RAM ou plus.
Inférence par lots
Générer plusieurs prompts en lot peut provoquer un plantage ou un comportement non fiable. Si c'est le cas, essayez d'itérer plutôt que de traiter en lot.
Update on GitHub