Diffusers documentation
Metal Performance Shaders (MPS)
Metal Performance Shaders (MPS)
Pipelines dengan lencana
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]
imageBackend 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