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)

Các Pipeline có nhãn MPS cho thấy mô hình có thể tận dụng backend MPS trên các thiết bị Apple silicon để suy luận nhanh hơn. Bạn có thể mở một Pull Request để thêm nhãn này vào các pipeline đang thiếu.

🤗 Diffusers tương thích với Apple silicon (chip M1/M2) bằng cách sử dụng thiết bị mps của PyTorch, vốn sử dụng framework Metal để tận dụng GPU trên các thiết bị MacOS. Bạn cần có:

  • máy tính macOS với phần cứng Apple silicon (M1/M2)
  • macOS 12.6 trở lên (khuyến nghị 13.0 trở lên)
  • Phiên bản Python arm64
  • PyTorch 2.0 (khuyến nghị) hoặc 1.13 (phiên bản tối thiểu được hỗ trợ cho mps)

Backend mps sử dụng giao diện .to() của PyTorch để chuyển pipeline Stable Diffusion sang thiết bị M1 hoặc M2 của bạn:

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 của PyTorch không hỗ trợ kích thước NDArray lớn hơn 2**32. Vui lòng mở một Issue nếu bạn gặp vấn đề này để chúng tôi có thể điều tra.

Nếu bạn đang sử dụng PyTorch 1.13, bạn cần “khởi động” pipeline bằng một lượt chạy bổ sung chỉ thực hiện một lần. Đây là giải pháp tạm thời cho vấn đề mà lượt suy luận đầu tiên tạo ra kết quả hơi khác so với các lượt tiếp theo. Bạn chỉ cần thực hiện lượt chạy này một lần, và sau một bước suy luận duy nhất, bạn có thể bỏ kết quả đó đi.

  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]

Xử lý sự cố

Phần này liệt kê một số vấn đề thường gặp khi sử dụng backend mps và cách khắc phục chúng.

Chia nhỏ Attention

Hiệu năng của M1/M2 rất nhạy cảm với áp lực bộ nhớ. Khi điều này xảy ra, hệ thống sẽ tự động hoán đổi (swap) nếu cần, điều này làm giảm hiệu năng đáng kể.

Để ngăn điều này xảy ra, chúng tôi khuyến nghị sử dụng attention slicing để giảm áp lực bộ nhớ trong quá trình suy luận và tránh việc hoán đổi. Điều này đặc biệt quan trọng nếu máy tính của bạn có ít hơn 64GB RAM hệ thống, hoặc nếu bạn tạo ảnh ở độ phân giải không chuẩn lớn hơn 512×512 pixel. Gọi hàm enable_attention_slicing() trên pipeline của bạn:

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 thực hiện thao tác attention tốn kém qua nhiều bước thay vì thực hiện tất cả cùng lúc. Nó thường cải thiện hiệu suất khoảng 20% trên các máy tính không có bộ nhớ phổ dụng, nhưng chúng tôi đã quan sát thấy hiệu suất tốt hơn trên hầu hết các máy tính Apple silicon trừ khi bạn có 64GB RAM trở lên.

Suy luận theo lô

Việc tạo nhiều prompt trong một batch có thể gây crash hoặc không hoạt động ổn định. Nếu gặp trường hợp này, hãy thử lặp lại thay vì xử lý theo batch.

Update on GitHub