Metal 性能着色器 (MPS)
🤗 Diffusers 通过使用 PyTorch 的 mps
设备与 Apple 硅芯片(M1/M2 芯片)兼容,该设备使用 Metal 框架来利用 macOS 设备上的 GPU。您需要拥有
- 配备 Apple 硅芯片(M1/M2)硬件的 macOS 计算机
- macOS 12.6 或更高版本(推荐使用 13.0 或更高版本)
- arm64 版本的 Python
- PyTorch 2.0(推荐)或 1.13(
mps
支持的最低版本)
mps
后端使用 PyTorch 的 .to()
接口将 Stable Diffusion 管道移动到您的 M1 或 M2 设备上
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("runwayml/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
如果您使用的是 **PyTorch 1.13**,则需要通过管道进行额外的单次传递来“预热”。这是针对第一个推理传递产生的结果与后续结果略有不同的问题的一种临时解决方法。您只需要执行此传递一次,并且在执行一次推理步骤后即可丢弃结果。
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("runwayml/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]
疑难解答
M1/M2 性能对内存压力非常敏感。当发生这种情况时,系统会自动交换(如果需要),这会显着降低性能。
为了防止这种情况发生,我们建议使用 *注意力切片* 来减少推理期间的内存压力并防止交换。如果您计算机的系统 RAM 少于 64GB,或者如果您以大于 512×512 像素的非标准分辨率生成图像,则这一点尤其重要。在您的管道上调用 enable_attention_slicing() 函数
from diffusers import DiffusionPipeline
import torch
pipeline = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True).to("mps")
pipeline.enable_attention_slicing()
注意力切片分多个步骤执行代价高昂的注意力操作,而不是一次性全部执行。它通常可以将没有统一内存的计算机的性能提高约 20%,但我们观察到,在大多数 Apple 硅芯片计算机中,除非您拥有 64GB 或更多 RAM,否则 *性能会更好*。
< > 在 GitHub 上更新