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.43.0).
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 dengan lencana MPS menunjukkan bahwa model dapat memanfaatkan backend MPS pada perangkat Apple silicon untuk inferensi yang lebih cepat. Silakan buka Pull Request untuk menambahkan lencana ini pada pipelines yang belum memilikinya.

🤗 Diffusers kompatibel dengan Apple silicon (chip M1/M2) menggunakan perangkat PyTorch mps, yang memanfaatkan framework Metal untuk menggunakan GPU pada perangkat MacOS. Anda perlu memiliki:

  • komputer macOS dengan perangkat keras Apple silicon (M1/M2)
  • macOS 12.6 atau lebih baru (13.0 atau lebih baru disarankan)
  • versi Python arm64
  • PyTorch 2.0 (disarankan) atau 1.13 (versi minimum yang didukung untuk mps)

Backend mps menggunakan antarmuka .to() dari PyTorch untuk memindahkan pipeline Stable Diffusion ke perangkat M1 atau M2 Anda:

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

Backend mps PyTorch tidak mendukung ukuran NDArray yang lebih besar dari 2**32. Silakan buka Issue jika Anda mengalami masalah ini agar kami dapat menyelidiki.

Jika Anda menggunakan PyTorch 1.13, Anda perlu “menyiapkan” pipeline dengan satu kali tambahan jalur sekali jalan melalui pipeline tersebut. Ini adalah solusi sementara untuk masalah di mana jalur inferensi pertama menghasilkan hasil yang sedikit berbeda dibandingkan jalur berikutnya. Anda hanya perlu melakukan jalur ini sekali, dan setelah satu langkah inferensi, Anda dapat membuang hasilnya.

  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]

Pemecahan masalah

Bagian ini merangkum beberapa masalah umum saat menggunakan backend mps beserta cara penyelesaiannya.

Pemotongan perhatian

Kinerja M1/M2 sangat sensitif terhadap tekanan memori. Ketika hal ini terjadi, sistem secara otomatis melakukan swap jika diperlukan, yang secara signifikan menurunkan kinerja.

Untuk mencegah hal ini terjadi, kami merekomendasikan attention slicing untuk mengurangi tekanan memori selama inferensi dan mencegah swapping. Hal ini terutama relevan jika komputer Anda memiliki RAM sistem kurang dari 64GB, atau jika Anda menghasilkan gambar pada resolusi non-standar yang lebih besar dari 512×512 piksel. Panggil fungsi enable_attention_slicing() pada pipeline Anda:

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 menjalankan operasi attention yang mahal dalam beberapa langkah, bukan sekaligus. Biasanya, ini meningkatkan kinerja sekitar 20% pada komputer tanpa memori universal, tetapi kami mengamati kinerja yang lebih baik di sebagian besar komputer Apple silicon kecuali Anda memiliki RAM 64GB atau lebih.

Inferensi batch

Membuat beberapa prompt dalam satu batch dapat menyebabkan crash atau gagal bekerja secara andal. Jika ini terjadi, coba lakukan iterasi alih-alih batching.

Update on GitHub