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).
概述
扩散推理的计算开销较大,在获得满意的结果之前,你通常需要多次运行 DiffusionPipeline。本页概述了 Diffusers 的主要优化技术、它们的作用以及适用场景。
入门路径
当模型可以装入单个 GPU 时,请从此基础加载方式开始。设置 dtype 并将流水线放置在加速器上。仅在内存紧张时才使用模型 CPU 卸载。你还可以通过减少步数或使用更快的调度器来加速推理。
省略 dtype 时,Diffusers 会以 float32 加载组件。传入 dtype=torch.bfloat16(若不支持 bfloat16,则传入 torch.float16),然后使用 pipeline.to("cuda") 将流水线移至加速器。
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
)
pipeline.to("cuda") # or "mps", "xpu"
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
pipeline(prompt).images[0]如果流水线无法容纳,或者内存紧张,请调用 enable_model_cpu_offload(),而不是将所有内容都保留在 GPU 上。它会将当前活动的模型放置在 GPU 上,并将其他组件保留在 CPU 上。
当模型能够完整加载时,请跳过此步骤。在无需卸载的情况下,卸载操作会降低速度。
有关更多卸载选项,请参阅 减少内存使用。
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
)
pipeline.enable_model_cpu_offload()通过减少 num_inference_steps 或使用更快的调度器(例如 DPMSolverMultistepScheduler)来降低延迟。这通常能加快生成速度,但与较慢的高质量调度器相比,可能会降低图像质量。有关更多加速技巧,请参阅下文中的 优化技术。
import time
from diffusers import DPMSolverMultistepScheduler
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)
start_time = time.perf_counter()
image = pipeline(prompt, num_inference_steps=25).images[0]
end_time = time.perf_counter()
print(f"Image generation took {end_time - start_time:.3f} seconds")优化技术
当入门路径无法满足需求时,请使用以下技术。如果推理速度过慢,请从 torch.compile、缓存或注意力后端入手。如果内存不足,请从卸载或量化入手。
更快的推理速度:
- torch.compile — 将 UNet、transformer 或 VAE 编译为优化后的内核。
- 区域编译 — 编译重复的代码块,以降低
torch.compile的冷启动延迟并复用已编译的产物。 - 缓存 — 当你追求更高速度且可以消耗更多内存时,在去噪步骤之间复用中间结果。
- 注意力后端 — 当注意力机制成为性能瓶颈时,通过统一 API 切换 Diffusers 的注意力实现。
- Kernels — 当您需要超越标准 PyTorch 的硬件特定加速时,加载优化的 Hub 计算内核(如 attention 以及 RMSNorm 或 RoPE 等自定义 CUDA 操作)。
更少的内存:
- Offloading — 通过 CPU、模型或组 offloading,将非活动的模型或层移至 CPU。
- 量化 — 加载更小的权重以减少内存占用(某些后端还能加速推理)。GGUF 是一个常见的起点。
- VAE 切片和 VAE 平铺—— 分块解码大批次或高分辨率图像,以降低峰值内存。
两者:
- 量化、编译与卸载 — 当单一技术不足时,结合量化、
torch.compile和卸载。