Diffusers documentation
Resumen
Resumen
La inferencia de difusión es computacionalmente costosa y a menudo se ejecuta un DiffusionPipeline más de una vez antes de obtener un resultado satisfactorio. Esta página ofrece una visión general de las principales técnicas de optimización de Diffusers, qué hacen y cuándo usarlas.
Ruta de inicio
Cuando el modelo cabe en una GPU, comience con esta carga de línea base. Establezca dtype y coloque el pipeline en un acelerador. Recurra al offload de CPU del modelo solo cuando la memoria sea limitada. También puede acelerar la inferencia con menos pasos o un programador más rápido.
Cuando omites dtype, Diffusers carga los componentes en float32. Pasa dtype=torch.bfloat16 (o torch.float16 si bfloat16 no es compatible) y luego coloca el pipeline en un acelerador con 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]Si el pipeline no cabe o la memoria es limitada, llama a enable_model_cpu_offload() en lugar de mantener todo en la GPU. Coloca el modelo activo en la GPU y mantiene los demás componentes en la CPU.
Omitelo cuando el modelo quepa. El descargado es más lento cuando no lo necesitas.
Para más opciones de descarga, consulte Reducir el uso de memoria.
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
)
pipeline.enable_model_cpu_offload()Menor latencia con menos num_inference_steps o un programador más rápido, como DPMSolverMultistepScheduler. Eso suele acelerar la generación, pero puede reducir la calidad de la imagen en comparación con un programador más lento y de mayor calidad. Consulte Técnicas de optimización a continuación para conocer más técnicas de velocidad.
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")Técnicas de optimización
Cuando la ruta inicial no es suficiente, utiliza estas técnicas. Si la inferencia es demasiado lenta, comienza con torch.compile, el almacenamiento en caché o los backends de atención. Si te quedas sin memoria, comienza con el offloading o la cuantización.
Inferencia más rápida:
- torch.compile — Compila el UNet, el transformer o el VAE en kernels optimizados.
- Compilación regional — Compila bloques repetidos para reducir la latencia de arranque en frío de
torch.compiley reutilizar los artefactos compilados. - Caché — Reutiliza los intermedios entre los pasos de desruido cuando buscas más velocidad y puedes gastar memoria.
- Backends de atención — Cambia las implementaciones de atención de Diffusers a través de una API unificada cuando la atención sea el cuello de botella.
- Kernels — Carga kernels de cómputo optimizados de Hub (atención y operaciones CUDA personalizadas como RMSNorm o RoPE) cuando necesites aceleraciones específicas del hardware más allá de PyTorch estándar.
Menos memoria:
- Offloading — Mover modelos o capas inactivos a la CPU mediante offloading de CPU, de modelo o de grupo.
- Cuantización — Carga pesos más pequeños para reducir la memoria (algunos backends también aceleran la inferencia). GGUF es un punto de partida común.
- Segmentación de VAE y mosaico de VAE: decodifica lotes grandes o imágenes de alta resolución por partes para reducir la memoria pico.
Ambos:
- Cuantizar, compilar y descargar — Combina la cuantización,
torch.compiley la descarga cuando una sola técnica no es suficiente.